diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-10 17:21:14 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-10 17:21:14 +0200 |
| commit | 1f4cc1cf884e0c7befdfea601def2291e54459be (patch) | |
| tree | 53f57aeff400515e4a025725d3cd6bde22db0dd2 /src | |
| parent | 92dd53177f0119c0638c057ea7da5204046846d0 (diff) | |
| download | box64-1f4cc1cf884e0c7befdfea601def2291e54459be.tar.gz box64-1f4cc1cf884e0c7befdfea601def2291e54459be.zip | |
Optimized Exit bridge managment
Diffstat (limited to 'src')
| -rwxr-xr-x | src/box64context.c | 3 | ||||
| -rwxr-xr-x | src/emu/x64emu.c | 11 | ||||
| -rwxr-xr-x | src/emu/x64run_private.h | 7 | ||||
| -rwxr-xr-x | src/include/box64context.h | 1 | ||||
| -rwxr-xr-x | src/include/x64emu.h | 2 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 2 | ||||
| -rwxr-xr-x | src/main.c | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 4 |
8 files changed, 15 insertions, 17 deletions
diff --git a/src/box64context.c b/src/box64context.c index b08b5e2a..fc626305 100755 --- a/src/box64context.c +++ b/src/box64context.c @@ -213,6 +213,7 @@ box64context_t *NewBox64Context(int argc) context->local_maplib = NewLibrarian(context, 1); context->versym = NewDictionnary(); context->system = NewBridge(); + // Cannot use Bridge name as the map is not initialized yet // create vsyscall context->vsyscall = AddBridge(context->system, vFEv, x64Syscall, 0, NULL); // create the vsyscalls @@ -223,6 +224,8 @@ box64context_t *NewBox64Context(int argc) addAlternate((void*)0xffffffffff600000, (void*)context->vsyscalls[0]); addAlternate((void*)0xffffffffff600400, (void*)context->vsyscalls[1]); addAlternate((void*)0xffffffffff600800, (void*)context->vsyscalls[2]); + // create exit bridge + context->exit_bridge = AddBridge(context->system, NULL, NULL, 0, NULL); // get handle to box64 itself context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL); context->dlprivate = NewDLPrivate(); diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c index d48b4912..620bea97 100755 --- a/src/emu/x64emu.c +++ b/src/emu/x64emu.c @@ -58,17 +58,6 @@ uint32_t* GetParityTab() return x86emu_parity_tab; } -void PushExit(x64emu_t* emu) -{ - uintptr_t endMarker = AddCheckBridge(my_context->system, NULL, NULL, 0, "ExitEmulation"); - Push(emu, endMarker); -} - -void* GetExit() -{ - return (void*)AddCheckBridge(my_context->system, NULL, NULL, 0, "ExitEmulation"); -} - static void internalX64Setup(x64emu_t* emu, box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack) { emu->context = context; diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h index 68db0670..23750022 100755 --- a/src/emu/x64run_private.h +++ b/src/emu/x64run_private.h @@ -4,6 +4,7 @@ #include <stdint.h> #include "regs.h" #include "x64emu_private.h" +#include "box64context.h" typedef struct x64emu_s x64emu_t; typedef union rex_s { @@ -37,6 +38,12 @@ static inline void Push(x64emu_t *emu, uint64_t v) } #endif +static inline void PushExit(x64emu_t* emu) +{ + R_RSP -= 8; + *((uint64_t*)R_RSP) = my_context->exit_bridge; +} + // the op code definition can be found here: http://ref.x86asm.net/geek32.html reg64_t* GetECommon(x64emu_t* emu, uintptr_t* addr, rex_t rex, uint8_t m, uint8_t delta); diff --git a/src/include/box64context.h b/src/include/box64context.h index bda5bf23..fb09c004 100755 --- a/src/include/box64context.h +++ b/src/include/box64context.h @@ -118,6 +118,7 @@ typedef struct box64context_s { kh_threadstack_t *stacksizes; // stack sizes attributes for thread (temporary) bridge_t *system; // other bridges + uintptr_t exit_bridge; // exit bridge value uintptr_t vsyscall; // vsyscall bridge value uintptr_t vsyscalls[3]; // the 3 x86 VSyscall pseudo bridges (mapped at 0xffffffffff600000+) dlprivate_t *dlprivate; // dlopen library map diff --git a/src/include/x64emu.h b/src/include/x64emu.h index d242925a..a1e03f6e 100755 --- a/src/include/x64emu.h +++ b/src/include/x64emu.h @@ -44,8 +44,6 @@ void ResetSegmentsCache(x64emu_t *emu); const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip); void StopEmu(x64emu_t* emu, const char* reason); -void PushExit(x64emu_t* emu); -void* GetExit(); void EmuCall(x64emu_t* emu, uintptr_t addr); void AddCleanup(x64emu_t *emu, void *p, void* dso_handle); void AddCleanup1Arg(x64emu_t *emu, void *p, void* a, void* dso_handle); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 1ea5489a..f3da73a9 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1668,7 +1668,7 @@ EXPORT int my_makecontext(x64emu_t* emu, void* ucp, void* fnc, int32_t argc, int } // push the return value --rsp; - *rsp = (uintptr_t)GetExit(); + *rsp = my_context->exit_bridge; u->uc_mcontext.gregs[X64_RSP] = (uintptr_t)rsp; return 0; diff --git a/src/main.c b/src/main.c index 77e2274c..71c6caba 100755 --- a/src/main.c +++ b/src/main.c @@ -1779,7 +1779,7 @@ int main(int argc, const char **argv, char **env) { // Stack is ready, with stacked: NULL env NULL argv argc SetRIP(emu, my_context->ep); ResetFlags(emu); - PushExit(emu); // push to pop it just after + Push64(emu, my_context->exit_bridge); // push to pop it just after SetRDX(emu, Pop64(emu)); // RDX is exit function Run(emu, 0); // Get EAX diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index c51f37d1..29d00435 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2939,7 +2939,7 @@ EXPORT int my_backtrace(x64emu_t* emu, void** buffer, int size) buffer[0] = (void*)addr; while (++idx < size) { uintptr_t ret_addr = get_parent_registers(unwind, FindElfAddress(my_context, addr), addr, &success); - if (ret_addr == (uintptr_t)GetExit()) { + if (ret_addr == my_context->exit_bridge) { // TODO: do something to be able to get the function name buffer[idx] = (void*)ret_addr; success = 2; @@ -2969,7 +2969,7 @@ EXPORT int my_backtrace_ip(x64emu_t* emu, void** buffer, int size) buffer[0] = (void*)addr; while ((++idx < size) && success) { uintptr_t ret_addr = get_parent_registers(unwind, FindElfAddress(my_context, addr), addr, &success); - if (ret_addr == (uintptr_t)GetExit()) { + if (ret_addr == my_context->exit_bridge) { // TODO: do something to be able to get the function name buffer[idx] = (void*)ret_addr; success = 2; |