about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-01 18:14:08 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-01 18:14:08 +0100
commit107738f0f27493677c05fc7a8217aca7b673b5c9 (patch)
tree471bd9cbf7c178497a4ca694e55f8581a87694c0 /src
parent936fa20928ecaebf68826e1284bbf65e7b42e29c (diff)
downloadbox64-107738f0f27493677c05fc7a8217aca7b673b5c9.tar.gz
box64-107738f0f27493677c05fc7a8217aca7b673b5c9.zip
[ELFLOADER] Last improvment to elfloader memory managment, should be good now
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c18
-rw-r--r--src/elfs/elfloader.c1
-rw-r--r--src/wrapped/wrappedlibc.c7
3 files changed, 16 insertions, 10 deletions
diff --git a/src/custommem.c b/src/custommem.c
index b85b2257..f72b83e4 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1519,7 +1519,7 @@ int getMmapped(uintptr_t addr)
 }
 
 #define LOWEST (void*)0x10000
-#define MEDIUM (void*)0x20000000
+#define MEDIUM (void*)0x40000000
 
 void* find31bitBlockNearHint(void* hint, size_t size)
 {
@@ -1528,13 +1528,14 @@ void* find31bitBlockNearHint(void* hint, size_t size)
     if(hint<LOWEST) hint = LOWEST;
     while(m && m->end<0x80000000LL) {
         // granularity 0x10000
-        uintptr_t addr = (m->end+1+0xffff)&~0xffff;
+        uintptr_t addr = m->end+1;
         uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL;
         // check hint and available size
         if(addr<=h && end>=h && end-h+1>=size)
             return hint;
-        if(addr>=h && end-addr+1>=size)
-            return (void*)addr;
+        uintptr_t aaddr = (addr+0xffff)&~0xffff;
+        if(aaddr>=h && end>aaddr && end-aaddr+1>=size)
+            return (void*)aaddr;
         m = m->next;
     }
     return NULL;
@@ -1562,13 +1563,14 @@ void* find47bitBlockNearHint(void* hint, size_t size)
     if(hint<LOWEST) hint = LOWEST;
     while(m && m->end<0x800000000000LL) {
         // granularity 0x10000
-        uintptr_t addr = (m->end+1+0xffff)&~0xffff;
+        uintptr_t addr = m->end+1;
         uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL;
         // check hint and available size
         if(addr<=h && end>=h && end-h+1>=size)
             return hint;
-        if(addr>=h && end-addr+1>=size)
-            return (void*)addr;
+        uintptr_t aaddr = (addr+0xffff)&~0xffff;
+        if(aaddr>=h && end>aaddr && end-aaddr+1>=size)
+            return (void*)aaddr;
         m = m->next;
     }
     return NULL;
@@ -1595,7 +1597,7 @@ int isBlockFree(void* hint, size_t size)
     if(h>0x800000000000LL)
         return 0;   // no tracking there
     while(m && m->end<0x800000000000LL) {
-        uintptr_t addr = (m->end+1+0xffff)&~0xffff;
+        uintptr_t addr = m->end+1;
         uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL;
         if(addr<=h && end>=h && end-h+1>=size)
             return 1;
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index a398694b..d6fe2efb 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -257,6 +257,7 @@ int AllocLoadElfMemory(box64context_t* context, elfheader_t* head, int mainbin)
                     return 1;
                 }
                 setProtection_mmap((uintptr_t)p, head->multiblocks[n].asize, prot);
+                head->multiblocks[n].p = p;
                 if(e->p_filesz) {
                     fseeko64(head->file, head->multiblocks[n].offs, SEEK_SET);
                     if(fread((void*)head->multiblocks[n].paddr, head->multiblocks[n].size, 1, head->file)!=1) {
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index ce284a8d..cee5fecd 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2572,7 +2572,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
     void* ret = mmap64(addr, length, prot, new_flags, fd, offset);
     #ifndef NOALIGN
     if((ret!=MAP_FAILED) && (flags&MAP_32BIT) &&
-      (((uintptr_t)ret>0xffffffffLL) || (box64_wine && ((uintptr_t)ret&0xffff)))) {
+      (((uintptr_t)ret>0xffffffffLL) || (box64_wine && ((uintptr_t)ret&0xffff) && (ret!=addr)))) {
         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
@@ -2614,7 +2614,10 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
     }
     #endif
     if(ret!=MAP_FAILED) {
-        setProtection_mmap((uintptr_t)ret, length, prot);
+        if(emu)
+            setProtection_mmap((uintptr_t)ret, length, prot);
+        else
+            setProtection((uintptr_t)ret, length, prot);
     }
     return ret;
 }