about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-30 14:02:28 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-30 14:02:28 +0100
commit51aa4b0416fbd9e960b5699dde5f573d89b54ae4 (patch)
treeceabba3bcf4e3a9ffe080fa8063563bd30016cf9 /src
parentb0db168fb57dd63e101c99b8c728aff9039a23bc (diff)
downloadbox64-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.c6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c3
-rw-r--r--src/dynarec/dynarec.c3
-rw-r--r--src/include/custommem.h1
-rw-r--r--src/libtools/signal32.c2
-rw-r--r--src/libtools/signals.c4
-rw-r--r--src/tools/bridge.c2
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;