diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-01 14:43:12 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-01 14:43:12 +0100 |
| commit | 717cddcc3d220e2c08b862807c66a8fd3e8306ef (patch) | |
| tree | b0ae509834aa87710b158a246e8a4d3f583a9285 /src | |
| parent | d6f7f620fcaf156b7a3a2b5b043307456863501f (diff) | |
| download | box64-717cddcc3d220e2c08b862807c66a8fd3e8306ef.tar.gz box64-717cddcc3d220e2c08b862807c66a8fd3e8306ef.zip | |
Improved bridge name storage/retreival
Diffstat (limited to 'src')
| -rw-r--r-- | src/elfs/elfloader.c | 4 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 2 | ||||
| -rw-r--r-- | src/include/bridge.h | 3 | ||||
| -rw-r--r-- | src/tools/bridge.c | 39 | ||||
| -rw-r--r-- | src/tools/bridge_private.h | 4 |
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; |