about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-01 14:43:12 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-01 14:43:12 +0100
commit717cddcc3d220e2c08b862807c66a8fd3e8306ef (patch)
treeb0ae509834aa87710b158a246e8a4d3f583a9285 /src
parentd6f7f620fcaf156b7a3a2b5b043307456863501f (diff)
downloadbox64-717cddcc3d220e2c08b862807c66a8fd3e8306ef.tar.gz
box64-717cddcc3d220e2c08b862807c66a8fd3e8306ef.zip
Improved bridge name storage/retreival
Diffstat (limited to 'src')
-rw-r--r--src/elfs/elfloader.c4
-rw-r--r--src/emu/x64run_private.c2
-rw-r--r--src/include/bridge.h3
-rw-r--r--src/tools/bridge.c39
-rw-r--r--src/tools/bridge_private.h4
5 files changed, 9 insertions, 43 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index 4c9221a5..d2b08637 100644
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -1449,11 +1449,10 @@ const char* FindNearestSymbolName(elfheader_t* h, void* p, uintptr_t* start, uin
     uint64_t size = 0;
     if((uintptr_t)p<0x10000)
         return ret;
-    #ifdef HAVE_TRACE
     if(!h) {
         if(getProtection((uintptr_t)p)&(PROT_READ)) {
             if(*(uint8_t*)(p)==0xCC && *(uint8_t*)(p+1)=='S' && *(uint8_t*)(p+2)=='C') {
-                ret = getBridgeName(*(void**)(p+3+8));
+                ret = getBridgeName(p);
                 if(ret) {
                     if(start)
                         *start = (uintptr_t)p;
@@ -1464,7 +1463,6 @@ const char* FindNearestSymbolName(elfheader_t* h, void* p, uintptr_t* start, uin
         }
         return ret;
     }
-    #endif
     if(!h || h->fini_done)
         return ret;
 
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 6400e06c..bb18971a 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -105,13 +105,11 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
 const char* GetNativeName(void* p)
 {
     static char buff[500] = {0};
-    #ifdef HAVE_TRACE
     {
         const char* n = getBridgeName(p);
         if(n)
             return n;
     }
-    #endif
     Dl_info info;
     if(dladdr(p, &info)==0) {
         const char *ret = GetNameOffset(my_context->maplib, p);
diff --git a/src/include/bridge.h b/src/include/bridge.h
index 0c238089..1197ac77 100644
--- a/src/include/bridge.h
+++ b/src/include/bridge.h
@@ -23,10 +23,7 @@ int hasAlternate(void* addr);
 void* getAlternate(void* addr);
 void addAlternate(void* addr, void* alt);
 void cleanAlternate(void);
-
-#ifdef HAVE_TRACE
 const char* getBridgeName(void* addr);
-#endif
 
 void init_bridge_helper(void);
 void fini_bridge_helper(void);
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index d009021d..9502505d 100644
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -97,6 +97,7 @@ void FreeBridge(bridge_t** bridge)
 void addBridgeName(void* addr, const char* name);
 #endif
 
+//static const char* default_bridge = "bridge???";
 uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name)
 {
     brick_t *b = NULL;
@@ -123,10 +124,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
     b->b[sz].f = (uintptr_t)fnc;
     b->b[sz].C3 = N?0xC2:0xC3;
     b->b[sz].N = N;
-    #ifdef HAVE_TRACE
-    if(name)
-        addBridgeName(fnc, name);
-    #endif
+    b->b[sz].name = name/*?name:default_bridge*/;
 
     return (uintptr_t)&b->b[sz].CC;
 }
@@ -236,34 +234,13 @@ uintptr_t AddVSyscall(bridge_t* bridge, int num)
     return (uintptr_t)&b->b[sz].CC;
 }
 
-#ifdef HAVE_TRACE
-KHASH_MAP_INIT_INT64(bridgename, const char*)
-static kh_bridgename_t *bridgename;
-void initBridgeName()
-{
-    bridgename = kh_init(bridgename);
-}
-void finiBridgeName()
-{
-    kh_destroy(bridgename, bridgename);
-    bridgename = NULL;
-}
-void addBridgeName(void* addr, const char* name)
-{
-    int ret;
-    khint_t k = kh_put(bridgename, bridgename, (uintptr_t)addr, &ret);
-    if(!ret) // already there
-        return;
-    kh_value(bridgename, k) = name;
-}
 const char* getBridgeName(void* addr)
 {
-    khint_t k = kh_get(bridgename, bridgename, (uintptr_t)addr);
-    if(k!=kh_end(bridgename))
-        return kh_value(bridgename, k);
+    onebridge_t* one = (onebridge_t*)(((uintptr_t)addr/sizeof(onebridge_t))*sizeof(onebridge_t));   // align to start of bridge
+    if(one->C3==0xC3 && one->S=='S' && one->C=='C')
+        return one->name;
     return NULL;
 }
-#endif
 
 
 // Alternate address handling
@@ -307,15 +284,9 @@ void cleanAlternate() {
 
 void init_bridge_helper()
 {
-    #ifdef HAVE_TRACE
-    initBridgeName();
-    #endif
 }
 
 void fini_bridge_helper()
 {
     cleanAlternate();
-    #ifdef HAVE_TRACE
-    finiBridgeName();
-    #endif
 }
diff --git a/src/tools/bridge_private.h b/src/tools/bridge_private.h
index 0983cea0..f59f587a 100644
--- a/src/tools/bridge_private.h
+++ b/src/tools/bridge_private.h
@@ -14,12 +14,14 @@ typedef union onebridge_s {
     uintptr_t f;    // the function for the wrapper
     uint8_t C3;     // C2 or C3 ret
     uint16_t N;     // N in case of C2 ret
+    const char* name;   // name of the function bridged
     };
     struct {
-    uint8_t B8;     // B8 00 11 22 33 mov rax, num
+    uint8_t B8;     // B8 00 11 22 33 mov eax, num
     uint32_t num;
     uint8_t _0F; uint8_t _05;   // 0F 05 syscall
     uint8_t _C3;    // C3 ret
+    const char* syscall_name;   //not used for now
     };
     uint64_t dummy[4];
 } onebridge_t;