about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-03 21:37:25 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-03 21:37:25 +0200
commit969ee91506518c4bb56d3d1b29e66c2c23e95e4c (patch)
tree5e507f36163cbfb4d8ef4eba8d9c758c7672294c /src
parentf56ee976769eead05e2b5e4eeb92eb1733df205c (diff)
downloadbox64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.tar.gz
box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.zip
More work around stack alignement and frame pointer
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64emu.c4
-rwxr-xr-xsrc/emu/x64run_private.c5
-rwxr-xr-xsrc/include/x64emu.h1
-rwxr-xr-xsrc/libtools/threads.c2
-rwxr-xr-xsrc/main.c3
5 files changed, 13 insertions, 2 deletions
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index 9a162dea..ebf378cf 100755
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -313,6 +313,10 @@ uint64_t GetRSP(x64emu_t *emu)
 {
     return R_RSP;
 }
+uint64_t GetRBP(x64emu_t *emu)
+{
+    return R_RBP;
+}
 void SetFS(x64emu_t *emu, uint16_t v)
 {
     emu->segs[_FS] = v;
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 3b6691e6..d9fcabfb 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -44,6 +44,9 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
     }
     printf_log(LOG_DEBUG, "Transfert to main(%d, %p, %p)=>%p from __libc_start_main\n", my_context->argc, my_context->argv, my_context->envv, main);
     // call main and finish
+    Push64(emu, GetRBP(emu));   // set frame pointer
+    SetRBP(emu, GetRSP(emu));   // save RSP
+    SetRSP(emu, GetRSP(emu)&~0xFLL);    // Align RSP
     PushExit(emu);
     SetRDX(emu, (uint64_t)my_context->envv);
     SetRSI(emu, (uint64_t)my_context->argv);
@@ -52,6 +55,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
 #ifdef DYNAREC
     DynaRun(emu);
 #endif
+    SetRSP(emu, GetRBP(emu));   // restore RSP
+    SetRBP(emu, Pop64(emu));         // restore RBP
     return 0;
 }
 
diff --git a/src/include/x64emu.h b/src/include/x64emu.h
index f0ad24dd..21f435c8 100755
--- a/src/include/x64emu.h
+++ b/src/include/x64emu.h
@@ -37,6 +37,7 @@ void SetRIP(x64emu_t *emu, uint64_t v);
 void SetFS(x64emu_t *emu, uint16_t v);
 uint16_t GetFS(x64emu_t *emu);
 uint64_t GetRSP(x64emu_t *emu);
+uint64_t GetRBP(x64emu_t *emu);
 void ResetFlags(x64emu_t *emu);
 void ResetSegmentsCache(x64emu_t *emu);
 const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip);
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index 6a1455bb..ed37ca2c 100755
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -231,7 +231,7 @@ static void* pthread_routine(void* p)
 	x64emu_t* emu = et->emu;
 	Push64(emu, 0);		// PUSH BP
 	R_RBP = R_RSP;	// MOV BP, SP
-	R_RSP -= 64;	// Gard zone
+	R_RSP -= 56;	// Gard zone
 	PushExit(emu);
 	R_RIP = et->fnc;
 	R_RDI = (uintptr_t)et->arg;
diff --git a/src/main.c b/src/main.c
index 80999490..d85bdcad 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1030,7 +1030,8 @@ int main(int argc, const char **argv, const char **env) {
     SetRCX(emu, (uint64_t)my_context->envv);
     SetRIP(emu, my_context->ep);
     PushExit(emu);
-    *(uint64_t*)GetRSP(emu) = my_context->argc;
+    //*(uint64_t*)GetRSP(emu) = my_context->argc;
+    Push64(emu, my_context->argc);
     ResetFlags(emu);
     Run(emu, 0);
     // Get EAX