From 6ca94b9f3fb369187af66425f33c8c6d498a3b8f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 11:29:32 +0100 Subject: Some small changes to clone syscall --- src/emu/x64syscall.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index ca60b4c9..d83cbaba 100755 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -348,6 +348,8 @@ void EXPORT x64Syscall(x64emu_t *emu) R_RAX = (uintptr_t)my_mremap(emu, (void*)R_RDI, R_RSI, R_RDX, R_R10d, (void*)R_R8); break; case 56: // sys_clone + // x86_64 raw syscall is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); + // so flags=R_RDI, stack=R_RSI, parent_tid=R_RDX, child_tid=R_R10, tls=R_R8 if(R_RSI) { void* stack_base = (void*)R_RSI; @@ -370,7 +372,8 @@ void EXPORT x64Syscall(x64emu_t *emu) x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RSI)?0:1); SetupX64Emu(newemu); CloneEmu(newemu, emu); - SetRSP(newemu, (uintptr_t)stack_base); + Push64(newemu, 0); + PushExit(newemu); void* mystack = NULL; if(my_context->stack_clone_used) { mystack = malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it @@ -380,15 +383,14 @@ void EXPORT x64Syscall(x64emu_t *emu) mystack = my_context->stack_clone; my_context->stack_clone_used = 1; } - // x86_64 raw clone is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); - int64_t ret = clone(clone_fn, (void*)((uintptr_t)mystack+1024*1024), R_RDI, newemu, R_R10, R_R9, R_R8); - R_RAX = ret; + int64_t ret = clone(clone_fn, (void*)((uintptr_t)mystack+1024*1024), R_RDI, newemu, R_RDX, R_R8, R_R10); + R_RAX = (uint64_t)ret; } else #ifdef NOALIGN - R_RAX = syscall(__NR_clone, R_RSI, R_RDX, R_R10, R_R8, R_R9); + R_RAX = (uint64_t)syscall(__NR_clone, R_RDI, R_RSI, R_RDX, R_R10, R_R8); #else - R_RAX = syscall(__NR_clone, R_RSI, R_RDX, R_R10, R_R9, R_R8); // invert R_R8/R_R9 on Aarch64 and most other + R_RAX = (uint64_t)syscall(__NR_clone, R_RDI, R_RSI, R_RDX, R_R8, R_R10); // invert R_R8/R_R10 on Aarch64 and most other #endif break; #ifndef __NR_fork @@ -541,6 +543,8 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) case 25: // sys_mremap return (uintptr_t)my_mremap(emu, (void*)R_RSI, R_RDX, R_RCX, R_R8d, (void*)R_R9); case 56: // sys_clone + // x86_64 raw syscall is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); + // so flags=R_RSI, stack=R_RDX, parent_tid=R_RCX, child_tid=R_R8, tls=R_R9 if(R_RDX) { void* stack_base = (void*)R_RDX; @@ -565,7 +569,6 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) CloneEmu(newemu, emu); Push64(newemu, 0); PushExit(newemu); - SetRSP(newemu, (uintptr_t)stack_base); void* mystack = NULL; if(my_context->stack_clone_used) { mystack = malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it @@ -577,13 +580,13 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu) } // x86_64 raw clone is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); int64_t ret = clone(clone_fn, (void*)((uintptr_t)mystack+1024*1024), R_ESI, newemu, R_RCX, R_R9, R_R8); - return ret; + return (uintptr_t)ret; } else #ifdef NOALIGN - return syscall(__NR_clone, R_RSI, R_RDX, R_RCX, R_R8, R_R9); + return (uintptr_t)syscall(__NR_clone, R_RSI, R_RDX, R_RCX, R_R8, R_R9); #else - return syscall(__NR_clone, R_RSI, R_RDX, R_RCX, R_R9, R_R8); // invert R_R8/R_R9 on Aarch64 and most other + return (uintptr_t)syscall(__NR_clone, R_RSI, R_RDX, R_RCX, R_R9, R_R8); // invert R_R8/R_R9 on Aarch64 and most other #endif break; #ifndef __NR_fork -- cgit 1.4.1 From d2cb088918b139ece64d3d7eab670a560e236d80 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 15:23:15 +0100 Subject: Change on mmap to help some stagging version of wine --- src/custommem.c | 12 ++++++------ src/main.c | 3 +++ src/wrapped/wrappedlibc.c | 6 ++++-- 3 files changed, 13 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index 5b399344..359725ea 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1016,7 +1016,7 @@ uint32_t getProtection(uintptr_t addr) } #define LOWEST (void*)0x20000 -static uintptr_t nextFree(uintptr_t addr) +static uintptr_t nextFree(uintptr_t addr, uintptr_t increment) { if(addr>=(1LL<<48)) return 0; @@ -1029,7 +1029,7 @@ static uintptr_t nextFree(uintptr_t addr) if(!memprot[idx>>16][i]) { return ((idx>>16)<<(16+12))+(i<=size) { return (void*)addr; @@ -1075,7 +1075,7 @@ void* find47bitBlock(size_t size) // search in 32bits as a backup addr = (uintptr_t)LOWEST; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1090,7 +1090,7 @@ void* find47bitBlockNearHint(void* hint, size_t size) // slow iterative search... Would need something better one day uintptr_t addr = (uintptr_t)hint; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1105,7 +1105,7 @@ void* findBlockNearHint(void* hint, size_t size) // slow iterative search... Would need something better one day uintptr_t addr = (uintptr_t)hint; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; diff --git a/src/main.c b/src/main.c index d344a1c9..da2abdf9 100755 --- a/src/main.c +++ b/src/main.c @@ -1054,6 +1054,9 @@ int main(int argc, const char **argv, const char **env) { prgname = prog; else ++prgname; + if(box64_wine) { + AddPath("libdl.so.2", &ld_preload, 0); + } // special case for dontstarve that use an old SDL2 if(strstr(prgname, "dontstarve")) { printf_log(LOG_INFO, "Dontstarve* detected, forcing emulated SDL2\n"); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index e73e32cf..d53b1ced 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2198,14 +2198,16 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot #endif void* ret = mmap64(addr, length, prot, flags, fd, offset); #ifndef NOALIGN - if((ret!=(void*)-1) && (flags&0x40) && ((uintptr_t)ret>0xffffffff)) { + if((ret!=(void*)-1) && (flags&0x40) && + (((uintptr_t)ret>0xffffffff) || (box64_wine && ((uintptr_t)ret&~0xffff!=(uintptr_t)ret)))) { printf_log(LOG_DEBUG, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret); munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously addr = findBlockNearHint(addr, length); // is this the best way? ret = mmap64(addr, length, prot, flags, fd, offset); printf_log(LOG_DEBUG, " tried again with %p, got %p\n", addr, ret); - } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && ((uintptr_t)ret>0x7fffffffffffLL)) { + } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && + (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff!=(uintptr_t)ret))) { printf_log(LOG_DEBUG, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret); munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously -- cgit 1.4.1 From e517e5877659a5669113401ab12df2936c11c3f1 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 16:27:19 +0100 Subject: Improved speed of mmap changes --- src/custommem.c | 3 +++ src/include/debug.h | 1 + src/librarian/library.c | 1 + src/main.c | 3 ++- src/wrapped/wrappedlibc.c | 6 +++--- 5 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index 359725ea..b653e78b 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,6 +940,8 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { + if(box64_mapclean) + return; char buf[500]; FILE *f = fopen("/proc/self/maps", "r"); if(!f) @@ -955,6 +957,7 @@ void loadProtectionFromMap() } } fclose(f); + box64_mapclean = 1; } static int blockempty(uint8_t* mem) diff --git a/src/include/debug.h b/src/include/debug.h index 0cb2be34..5a300117 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -32,6 +32,7 @@ extern uintptr_t trace_start, trace_end; extern char* trace_func; #endif extern int allow_missing_libs; +extern int box64_mapclean; extern int box64_prefer_wrapped; extern int box64_steam; extern int box64_wine; diff --git a/src/librarian/library.c b/src/librarian/library.c index e390ebe6..e41588f6 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -198,6 +198,7 @@ static void initNativeLib(library_t *lib, box64context_t* context) { return; // non blocker... } printf_log(LOG_INFO, "Using native(wrapped) %s\n", lib->name); + box64_mapclean = 0; lib->priv.w.box64lib = context->box64lib; lib->context = context; lib->fini = wrappedlibs[i].fini; diff --git a/src/main.c b/src/main.c index da2abdf9..ec89cd13 100755 --- a/src/main.c +++ b/src/main.c @@ -74,6 +74,7 @@ int x11glx = 1; int allow_missing_libs = 0; int box64_prefer_wrapped = 0; int fix_64bit_inodes = 0; +int box64_mapclean = 0; int box64_zoom = 0; int box64_steam = 0; int box64_wine = 0; @@ -957,7 +958,7 @@ int main(int argc, const char **argv, const char **env) { //wine_preloaded = 1; } } - #if 0 + #if 1 // pre-check for pressure-vessel-wrap if(strstr(prog, "pressure-vessel-wrap")==(prog+strlen(prog)-strlen("pressure-vessel-wrap"))) { // pressure-vessel-wrap detecter, skipping it and all -- args until "--" if needed diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index d53b1ced..61429120 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2203,15 +2203,15 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot printf_log(LOG_DEBUG, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret); munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously - addr = findBlockNearHint(addr, length); // is this the best way? + addr = findBlockNearHint(old_addr, length); // is this the best way? ret = mmap64(addr, length, prot, flags, fd, offset); printf_log(LOG_DEBUG, " tried again with %p, got %p\n", addr, ret); - } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && + } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && (old_addr) && (addr!=ret) && (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff!=(uintptr_t)ret))) { printf_log(LOG_DEBUG, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret); munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously - addr = find47bitBlock(length); // is this the best way? + addr = find47bitBlockNearHint(old_addr, length); // is this the best way? ret = mmap64(addr, length, prot, flags, fd, offset); printf_log(LOG_DEBUG, " tried again with %p, got %p\n", addr, ret); } -- cgit 1.4.1 From a996f4c091c6ff1bff47f758e086a5fe925d0885 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 16:54:17 +0100 Subject: Added some vulkan extentions --- src/wrapped/generated/functions_list.txt | 7 ++++ src/wrapped/generated/wrappedvulkantypes.h | 4 +++ src/wrapped/generated/wrapper.c | 9 +++++ src/wrapped/generated/wrapper.h | 3 ++ src/wrapped/wrappedvulkan.c | 17 +++++++++ src/wrapped/wrappedvulkan_private.h | 55 ++++++++++++++++++++++++++++++ 6 files changed, 95 insertions(+) (limited to 'src') diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index d9d8a697..10080772 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -1012,6 +1012,7 @@ #() vFpuuuu #() vFpuuup #() vFpuupp +#() vFpuUUu #() vFpuddd #() vFpupup #() vFpUuiu @@ -1303,6 +1304,7 @@ #() vFpiiipp #() vFpiiuuu #() vFpiippp +#() vFpiUuup #() vFpipipV #() vFpipppi #() vFpuiiii @@ -1387,6 +1389,7 @@ #() iFpuiCpp #() iFpuippp #() iFpupuui +#() iFpUuupp #() iFpUUUip #() iFpUUUUp #() iFpLLppp @@ -3713,6 +3716,7 @@ wrappedvulkan: - vkDestroyShaderModule - vkDestroySurfaceKHR - vkDestroySwapchainKHR + - vkDestroyValidationCacheEXT - vFppp: - vkDestroyDebugUtilsMessengerEXT - iFpUp: @@ -3754,15 +3758,18 @@ wrappedvulkan: - vkCreateSemaphore - vkCreateShaderModule - vkCreateSwapchainKHR + - vkCreateValidationCacheEXT - vkCreateWaylandSurfaceKHR - vkCreateXcbSurfaceKHR - vkCreateXlibSurfaceKHR + - vkRegisterDeviceEventEXT - vFpupup: - vkUpdateDescriptorSets - iFpuppp: - vkCreateSharedSwapchainsKHR - iFpUppp: - vkCreateDisplayModeKHR + - vkRegisterDisplayEventEXT - iFpUuppp: - vkCreateComputePipelines - vkCreateGraphicsPipelines diff --git a/src/wrapped/generated/wrappedvulkantypes.h b/src/wrapped/generated/wrappedvulkantypes.h index a7b1e897..a5973d09 100644 --- a/src/wrapped/generated/wrappedvulkantypes.h +++ b/src/wrapped/generated/wrappedvulkantypes.h @@ -56,6 +56,7 @@ typedef void (*vFpiiiupupup_t)(void*, int64_t, int64_t, int64_t, uint64_t, void* GO(vkDestroyShaderModule, vFpUp_t) \ GO(vkDestroySurfaceKHR, vFpUp_t) \ GO(vkDestroySwapchainKHR, vFpUp_t) \ + GO(vkDestroyValidationCacheEXT, vFpUp_t) \ GO(vkDestroyDebugUtilsMessengerEXT, vFppp_t) \ GO(vkFreeMemory, iFpUp_t) \ GO(vkCreateInstance, iFppp_t) \ @@ -92,12 +93,15 @@ typedef void (*vFpiiiupupup_t)(void*, int64_t, int64_t, int64_t, uint64_t, void* GO(vkCreateSemaphore, iFpppp_t) \ GO(vkCreateShaderModule, iFpppp_t) \ GO(vkCreateSwapchainKHR, iFpppp_t) \ + GO(vkCreateValidationCacheEXT, iFpppp_t) \ GO(vkCreateWaylandSurfaceKHR, iFpppp_t) \ GO(vkCreateXcbSurfaceKHR, iFpppp_t) \ GO(vkCreateXlibSurfaceKHR, iFpppp_t) \ + GO(vkRegisterDeviceEventEXT, iFpppp_t) \ GO(vkUpdateDescriptorSets, vFpupup_t) \ GO(vkCreateSharedSwapchainsKHR, iFpuppp_t) \ GO(vkCreateDisplayModeKHR, iFpUppp_t) \ + GO(vkRegisterDisplayEventEXT, iFpUppp_t) \ GO(vkCreateComputePipelines, iFpUuppp_t) \ GO(vkCreateGraphicsPipelines, iFpUuppp_t) \ GO(vkGetPhysicalDeviceSparseImageFormatProperties, vFpiiiiipp_t) \ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index 5ac6e503..432b0b82 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -1046,6 +1046,7 @@ typedef void (*vFpuipp_t)(void*, uint64_t, int64_t, void*, void*); typedef void (*vFpuuuu_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t); typedef void (*vFpuuup_t)(void*, uint64_t, uint64_t, uint64_t, void*); typedef void (*vFpuupp_t)(void*, uint64_t, uint64_t, void*, void*); +typedef void (*vFpuUUu_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t); typedef void (*vFpuddd_t)(void*, uint64_t, double, double, double); typedef void (*vFpupup_t)(void*, uint64_t, void*, uint64_t, void*); typedef void (*vFpUuiu_t)(void*, uint64_t, uint64_t, int64_t, uint64_t); @@ -1337,6 +1338,7 @@ typedef void (*vFpiiiii_t)(void*, int64_t, int64_t, int64_t, int64_t, int64_t); typedef void (*vFpiiipp_t)(void*, int64_t, int64_t, int64_t, void*, void*); typedef void (*vFpiiuuu_t)(void*, int64_t, int64_t, uint64_t, uint64_t, uint64_t); typedef void (*vFpiippp_t)(void*, int64_t, int64_t, void*, void*, void*); +typedef void (*vFpiUuup_t)(void*, int64_t, uint64_t, uint64_t, uint64_t, void*); typedef void (*vFpipipV_t)(void*, int64_t, void*, int64_t, void*, void*); typedef void (*vFpipppi_t)(void*, int64_t, void*, void*, void*, int64_t); typedef void (*vFpuiiii_t)(void*, uint64_t, int64_t, int64_t, int64_t, int64_t); @@ -1421,6 +1423,7 @@ typedef int64_t (*iFpWpppp_t)(void*, uint16_t, void*, void*, void*, void*); typedef int64_t (*iFpuiCpp_t)(void*, uint64_t, int64_t, uint8_t, void*, void*); typedef int64_t (*iFpuippp_t)(void*, uint64_t, int64_t, void*, void*, void*); typedef int64_t (*iFpupuui_t)(void*, uint64_t, void*, uint64_t, uint64_t, int64_t); +typedef int64_t (*iFpUuupp_t)(void*, uint64_t, uint64_t, uint64_t, void*, void*); typedef int64_t (*iFpUUUip_t)(void*, uint64_t, uint64_t, uint64_t, int64_t, void*); typedef int64_t (*iFpUUUUp_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t, void*); typedef int64_t (*iFpLLppp_t)(void*, uintptr_t, uintptr_t, void*, void*, void*); @@ -3103,6 +3106,7 @@ void vFpuipp(x64emu_t *emu, uintptr_t fcn) { vFpuipp_t fn = (vFpuipp_t)fcn; fn(( void vFpuuuu(x64emu_t *emu, uintptr_t fcn) { vFpuuuu_t fn = (vFpuuuu_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8); } void vFpuuup(x64emu_t *emu, uintptr_t fcn) { vFpuuup_t fn = (vFpuuup_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (void*)R_R8); } void vFpuupp(x64emu_t *emu, uintptr_t fcn) { vFpuupp_t fn = (vFpuupp_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (void*)R_RCX, (void*)R_R8); } +void vFpuUUu(x64emu_t *emu, uintptr_t fcn) { vFpuUUu_t fn = (vFpuUUu_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8); } void vFpuddd(x64emu_t *emu, uintptr_t fcn) { vFpuddd_t fn = (vFpuddd_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0]); } void vFpupup(x64emu_t *emu, uintptr_t fcn) { vFpupup_t fn = (vFpupup_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (void*)R_RDX, (uint64_t)R_RCX, (void*)R_R8); } void vFpUuiu(x64emu_t *emu, uintptr_t fcn) { vFpUuiu_t fn = (vFpUuiu_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (int64_t)R_RCX, (uint64_t)R_R8); } @@ -3394,6 +3398,7 @@ void vFpiiiii(x64emu_t *emu, uintptr_t fcn) { vFpiiiii_t fn = (vFpiiiii_t)fcn; f void vFpiiipp(x64emu_t *emu, uintptr_t fcn) { vFpiiipp_t fn = (vFpiiipp_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (void*)R_R8, (void*)R_R9); } void vFpiiuuu(x64emu_t *emu, uintptr_t fcn) { vFpiiuuu_t fn = (vFpiiuuu_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (uint64_t)R_R9); } void vFpiippp(x64emu_t *emu, uintptr_t fcn) { vFpiippp_t fn = (vFpiippp_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); } +void vFpiUuup(x64emu_t *emu, uintptr_t fcn) { vFpiUuup_t fn = (vFpiUuup_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (void*)R_R9); } void vFpipipV(x64emu_t *emu, uintptr_t fcn) { vFpipipV_t fn = (vFpipipV_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (void*)R_RDX, (int64_t)R_RCX, (void*)R_R8, (void*)(R_RSP + 8)); } void vFpipppi(x64emu_t *emu, uintptr_t fcn) { vFpipppi_t fn = (vFpipppi_t)fcn; fn((void*)R_RDI, (int64_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (int64_t)R_R9); } void vFpuiiii(x64emu_t *emu, uintptr_t fcn) { vFpuiiii_t fn = (vFpuiiii_t)fcn; fn((void*)R_RDI, (uint64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9); } @@ -3478,6 +3483,7 @@ void iFpWpppp(x64emu_t *emu, uintptr_t fcn) { iFpWpppp_t fn = (iFpWpppp_t)fcn; R void iFpuiCpp(x64emu_t *emu, uintptr_t fcn) { iFpuiCpp_t fn = (iFpuiCpp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (int64_t)R_RDX, (uint8_t)R_RCX, (void*)R_R8, (void*)R_R9); } void iFpuippp(x64emu_t *emu, uintptr_t fcn) { iFpuippp_t fn = (iFpuippp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (int64_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); } void iFpupuui(x64emu_t *emu, uintptr_t fcn) { iFpupuui_t fn = (iFpupuui_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (void*)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (int64_t)R_R9); } +void iFpUuupp(x64emu_t *emu, uintptr_t fcn) { iFpUuupp_t fn = (iFpUuupp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (void*)R_R8, (void*)R_R9); } void iFpUUUip(x64emu_t *emu, uintptr_t fcn) { iFpUUUip_t fn = (iFpUUUip_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (int64_t)R_R8, (void*)R_R9); } void iFpUUUUp(x64emu_t *emu, uintptr_t fcn) { iFpUUUUp_t fn = (iFpUUUUp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (void*)R_R9); } void iFpLLppp(x64emu_t *emu, uintptr_t fcn) { iFpLLppp_t fn = (iFpLLppp_t)fcn; R_RAX=(int64_t)fn((void*)R_RDI, (uintptr_t)R_RSI, (uintptr_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); } @@ -5023,6 +5029,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &vFpuuuu) return 1; if (fun == &vFpuuup) return 1; if (fun == &vFpuupp) return 1; + if (fun == &vFpuUUu) return 1; if (fun == &vFpuddd) return 4; if (fun == &vFpupup) return 1; if (fun == &vFpUuiu) return 1; @@ -5266,6 +5273,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &vFpiiipp) return 1; if (fun == &vFpiiuuu) return 1; if (fun == &vFpiippp) return 1; + if (fun == &vFpiUuup) return 1; if (fun == &vFpipppi) return 1; if (fun == &vFpuiiii) return 1; if (fun == &vFpuiiiu) return 1; @@ -5338,6 +5346,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &iFpuiCpp) return 1; if (fun == &iFpuippp) return 1; if (fun == &iFpupuui) return 1; + if (fun == &iFpUuupp) return 1; if (fun == &iFpUUUip) return 1; if (fun == &iFpUUUUp) return 1; if (fun == &iFpLLppp) return 1; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index 5ec7c7ac..7e947327 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -1045,6 +1045,7 @@ void vFpuipp(x64emu_t *emu, uintptr_t fnc); void vFpuuuu(x64emu_t *emu, uintptr_t fnc); void vFpuuup(x64emu_t *emu, uintptr_t fnc); void vFpuupp(x64emu_t *emu, uintptr_t fnc); +void vFpuUUu(x64emu_t *emu, uintptr_t fnc); void vFpuddd(x64emu_t *emu, uintptr_t fnc); void vFpupup(x64emu_t *emu, uintptr_t fnc); void vFpUuiu(x64emu_t *emu, uintptr_t fnc); @@ -1336,6 +1337,7 @@ void vFpiiiii(x64emu_t *emu, uintptr_t fnc); void vFpiiipp(x64emu_t *emu, uintptr_t fnc); void vFpiiuuu(x64emu_t *emu, uintptr_t fnc); void vFpiippp(x64emu_t *emu, uintptr_t fnc); +void vFpiUuup(x64emu_t *emu, uintptr_t fnc); void vFpipipV(x64emu_t *emu, uintptr_t fnc); void vFpipppi(x64emu_t *emu, uintptr_t fnc); void vFpuiiii(x64emu_t *emu, uintptr_t fnc); @@ -1420,6 +1422,7 @@ void iFpWpppp(x64emu_t *emu, uintptr_t fnc); void iFpuiCpp(x64emu_t *emu, uintptr_t fnc); void iFpuippp(x64emu_t *emu, uintptr_t fnc); void iFpupuui(x64emu_t *emu, uintptr_t fnc); +void iFpUuupp(x64emu_t *emu, uintptr_t fnc); void iFpUUUip(x64emu_t *emu, uintptr_t fnc); void iFpUUUUp(x64emu_t *emu, uintptr_t fnc); void iFpLLppp(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedvulkan.c b/src/wrapped/wrappedvulkan.c index e9528f05..75b14bfb 100755 --- a/src/wrapped/wrappedvulkan.c +++ b/src/wrapped/wrappedvulkan.c @@ -476,6 +476,21 @@ CREATE(vkCreateXlibSurfaceKHR) CREATE(vkCreateRenderPass2) CREATE(vkCreateRenderPass2KHR) +EXPORT int my_vkRegisterDeviceEventEXT(x64emu_t* emu, void* device, void* info, my_VkAllocationCallbacks_t* pAllocator, void* pFence) +{ + vulkan_my_t* my = (vulkan_my_t*)my_lib->priv.w.p2; + my_VkAllocationCallbacks_t my_alloc; + return my->vkRegisterDeviceEventEXT(device, info, find_VkAllocationCallbacks(&my_alloc, pAllocator), pFence); +} +EXPORT int my_vkRegisterDisplayEventEXT(x64emu_t* emu, void* device, uint64_t disp, void* info, my_VkAllocationCallbacks_t* pAllocator, void* pFence) +{ + vulkan_my_t* my = (vulkan_my_t*)my_lib->priv.w.p2; + my_VkAllocationCallbacks_t my_alloc; + return my->vkRegisterDisplayEventEXT(device, disp, info, find_VkAllocationCallbacks(&my_alloc, pAllocator), pFence); +} + +CREATE(vkCreateValidationCacheEXT) + DESTROY64(vkDestroyBuffer) DESTROY64(vkDestroyBufferView) DESTROY64(vkDestroyCommandPool) @@ -524,6 +539,8 @@ DESTROY64(vkDestroySurfaceKHR) DESTROY64(vkDestroySamplerYcbcrConversionKHR) +DESTROY64(vkDestroyValidationCacheEXT) + EXPORT void my_vkGetPhysicalDeviceProperties(x64emu_t* emu, void* device, void* pProps) { vulkan_my_t* my = (vulkan_my_t*)my_lib->priv.w.p2; diff --git a/src/wrapped/wrappedvulkan_private.h b/src/wrapped/wrappedvulkan_private.h index 1489ea76..cb383246 100755 --- a/src/wrapped/wrappedvulkan_private.h +++ b/src/wrapped/wrappedvulkan_private.h @@ -409,3 +409,58 @@ GO(vkCmdDrawIndirectCountKHR, vFpUUUUuu) // VK_AMD_draw_indirect_count GO(vkCmdDrawIndexedIndirectCountAMD, vFpUUUUuu) GO(vkCmdDrawIndirectCountAMD, vFpUUUUuu) + +// VK_AMD_buffer_marker +GO(vkCmdWriteBufferMarkerAMD, vFpuUUu) + +// VK_AMD_shader_info +GO(vkGetShaderInfoAMD, iFpUuupp) + +// VK_EXT_debug_marker +GO(vkCmdDebugMarkerBeginEXT, vFpp) +GO(vkCmdDebugMarkerEndEXT, vFp) +GO(vkCmdDebugMarkerInsertEXT, vFpp) +GO(vkDebugMarkerSetObjectNameEXT, iFpp) +GO(vkDebugMarkerSetObjectTagEXT, iFpp) + +// VK_EXT_discard_rectangles +GO(vkCmdSetDiscardRectangleEXT, vFpuup) + +// VK_EXT_display_control +GO(vkDisplayPowerControlEXT, iFpUp) +GO(vkGetSwapchainCounterEXT, iFpUup) +GOM(vkRegisterDeviceEventEXT, iFEpppp) +GOM(vkRegisterDisplayEventEXT, iFEpUppp) + +// VK_EXT_external_memory_host +GO(vkGetMemoryHostPointerPropertiesEXT, iFpupp) + +// VK_EXT_hdr_metadata +GO(vkSetHdrMetadataEXT, vFpupp) + +// VK_EXT_validation_cache +GOM(vkCreateValidationCacheEXT, iFEpppp) +GOM(vkDestroyValidationCacheEXT, vFEpUp) +GO(vkGetValidationCacheDataEXT, iFpUpp) +GO(vkMergeValidationCachesEXT, iFpUup) + +// VK_GOOGLE_display_timing +GO(vkGetPastPresentationTimingGOOGLE, iFpUpp) +GO(vkGetRefreshCycleDurationGOOGLE, iFpUp) + +// VK_KHR_external_fence_fd +GO(vkGetFenceFdKHR, iFppp) +GO(vkImportFenceFdKHR, iFpp) + +// VK_KHR_external_semaphore_fd +GO(vkGetSemaphoreFdKHR, iFppp) +GO(vkImportSemaphoreFdKHR, iFpp) + +// VK_KHR_push_descriptor +GO(vkCmdPushDescriptorSetKHR, vFpiUuup) + +// VK_KHR_shared_presentable_image +GO(vkGetSwapchainStatusKHR, iFpU) + +// VK_NV_clip_space_w_scaling +GO(vkCmdSetViewportWScalingNV, vFpuup) \ No newline at end of file -- cgit 1.4.1 From 0a08b7da1aaa4d2f0d1f971e5ed22d1be5bba96c Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 17:14:15 +0100 Subject: Removed a debugging leftover --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index ec89cd13..d5a420c2 100755 --- a/src/main.c +++ b/src/main.c @@ -958,7 +958,7 @@ int main(int argc, const char **argv, const char **env) { //wine_preloaded = 1; } } - #if 1 + #if 0 // pre-check for pressure-vessel-wrap if(strstr(prog, "pressure-vessel-wrap")==(prog+strlen(prog)-strlen("pressure-vessel-wrap"))) { // pressure-vessel-wrap detecter, skipping it and all -- args until "--" if needed -- cgit 1.4.1 From b525b0bdd4528ea19b8323c87f2eb31f45eaf3ab Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 18:50:48 +0100 Subject: Fixed a rare case of segfault --- src/librarian/librarian.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index a0419132..e1d4acb9 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -468,6 +468,8 @@ void** my_GetGTKDisplay(); void** my_GetGthreadsGotInitialized(); int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, uintptr_t* end, elfheader_t* self, int version, const char* vername) { + if(!maplib) + return 0; if(GetGlobalSymbolStartEnd_internal(maplib, name, start, end, self, version, vername)) { if(start && end && *end==*start) { // object is of 0 sized, try to see an "_END" object of null size uintptr_t start2, end2; -- cgit 1.4.1 From 9c47b1fbf933d33804cba51d8aa6adf728810133 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 18:51:18 +0100 Subject: Added an option to always show SIGSEGV messages --- docs/USAGE.md | 5 +++++ src/include/debug.h | 1 + src/libtools/signals.c | 2 +- src/main.c | 11 +++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/docs/USAGE.md b/docs/USAGE.md index dfa34b4f..9d90e7dd 100755 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -78,6 +78,11 @@ Disable handling of SigILL (to ease debugging mainly). * 0 : Let x86 program set sighandler for Illegal Instruction * 1 : Disables the handling of SigILL +#### BOX64_SHOWSEGV +Show Segfault signal even if a signal handler is present + * 0 : Don"t force show the SIGSEGV analysis (Default.) + * 1 : Show SIGSEGV detail, even if a signal handler is present + #### BOX64_X11THREADS Call XInitThreads when loading X11. (This is mostly for old Loki games with the Loki_Compat library.) * 0 : Don't force call XInitThreads. (Default.) diff --git a/src/include/debug.h b/src/include/debug.h index 5a300117..7fb8d558 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -39,6 +39,7 @@ extern int box64_wine; extern int box64_nopulse; // disabling the use of wrapped pulseaudio extern int box64_nogtk; // disabling the use of wrapped gtk extern int box64_novulkan; // disabling the use of wrapped vulkan +extern int box64_showsegv; // show sigv, even if a signal handler is present extern uintptr_t fmod_smc_start, fmod_smc_end; // to handle libfmod (from Unreal) SMC (self modifying code) extern uint32_t default_gs; extern int jit_gdb; // launch gdb when a segfault is trapped diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 7d4586dc..a98b570a 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -749,7 +749,7 @@ static pthread_mutex_t mutex_dynarec_prot; void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) { // sig==SIGSEGV || sig==SIGBUS || sig==SIGILL here! - int log_minimum = (my_context->is_sigaction[sig] && sig==SIGSEGV)?LOG_DEBUG:LOG_INFO; + int log_minimum = (box64_showsegv)?LOG_NONE:((my_context->is_sigaction[sig] && sig==SIGSEGV)?LOG_DEBUG:LOG_INFO); ucontext_t *p = (ucontext_t *)ucntx; void* addr = (void*)info->si_addr; // address that triggered the issue void* rsp = NULL; diff --git a/src/main.c b/src/main.c index d5a420c2..34d2f58d 100755 --- a/src/main.c +++ b/src/main.c @@ -81,6 +81,7 @@ int box64_wine = 0; int box64_nopulse = 0; int box64_nogtk = 0; int box64_novulkan = 0; +int box64_showsegv = 0; char* libGL = NULL; uintptr_t fmod_smc_start = 0; uintptr_t fmod_smc_end = 0; @@ -548,6 +549,15 @@ void LoadLogEnv() if(jit_gdb) printf_log(LOG_INFO, "Launch %s on segfault\n", (jit_gdb==2)?"gdbserver":"gdb"); } + p = getenv("BOX64_SHOWSEGV"); + if(p) { + if(strlen(p)==1) { + if(p[0]>='0' && p[0]<='0'+1) + box64_showsegv = p[0]-'0'; + } + if(box64_showsegv) + printf_log(LOG_INFO, "Show Segfault signal even if a signal handler is present\n"); + } box64_pagesize = sysconf(_SC_PAGESIZE); if(!box64_pagesize) box64_pagesize = 4096; @@ -676,6 +686,7 @@ void PrintHelp() { printf(" BOX64_LOAD_ADDR=0xXXXXXX try to load at 0xXXXXXX main binary (if binary is a PIE)\n"); printf(" BOX64_NOSIGSEGV=1 to disable handling of SigSEGV\n"); printf(" BOX64_NOSIGILL=1 to disable handling of SigILL\n"); + printf(" BOX64_SHOWSEGV=1 to show Segfault signal even if a signal handler is present\n"); printf(" BOX64_X11THREADS=1 to call XInitThreads when loading X11 (for old Loki games with Loki_Compat lib)"); printf(" BOX64_LIBGL=libXXXX set the name (and optionnaly full path) for libGL.so.1\n"); printf(" BOX64_LD_PRELOAD=XXXX[:YYYYY] force loading XXXX (and YYYY...) libraries with the binary\n"); -- cgit 1.4.1 From a326c821580ed2cd6665312a6d78696c5f6afcca Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 6 Mar 2022 19:13:08 +0100 Subject: Fixed dlinfo (helps wine) --- src/librarian/librarian.c | 2 +- src/librarian/library.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index e1d4acb9..adcf647e 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -294,7 +294,7 @@ int AddNeededLib_add(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib printf_log(LOG_DEBUG, "Failure to add lib linkmap\n"); return 1; } - lm->l_addr = (Elf64_Addr)GetBaseAddress(my_context->elfs[lib->priv.n.elf_index]); + lm->l_addr = (Elf64_Addr)GetElfDelta(my_context->elfs[lib->priv.n.elf_index]); lm->l_name = lib->name; lm->l_ld = GetDynamicSection(my_context->elfs[lib->priv.n.elf_index]); } diff --git a/src/librarian/library.c b/src/librarian/library.c index e41588f6..4ed54096 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -895,7 +895,7 @@ void AddMainElfToLinkmap(elfheader_t* elf) { linkmap_t* lm = addLinkMapLib(NULL); // main elf will have a null lib link - lm->l_addr = (Elf64_Addr)GetBaseAddress(elf); + lm->l_addr = (Elf64_Addr)GetElfDelta(elf); lm->l_name = my_context->fullpath; lm->l_ld = GetDynamicSection(elf); } -- cgit 1.4.1 From 622baec9529bb261cd250c2c2b9768b75ee0530f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 14:14:07 +0100 Subject: Fix some special case on mmap64 wrapping --- src/custommem.c | 5 +++-- src/librarian/librarian.c | 1 + src/librarian/library.c | 1 - src/libtools/signals.c | 7 ++----- src/tools/box64stack.c | 1 + 5 files changed, 7 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index b653e78b..843532bb 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,6 +940,7 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { +printf_log(LOG_INFO, "loadProtectionFromMap(), mapclean=%d\n", box64_mapclean); if(box64_mapclean) return; char buf[500]; @@ -1091,7 +1092,7 @@ void* find47bitBlock(size_t size) void* find47bitBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); @@ -1106,7 +1107,7 @@ void* find47bitBlockNearHint(void* hint, size_t size) void* findBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index adcf647e..02a02ec6 100755 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -342,6 +342,7 @@ int AddNeededLib_init(lib_t* maplib, needed_libs_t* neededlibs, library_t* depli EXPORTDYN int AddNeededLib(lib_t* maplib, needed_libs_t* neededlibs, library_t* deplib, int local, int bindnow, const char** paths, int npath, box64context_t* box64, x64emu_t* emu) { + box64_mapclean = 0; if(!neededlibs) { neededlibs = alloca(sizeof(needed_libs_t)); memset(neededlibs, 0, sizeof(needed_libs_t)); diff --git a/src/librarian/library.c b/src/librarian/library.c index 4ed54096..85e4dfc3 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -198,7 +198,6 @@ static void initNativeLib(library_t *lib, box64context_t* context) { return; // non blocker... } printf_log(LOG_INFO, "Using native(wrapped) %s\n", lib->name); - box64_mapclean = 0; lib->priv.w.box64lib = context->box64lib; lib->context = context; lib->fini = wrappedlibs[i].fini; diff --git a/src/libtools/signals.c b/src/libtools/signals.c index a98b570a..e0410b1c 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -505,7 +505,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void sigcontext->uc_mcontext.gregs[X64_RBP] = R_RBP; sigcontext->uc_mcontext.gregs[X64_RSP] = R_RSP; sigcontext->uc_mcontext.gregs[X64_RBX] = R_RBX; - sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP;//emu->old_ip; // old_ip should be more accurate as the "current" IP, but it's not always up-to-date + sigcontext->uc_mcontext.gregs[X64_RIP] = emu->old_ip; // flags sigcontext->uc_mcontext.gregs[X64_EFL] = emu->eflags.x64; // get segments @@ -934,10 +934,7 @@ exit(-1); const char* x64name = NULL; const char* elfname = NULL; x64emu_t* emu = thread_get_emu(); - // Adjust RIP for special case of NULL function run - if(sig==SIGSEGV && R_RIP==0x1 && (uintptr_t)info->si_addr==0x0) - R_RIP = 0x0; - x64pc = R_RIP; + x64pc = emu->old_ip; rsp = (void*)R_RSP; #if defined(DYNAREC) #if defined(ARM64) diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c index 9a5ca602..5ede282e 100755 --- a/src/tools/box64stack.c +++ b/src/tools/box64stack.c @@ -167,6 +167,7 @@ void SetupInitialStack(x64emu_t *emu) Push(emu, p_random); Push(emu, 25); //AT_RANDOM(25)=p_random Push(emu, 0); Push(emu, 26); //AT_HWCAP2(26)=0 Push(emu, p_arg0); Push(emu, 31); //AT_EXECFN(31)=p_arg0 + Push(emu, emu->context->vsyscall); Push(emu, 32); //AT_SYSINFO(32)=vsyscall //Push(emu, 0); Push(emu, 33); //AT_SYSINFO_EHDR(33)=address of vDSO if(!emu->context->auxval_start) // store auxval start if needed emu->context->auxval_start = (uintptr_t*)R_RSP; -- cgit 1.4.1 From 749c8711242a5cd1ba303468a8740aaedf8c93bd Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 14:18:04 +0100 Subject: Small change is symbol gathering for wrapped libs --- src/librarian/library.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/librarian/library.c b/src/librarian/library.c index 85e4dfc3..46aead20 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -811,6 +811,8 @@ int getSymbolInMaps(library_t *lib, const char* name, int noweak, uintptr_t *add { if(!lib->active) return 0; + if(version==-2) // don't send global native symbol for a version==-2 search + return 0; // check in datamaps (but no version, it's not handled there) if(getSymbolInDataMaps(lib, name, noweak, addr, size)) return 1; -- cgit 1.4.1 From 0b37d4aac24518623d5a697ec0914961f827853f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 14:44:38 +0100 Subject: Rolback this change in signal, and better change the interpretor handling of IP instead --- src/libtools/signals.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index e0410b1c..a98b570a 100755 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -505,7 +505,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void sigcontext->uc_mcontext.gregs[X64_RBP] = R_RBP; sigcontext->uc_mcontext.gregs[X64_RSP] = R_RSP; sigcontext->uc_mcontext.gregs[X64_RBX] = R_RBX; - sigcontext->uc_mcontext.gregs[X64_RIP] = emu->old_ip; + sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP;//emu->old_ip; // old_ip should be more accurate as the "current" IP, but it's not always up-to-date // flags sigcontext->uc_mcontext.gregs[X64_EFL] = emu->eflags.x64; // get segments @@ -934,7 +934,10 @@ exit(-1); const char* x64name = NULL; const char* elfname = NULL; x64emu_t* emu = thread_get_emu(); - x64pc = emu->old_ip; + // Adjust RIP for special case of NULL function run + if(sig==SIGSEGV && R_RIP==0x1 && (uintptr_t)info->si_addr==0x0) + R_RIP = 0x0; + x64pc = R_RIP; rsp = (void*)R_RSP; #if defined(DYNAREC) #if defined(ARM64) -- cgit 1.4.1 From 726af707ebe92f0f1a98ea985343f6641fa45ba8 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 7 Mar 2022 15:08:35 +0100 Subject: Removed a debug leftover --- src/custommem.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index 843532bb..4d4ab240 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,7 +940,6 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { -printf_log(LOG_INFO, "loadProtectionFromMap(), mapclean=%d\n", box64_mapclean); if(box64_mapclean) return; char buf[500]; -- cgit 1.4.1