tcg/tci: Use {set,clear}_helper_retaddr
Wrap guest memory operations for tci like we do for cpu_ld*_data. We cannot actually use the cpu_ldst.h interface without duplicating the memory trace operations performed within, which will already have been expanded into the tcg opcode stream. Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
d1b1348cc3
commit
2fc6f16ca5
10
tcg/tci.c
10
tcg/tci.c
@ -292,10 +292,9 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
|||||||
TCGMemOpIdx oi, const void *tb_ptr)
|
TCGMemOpIdx oi, const void *tb_ptr)
|
||||||
{
|
{
|
||||||
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
|
||||||
uintptr_t ra = (uintptr_t)tb_ptr;
|
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
switch (mop) {
|
switch (mop) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
return helper_ret_ldub_mmu(env, taddr, oi, ra);
|
return helper_ret_ldub_mmu(env, taddr, oi, ra);
|
||||||
@ -328,6 +327,7 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
|||||||
void *haddr = g2h(env_cpu(env), taddr);
|
void *haddr = g2h(env_cpu(env), taddr);
|
||||||
uint64_t ret;
|
uint64_t ret;
|
||||||
|
|
||||||
|
set_helper_retaddr(ra);
|
||||||
switch (mop) {
|
switch (mop) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
ret = ldub_p(haddr);
|
ret = ldub_p(haddr);
|
||||||
@ -368,6 +368,7 @@ static uint64_t tci_qemu_ld(CPUArchState *env, target_ulong taddr,
|
|||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
clear_helper_retaddr();
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -376,10 +377,9 @@ static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
|||||||
TCGMemOpIdx oi, const void *tb_ptr)
|
TCGMemOpIdx oi, const void *tb_ptr)
|
||||||
{
|
{
|
||||||
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
MemOp mop = get_memop(oi) & (MO_BSWAP | MO_SSIZE);
|
||||||
|
|
||||||
#ifdef CONFIG_SOFTMMU
|
|
||||||
uintptr_t ra = (uintptr_t)tb_ptr;
|
uintptr_t ra = (uintptr_t)tb_ptr;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SOFTMMU
|
||||||
switch (mop) {
|
switch (mop) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
helper_ret_stb_mmu(env, taddr, val, oi, ra);
|
helper_ret_stb_mmu(env, taddr, val, oi, ra);
|
||||||
@ -408,6 +408,7 @@ static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
|||||||
#else
|
#else
|
||||||
void *haddr = g2h(env_cpu(env), taddr);
|
void *haddr = g2h(env_cpu(env), taddr);
|
||||||
|
|
||||||
|
set_helper_retaddr(ra);
|
||||||
switch (mop) {
|
switch (mop) {
|
||||||
case MO_UB:
|
case MO_UB:
|
||||||
stb_p(haddr, val);
|
stb_p(haddr, val);
|
||||||
@ -433,6 +434,7 @@ static void tci_qemu_st(CPUArchState *env, target_ulong taddr, uint64_t val,
|
|||||||
default:
|
default:
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
clear_helper_retaddr();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user