mirror of https://github.com/proxmox/mirror_qemu
tcg: Move TLB_FLAGS_MASK check out of get_alignment_bits
The replacement isn't ideal, as the raw count of bits is not easily synced with exec/cpu-all.h, but it does remove from tcg.h the target dependency on TARGET_PAGE_BITS_MIN which is built into TLB_FLAGS_MASK. Reviewed-by: Anton Johansson <anjo@rev.ng> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>master
parent
28ea568a03
commit
3a80bde37b
|
@ -314,6 +314,9 @@ CPUArchState *cpu_copy(CPUArchState *env);
|
||||||
*
|
*
|
||||||
* Use TARGET_PAGE_BITS_MIN so that these bits are constant
|
* Use TARGET_PAGE_BITS_MIN so that these bits are constant
|
||||||
* when TARGET_PAGE_BITS_VARY is in effect.
|
* when TARGET_PAGE_BITS_VARY is in effect.
|
||||||
|
*
|
||||||
|
* The count, if not the placement of these bits is known
|
||||||
|
* to tcg/tcg-op-ldst.c, check_max_alignment().
|
||||||
*/
|
*/
|
||||||
/* Zero if TLB entry is valid. */
|
/* Zero if TLB entry is valid. */
|
||||||
#define TLB_INVALID_MASK (1 << (TARGET_PAGE_BITS_MIN - 1))
|
#define TLB_INVALID_MASK (1 << (TARGET_PAGE_BITS_MIN - 1))
|
||||||
|
|
|
@ -305,10 +305,6 @@ static inline unsigned get_alignment_bits(MemOp memop)
|
||||||
/* A specific alignment requirement. */
|
/* A specific alignment requirement. */
|
||||||
a = a >> MO_ASHIFT;
|
a = a >> MO_ASHIFT;
|
||||||
}
|
}
|
||||||
#if defined(CONFIG_SOFTMMU)
|
|
||||||
/* The requested alignment cannot overlap the TLB flags. */
|
|
||||||
tcg_debug_assert((TLB_FLAGS_MASK & ((1 << a) - 1)) == 0);
|
|
||||||
#endif
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,23 @@
|
||||||
#include "tcg-internal.h"
|
#include "tcg-internal.h"
|
||||||
|
|
||||||
|
|
||||||
static inline MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
|
static void check_max_alignment(unsigned a_bits)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_SOFTMMU)
|
||||||
|
/*
|
||||||
|
* The requested alignment cannot overlap the TLB flags.
|
||||||
|
* FIXME: Must keep the count up-to-date with "exec/cpu-all.h".
|
||||||
|
*/
|
||||||
|
tcg_debug_assert(a_bits + 6 <= tcg_ctx->page_bits);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
|
||||||
{
|
{
|
||||||
/* Trigger the asserts within as early as possible. */
|
|
||||||
unsigned a_bits = get_alignment_bits(op);
|
unsigned a_bits = get_alignment_bits(op);
|
||||||
|
|
||||||
|
check_max_alignment(a_bits);
|
||||||
|
|
||||||
/* Prefer MO_ALIGN+MO_XX over MO_ALIGN_XX+MO_XX */
|
/* Prefer MO_ALIGN+MO_XX over MO_ALIGN_XX+MO_XX */
|
||||||
if (a_bits == (op & MO_SIZE)) {
|
if (a_bits == (op & MO_SIZE)) {
|
||||||
op = (op & ~MO_AMASK) | MO_ALIGN;
|
op = (op & ~MO_AMASK) | MO_ALIGN;
|
||||||
|
@ -491,6 +503,7 @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
|
||||||
TCGv_i64 ext_addr = NULL;
|
TCGv_i64 ext_addr = NULL;
|
||||||
TCGOpcode opc;
|
TCGOpcode opc;
|
||||||
|
|
||||||
|
check_max_alignment(get_alignment_bits(memop));
|
||||||
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
|
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
|
||||||
|
|
||||||
/* TODO: For now, force 32-bit hosts to use the helper. */
|
/* TODO: For now, force 32-bit hosts to use the helper. */
|
||||||
|
@ -599,6 +612,7 @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
|
||||||
TCGv_i64 ext_addr = NULL;
|
TCGv_i64 ext_addr = NULL;
|
||||||
TCGOpcode opc;
|
TCGOpcode opc;
|
||||||
|
|
||||||
|
check_max_alignment(get_alignment_bits(memop));
|
||||||
tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST);
|
tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST);
|
||||||
|
|
||||||
/* TODO: For now, force 32-bit hosts to use the helper. */
|
/* TODO: For now, force 32-bit hosts to use the helper. */
|
||||||
|
|
Loading…
Reference in New Issue