about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-10 17:21:14 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-10 17:21:14 +0200
commit1f4cc1cf884e0c7befdfea601def2291e54459be (patch)
tree53f57aeff400515e4a025725d3cd6bde22db0dd2 /src
parent92dd53177f0119c0638c057ea7da5204046846d0 (diff)
downloadbox64-1f4cc1cf884e0c7befdfea601def2291e54459be.tar.gz
box64-1f4cc1cf884e0c7befdfea601def2291e54459be.zip
Optimized Exit bridge managment
Diffstat (limited to 'src')
-rwxr-xr-xsrc/box64context.c3
-rwxr-xr-xsrc/emu/x64emu.c11
-rwxr-xr-xsrc/emu/x64run_private.h7
-rwxr-xr-xsrc/include/box64context.h1
-rwxr-xr-xsrc/include/x64emu.h2
-rwxr-xr-xsrc/libtools/signals.c2
-rwxr-xr-xsrc/main.c2
-rwxr-xr-xsrc/wrapped/wrappedlibc.c4
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;