about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-07 14:14:07 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-07 14:14:07 +0100
commit622baec9529bb261cd250c2c2b9768b75ee0530f (patch)
tree45c313608b2e02fbe570a92b4113a855de25be27 /src
parenta326c821580ed2cd6665312a6d78696c5f6afcca (diff)
downloadbox64-622baec9529bb261cd250c2c2b9768b75ee0530f.tar.gz
box64-622baec9529bb261cd250c2c2b9768b75ee0530f.zip
Fix some special case on mmap64 wrapping
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c5
-rwxr-xr-xsrc/librarian/librarian.c1
-rwxr-xr-xsrc/librarian/library.c1
-rwxr-xr-xsrc/libtools/signals.c7
-rwxr-xr-xsrc/tools/box64stack.c1
5 files changed, 7 insertions, 8 deletions
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;