tci: Make tcg temporaries local to tcg_qemu_tb_exec
We're moving away from the temporaries stored in env. Make sure we can differentiate between temp stores and possibly bogus stores for extra call arguments. Move TCG_AREG0 and TCG_REG_CALL_STACK out of the way of the parameter passing registers. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off by: Stefan Weil <sw@weilnetz.de>
This commit is contained in:
parent
4699ca6dbf
commit
ee79c356ff
@ -40,11 +40,6 @@
|
|||||||
/* Bitfield n...m (in 32 bit value). */
|
/* Bitfield n...m (in 32 bit value). */
|
||||||
#define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
|
#define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
|
||||||
|
|
||||||
/* Used for function call generation. */
|
|
||||||
#define TCG_REG_CALL_STACK TCG_REG_R4
|
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
|
||||||
|
|
||||||
/* Macros used in tcg_target_op_defs. */
|
/* Macros used in tcg_target_op_defs. */
|
||||||
#define R "r"
|
#define R "r"
|
||||||
#define RI "ri"
|
#define RI "ri"
|
||||||
@ -901,10 +896,15 @@ static void tcg_target_init(TCGContext *s)
|
|||||||
/* TODO: Which registers should be set here? */
|
/* TODO: Which registers should be set here? */
|
||||||
tcg_regset_set32(tcg_target_call_clobber_regs, 0,
|
tcg_regset_set32(tcg_target_call_clobber_regs, 0,
|
||||||
BIT(TCG_TARGET_NB_REGS) - 1);
|
BIT(TCG_TARGET_NB_REGS) - 1);
|
||||||
|
|
||||||
tcg_regset_clear(s->reserved_regs);
|
tcg_regset_clear(s->reserved_regs);
|
||||||
tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK);
|
tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK);
|
||||||
tcg_add_target_add_op_defs(tcg_target_op_defs);
|
tcg_add_target_add_op_defs(tcg_target_op_defs);
|
||||||
tcg_set_frame(s, TCG_AREG0, offsetof(CPUArchState, temp_buf),
|
|
||||||
|
/* We use negative offsets from "sp" so that we can distinguish
|
||||||
|
stores that might pretend to be call arguments. */
|
||||||
|
tcg_set_frame(s, TCG_REG_CALL_STACK,
|
||||||
|
-CPU_TEMP_BUF_NLONGS * sizeof(long),
|
||||||
CPU_TEMP_BUF_NLONGS * sizeof(long));
|
CPU_TEMP_BUF_NLONGS * sizeof(long));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +127,6 @@ typedef enum {
|
|||||||
TCG_REG_R5,
|
TCG_REG_R5,
|
||||||
TCG_REG_R6,
|
TCG_REG_R6,
|
||||||
TCG_REG_R7,
|
TCG_REG_R7,
|
||||||
TCG_AREG0 = TCG_REG_R7,
|
|
||||||
#if TCG_TARGET_NB_REGS >= 16
|
#if TCG_TARGET_NB_REGS >= 16
|
||||||
TCG_REG_R8,
|
TCG_REG_R8,
|
||||||
TCG_REG_R9,
|
TCG_REG_R9,
|
||||||
@ -160,6 +159,13 @@ typedef enum {
|
|||||||
TCG_CONST = UINT8_MAX
|
TCG_CONST = UINT8_MAX
|
||||||
} TCGReg;
|
} TCGReg;
|
||||||
|
|
||||||
|
#define TCG_AREG0 (TCG_TARGET_NB_REGS - 2)
|
||||||
|
|
||||||
|
/* Used for function call generation. */
|
||||||
|
#define TCG_REG_CALL_STACK (TCG_TARGET_NB_REGS - 1)
|
||||||
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
|
|
||||||
void tci_disas(uint8_t opc);
|
void tci_disas(uint8_t opc);
|
||||||
|
|
||||||
tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr);
|
tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr);
|
||||||
|
6
tci.c
6
tci.c
@ -112,6 +112,7 @@ static void tci_write_reg(TCGReg index, tcg_target_ulong value)
|
|||||||
{
|
{
|
||||||
assert(index < ARRAY_SIZE(tci_reg));
|
assert(index < ARRAY_SIZE(tci_reg));
|
||||||
assert(index != TCG_AREG0);
|
assert(index != TCG_AREG0);
|
||||||
|
assert(index != TCG_REG_CALL_STACK);
|
||||||
tci_reg[index] = value;
|
tci_reg[index] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,9 +436,12 @@ static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
|
|||||||
/* Interpret pseudo code in tb. */
|
/* Interpret pseudo code in tb. */
|
||||||
tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
||||||
{
|
{
|
||||||
|
long tcg_temps[CPU_TEMP_BUF_NLONGS];
|
||||||
|
uintptr_t sp_value = (uintptr_t)(tcg_temps + CPU_TEMP_BUF_NLONGS);
|
||||||
tcg_target_ulong next_tb = 0;
|
tcg_target_ulong next_tb = 0;
|
||||||
|
|
||||||
tci_reg[TCG_AREG0] = (tcg_target_ulong)env;
|
tci_reg[TCG_AREG0] = (tcg_target_ulong)env;
|
||||||
|
tci_reg[TCG_REG_CALL_STACK] = sp_value;
|
||||||
assert(tb_ptr);
|
assert(tb_ptr);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -585,6 +589,7 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
|||||||
t0 = tci_read_r32(&tb_ptr);
|
t0 = tci_read_r32(&tb_ptr);
|
||||||
t1 = tci_read_r(&tb_ptr);
|
t1 = tci_read_r(&tb_ptr);
|
||||||
t2 = tci_read_s32(&tb_ptr);
|
t2 = tci_read_s32(&tb_ptr);
|
||||||
|
assert(t1 != sp_value || (int32_t)t2 < 0);
|
||||||
*(uint32_t *)(t1 + t2) = t0;
|
*(uint32_t *)(t1 + t2) = t0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -869,6 +874,7 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *env, uint8_t *tb_ptr)
|
|||||||
t0 = tci_read_r64(&tb_ptr);
|
t0 = tci_read_r64(&tb_ptr);
|
||||||
t1 = tci_read_r(&tb_ptr);
|
t1 = tci_read_r(&tb_ptr);
|
||||||
t2 = tci_read_s32(&tb_ptr);
|
t2 = tci_read_s32(&tb_ptr);
|
||||||
|
assert(t1 != sp_value || (int32_t)t2 < 0);
|
||||||
*(uint64_t *)(t1 + t2) = t0;
|
*(uint64_t *)(t1 + t2) = t0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user