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
0 commit comments