mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
tcg: let plugins instrument virtual memory accesses
To capture all memory accesses we need hook into all the various helper functions that are involved in memory operations as well as the injected inline helper calls. A later commit will allow us to resolve the actual guest HW addresses by replaying the lookup. Signed-off-by: Emilio G. Cota <cota@braap.org> [AJB: drop haddr handling, just deal in vaddr] Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cfec388518
commit
e6d86bed50
8 changed files with 74 additions and 36 deletions
|
@ -214,6 +214,7 @@ typedef struct CPUTLBCommon {
|
|||
* Since this is placed within CPUNegativeOffsetState, the smallest
|
||||
* negative offsets are at the end of the struct.
|
||||
*/
|
||||
|
||||
typedef struct CPUTLB {
|
||||
CPUTLBCommon c;
|
||||
CPUTLBDesc d[NB_MMU_MODES];
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "trace-root.h"
|
||||
#endif
|
||||
|
||||
#include "qemu/plugin.h"
|
||||
#include "trace/mem.h"
|
||||
|
||||
#if DATA_SIZE == 8
|
||||
|
@ -86,11 +87,9 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
target_ulong addr;
|
||||
int mmu_idx = CPU_MMU_INDEX;
|
||||
TCGMemOpIdx oi;
|
||||
|
||||
#if !defined(SOFTMMU_CODE_ACCESS)
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, false, MO_TE, false, mmu_idx));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, false, MO_TE, false, mmu_idx);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
|
||||
addr = ptr;
|
||||
|
@ -104,6 +103,9 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
uintptr_t hostaddr = addr + entry->addend;
|
||||
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
|
||||
}
|
||||
#ifndef SOFTMMU_CODE_ACCESS
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -124,11 +126,9 @@ glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
target_ulong addr;
|
||||
int mmu_idx = CPU_MMU_INDEX;
|
||||
TCGMemOpIdx oi;
|
||||
|
||||
#if !defined(SOFTMMU_CODE_ACCESS)
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, true, MO_TE, false, mmu_idx));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, true, MO_TE, false, mmu_idx);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
|
||||
addr = ptr;
|
||||
|
@ -142,6 +142,9 @@ glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
uintptr_t hostaddr = addr + entry->addend;
|
||||
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
|
||||
}
|
||||
#ifndef SOFTMMU_CODE_ACCESS
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -165,11 +168,9 @@ glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
target_ulong addr;
|
||||
int mmu_idx = CPU_MMU_INDEX;
|
||||
TCGMemOpIdx oi;
|
||||
|
||||
#if !defined(SOFTMMU_CODE_ACCESS)
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, false, MO_TE, true, mmu_idx));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, false, MO_TE, true, mmu_idx);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
|
||||
addr = ptr;
|
||||
|
@ -183,6 +184,9 @@ glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
uintptr_t hostaddr = addr + entry->addend;
|
||||
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
|
||||
}
|
||||
#ifndef SOFTMMU_CODE_ACCESS
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -64,18 +64,18 @@
|
|||
static inline RES_TYPE
|
||||
glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
|
||||
{
|
||||
#ifdef CODE_ACCESS
|
||||
RES_TYPE ret;
|
||||
#ifdef CODE_ACCESS
|
||||
set_helper_retaddr(1);
|
||||
ret = glue(glue(ld, USUFFIX), _p)(g2h(ptr));
|
||||
clear_helper_retaddr();
|
||||
return ret;
|
||||
#else
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, false, MO_TE, false, MMU_USER_IDX));
|
||||
return glue(glue(ld, USUFFIX), _p)(g2h(ptr));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, false, MO_TE, false,
|
||||
MMU_USER_IDX);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
ret = glue(glue(ld, USUFFIX), _p)(g2h(ptr));
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifndef CODE_ACCESS
|
||||
|
@ -96,18 +96,19 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
|
|||
static inline int
|
||||
glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr)
|
||||
{
|
||||
#ifdef CODE_ACCESS
|
||||
int ret;
|
||||
#ifdef CODE_ACCESS
|
||||
set_helper_retaddr(1);
|
||||
ret = glue(glue(lds, SUFFIX), _p)(g2h(ptr));
|
||||
clear_helper_retaddr();
|
||||
return ret;
|
||||
#else
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, true, MO_TE, false, MMU_USER_IDX));
|
||||
return glue(glue(lds, SUFFIX), _p)(g2h(ptr));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, true, MO_TE, false,
|
||||
MMU_USER_IDX);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
ret = glue(glue(lds, SUFFIX), _p)(g2h(ptr));
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifndef CODE_ACCESS
|
||||
|
@ -130,10 +131,11 @@ static inline void
|
|||
glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, abi_ptr ptr,
|
||||
RES_TYPE v)
|
||||
{
|
||||
trace_guest_mem_before_exec(
|
||||
env_cpu(env), ptr,
|
||||
trace_mem_build_info(SHIFT, false, MO_TE, true, MMU_USER_IDX));
|
||||
uint16_t meminfo = trace_mem_build_info(SHIFT, false, MO_TE, true,
|
||||
MMU_USER_IDX);
|
||||
trace_guest_mem_before_exec(env_cpu(env), ptr, meminfo);
|
||||
glue(glue(st, SUFFIX), _p)(g2h(ptr), v);
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), ptr, meminfo);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue