diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 21:37:25 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 21:37:25 +0200 |
| commit | 969ee91506518c4bb56d3d1b29e66c2c23e95e4c (patch) | |
| tree | 5e507f36163cbfb4d8ef4eba8d9c758c7672294c /src/emu | |
| parent | f56ee976769eead05e2b5e4eeb92eb1733df205c (diff) | |
| download | box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.tar.gz box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.zip | |
More work around stack alignement and frame pointer
Diffstat (limited to 'src/emu')
| -rwxr-xr-x | src/emu/x64emu.c | 4 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 5 |
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; } |