about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-11-28 18:57:52 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-11-28 18:57:52 +0100
commitd6d2b2e7563eebea88620dbc67f361523b47cc68 (patch)
tree1e8ee0809c9167a4eda966fd4e433c4cfc03f798
parent4276573f6736f8c57f9a6ff58a1bbecb57800d23 (diff)
downloadbox64-d6d2b2e7563eebea88620dbc67f361523b47cc68.tar.gz
box64-d6d2b2e7563eebea88620dbc67f361523b47cc68.zip
Changed how mmap with MAP_32BITS flag is handled (help deadcells, maybe some others)
-rw-r--r--src/custommem.c39
-rw-r--r--src/include/custommem.h2
-rwxr-xr-xsrc/wrapped/wrappedlibc.c4
3 files changed, 26 insertions, 19 deletions
diff --git a/src/custommem.c b/src/custommem.c
index d8d2d768..3b31b326 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1324,23 +1324,14 @@ uint32_t getProtection(uintptr_t addr)
 }
 
 #define LOWEST (void*)0x10000
-void* find32bitBlock(size_t size)
-{
-    return findBlockNearHint(LOWEST, size);
-}
-void* find47bitBlock(size_t size)
-{
-    void* ret = find47bitBlockNearHint((void*)0x100000000LL, size);
-    if(!ret)
-        ret = find32bitBlock(size);
-    return ret;
-}
-void* find47bitBlockNearHint(void* hint, size_t size)
+#define MEDIUM (void*)0x20000000
+
+void* find31bitBlockNearHint(void* hint, size_t size)
 {
     mapmem_t* m = mapmem;
     uintptr_t h = (uintptr_t)hint;
     if(hint<LOWEST) hint = LOWEST;
-    while(m && m->end<0x800000000000LL) {
+    while(m && m->end<0x80000000LL) {
         // granularity 0x10000
         uintptr_t addr = (m->end+1+0xffff)&~0xffff;
         uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL;
@@ -1353,12 +1344,28 @@ void* find47bitBlockNearHint(void* hint, size_t size)
     }
     return NULL;
 }
-void* findBlockNearHint(void* hint, size_t size)
+
+void* find32bitBlock(size_t size)
+{
+    void* ret = find31bitBlockNearHint(MEDIUM, size);
+    if(ret)
+        return ret;
+    ret = find31bitBlockNearHint(LOWEST, size);
+    return ret?ret:find47bitBlock(size);
+}
+void* find47bitBlock(size_t size)
+{
+    void* ret = find47bitBlockNearHint((void*)0x100000000LL, size);
+    if(!ret)
+        ret = find32bitBlock(size);
+    return ret;
+}
+void* find47bitBlockNearHint(void* hint, size_t size)
 {
     mapmem_t* m = mapmem;
     uintptr_t h = (uintptr_t)hint;
     if(hint<LOWEST) hint = LOWEST;
-    while(m && m->end<0x100000000LL) {
+    while(m && m->end<0x800000000000LL) {
         // granularity 0x10000
         uintptr_t addr = (m->end+1+0xffff)&~0xffff;
         uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL;
@@ -1369,7 +1376,7 @@ void* findBlockNearHint(void* hint, size_t size)
             return (void*)addr;
         m = m->next;
     }
-    return hint;
+    return NULL;
 }
 
 int unlockCustommemMutex()
diff --git a/src/include/custommem.h b/src/include/custommem.h
index a33e1377..42f75a89 100644
--- a/src/include/custommem.h
+++ b/src/include/custommem.h
@@ -55,7 +55,7 @@ int AreaInHotPage(uintptr_t start, uintptr_t end);
 void AddHotPage(uintptr_t addr);
 #endif
 void* find32bitBlock(size_t size);
-void* findBlockNearHint(void* hint, size_t size);
+void* find31bitBlockNearHint(void* hint, size_t size);
 void* find47bitBlock(size_t size);
 void* find47bitBlockNearHint(void* hint, size_t size);
 
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 6d7169bb..cc0a5de8 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2360,7 +2360,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
     if(flags&0x40) {
         // 0x40 is MAP_32BIT, wich only exist on x86_64!
         //flags &= ~0x40;   // let the flags in?
-        addr = findBlockNearHint(addr, length);
+        addr = find31bitBlockNearHint(addr, length);
     } else if (box64_wine || 1) {   // other mmap should be restricted to 47bits
         if(!addr)
             addr = find47bitBlock(length);
@@ -2373,7 +2373,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
         printf_log(LOG_DEBUG, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret);
         munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously
-        addr = findBlockNearHint(old_addr, length); // is this the best way?
+        addr = find31bitBlockNearHint(old_addr, length); // is this the best way?
         ret = mmap64(addr, length, prot, flags, fd, offset);
         printf_log(LOG_DEBUG, " tried again with %p, got %p\n", addr, ret);
     } else if((ret!=(void*)-1) && !(flags&MAP_FIXED) && (box64_wine) && (old_addr) && (addr!=ret) &&