about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-06 16:27:19 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-06 16:27:19 +0100
commite517e5877659a5669113401ab12df2936c11c3f1 (patch)
tree4101ba2d9b75330aad2435c84f5b17553d51bf2a /src
parentd2cb088918b139ece64d3d7eab670a560e236d80 (diff)
downloadbox64-e517e5877659a5669113401ab12df2936c11c3f1.tar.gz
box64-e517e5877659a5669113401ab12df2936c11c3f1.zip
Improved speed of mmap changes
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c3
-rwxr-xr-xsrc/include/debug.h1
-rwxr-xr-xsrc/librarian/library.c1
-rwxr-xr-xsrc/main.c3
-rwxr-xr-xsrc/wrapped/wrappedlibc.c6
5 files changed, 10 insertions, 4 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 359725ea..b653e78b 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -940,6 +940,8 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot)
 
 void loadProtectionFromMap()
 {
+    if(box64_mapclean)
+        return;
     char buf[500];
     FILE *f = fopen("/proc/self/maps", "r");
     if(!f)
@@ -955,6 +957,7 @@ void loadProtectionFromMap()
         }
     }
     fclose(f);
+    box64_mapclean = 1;
 }
 
 static int blockempty(uint8_t* mem)
diff --git a/src/include/debug.h b/src/include/debug.h
index 0cb2be34..5a300117 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -32,6 +32,7 @@ extern uintptr_t trace_start, trace_end;
 extern char* trace_func;
 #endif
 extern int allow_missing_libs;
+extern int box64_mapclean;
 extern int box64_prefer_wrapped;
 extern int box64_steam;
 extern int box64_wine;
diff --git a/src/librarian/library.c b/src/librarian/library.c
index e390ebe6..e41588f6 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -198,6 +198,7 @@ static void initNativeLib(library_t *lib, box64context_t* context) {
                 return; // non blocker...
             }
             printf_log(LOG_INFO, "Using native(wrapped) %s\n", lib->name);
+            box64_mapclean = 0;
             lib->priv.w.box64lib = context->box64lib;
             lib->context = context;
             lib->fini = wrappedlibs[i].fini;
diff --git a/src/main.c b/src/main.c
index da2abdf9..ec89cd13 100755
--- a/src/main.c
+++ b/src/main.c
@@ -74,6 +74,7 @@ int x11glx = 1;
 int allow_missing_libs = 0;
 int box64_prefer_wrapped = 0;
 int fix_64bit_inodes = 0;
+int box64_mapclean = 0;
 int box64_zoom = 0;
 int box64_steam = 0;
 int box64_wine = 0;
@@ -957,7 +958,7 @@ int main(int argc, const char **argv, const char **env) {
             //wine_preloaded = 1;
         }
     }
-    #if 0
+    #if 1
     // pre-check for pressure-vessel-wrap
     if(strstr(prog, "pressure-vessel-wrap")==(prog+strlen(prog)-strlen("pressure-vessel-wrap"))) {
         // pressure-vessel-wrap detecter, skipping it and all -- args until "--" if needed
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index d53b1ced..61429120 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2203,15 +2203,15 @@ 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(addr, length); // is this the best way?
+        addr = findBlockNearHint(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)==0) && (box64_wine) && 
+    } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && (old_addr) && (addr!=ret) &&
              (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff!=(uintptr_t)ret))) {
         printf_log(LOG_DEBUG, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret);
         munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously
-        addr = find47bitBlock(length); // is this the best way?
+        addr = find47bitBlockNearHint(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);
     }