From d2cb088918b139ece64d3d7eab670a560e236d80 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 15:23:15 +0100 Subject: Change on mmap to help some stagging version of wine --- src/custommem.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/custommem.c') diff --git a/src/custommem.c b/src/custommem.c index 5b399344..359725ea 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1016,7 +1016,7 @@ uint32_t getProtection(uintptr_t addr) } #define LOWEST (void*)0x20000 -static uintptr_t nextFree(uintptr_t addr) +static uintptr_t nextFree(uintptr_t addr, uintptr_t increment) { if(addr>=(1LL<<48)) return 0; @@ -1029,7 +1029,7 @@ static uintptr_t nextFree(uintptr_t addr) if(!memprot[idx>>16][i]) { return ((idx>>16)<<(16+12))+(i<=size) { return (void*)addr; @@ -1075,7 +1075,7 @@ void* find47bitBlock(size_t size) // search in 32bits as a backup addr = (uintptr_t)LOWEST; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1090,7 +1090,7 @@ void* find47bitBlockNearHint(void* hint, size_t size) // slow iterative search... Would need something better one day uintptr_t addr = (uintptr_t)hint; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1105,7 +1105,7 @@ void* findBlockNearHint(void* hint, size_t size) // slow iterative search... Would need something better one day uintptr_t addr = (uintptr_t)hint; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; -- cgit 1.4.1 From e517e5877659a5669113401ab12df2936c11c3f1 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 16:27:19 +0100 Subject: Improved speed of mmap changes --- src/custommem.c | 3 +++ src/include/debug.h | 1 + src/librarian/library.c | 1 + src/main.c | 3 ++- src/wrapped/wrappedlibc.c | 6 +++--- 5 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src/custommem.c') 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); } -- cgit 1.4.1 From 622baec9529bb261cd250c2c2b9768b75ee0530f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 14:14:07 +0100 Subject: Fix some special case on mmap64 wrapping --- src/custommem.c | 5 +++-- src/librarian/librarian.c | 1 + src/librarian/library.c | 1 - src/libtools/signals.c | 7 ++----- src/tools/box64stack.c | 1 + 5 files changed, 7 insertions(+), 8 deletions(-) (limited to 'src/custommem.c') diff --git a/src/custommem.c b/src/custommem.c index b653e78b..843532bb 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,6 +940,7 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { +printf_log(LOG_INFO, "loadProtectionFromMap(), mapclean=%d\n", box64_mapclean); if(box64_mapclean) return; char buf[500]; @@ -1091,7 +1092,7 @@ void* find47bitBlock(size_t size) void* find47bitBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); @@ -1106,7 +1107,7 @@ void* find47bitBlockNearHint(void* hint, size_t size) void* findBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index adcf647e..02a02ec6 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -342,6 +342,7 @@ int AddNeededLib_init(lib_t* maplib, needed_libs_t* neededlibs, library_t* depli EXPORTDYN int AddNeededLib(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib, int local, int bindnow, const char** paths, int npath, box64context_t* box64, x64emu_t* emu) { + box64_mapclean = 0; if(!neededlibs) { neededlibs = alloca(sizeof(needed_libs_t)); memset(neededlibs, 0, sizeof(needed_libs_t)); diff --git a/src/librarian/library.c b/src/librarian/library.c index 4ed54096..85e4dfc3 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -198,7 +198,6 @@ 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/libtools/signals.c b/src/libtools/signals.c index a98b570a..e0410b1c 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -505,7 +505,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void sigcontext->uc_mcontext.gregs[X64_RBP] = R_RBP; sigcontext->uc_mcontext.gregs[X64_RSP] = R_RSP; sigcontext->uc_mcontext.gregs[X64_RBX] = R_RBX; - sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP;//emu->old_ip; // old_ip should be more accurate as the "current" IP, but it's not always up-to-date + sigcontext->uc_mcontext.gregs[X64_RIP] = emu->old_ip; // flags sigcontext->uc_mcontext.gregs[X64_EFL] = emu->eflags.x64; // get segments @@ -934,10 +934,7 @@ exit(-1); const char* x64name = NULL; const char* elfname = NULL; x64emu_t* emu = thread_get_emu(); - // Adjust RIP for special case of NULL function run - if(sig==SIGSEGV && R_RIP==0x1 && (uintptr_t)info->si_addr==0x0) - R_RIP = 0x0; - x64pc = R_RIP; + x64pc = emu->old_ip; rsp = (void*)R_RSP; #if defined(DYNAREC) #if defined(ARM64) diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c index 9a5ca602..5ede282e 100755 --- a/src/tools/box64stack.c +++ b/src/tools/box64stack.c @@ -167,6 +167,7 @@ void SetupInitialStack(x64emu_t *emu) Push(emu, p_random); Push(emu, 25); //AT_RANDOM(25)=p_random Push(emu, 0); Push(emu, 26); //AT_HWCAP2(26)=0 Push(emu, p_arg0); Push(emu, 31); //AT_EXECFN(31)=p_arg0 + Push(emu, emu->context->vsyscall); Push(emu, 32); //AT_SYSINFO(32)=vsyscall //Push(emu, 0); Push(emu, 33); //AT_SYSINFO_EHDR(33)=address of vDSO if(!emu->context->auxval_start) // store auxval start if needed emu->context->auxval_start = (uintptr_t*)R_RSP; -- cgit 1.4.1 From 726af707ebe92f0f1a98ea985343f6641fa45ba8 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 15:08:35 +0100 Subject: Removed a debug leftover --- src/custommem.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/custommem.c') diff --git a/src/custommem.c b/src/custommem.c index 843532bb..4d4ab240 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,7 +940,6 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { -printf_log(LOG_INFO, "loadProtectionFromMap(), mapclean=%d\n", box64_mapclean); if(box64_mapclean) return; char buf[500]; -- cgit 1.4.1