Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion include/exec/cpu_ldst.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@

/* The memory helpers for tcg-generated code need tcg_target_long etc. */
#include "tcg.h"

#define PANDA_DO_CBS_DATA_ACCESS
#ifdef MMU_MODE0_SUFFIX
#define CPU_MMU_INDEX 0
#define MEMSUFFIX MMU_MODE0_SUFFIX
Expand Down Expand Up @@ -359,6 +359,7 @@
#include "exec/cpu_ldst_template.h"
#undef CPU_MMU_INDEX
#undef MEMSUFFIX
#undef PANDA_DO_CBS_DATA_ACCESS

#define CPU_MMU_INDEX (cpu_mmu_index(env, true))
#define MEMSUFFIX _code
Expand Down
48 changes: 48 additions & 0 deletions include/exec/cpu_ldst_template.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,21 @@
#define SRETSUFFIX glue(s, SUFFIX)
#endif

#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
extern bool panda_use_memcb;
#endif

#ifndef MEM_CBS_REFERENCED
#define MEM_CBS_REFERENCED
#define target_ptr_t target_ulong
extern void panda_callbacks_mem_before_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, void *ram_ptr);
extern void panda_callbacks_mem_after_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t result, void *ram_ptr);
extern void panda_callbacks_mem_before_write(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t val, void *ram_ptr);
extern void panda_callbacks_mem_after_write(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t val, void *ram_ptr);
#endif


/* generic load/store macros */

static inline RES_TYPE
Expand Down Expand Up @@ -103,7 +118,18 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
oi, retaddr);
} else {
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
#if defined(PANDA_DO_CBS_DATA_ACCESS)
if (likely(!panda_use_memcb)){
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
}else{
CPUState *cpu = ENV_GET_CPU(env);
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)hostaddr);
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)res, (void *)hostaddr);
}
#else
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
#endif
}
return res;
}
Expand Down Expand Up @@ -141,7 +167,18 @@ glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
MMUSUFFIX)(env, addr, oi, retaddr);
} else {
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
#if defined(PANDA_DO_CBS_DATA_ACCESS)
if (likely(!panda_use_memcb)){
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
}else{
CPUState *cpu = ENV_GET_CPU(env);
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)hostaddr);
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)res, (void *)hostaddr);
}
#else
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
#endif
}
return res;
}
Expand Down Expand Up @@ -183,7 +220,18 @@ glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
retaddr);
} else {
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
#if defined(PANDA_DO_CBS_DATA_ACCESS)
if (likely(!panda_use_memcb)){
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
}else{
CPUState *cpu = ENV_GET_CPU(env);
panda_callbacks_mem_before_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)v, (void *)hostaddr);
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
panda_callbacks_mem_after_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)v, (void *)hostaddr);
}
#else
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
#endif
}
}

Expand Down
4 changes: 4 additions & 0 deletions panda/include/panda/callbacks/cb-support.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,15 @@ exit 0
// If this file is included from a file that doesn't define TranslationBlock (e.g., memory.c), we still need to be valid
typedef struct {} TranslationBlock;
#endif

#ifndef MEM_CBS_REFERENCED
#define MEM_CBS_REFERENCED
/* shared helpers for virtual/physical memory callbacks */
void panda_callbacks_mem_before_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, void *ram_ptr);
void panda_callbacks_mem_after_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t result, void *ram_ptr);
void panda_callbacks_mem_before_write(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t val, void *ram_ptr);
void panda_callbacks_mem_after_write(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, uint64_t val, void *ram_ptr);
#endif

