about summary refs log tree commit diff stats
path: root/src/emu
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/emu
parentf56ee976769eead05e2b5e4eeb92eb1733df205c (diff)
downloadbox64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.tar.gz
box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.zip
More work around stack alignement and frame pointer
Diffstat (limited to 'src/emu')
-rwxr-xr-xsrc/emu/x64emu.c4
-rwxr-xr-xsrc/emu/x64run_private.c5
2 files changed, 9 insertions, 0 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;
 }