mirror of https://github.com/xemu-project/xemu.git
accel/tcg: Push trace info building into atomic_common.c.inc
Use trace_mem_get_info instead of trace_mem_build_info, using the TCGMemOpIdx that we already have. Do this in the atomic_trace_*_pre function as common subroutines. Tested-by: Cole Robinson <crobinso@redhat.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
785ea711b1
commit
f3e182b100
|
@ -13,45 +13,58 @@
|
||||||
* See the COPYING file in the top-level directory.
|
* See the COPYING file in the top-level directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static inline
|
static uint16_t atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
|
||||||
void atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr, uint16_t info)
|
TCGMemOpIdx oi)
|
||||||
{
|
{
|
||||||
CPUState *cpu = env_cpu(env);
|
CPUState *cpu = env_cpu(env);
|
||||||
|
uint16_t info = trace_mem_get_info(get_memop(oi), get_mmuidx(oi), false);
|
||||||
|
|
||||||
trace_guest_mem_before_exec(cpu, addr, info);
|
trace_guest_mem_before_exec(cpu, addr, info);
|
||||||
trace_guest_mem_before_exec(cpu, addr, info | TRACE_MEM_ST);
|
trace_guest_mem_before_exec(cpu, addr, info | TRACE_MEM_ST);
|
||||||
|
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
|
||||||
atomic_trace_rmw_post(CPUArchState *env, target_ulong addr, uint16_t info)
|
uint16_t info)
|
||||||
{
|
{
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info | TRACE_MEM_ST);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info | TRACE_MEM_ST);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
#if HAVE_ATOMIC128
|
||||||
void atomic_trace_ld_pre(CPUArchState *env, target_ulong addr, uint16_t info)
|
static uint16_t atomic_trace_ld_pre(CPUArchState *env, target_ulong addr,
|
||||||
|
TCGMemOpIdx oi)
|
||||||
{
|
{
|
||||||
|
uint16_t info = trace_mem_get_info(get_memop(oi), get_mmuidx(oi), false);
|
||||||
|
|
||||||
trace_guest_mem_before_exec(env_cpu(env), addr, info);
|
trace_guest_mem_before_exec(env_cpu(env), addr, info);
|
||||||
|
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static void atomic_trace_ld_post(CPUArchState *env, target_ulong addr,
|
||||||
void atomic_trace_ld_post(CPUArchState *env, target_ulong addr, uint16_t info)
|
uint16_t info)
|
||||||
{
|
{
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static uint16_t atomic_trace_st_pre(CPUArchState *env, target_ulong addr,
|
||||||
void atomic_trace_st_pre(CPUArchState *env, target_ulong addr, uint16_t info)
|
TCGMemOpIdx oi)
|
||||||
{
|
{
|
||||||
|
uint16_t info = trace_mem_get_info(get_memop(oi), get_mmuidx(oi), true);
|
||||||
|
|
||||||
trace_guest_mem_before_exec(env_cpu(env), addr, info);
|
trace_guest_mem_before_exec(env_cpu(env), addr, info);
|
||||||
|
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static void atomic_trace_st_post(CPUArchState *env, target_ulong addr,
|
||||||
void atomic_trace_st_post(CPUArchState *env, target_ulong addr, uint16_t info)
|
uint16_t info)
|
||||||
{
|
{
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomic helpers callable from TCG.
|
* Atomic helpers callable from TCG.
|
||||||
|
|
|
@ -77,10 +77,8 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ | PAGE_WRITE, retaddr);
|
PAGE_READ | PAGE_WRITE, retaddr);
|
||||||
DATA_TYPE ret;
|
DATA_TYPE ret;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, false,
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_rmw_pre(env, addr, info);
|
|
||||||
#if DATA_SIZE == 16
|
#if DATA_SIZE == 16
|
||||||
ret = atomic16_cmpxchg(haddr, cmpv, newv);
|
ret = atomic16_cmpxchg(haddr, cmpv, newv);
|
||||||
#else
|
#else
|
||||||
|
@ -99,10 +97,8 @@ ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ, retaddr);
|
PAGE_READ, retaddr);
|
||||||
DATA_TYPE val;
|
DATA_TYPE val;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, false,
|
uint16_t info = atomic_trace_ld_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_ld_pre(env, addr, info);
|
|
||||||
val = atomic16_read(haddr);
|
val = atomic16_read(haddr);
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_ld_post(env, addr, info);
|
atomic_trace_ld_post(env, addr, info);
|
||||||
|
@ -114,10 +110,8 @@ void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||||
{
|
{
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_WRITE, retaddr);
|
PAGE_WRITE, retaddr);
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, true,
|
uint16_t info = atomic_trace_st_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_st_pre(env, addr, info);
|
|
||||||
atomic16_set(haddr, val);
|
atomic16_set(haddr, val);
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_st_post(env, addr, info);
|
atomic_trace_st_post(env, addr, info);
|
||||||
|
@ -130,10 +124,8 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ | PAGE_WRITE, retaddr);
|
PAGE_READ | PAGE_WRITE, retaddr);
|
||||||
DATA_TYPE ret;
|
DATA_TYPE ret;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, false,
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_rmw_pre(env, addr, info);
|
|
||||||
ret = qatomic_xchg__nocheck(haddr, val);
|
ret = qatomic_xchg__nocheck(haddr, val);
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_rmw_post(env, addr, info);
|
atomic_trace_rmw_post(env, addr, info);
|
||||||
|
@ -147,9 +139,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||||
DATA_TYPE ret; \
|
DATA_TYPE ret; \
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, false, \
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
ATOMIC_MMU_IDX); \
|
|
||||||
atomic_trace_rmw_pre(env, addr, info); \
|
|
||||||
ret = qatomic_##X(haddr, val); \
|
ret = qatomic_##X(haddr, val); \
|
||||||
ATOMIC_MMU_CLEANUP; \
|
ATOMIC_MMU_CLEANUP; \
|
||||||
atomic_trace_rmw_post(env, addr, info); \
|
atomic_trace_rmw_post(env, addr, info); \
|
||||||
|
@ -182,9 +172,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||||
XDATA_TYPE cmp, old, new, val = xval; \
|
XDATA_TYPE cmp, old, new, val = xval; \
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, 0, false, \
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
ATOMIC_MMU_IDX); \
|
|
||||||
atomic_trace_rmw_pre(env, addr, info); \
|
|
||||||
smp_mb(); \
|
smp_mb(); \
|
||||||
cmp = qatomic_read__nocheck(haddr); \
|
cmp = qatomic_read__nocheck(haddr); \
|
||||||
do { \
|
do { \
|
||||||
|
@ -228,10 +216,8 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ | PAGE_WRITE, retaddr);
|
PAGE_READ | PAGE_WRITE, retaddr);
|
||||||
DATA_TYPE ret;
|
DATA_TYPE ret;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, false,
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_rmw_pre(env, addr, info);
|
|
||||||
#if DATA_SIZE == 16
|
#if DATA_SIZE == 16
|
||||||
ret = atomic16_cmpxchg(haddr, BSWAP(cmpv), BSWAP(newv));
|
ret = atomic16_cmpxchg(haddr, BSWAP(cmpv), BSWAP(newv));
|
||||||
#else
|
#else
|
||||||
|
@ -250,10 +236,8 @@ ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ, retaddr);
|
PAGE_READ, retaddr);
|
||||||
DATA_TYPE val;
|
DATA_TYPE val;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, false,
|
uint16_t info = atomic_trace_ld_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_ld_pre(env, addr, info);
|
|
||||||
val = atomic16_read(haddr);
|
val = atomic16_read(haddr);
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_ld_post(env, addr, info);
|
atomic_trace_ld_post(env, addr, info);
|
||||||
|
@ -265,11 +249,9 @@ void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||||
{
|
{
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_WRITE, retaddr);
|
PAGE_WRITE, retaddr);
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, true,
|
uint16_t info = atomic_trace_st_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
val = BSWAP(val);
|
val = BSWAP(val);
|
||||||
atomic_trace_st_pre(env, addr, info);
|
|
||||||
val = BSWAP(val);
|
val = BSWAP(val);
|
||||||
atomic16_set(haddr, val);
|
atomic16_set(haddr, val);
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
|
@ -283,10 +265,8 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||||
PAGE_READ | PAGE_WRITE, retaddr);
|
PAGE_READ | PAGE_WRITE, retaddr);
|
||||||
ABI_TYPE ret;
|
ABI_TYPE ret;
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, false,
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi);
|
||||||
ATOMIC_MMU_IDX);
|
|
||||||
|
|
||||||
atomic_trace_rmw_pre(env, addr, info);
|
|
||||||
ret = qatomic_xchg__nocheck(haddr, BSWAP(val));
|
ret = qatomic_xchg__nocheck(haddr, BSWAP(val));
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_rmw_post(env, addr, info);
|
atomic_trace_rmw_post(env, addr, info);
|
||||||
|
@ -300,9 +280,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||||
DATA_TYPE ret; \
|
DATA_TYPE ret; \
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, \
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
false, ATOMIC_MMU_IDX); \
|
|
||||||
atomic_trace_rmw_pre(env, addr, info); \
|
|
||||||
ret = qatomic_##X(haddr, BSWAP(val)); \
|
ret = qatomic_##X(haddr, BSWAP(val)); \
|
||||||
ATOMIC_MMU_CLEANUP; \
|
ATOMIC_MMU_CLEANUP; \
|
||||||
atomic_trace_rmw_post(env, addr, info); \
|
atomic_trace_rmw_post(env, addr, info); \
|
||||||
|
@ -332,9 +310,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||||
XDATA_TYPE ldo, ldn, old, new, val = xval; \
|
XDATA_TYPE ldo, ldn, old, new, val = xval; \
|
||||||
uint16_t info = trace_mem_build_info(SHIFT, false, MO_BSWAP, \
|
uint16_t info = atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
false, ATOMIC_MMU_IDX); \
|
|
||||||
atomic_trace_rmw_pre(env, addr, info); \
|
|
||||||
smp_mb(); \
|
smp_mb(); \
|
||||||
ldn = qatomic_read__nocheck(haddr); \
|
ldn = qatomic_read__nocheck(haddr); \
|
||||||
do { \
|
do { \
|
||||||
|
|
Loading…
Reference in New Issue