diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/box64context.c | 5 | ||||
| -rwxr-xr-x | src/elfs/elfloader.c | 2 | ||||
| -rwxr-xr-x | src/emu/x64emu.c | 4 | ||||
| -rwxr-xr-x | src/emu/x64int3.c | 12 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 8 | ||||
| -rwxr-xr-x | src/include/bridge.h | 11 | ||||
| -rwxr-xr-x | src/librarian/library.c | 10 | ||||
| -rwxr-xr-x | src/libtools/sdl1rwops.c | 2 | ||||
| -rwxr-xr-x | src/libtools/sdl2rwops.c | 2 | ||||
| -rwxr-xr-x | src/tools/bridge.c | 61 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 2 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 3 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibasound.c | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 8 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibgl.c | 3 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibx11.c | 14 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibxext.c | 2 | ||||
| -rwxr-xr-x | src/wrapped/wrappedopenal.c | 6 | ||||
| -rwxr-xr-x | src/wrapped/wrappedsdl1.c | 9 | ||||
| -rwxr-xr-x | src/wrapped/wrappedsdl2.c | 7 |
22 files changed, 127 insertions, 50 deletions
diff --git a/src/box64context.c b/src/box64context.c index ed33a2fa..91aa4fbc 100755 --- a/src/box64context.c +++ b/src/box64context.c @@ -27,6 +27,7 @@ void initAllHelpers(box64context_t* context) return; my_context = context; init_pthread_helper(); + init_bridge_helper(); init_signal_helper(context); inited = 1; } @@ -39,7 +40,7 @@ void finiAllHelpers(box64context_t* context) return; fini_pthread_helper(context); fini_signal_helper(); - cleanAlternate(); + fini_bridge_helper(); fini_custommem_helper(context); finied = 1; } @@ -88,7 +89,7 @@ box64context_t *NewBox64Context(int argc) context->local_maplib = NewLibrarian(context, 1); context->system = NewBridge(); // create vsyscall - context->vsyscall = AddBridge(context->system, vFv, x64Syscall, 0); + context->vsyscall = AddBridge(context->system, vFv, x64Syscall, 0, NULL); context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL); context->dlprivate = NewDLPrivate(); diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 2c346db3..a9335de3 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -726,7 +726,7 @@ int RelocateElfPlt(lib_t *maplib, lib_t *local_maplib, elfheader_t* head) return -1; } if(pltResolver==~0) { - pltResolver = AddBridge(my_context->system, vFE, PltResolver, 0); + pltResolver = AddBridge(my_context->system, vFE, PltResolver, 0, "PltResolver"); } if(head->pltgot) { *(uintptr_t*)(head->pltgot+head->delta+16) = pltResolver; diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c index 1cf93f8f..90008e0d 100755 --- a/src/emu/x64emu.c +++ b/src/emu/x64emu.c @@ -45,13 +45,13 @@ uint32_t* GetParityTab() void PushExit(x64emu_t* emu) { - uintptr_t endMarker = AddCheckBridge(my_context->system, NULL, NULL, 0); + 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); + 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) diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c index 8904fa3e..d2ab7336 100755 --- a/src/emu/x64int3.c +++ b/src/emu/x64int3.c @@ -93,18 +93,16 @@ void x64Int3(x64emu_t* emu) int perr = 0; uint32_t *pu32 = NULL; const char *s = NULL; - { - Dl_info info; - if(dladdr((void*)addr, &info)) - s = info.dli_sname; - } - if(!s) s = GetNativeName((void*)addr); + s = GetNativeName((void*)addr); if(addr==(uintptr_t)PltResolver) { snprintf(buff, 256, "%s", " ... "); - } else if(strstr(s, "__open")==s || strcmp(s, "open")==0) { + } else if(strstr(s, "__open")==s || strcmp(s, "open ")==0) { tmp = (char*)(R_RDI); snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\", %d (,%d))", tid, *(void**)(R_RSP), s, (tmp)?tmp:"(nil)", (int)(R_ESI), (int)(R_EDX)); perr = 1; + } else if(strstr(s, "my___printf_chk")) { + tmp = (char*)(R_RSI); + snprintf(buff, 255, "%04d|%p: Calling %s(%d, \"%s\" (,%p))", tid, *(void**)(R_RSP), s, R_EDI, (tmp)?tmp:"(nil)", (void*)(R_RDX)); } else { snprintf(buff, 255, "%04d|%p: Calling %s (0x%lX, 0x%lX, 0x%lX, ...)", tid, *(void**)(R_RSP), s, R_RDI, R_RSI, R_RDX); } diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 737225e3..9e012d1f 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -23,6 +23,7 @@ #include "x64trace.h" #endif #include "x64tls.h" +#include "bridge.h" #define PARITY(x) (((emu->x64emu_parity_tab[(x) / 32] >> ((x) % 32)) & 1) == 0) #define XOR2(x) (((x) ^ ((x)>>1)) & 0x1) @@ -57,6 +58,13 @@ 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 dfe402f9..9499b440 100755 --- a/src/include/bridge.h +++ b/src/include/bridge.h @@ -10,9 +10,9 @@ typedef void (*wrapper_t)(x64emu_t* emu, uintptr_t fnc); bridge_t *NewBridge(); void FreeBridge(bridge_t** bridge); -uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N); +uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name); uintptr_t CheckBridged(bridge_t* bridge, void* fnc); -uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N); +uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name); uintptr_t AddAutomaticBridge(x64emu_t* emu, bridge_t* bridge, wrapper_t w, void* fnc, int N); void* GetNativeFnc(uintptr_t fnc); void* GetNativeFncOrFnc(uintptr_t fnc); @@ -22,4 +22,11 @@ void* getAlternate(void* addr); void addAlternate(void* addr, void* alt); void cleanAlternate(); +#ifdef HAVE_TRACE +const char* getBridgeName(void* addr); +#endif + +void init_bridge_helper(); +void fini_bridge_helper(); + #endif //__BRIDGE_H_ \ No newline at end of file diff --git a/src/librarian/library.c b/src/librarian/library.c index bcd8248a..b0be60b4 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -587,7 +587,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr printf_log(LOG_NONE, "Warning, function %s not found\n", buff); } else AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->mysymbolmap, k), symbol, 0); + *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->mysymbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } @@ -605,7 +605,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr printf_log(LOG_NONE, "Warning, function %s not found\n", buff); } else AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->stsymbolmap, k), symbol, 4); // all of this for this little "4" + *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->stsymbolmap, k), symbol, sizeof(void*), name); *size = sizeof(void*); return 1; } @@ -624,7 +624,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr return 0; } else AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbolmap, k), symbol, 0); + *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } @@ -643,7 +643,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr return 0; } else AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wsymbolmap, k), symbol, 0); + *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->wsymbolmap, k), symbol, 0, name); *size = sizeof(void*); return 1; } @@ -661,7 +661,7 @@ int getSymbolInMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr return 0; } else AddOffsetSymbol(lib->context->maplib, symbol, name); - *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbol2map, k).w, symbol, 0); + *addr = AddBridge(lib->priv.w.bridge, kh_value(lib->symbol2map, k).w, symbol, 0, name); *size = sizeof(void*); return 1; } diff --git a/src/libtools/sdl1rwops.c b/src/libtools/sdl1rwops.c index bdb26c83..d4139e7d 100755 --- a/src/libtools/sdl1rwops.c +++ b/src/libtools/sdl1rwops.c @@ -106,7 +106,7 @@ SDL1_RWops_t* AddNativeRW(x64emu_t* emu, SDL1_RWops_t* ops) // get or create wrapper, add it to map and change to the emulated one if rw #define GO(A, W) \ - fnc = AddCheckBridge(system, W, my_native_##A, 0); \ + fnc = AddCheckBridge(system, W, my_native_##A, 0, NULL); \ newrw->A = (sdl1_##A)fnc; GO(seek, iFpii) diff --git a/src/libtools/sdl2rwops.c b/src/libtools/sdl2rwops.c index 3874ce60..cc7c5dbc 100755 --- a/src/libtools/sdl2rwops.c +++ b/src/libtools/sdl2rwops.c @@ -113,7 +113,7 @@ SDL2_RWops_t* AddNativeRW2(x64emu_t* emu, SDL2_RWops_t* ops) // get or create wrapper, add it to map and change to the emulated one if rw #define GO(A, W) \ - fnc = AddCheckBridge(system, W, my2_native_##A, 0); \ + fnc = AddCheckBridge(system, W, my2_native_##A, 0, NULL); \ newrw->A = (sdl2_##A)fnc; GO(size, IFp) diff --git a/src/tools/bridge.c b/src/tools/bridge.c index 76eb20b2..3724e0b3 100755 --- a/src/tools/bridge.c +++ b/src/tools/bridge.c @@ -70,7 +70,11 @@ void FreeBridge(bridge_t** bridge) *bridge = NULL; } -uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N) +#ifdef HAVE_TRACE +void addBridgeName(void* addr, const char* name); +#endif + +uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name) { pthread_mutex_lock(&bridge->mutex); brick_t *b = bridge->last; @@ -103,6 +107,10 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N) khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret); kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[b->sz].CC; pthread_mutex_unlock(&bridge->mutex); + #ifdef HAVE_TRACE + if(name) + addBridgeName(fnc, name); + #endif return (uintptr_t)&b->b[b->sz++].CC; } @@ -116,13 +124,13 @@ uintptr_t CheckBridged(bridge_t* bridge, void* fnc) return kh_value(bridge->bridgemap, k); } -uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N) +uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char* name) { if(!fnc && w) return 0; uintptr_t ret = CheckBridged(bridge, fnc); if(!ret) - ret = AddBridge(bridge, w, fnc, N); + ret = AddBridge(bridge, w, fnc, N, name); return ret; } @@ -132,7 +140,7 @@ uintptr_t AddAutomaticBridge(x64emu_t* emu, bridge_t* bridge, wrapper_t w, void* return 0; uintptr_t ret = CheckBridged(bridge, fnc); if(!ret) - ret = AddBridge(bridge, w, fnc, N); + ret = AddBridge(bridge, w, fnc, N, NULL); if(!hasAlternate(fnc)) { printf_log(LOG_DEBUG, "Adding AutomaticBridge for %p to %p\n", fnc, (void*)ret); addAlternate(fnc, (void*)ret); @@ -180,6 +188,36 @@ void* GetNativeFncOrFnc(uintptr_t fnc) return (void*)b->f; } +#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); + return NULL; +} +#endif + + // Alternate address handling KHASH_MAP_INIT_INT64(alternate, void*) static kh_alternate_t *my_alternates = NULL; @@ -218,3 +256,18 @@ void cleanAlternate() { my_alternates = NULL; } } + +void init_bridge_helper() +{ + #ifdef HAVE_TRACE + initBridgeName(); + #endif +} + +void fini_bridge_helper() +{ + cleanAlternate(); + #ifdef HAVE_TRACE + finiBridgeName(); + #endif +} diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index 7c79e560..3b61e9b0 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -514,6 +514,7 @@ #() iFEippp #() iFEpipi #() iFEpipp +#() iFEpipV #() iFEpLpp #() iFEppiV #() iFEpppp @@ -894,6 +895,5 @@ #() pFppv -> pFpp #() iFEvpp -> iFEpp #() iFEpvpp -> iFEppp -#() iFEpvpV -> iFEppV #() iFEpLvvpp -> iFEpLpp #() iFEpuvvppp -> iFEpuppp diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 1d103fb8..05da770b 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -547,6 +547,7 @@ typedef void (*vFppppp_t)(void*, void*, void*, void*, void*); typedef int32_t (*iFEippp_t)(x64emu_t*, int32_t, void*, void*, void*); typedef int32_t (*iFEpipi_t)(x64emu_t*, void*, int32_t, void*, int32_t); typedef int32_t (*iFEpipp_t)(x64emu_t*, void*, int32_t, void*, void*); +typedef int32_t (*iFEpipV_t)(x64emu_t*, void*, int32_t, void*, void*); typedef int32_t (*iFEpLpp_t)(x64emu_t*, void*, uintptr_t, void*, void*); typedef int32_t (*iFEppiV_t)(x64emu_t*, void*, void*, int32_t, void*); typedef int32_t (*iFEpppp_t)(x64emu_t*, void*, void*, void*, void*); @@ -1444,6 +1445,7 @@ void vFppppp(x64emu_t *emu, uintptr_t fcn) { vFppppp_t fn = (vFppppp_t)fcn; fn(( void iFEippp(x64emu_t *emu, uintptr_t fcn) { iFEippp_t fn = (iFEippp_t)fcn; R_RAX=fn(emu, (int32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX); } void iFEpipi(x64emu_t *emu, uintptr_t fcn) { iFEpipi_t fn = (iFEpipi_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX); } void iFEpipp(x64emu_t *emu, uintptr_t fcn) { iFEpipp_t fn = (iFEpipp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX); } +void iFEpipV(x64emu_t *emu, uintptr_t fcn) { iFEpipV_t fn = (iFEpipV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)(R_RSP + 8)); } void iFEpLpp(x64emu_t *emu, uintptr_t fcn) { iFEpLpp_t fn = (iFEpLpp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX); } void iFEppiV(x64emu_t *emu, uintptr_t fcn) { iFEppiV_t fn = (iFEppiV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)(R_RSP + 8)); } void iFEpppp(x64emu_t *emu, uintptr_t fcn) { iFEpppp_t fn = (iFEpppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX); } @@ -1831,6 +1833,5 @@ void pFEv(x64emu_t *emu, uintptr_t fcn) { pFE_t fn = (pFE_t)fcn; R_RAX=(uintptr_ void pFppv(x64emu_t *emu, uintptr_t fcn) { pFpp_t fn = (pFpp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI); } void iFEvpp(x64emu_t *emu, uintptr_t fcn) { iFEpp_t fn = (iFEpp_t)fcn; R_RAX=fn(emu, (void*)R_RSI, (void*)R_RDX); } void iFEpvpp(x64emu_t *emu, uintptr_t fcn) { iFEppp_t fn = (iFEppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RDX, (void*)R_RCX); } -void iFEpvpV(x64emu_t *emu, uintptr_t fcn) { iFEppV_t fn = (iFEppV_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (void*)R_RDX, (void*)(R_RSP + 8)); } void iFEpLvvpp(x64emu_t *emu, uintptr_t fcn) { iFEpLpp_t fn = (iFEpLpp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_R8, (void*)R_R9); } void iFEpuvvppp(x64emu_t *emu, uintptr_t fcn) { iFEpuppp_t fn = (iFEpuppp_t)fcn; R_RAX=fn(emu, (void*)R_RDI, (uint32_t)R_RSI, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 1e9c7411..0573918b 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -544,6 +544,7 @@ void vFppppp(x64emu_t *emu, uintptr_t fnc); void iFEippp(x64emu_t *emu, uintptr_t fnc); void iFEpipi(x64emu_t *emu, uintptr_t fnc); void iFEpipp(x64emu_t *emu, uintptr_t fnc); +void iFEpipV(x64emu_t *emu, uintptr_t fnc); void iFEpLpp(x64emu_t *emu, uintptr_t fnc); void iFEppiV(x64emu_t *emu, uintptr_t fnc); void iFEpppp(x64emu_t *emu, uintptr_t fnc); @@ -931,7 +932,6 @@ void pFEv(x64emu_t *emu, uintptr_t fnc); void pFppv(x64emu_t *emu, uintptr_t fnc); void iFEvpp(x64emu_t *emu, uintptr_t fnc); void iFEpvpp(x64emu_t *emu, uintptr_t fnc); -void iFEpvpV(x64emu_t *emu, uintptr_t fnc); void iFEpLvvpp(x64emu_t *emu, uintptr_t fnc); void iFEpuvvppp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedlibasound.c b/src/wrapped/wrappedlibasound.c index a11b0fde..acb5f3de 100755 --- a/src/wrapped/wrappedlibasound.c +++ b/src/wrapped/wrappedlibasound.c @@ -52,7 +52,7 @@ void* getAsoundMy(library_t* lib) SUPER() #undef GO // setup custom error handler - my_snd_lib_error = AddCheckBridge(my_context->system, vFpipipV, default_error_handler, 0); + my_snd_lib_error = AddCheckBridge(my_context->system, vFpipipV, default_error_handler, 0, "ASoundCustomErrorHandler"); //all done return my; } diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index bba0a0ad..19e41805 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -604,11 +604,15 @@ EXPORT int my___vfprintf_chk(x64emu_t *emu, void* F, void* fmt, x64_va_list_t b) EXPORT int my__IO_vfprintf(x64emu_t *emu, void* F, void* fmt, x64_va_list_t b) __attribute__((alias("my_vfprintf"))); EXPORT int my_fprintf(x64emu_t *emu, void* F, void* fmt, void* b) { - myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 1); + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 2); + PREPARE_VALIST; + return vfprintf(F, fmt, VARARGS); +} +EXPORT int my___fprintf_chk(x64emu_t *emu, void* F, int flag, void* fmt, void* b) { + myStackAlign(emu, (const char*)fmt, b, emu->scratch, R_EAX, 3); PREPARE_VALIST; return vfprintf(F, fmt, VARARGS); } -EXPORT int my___fprintf_chk(x64emu_t *emu, void* F, void* fmt, void* b) __attribute__((alias("my_fprintf"))); #if 0 EXPORT int my_wprintf(x64emu_t *emu, void* fmt, void* b, va_list V) { diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 4aebcf85..be3b47e8 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -376,7 +376,7 @@ GOM(fork, lFEv) // Weak //GOW(fpathconf, //GO(__fpending, GOM(fprintf, iFEppV) -GOM(__fprintf_chk, iFEpvpV) +GOM(__fprintf_chk, iFEpipV) //DATA(__fpu_control, //GO(__fpurge, GO(fputc, iFip) diff --git a/src/wrapped/wrappedlibgl.c b/src/wrapped/wrappedlibgl.c index 2343506a..8f544a3c 100755 --- a/src/wrapped/wrappedlibgl.c +++ b/src/wrapped/wrappedlibgl.c @@ -75,8 +75,9 @@ EXPORT void* my_glXGetProcAddress(x64emu_t* emu, void* name) if(dlsym_error && box64_log<LOG_INFO) printf_log(LOG_NONE, "Warning, no wrapper for %s\n", rname); return NULL; } + const char* constname = kh_key(emu->context->glwrappers, k); AddOffsetSymbol(emu->context->maplib, symbol, rname); - ret = AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0); + ret = AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname); if(dlsym_error && box64_log<LOG_DEBUG) printf_log(LOG_NONE, "%p\n", (void*)ret); return (void*)ret; diff --git a/src/wrapped/wrappedlibx11.c b/src/wrapped/wrappedlibx11.c index 51d71079..d207f79f 100755 --- a/src/wrapped/wrappedlibx11.c +++ b/src/wrapped/wrappedlibx11.c @@ -204,7 +204,7 @@ static void* reverse_wire_to_eventFct(library_t* lib, void* fct) #define GO(A) if(my_wire_to_event_##A == fct) return (void*)my_wire_to_event_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); } // event_to_wire @@ -237,7 +237,7 @@ static void* reverse_event_to_wireFct(library_t* lib, void* fct) #define GO(A) if(my_event_to_wire_##A == fct) return (void*)my_event_to_wire_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); } // error_handler @@ -270,7 +270,7 @@ static void* reverse_error_handlerFct(library_t* lib, void* fct) #define GO(A) if(my_error_handler_##A == fct) return (void*)my_error_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL); } // ioerror_handler @@ -303,7 +303,7 @@ static void* reverse_ioerror_handlerFct(library_t* lib, void* fct) #define GO(A) if(my_ioerror_handler_##A == fct) return (void*)my_ioerror_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFp, fct, 0, NULL); } // exterror_handler @@ -336,7 +336,7 @@ static void* reverse_exterror_handlerFct(library_t* lib, void* fct) #define GO(A) if(my_exterror_handler_##A == fct) return (void*)my_exterror_handler_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpppp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFpppp, fct, 0, NULL); } // close_display @@ -369,7 +369,7 @@ static void* reverse_close_displayFct(library_t* lib, void* fct) #define GO(A) if(my_close_display_##A == fct) return (void*)my_close_display_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFpp, fct, 0, NULL); } // register_im @@ -402,7 +402,7 @@ static void* reverse_register_imFct(library_t* lib, void* fct) #define GO(A) if(my_register_im_##A == fct) return (void*)my_register_im_fct_##A; SUPER() #undef GO - return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0); + return (void*)AddBridge(lib->priv.w.bridge, iFppp, fct, 0, NULL); } // XConnectionWatchProc diff --git a/src/wrapped/wrappedlibxext.c b/src/wrapped/wrappedlibxext.c index 9482b70f..ab73af17 100755 --- a/src/wrapped/wrappedlibxext.c +++ b/src/wrapped/wrappedlibxext.c @@ -111,7 +111,7 @@ static void* reverse_exterrorhandleFct(void* fct) #define GO(A) if(my_exterrorhandle_##A == fct) return (void*)my_exterrorhandle_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, iFppp, fct, 0); + return (void*)AddBridge(my_lib->priv.w.bridge, iFppp, fct, 0, NULL); } #undef SUPER diff --git a/src/wrapped/wrappedopenal.c b/src/wrapped/wrappedopenal.c index 7f17bd4d..27b1af20 100755 --- a/src/wrapped/wrappedopenal.c +++ b/src/wrapped/wrappedopenal.c @@ -171,8 +171,9 @@ EXPORT void* my_alGetProcAddress(x64emu_t* emu, void* name) printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname); return NULL; } + const char* constname = kh_key(emu->context->alwrappers, k); AddOffsetSymbol(emu->context->maplib, symbol, rname); - return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0); + return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0, constname); } EXPORT void* my_alcGetProcAddress(x64emu_t* emu, void* device, void* name) @@ -206,8 +207,9 @@ EXPORT void* my_alcGetProcAddress(x64emu_t* emu, void* device, void* name) printf_log(LOG_INFO, "Warning, no wrapper for %s\n", rname); return NULL; } + const char* constname = kh_key(emu->context->alwrappers, k); AddOffsetSymbol(emu->context->maplib, symbol, rname); - return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0); + return (void*)AddBridge(emu->context->system, kh_value(emu->context->alwrappers, k), symbol, 0, constname); } EXPORT void my_alRequestFoldbackStart(x64emu_t *emu, int32_t mode, int32_t count, int32_t length, void* mem, void* cb) diff --git a/src/wrapped/wrappedsdl1.c b/src/wrapped/wrappedsdl1.c index f608b8ec..3f78bc38 100755 --- a/src/wrapped/wrappedsdl1.c +++ b/src/wrapped/wrappedsdl1.c @@ -213,7 +213,7 @@ static void* reverse_EvtFilterFct(void* fct) #define GO(A) if(my_EvtFilter_##A == fct) return (void*)my_EvtFilter_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_lib->priv.w.bridge, iFp, fct, 0); + return (void*)AddBridge(my_lib->priv.w.bridge, iFp, fct, 0, NULL); } #undef SUPER @@ -497,7 +497,8 @@ EXPORT void* my_SDL_GL_GetProcAddress(x64emu_t* emu, void* name) return NULL; } AddOffsetSymbol(emu->context->maplib, symbol, rname); - return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0); + const char* constname = kh_key(emu->context->glwrappers, k); + return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname); } // DL functions from wrappedlibdl.c @@ -546,9 +547,9 @@ EXPORT int32_t my_SDL_GetWMInfo(x64emu_t* emu, void* p) int ret = my->SDL_GetWMInfo(p); my_SDL_SysWMinfo *info = (my_SDL_SysWMinfo*)p; if(info->info.x11.lock_func) - info->info.x11.lock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.lock_func, 0); + info->info.x11.lock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.lock_func, 0, NULL); if(info->info.x11.unlock_func) - info->info.x11.unlock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.unlock_func, 0); + info->info.x11.unlock_func = (void*)AddBridge(emu->context->system, vFv, info->info.x11.unlock_func, 0, NULL); return ret; } diff --git a/src/wrapped/wrappedsdl2.c b/src/wrapped/wrappedsdl2.c index f0489193..97507a19 100755 --- a/src/wrapped/wrappedsdl2.c +++ b/src/wrapped/wrappedsdl2.c @@ -264,7 +264,7 @@ static void* reverse_eventfilter_Fct(void* fct) #define GO(A) if(my_eventfilter_##A == fct) return (void*)my_eventfilter_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, iFpp, fct, 0); + return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, iFpp, fct, 0, NULL); } // LogOutput @@ -297,7 +297,7 @@ static void* reverse_LogOutput_Fct(void* fct) #define GO(A) if(my_LogOutput_##A == fct) return (void*)my_LogOutput_fct_##A; SUPER() #undef GO - return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, vFpiip, fct, 0); + return (void*)AddBridge(my_context->sdl2lib->priv.w.bridge, vFpiip, fct, 0, NULL); } #undef SUPER @@ -773,7 +773,8 @@ EXPORT void* my2_SDL_GL_GetProcAddress(x64emu_t* emu, void* name) return NULL; } AddOffsetSymbol(emu->context->maplib, symbol, rname); - return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0); + const char* constname = kh_key(emu->context->glwrappers, k); + return (void*)AddBridge(emu->context->system, kh_value(emu->context->glwrappers, k), symbol, 0, constname); } #define nb_once 16 |