mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
accel/tcg: Pass MemOpIdx to atomic_trace_*_post
We will shortly use the MemOpIdx directly, but in the meantime re-compute the trace meminfo. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
b0702c91c6
commit
c3e83e376c
2 changed files with 39 additions and 39 deletions
|
@ -13,7 +13,7 @@
|
||||||
* See the COPYING file in the top-level directory.
|
* See the COPYING file in the top-level directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint16_t atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
|
||||||
MemOpIdx oi)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
CPUState *cpu = env_cpu(env);
|
CPUState *cpu = env_cpu(env);
|
||||||
|
@ -21,47 +21,47 @@ static uint16_t atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
|
||||||
|
|
||||||
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 void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
|
||||||
uint16_t info)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
|
uint16_t info = trace_mem_get_info(oi, false);
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAVE_ATOMIC128
|
#if HAVE_ATOMIC128
|
||||||
static uint16_t atomic_trace_ld_pre(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_ld_pre(CPUArchState *env, target_ulong addr,
|
||||||
MemOpIdx oi)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
uint16_t info = trace_mem_get_info(oi, false);
|
uint16_t info = trace_mem_get_info(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 void atomic_trace_ld_post(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_ld_post(CPUArchState *env, target_ulong addr,
|
||||||
uint16_t info)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
|
uint16_t info = trace_mem_get_info(oi, false);
|
||||||
|
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t atomic_trace_st_pre(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_st_pre(CPUArchState *env, target_ulong addr,
|
||||||
MemOpIdx oi)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
uint16_t info = trace_mem_get_info(oi, true);
|
uint16_t info = trace_mem_get_info(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 void atomic_trace_st_post(CPUArchState *env, target_ulong addr,
|
static void atomic_trace_st_post(CPUArchState *env, target_ulong addr,
|
||||||
uint16_t info)
|
MemOpIdx oi)
|
||||||
{
|
{
|
||||||
|
uint16_t info = trace_mem_get_info(oi, false);
|
||||||
|
|
||||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, info);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,15 +77,15 @@ 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 = atomic_trace_rmw_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_rmw_pre(env, addr, oi);
|
||||||
#if DATA_SIZE == 16
|
#if DATA_SIZE == 16
|
||||||
ret = atomic16_cmpxchg(haddr, cmpv, newv);
|
ret = atomic16_cmpxchg(haddr, cmpv, newv);
|
||||||
#else
|
#else
|
||||||
ret = qatomic_cmpxchg__nocheck(haddr, cmpv, newv);
|
ret = qatomic_cmpxchg__nocheck(haddr, cmpv, newv);
|
||||||
#endif
|
#endif
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_rmw_post(env, addr, info);
|
atomic_trace_rmw_post(env, addr, oi);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,11 +97,11 @@ 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 = atomic_trace_ld_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_ld_pre(env, addr, oi);
|
||||||
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, oi);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,11 +110,11 @@ 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 = atomic_trace_st_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_st_pre(env, addr, oi);
|
||||||
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, oi);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -124,11 +124,11 @@ 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 = atomic_trace_rmw_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_rmw_pre(env, addr, oi);
|
||||||
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, oi);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,10 +139,10 @@ 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 = atomic_trace_rmw_pre(env, addr, oi); \
|
atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
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, oi); \
|
||||||
return ret; \
|
return ret; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +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 = atomic_trace_rmw_pre(env, addr, oi); \
|
atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
smp_mb(); \
|
smp_mb(); \
|
||||||
cmp = qatomic_read__nocheck(haddr); \
|
cmp = qatomic_read__nocheck(haddr); \
|
||||||
do { \
|
do { \
|
||||||
|
@ -180,7 +180,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
cmp = qatomic_cmpxchg__nocheck(haddr, old, new); \
|
cmp = qatomic_cmpxchg__nocheck(haddr, old, new); \
|
||||||
} while (cmp != old); \
|
} while (cmp != old); \
|
||||||
ATOMIC_MMU_CLEANUP; \
|
ATOMIC_MMU_CLEANUP; \
|
||||||
atomic_trace_rmw_post(env, addr, info); \
|
atomic_trace_rmw_post(env, addr, oi); \
|
||||||
return RET; \
|
return RET; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,15 +216,15 @@ 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 = atomic_trace_rmw_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_rmw_pre(env, addr, oi);
|
||||||
#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
|
||||||
ret = qatomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv));
|
ret = qatomic_cmpxchg__nocheck(haddr, BSWAP(cmpv), BSWAP(newv));
|
||||||
#endif
|
#endif
|
||||||
ATOMIC_MMU_CLEANUP;
|
ATOMIC_MMU_CLEANUP;
|
||||||
atomic_trace_rmw_post(env, addr, info);
|
atomic_trace_rmw_post(env, addr, oi);
|
||||||
return BSWAP(ret);
|
return BSWAP(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,11 +236,11 @@ 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 = atomic_trace_ld_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_ld_pre(env, addr, oi);
|
||||||
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, oi);
|
||||||
return BSWAP(val);
|
return BSWAP(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,12 +249,12 @@ 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 = atomic_trace_st_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_st_pre(env, addr, oi);
|
||||||
val = BSWAP(val);
|
val = BSWAP(val);
|
||||||
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, oi);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -264,11 +264,11 @@ 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 = atomic_trace_rmw_pre(env, addr, oi);
|
|
||||||
|
|
||||||
|
atomic_trace_rmw_pre(env, addr, oi);
|
||||||
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, oi);
|
||||||
return BSWAP(ret);
|
return BSWAP(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,10 +279,10 @@ 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 = atomic_trace_rmw_pre(env, addr, oi); \
|
atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
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, oi); \
|
||||||
return BSWAP(ret); \
|
return BSWAP(ret); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +309,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 = atomic_trace_rmw_pre(env, addr, oi); \
|
atomic_trace_rmw_pre(env, addr, oi); \
|
||||||
smp_mb(); \
|
smp_mb(); \
|
||||||
ldn = qatomic_read__nocheck(haddr); \
|
ldn = qatomic_read__nocheck(haddr); \
|
||||||
do { \
|
do { \
|
||||||
|
@ -317,7 +317,7 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||||
ldn = qatomic_cmpxchg__nocheck(haddr, ldo, BSWAP(new)); \
|
ldn = qatomic_cmpxchg__nocheck(haddr, ldo, BSWAP(new)); \
|
||||||
} while (ldo != ldn); \
|
} while (ldo != ldn); \
|
||||||
ATOMIC_MMU_CLEANUP; \
|
ATOMIC_MMU_CLEANUP; \
|
||||||
atomic_trace_rmw_post(env, addr, info); \
|
atomic_trace_rmw_post(env, addr, oi); \
|
||||||
return RET; \
|
return RET; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue