Skip to content

Commit 3747f31

Browse files
committed
change up softmmu model
1 parent a28e40b commit 3747f31

File tree

6 files changed

+139
-45
lines changed

6 files changed

+139
-45
lines changed

include/exec/cpu_ldst.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112

113113
/* The memory helpers for tcg-generated code need tcg_target_long etc. */
114114
#include "tcg.h"
115-
115+
#define PANDA_DO_CBS_DATA_ACCESS
116116
#ifdef MMU_MODE0_SUFFIX
117117
#define CPU_MMU_INDEX 0
118118
#define MEMSUFFIX MMU_MODE0_SUFFIX
@@ -359,6 +359,7 @@
359359
#include "exec/cpu_ldst_template.h"
360360
#undef CPU_MMU_INDEX
361361
#undef MEMSUFFIX
362+
#undef PANDA_DO_CBS_DATA_ACCESS
362363

363364
#define CPU_MMU_INDEX (cpu_mmu_index(env, true))
364365
#define MEMSUFFIX _code

include/exec/cpu_ldst_template.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,21 @@
7474
#define SRETSUFFIX glue(s, SUFFIX)
7575
#endif
7676

77+
#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
78+
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
79+
extern bool panda_use_memcb;
80+
#endif
81+
82+
#ifndef MEM_CBS_REFERENCED
83+
#define MEM_CBS_REFERENCED
84+
#define target_ptr_t target_ulong
85+
extern void panda_callbacks_mem_before_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, void *ram_ptr);
86+
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);
87+
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);
88+
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);
89+
#endif
90+
91+
7792
/* generic load/store macros */
7893

7994
static inline RES_TYPE
@@ -103,7 +118,18 @@ glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
103118
oi, retaddr);
104119
} else {
105120
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
121+
#if defined(PANDA_DO_CBS_DATA_ACCESS)
122+
if (likely(!panda_use_memcb)){
123+
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
124+
}else{
125+
CPUState *cpu = ENV_GET_CPU(env);
126+
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)hostaddr);
127+
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
128+
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)res, (void *)hostaddr);
129+
}
130+
#else
106131
res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
132+
#endif
107133
}
108134
return res;
109135
}
@@ -141,7 +167,18 @@ glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
141167
MMUSUFFIX)(env, addr, oi, retaddr);
142168
} else {
143169
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
170+
#if defined(PANDA_DO_CBS_DATA_ACCESS)
171+
if (likely(!panda_use_memcb)){
172+
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
173+
}else{
174+
CPUState *cpu = ENV_GET_CPU(env);
175+
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)hostaddr);
176+
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
177+
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)res, (void *)hostaddr);
178+
}
179+
#else
144180
res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
181+
#endif
145182
}
146183
return res;
147184
}
@@ -183,7 +220,18 @@ glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
183220
retaddr);
184221
} else {
185222
uintptr_t hostaddr = addr + env->tlb_table[mmu_idx][page_index].addend;
223+
#if defined(PANDA_DO_CBS_DATA_ACCESS)
224+
if (likely(!panda_use_memcb)){
225+
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
226+
}else{
227+
CPUState *cpu = ENV_GET_CPU(env);
228+
panda_callbacks_mem_before_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)v, (void *)hostaddr);
229+
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
230+
panda_callbacks_mem_after_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)v, (void *)hostaddr);
231+
}
232+
#else
186233
glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
234+
#endif
187235
}
188236
}
189237

panda/include/panda/callbacks/cb-support.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,15 @@ exit 0
5757
// If this file is included from a file that doesn't define TranslationBlock (e.g., memory.c), we still need to be valid
5858
typedef struct {} TranslationBlock;
5959
#endif
60+
61+
#ifndef MEM_CBS_REFERENCED
62+
#define MEM_CBS_REFERENCED
6063
/* shared helpers for virtual/physical memory callbacks */
6164
void panda_callbacks_mem_before_read(CPUState *env, target_ptr_t pc, target_ptr_t addr, size_t data_size, void *ram_ptr);
6265
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);
6366
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);
6467
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);
68+
#endif
6569

6670
/* invoked from cpu-exec.c */
6771
void panda_callbacks_before_find_fast(void);

panda/include/panda/plugin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ void panda_unload_plugin_idx(int idx);
7474
void panda_unload_plugins(void);
7575

7676
extern bool panda_update_pc;
77+
#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
78+
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
7779
extern bool panda_use_memcb;
80+
#endif
7881
extern panda_cb_list *panda_cbs[PANDA_CB_LAST];
7982
extern bool panda_plugins_to_unload[MAX_PANDA_PLUGINS];
8083
extern bool panda_plugin_to_unload;

softmmu_template.h

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@
4545
#error unsupported data size
4646
#endif
4747

48+
#ifndef CONFIG_SOFTMMU_EXTERN_VAR_ONCE
49+
#define CONFIG_SOFTMMU_EXTERN_VAR_ONCE
50+
extern bool panda_use_memcb;
51+
#endif
4852

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

108-
WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
112+
static inline WORD_TYPE glue(helper_le_ld_name,_internal)(CPUArchState *env, target_ulong addr,
109113
TCGMemOpIdx oi, uintptr_t retaddr)
110114
{
111115
unsigned mmu_idx = get_mmuidx(oi);
@@ -153,8 +157,8 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
153157
do_unaligned_access:
154158
addr1 = addr & ~(DATA_SIZE - 1);
155159
addr2 = addr1 + DATA_SIZE;
156-
res1 = helper_le_ld_name(env, addr1, oi, retaddr);
157-
res2 = helper_le_ld_name(env, addr2, oi, retaddr);
160+
res1 = glue(helper_le_ld_name,_internal)(env, addr1, oi, retaddr);
161+
res2 = glue(helper_le_ld_name,_internal)(env, addr2, oi, retaddr);
158162
shift = (addr & (DATA_SIZE - 1)) * 8;
159163

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

175179
#if DATA_SIZE > 1
176-
WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
180+
181+
static inline WORD_TYPE glue(helper_be_ld_name,_internal)(CPUArchState *env, target_ulong addr,
177182
TCGMemOpIdx oi, uintptr_t retaddr)
178183
{
179184
unsigned mmu_idx = get_mmuidx(oi);
@@ -221,8 +226,8 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
221226
do_unaligned_access:
222227
addr1 = addr & ~(DATA_SIZE - 1);
223228
addr2 = addr1 + DATA_SIZE;
224-
res1 = helper_be_ld_name(env, addr1, oi, retaddr);
225-
res2 = helper_be_ld_name(env, addr2, oi, retaddr);
229+
res1 = glue(helper_be_ld_name,_internal)(env, addr1, oi, retaddr);
230+
res2 = glue(helper_be_ld_name,_internal)(env, addr2, oi, retaddr);
226231
shift = (addr & (DATA_SIZE - 1)) * 8;
227232

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

269-
void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
274+
static inline void glue(helper_le_st_name,_internal)(CPUArchState *env, target_ulong addr, DATA_TYPE val,
270275
TCGMemOpIdx oi, uintptr_t retaddr)
271276
{
272277
unsigned mmu_idx = get_mmuidx(oi);
@@ -327,7 +332,7 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
327332
for (i = 0; i < DATA_SIZE; ++i) {
328333
/* Little-endian extract. */
329334
uint8_t val8 = val >> (i * 8);
330-
glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8,
335+
glue(glue(helper_ret_stb, MMUSUFFIX),_internal)(env, addr + i, val8,
331336
oi, retaddr);
332337
}
333338
return;
@@ -342,7 +347,8 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
342347
}
343348

344349
#if DATA_SIZE > 1
345-
void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
350+
static inline void glue(helper_be_st_name, _internal)(CPUArchState *env, target_ulong addr,
351+
DATA_TYPE val,
346352
TCGMemOpIdx oi, uintptr_t retaddr)
347353
{
348354
unsigned mmu_idx = get_mmuidx(oi);
@@ -403,7 +409,7 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
403409
for (i = 0; i < DATA_SIZE; ++i) {
404410
/* Big-endian extract. */
405411
uint8_t val8 = val >> (((DATA_SIZE - 1) * 8) - (i * 8));
406-
glue(helper_ret_stb, MMUSUFFIX)(env, addr + i, val8,
412+
glue(glue(helper_ret_stb, MMUSUFFIX),_internal)(env, addr + i, val8,
407413
oi, retaddr);
408414
}
409415
return;
@@ -414,9 +420,12 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
414420
}
415421
#endif /* DATA_SIZE > 1 */
416422

417-
WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
423+
WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
418424
TCGMemOpIdx oi, uintptr_t retaddr)
419425
{
426+
if (likely(!panda_use_memcb)){
427+
return glue(helper_le_ld_name,_internal)(env, addr, oi, retaddr);
428+
}
420429
unsigned mmu_idx = get_mmuidx(oi);
421430
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
422431
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_read;
@@ -437,15 +446,25 @@ WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
437446
}
438447

439448
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)haddr);
440-
WORD_TYPE ret = helper_le_ld_name(env, addr, oi, retaddr);
449+
WORD_TYPE ret = glue(helper_le_ld_name,_internal)(env, addr, oi, retaddr);
441450
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)ret, (void *)haddr);
442451
return ret;
443452
}
444453

445-
void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
454+
WORD_TYPE glue(helper_le_ld_name, _panda)(CPUArchState *env, target_ulong addr,
455+
TCGMemOpIdx oi, uintptr_t retaddr)
456+
{
457+
return helper_le_ld_name(env, addr, oi, retaddr);
458+
}
459+
460+
void helper_le_st_name(CPUArchState *env, target_ulong addr,
446461
DATA_TYPE val, TCGMemOpIdx oi,
447462
uintptr_t retaddr)
448463
{
464+
if (likely(!panda_use_memcb)){
465+
glue(helper_le_st_name,_internal)(env, addr, val, oi, retaddr);
466+
return;
467+
}
449468
unsigned mmu_idx = get_mmuidx(oi);
450469
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
451470
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
@@ -466,14 +485,23 @@ void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
466485
}
467486

468487
panda_callbacks_mem_before_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
469-
helper_le_st_name(env, addr, val, oi, retaddr);
488+
glue(helper_le_st_name,_internal)(env, addr, val, oi, retaddr);
470489
panda_callbacks_mem_after_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
471490
}
472491

492+
void glue(helper_le_st_name, _panda)(CPUArchState *env, target_ulong addr,
493+
DATA_TYPE val, TCGMemOpIdx oi,
494+
uintptr_t retaddr){
495+
return helper_le_st_name(env, addr, val, oi, retaddr);
496+
}
497+
473498
#if DATA_SIZE > 1
474-
WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
499+
WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
475500
TCGMemOpIdx oi, uintptr_t retaddr)
476501
{
502+
if (likely(!panda_use_memcb)){
503+
return glue(helper_be_ld_name,_internal)(env, addr, oi, retaddr);
504+
}
477505
unsigned mmu_idx = get_mmuidx(oi);
478506
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
479507
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_read;
@@ -494,15 +522,24 @@ WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
494522
}
495523

496524
panda_callbacks_mem_before_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (void *)haddr);
497-
WORD_TYPE ret = helper_be_ld_name(env, addr, oi, retaddr);
525+
WORD_TYPE ret = glue(helper_be_ld_name,_internal)(env, addr, oi, retaddr);
498526
panda_callbacks_mem_after_read(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)ret, (void *)haddr);
499527
return ret;
500528
}
501529

502-
void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
503-
DATA_TYPE val, TCGMemOpIdx oi,
504-
uintptr_t retaddr)
530+
WORD_TYPE glue(helper_be_ld_name, _panda)(CPUArchState *env, target_ulong addr,
531+
TCGMemOpIdx oi, uintptr_t retaddr)
505532
{
533+
return helper_be_ld_name(env, addr, oi, retaddr);
534+
}
535+
536+
void helper_be_st_name(CPUArchState *env, target_ulong addr,
537+
DATA_TYPE val, TCGMemOpIdx oi,
538+
uintptr_t retaddr){
539+
if (likely(!panda_use_memcb)){
540+
glue(helper_be_st_name,_internal)(env, addr, val, oi, retaddr);
541+
return;
542+
}
506543
unsigned mmu_idx = get_mmuidx(oi);
507544
int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
508545
target_ulong tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
@@ -523,11 +560,33 @@ void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
523560
}
524561

525562
panda_callbacks_mem_before_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
526-
helper_be_st_name(env, addr, val, oi, retaddr);
563+
glue(helper_be_st_name,_internal)(env, addr, val, oi, retaddr);
527564
panda_callbacks_mem_after_write(cpu, cpu->panda_guest_pc, addr, DATA_SIZE, (uint64_t)val, (void *)haddr);
528565
}
529566

567+
void glue(helper_be_st_name, _panda)(CPUArchState *env, target_ulong addr,
568+
DATA_TYPE val, TCGMemOpIdx oi,
569+
uintptr_t retaddr){
570+
return helper_be_st_name(env, addr, val, oi, retaddr);
571+
}
572+
530573
#endif /* DATA_SIZE > 1 */
574+
#else
575+
WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr,
576+
TCGMemOpIdx oi, uintptr_t retaddr)
577+
{
578+
return glue(helper_le_ld_name,_internal)(env, addr, oi, retaddr);
579+
}
580+
581+
#if DATA_SIZE > 1
582+
583+
WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr,
584+
TCGMemOpIdx oi, uintptr_t retaddr)
585+
{
586+
return glue(helper_be_ld_name,_internal)(env, addr, oi, retaddr);
587+
}
588+
589+
#endif
531590
#endif /* !defined(SOFTMMU_CODE_ACCESS) */
532591

533592
#undef READ_ACCESS_TYPE

tcg/i386/tcg-target.inc.c

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,7 @@ extern bool panda_use_memcb;
12201220
* int mmu_idx, uintptr_t ra)
12211221
*/
12221222

1223-
static void * const qemu_ld_helpers_normal[16] = {
1223+
static void * const qemu_ld_helpers[16] = {
12241224
[MO_UB] = helper_ret_ldub_mmu,
12251225
[MO_LEUW] = helper_le_lduw_mmu,
12261226
[MO_LEUL] = helper_le_ldul_mmu,
@@ -1229,23 +1229,13 @@ static void * const qemu_ld_helpers_normal[16] = {
12291229
[MO_BEUL] = helper_be_ldul_mmu,
12301230
[MO_BEQ] = helper_be_ldq_mmu,
12311231
};
1232-
static void * const qemu_ld_helpers_panda[16] = {
1233-
[MO_UB] = helper_ret_ldub_mmu_panda,
1234-
[MO_LEUW] = helper_le_lduw_mmu_panda,
1235-
[MO_LEUL] = helper_le_ldul_mmu_panda,
1236-
[MO_LEQ] = helper_le_ldq_mmu_panda,
1237-
[MO_BEUW] = helper_be_lduw_mmu_panda,
1238-
[MO_BEUL] = helper_be_ldul_mmu_panda,
1239-
[MO_BEQ] = helper_be_ldq_mmu_panda,
1240-
};
1241-
#define qemu_ld_helpers \
1242-
(panda_use_memcb ? qemu_ld_helpers_panda : qemu_ld_helpers_normal)
1232+
12431233

12441234
/* helper signature: helper_ret_st_mmu(CPUState *env, target_ulong addr,
12451235
* uintxx_t val, int mmu_idx, uintptr_t ra)
12461236
*/
12471237

1248-
static void * const qemu_st_helpers_normal[16] = {
1238+
static void * const qemu_st_helpers[16] = {
12491239
[MO_UB] = helper_ret_stb_mmu,
12501240
[MO_LEUW] = helper_le_stw_mmu,
12511241
[MO_LEUL] = helper_le_stl_mmu,
@@ -1254,17 +1244,6 @@ static void * const qemu_st_helpers_normal[16] = {
12541244
[MO_BEUL] = helper_be_stl_mmu,
12551245
[MO_BEQ] = helper_be_stq_mmu,
12561246
};
1257-
static void * const qemu_st_helpers_panda[16] = {
1258-
[MO_UB] = helper_ret_stb_mmu_panda,
1259-
[MO_LEUW] = helper_le_stw_mmu_panda,
1260-
[MO_LEUL] = helper_le_stl_mmu_panda,
1261-
[MO_LEQ] = helper_le_stq_mmu_panda,
1262-
[MO_BEUW] = helper_be_stw_mmu_panda,
1263-
[MO_BEUL] = helper_be_stl_mmu_panda,
1264-
[MO_BEQ] = helper_be_stq_mmu_panda,
1265-
};
1266-
#define qemu_st_helpers \
1267-
(panda_use_memcb ? qemu_st_helpers_panda : qemu_st_helpers_normal)
12681247

12691248
/* Perform the TLB load and compare.
12701249

0 commit comments

Comments
 (0)