diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-30 14:02:28 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-30 14:02:28 +0100 |
| commit | 51aa4b0416fbd9e960b5699dde5f573d89b54ae4 (patch) | |
| tree | ceabba3bcf4e3a9ffe080fa8063563bd30016cf9 /src | |
| parent | b0db168fb57dd63e101c99b8c728aff9039a23bc (diff) | |
| download | box64-51aa4b0416fbd9e960b5699dde5f573d89b54ae4.tar.gz box64-51aa4b0416fbd9e960b5699dde5f573d89b54ae4.zip | |
Added a new memExist helper function and use it instead of getMmapped were it make sense
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 3 | ||||
| -rw-r--r-- | src/include/custommem.h | 1 | ||||
| -rw-r--r-- | src/libtools/signal32.c | 2 | ||||
| -rw-r--r-- | src/libtools/signals.c | 4 | ||||
| -rw-r--r-- | src/tools/bridge.c | 2 |
7 files changed, 15 insertions, 6 deletions
diff --git a/src/custommem.c b/src/custommem.c index dc7280e9..b6af88cc 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -904,6 +904,7 @@ uintptr_t AllocDynarecMap(size_t size) dynarec_allocated += allocsize; #endif setProtection((uintptr_t)p, allocsize, PROT_READ | PROT_WRITE | PROT_EXEC); + list->chunks[i].block = p; list->chunks[i].first = p; list->chunks[i].size = allocsize; @@ -1666,6 +1667,11 @@ int getMmapped(uintptr_t addr) return rb_get(mmapmem, addr); } +int memExist(uintptr_t addr) +{ + return rb_get(mapallmem, addr); +} + #define LOWEST (void*)0x10000 #define WINE_LOWEST (void*)0x30000000 #define MEDIUM (void*)0x40000000 diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index ebe5c4e8..e7a445c9 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -509,8 +509,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin CALL(native_priv, -1); LOAD_XEMU_CALL(xRIP); jump_to_epilog(dyn, 0, xRIP, ninst); - *need_epilog = 0; - *ok = 0; + // continue the block break; case 0x31: INST_NAME("RDTSC"); diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 7cf20c4e..265b23f7 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -42,6 +42,9 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3) } else if(emu->segs[_CS]==0x23 && addr>0x100000000LL) { dynablock_t* db = FindDynablockFromNativeAddress(x2-4); printf_log(LOG_NONE, "Warning, jumping to high address %p from %p (db=%p, x64addr=%p/%s)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, db?getAddrFunctionName(getX64Address(db, (uintptr_t)x2-4)):"(nil)"); + } else if(!memExist(addr)) { + dynablock_t* db = FindDynablockFromNativeAddress(x2-4); + printf_log(LOG_NONE, "Warning, jumping to an unmapped address %p from %p (db=%p, x64addr=%p/%s)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, db?getAddrFunctionName(getX64Address(db, (uintptr_t)x2-4)):"(nil)"); #endif } #endif diff --git a/src/include/custommem.h b/src/include/custommem.h index d892079e..13874592 100644 --- a/src/include/custommem.h +++ b/src/include/custommem.h @@ -102,6 +102,7 @@ void refreshProtection(uintptr_t addr); uint32_t getProtection(uintptr_t addr); uint32_t getProtection_fast(uintptr_t addr); int getMmapped(uintptr_t addr); +int memExist(uintptr_t addr); void loadProtectionFromMap(void); #ifdef DYNAREC void protectDB(uintptr_t addr, size_t size); diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index 1c7ada71..0cf9e440 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -621,7 +621,7 @@ void my_sigactionhandler_oldcode_32(int32_t sig, int simple, siginfo_t* info, vo TRAP_x86_CACHEFLT = 19 // SIMD exception (via SIGFPE) if CPU is SSE capable otherwise Cache flush exception (via SIGSEV) */ uint32_t prot = getProtection((uintptr_t)info->si_addr); - uint32_t mmapped = getMmapped((uintptr_t)info->si_addr); + uint32_t mmapped = memExist((uintptr_t)info->si_addr); uint32_t real_prot = 0; if(prot&PROT_READ) real_prot|=PROT_READ; if(prot&PROT_WRITE) real_prot|=PROT_WRITE; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 395334e9..3bf37f50 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1145,7 +1145,7 @@ void my_sigactionhandler_oldcode(x64emu_t* emu, int32_t sig, int simple, siginfo TRAP_x86_CACHEFLT = 19 // SIMD exception (via SIGFPE) if CPU is SSE capable otherwise Cache flush exception (via SIGSEV) */ uint32_t prot = getProtection((uintptr_t)info->si_addr); - uint32_t mmapped = getMmapped((uintptr_t)info->si_addr); + uint32_t mmapped = memExist((uintptr_t)info->si_addr); uint32_t real_prot = 0; if(prot&PROT_READ) real_prot|=PROT_READ; if(prot&PROT_WRITE) real_prot|=PROT_WRITE; @@ -1620,7 +1620,7 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "Repeated SIGSEGV with Access error on %p for static int old_tid = 0; static uint32_t old_prot = 0; int tid = GetTID(); - int mapped = getMmapped((uintptr_t)addr); + int mapped = memExist((uintptr_t)addr); const char* signame = (sig==SIGSEGV)?"SIGSEGV":((sig==SIGBUS)?"SIGBUS":((sig==SIGILL)?"SIGILL":"SIGABRT")); if(old_code==info->si_code && old_pc==pc && old_addr==addr && old_tid==tid && old_prot==prot) { printf_log(log_minimum, "%04d|Double %s (code=%d, pc=%p, addr=%p, prot=%02x)!\n", tid, signame, old_code, old_pc, old_addr, prot); diff --git a/src/tools/bridge.c b/src/tools/bridge.c index b147d23a..7684ec3d 100644 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -225,7 +225,7 @@ uintptr_t AddVSyscall(bridge_t* bridge, int num) const char* getBridgeName(void* addr) { - if(!getMmapped((uintptr_t)addr)) + if(!memExist((uintptr_t)addr)) return NULL; if(!(getProtection((uintptr_t)addr)&PROT_READ)) return NULL; |