/* invoked from cpu-exec.c */
void panda_callbacks_before_find_fast(void);
Expand Down
17 changes: 16 additions & 1 deletion panda/include/panda/plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,22 @@ PANDAENDCOMMENT */
extern "C" {
#endif

#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
extern bool panda_use_memcb;
#endif

#if 0
// BEGIN_PYPANDA_NEEDS_THIS -- do not delete this comment bc pypanda
// api autogen needs it. And don't put any compiler directives
// between this and END_PYPANDA_NEEDS_THIS except includes of other
// files in this directory that contain subsections like this one.

extern bool panda_use_memcb;

// END_PYPANDA_NEEDS_THIS -- do not delete this comment!
#endif

// BEGIN_PYPANDA_NEEDS_THIS -- do not delete this comment bc pypanda
// api autogen needs it. And don't put any compiler directives
// between this and END_PYPANDA_NEEDS_THIS except includes of other
Expand Down Expand Up @@ -74,7 +90,6 @@ void panda_unload_plugin_idx(int idx);
void panda_unload_plugins(void);

extern bool panda_update_pc;
extern bool panda_use_memcb;
extern panda_cb_list *panda_cbs[PANDA_CB_LAST];
extern bool panda_plugins_to_unload[MAX_PANDA_PLUGINS];
extern bool panda_plugin_to_unload;
Expand Down
99 changes: 79 additions & 20 deletions softmmu_template.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
#error unsupported data size
#endif

#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
extern bool panda_use_memcb;
#endif

/* For the benefit of TCG generated code, we want to avoid the complication
of ABI-specific return type promotion and always return a value extended
Expand Down Expand Up @@ -105,7 +109,7 @@ static inline DATA_TYPE glue(io_read, SUFFIX)(CPUArchState *env,
}
#endif

WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
static inline WORD_TYPE glue(helper_le_ld_name,_internal)(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
unsigned mmu_idx = get_mmuidx(oi);
Expand Down Expand Up @@ -153,8 +157,8 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
do_unaligned_access:
addr1 = addr & ~(DATA_SIZE - 1);
addr2 = addr1 + DATA_SIZE;
res1 = helper_le_ld_name(env, addr1, oi, retaddr);
res2 = helper_le_ld_name(env, addr2, oi, retaddr);
res1 = glue(helper_le_ld_name,_internal)(env, addr1, oi, retaddr);
res2 = glue(helper_le_ld_name,_internal)(env, addr2, oi, retaddr);
shift = (addr & (DATA_SIZE - 1)) * 8;

/* Little-endian combine. */
Expand All @@ -173,7 +177,8 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
}

#if DATA_SIZE > 1
WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,

static inline WORD_TYPE glue(helper_be_ld_name,_internal)(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
unsigned mmu_idx = get_mmuidx(oi);
Expand Down Expand Up @@ -221,8 +226,8 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
do_unaligned_access:
addr1 = addr & ~(DATA_SIZE - 1);
addr2 = addr1 + DATA_SIZE;
res1 = helper_be_ld_name(env, addr1, oi, retaddr);
res2 = helper_be_ld_name(env, addr2, oi, retaddr);
res1 = glue(helper_be_ld_name,_internal)(env, addr1, oi, retaddr);
res2 = glue(helper_be_ld_name,_internal)(env, addr2, oi, retaddr);
shift = (addr & (DATA_SIZE - 1)) * 8;

/* Big-endian combine. */
Expand Down Expand Up @@ -266,7 +271,7 @@ static inline void glue(io_write, SUFFIX)(CPUArchState *env,
return io_writex(env, iotlbentry, val, addr, retaddr, DATA_SIZE);
}

void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
static inline void glue(helper_le_st_name,_internal)(CPUArchState *env, target_ulong addr, DATA_TYPE val,
TCGMemOpIdx oi, uintptr_t retaddr)
{
unsigned mmu_idx = get_mmuidx(oi);
Expand Down Expand Up @@ -327,7 +332,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
for (i = 0; i < DATA_SIZE; ++i) {
/* Little-endian extract. */
uint8_t val8 = val >> (i * 8);
glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8,
glue(glue(helper_ret_stb, MMUSUFFIX),_internal)(env, addr + i, val8,
oi, retaddr);
}
return;
Expand All @@ -342,7 +347,8 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
}

#if DATA_SIZE > 1
void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
static inline void glue(helper_be_st_name, _internal)(CPUArchState *env, target_ulong addr,
DATA_TYPE val,
TCGMemOpIdx oi, uintptr_t retaddr)
{
unsigned mmu_idx = get_mmuidx(oi);
Expand Down Expand Up @@ -403,7 +409,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
for (i = 0; i < DATA_SIZE; ++i) {
/* Big-endian extract. */
uint8_t val8 = val >> (((DATA_SIZE - 1) * 8) - (i * 8));
glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8,
glue(glue(helper_ret_stb, MMUSUFFIX),_internal)(env, addr + i, val8,
oi, retaddr);
}
return;
Expand All @@ -414,9 +420,12 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
}
#endif /* DATA_SIZE > 1 */

WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
if (likely(!panda_use_memcb)){
return glue(helper_le_ld_name, _internal)(env, addr, oi, retaddr);
}
unsigned mmu_idx = get_mmuidx(oi);
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_read;
Expand All @@ -437,15 +446,25 @@ WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
}

