diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-06 16:27:19 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-06 16:27:19 +0100 |
| commit | e517e5877659a5669113401ab12df2936c11c3f1 (patch) | |
| tree | 4101ba2d9b75330aad2435c84f5b17553d51bf2a /src | |
| parent | d2cb088918b139ece64d3d7eab670a560e236d80 (diff) | |
| download | box64-e517e5877659a5669113401ab12df2936c11c3f1.tar.gz box64-e517e5877659a5669113401ab12df2936c11c3f1.zip | |
Improved speed of mmap changes
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 3 | ||||
| -rwxr-xr-x | src/include/debug.h | 1 | ||||
| -rwxr-xr-x | src/librarian/library.c | 1 | ||||
| -rwxr-xr-x | src/main.c | 3 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 6 |
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); } |