panda_callbacks_mem_before_read(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (void *)haddr);
WORD_TYPE ret = helper_le_ld_name(env, addr, oi, retaddr);
WORD_TYPE ret = glue(helper_le_ld_name, _internal)(env, addr, oi, retaddr);
panda_callbacks_mem_after_read(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)ret, (void *)haddr);
return ret;
}

void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
return helper_le_ld_name(env, addr, oi, retaddr);
}

void helper_le_st_name(CPUArchState *env, target_ulong addr,
DATA_TYPE val, TCGMemOpIdx oi,
uintptr_t retaddr)
{
if (likely(!panda_use_memcb)){
glue(helper_le_st_name,_internal)(env, addr, val, oi, retaddr);
return;
}
unsigned mmu_idx = get_mmuidx(oi);
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
Expand All @@ -466,14 +485,23 @@ void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
}

panda_callbacks_mem_before_write(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
helper_le_st_name(env, addr, val, oi, retaddr);
glue(helper_le_st_name, _internal)(env, addr, val, oi, retaddr);
panda_callbacks_mem_after_write(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
}

void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
DATA_TYPE val, TCGMemOpIdx oi,
uintptr_t retaddr){
return helper_le_st_name(env, addr, val, oi, retaddr);
}

#if DATA_SIZE > 1
WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
if (likely(!panda_use_memcb)){
return glue(helper_be_ld_name,_internal)(env, addr, oi, retaddr);
}
unsigned mmu_idx = get_mmuidx(oi);
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_read;
Expand All @@ -494,15 +522,24 @@ WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
}

panda_callbacks_mem_before_read(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (void *)haddr);
WORD_TYPE ret = helper_be_ld_name(env, addr, oi, retaddr);
WORD_TYPE ret = glue(helper_be_ld_name, _internal)(env, addr, oi, retaddr);
panda_callbacks_mem_after_read(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)ret, (void *)haddr);
return ret;
}

void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
DATA_TYPE val, TCGMemOpIdx oi,
uintptr_t retaddr)
WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
return helper_be_ld_name(env, addr, oi, retaddr);
}

void helper_be_st_name(CPUArchState *env, target_ulong addr,
DATA_TYPE val, TCGMemOpIdx oi,
uintptr_t retaddr){
if (likely(!panda_use_memcb)){
glue(helper_be_st_name,_internal)(env, addr, val, oi, retaddr);
return;
}
unsigned mmu_idx = get_mmuidx(oi);
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
Expand All @@ -523,11 +560,33 @@ void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
}

panda_callbacks_mem_before_write(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
helper_be_st_name(env, addr, val, oi, retaddr);
glue(helper_be_st_name, _internal)(env, addr, val, oi, retaddr);
panda_callbacks_mem_after_write(cpu, panda_current_pc(cpu), addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
}

void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
DATA_TYPE val, TCGMemOpIdx oi,
uintptr_t retaddr){
return helper_be_st_name(env, addr, val, oi, retaddr);
}

#endif /* DATA_SIZE > 1 */
#else
WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
return glue(helper_le_ld_name,_internal)(env, addr, oi, retaddr);
}

#if DATA_SIZE > 1

WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
TCGMemOpIdx oi, uintptr_t retaddr)
{
return glue(helper_be_ld_name,_internal)(env, addr, oi, retaddr);
}

#endif
#endif /* !defined(SOFTMMU_CODE_ACCESS) */

#undef READ_ACCESS_TYPE
Expand Down
Loading