diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-08 16:40:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-08 16:40:35 +0100 |
| commit | e05796674bd7648faa4bbb4d61de2e641bed34b9 (patch) | |
| tree | 7d38c44b030c69de44fc9988840832999d7d719c | |
| parent | 0ce169e7f55a84eef801fec61e352c800ac8e5e6 (diff) | |
| parent | 726af707ebe92f0f1a98ea985343f6641fa45ba8 (diff) | |
| download | box64-e05796674bd7648faa4bbb4d61de2e641bed34b9.tar.gz box64-e05796674bd7648faa4bbb4d61de2e641bed34b9.zip | |
Merge branch 'main' of https://github.com/ptitSeb/box64 into main
| -rwxr-xr-x | docs/USAGE.md | 5 | ||||
| -rw-r--r-- | src/custommem.c | 19 | ||||
| -rwxr-xr-x | src/emu/x64syscall.c | 23 | ||||
| -rwxr-xr-x | src/include/debug.h | 2 | ||||
| -rwxr-xr-x | src/librarian/librarian.c | 5 | ||||
| -rwxr-xr-x | src/librarian/library.c | 4 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 2 | ||||
| -rwxr-xr-x | src/main.c | 15 | ||||
| -rwxr-xr-x | src/tools/box64stack.c | 1 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 7 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedvulkantypes.h | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 9 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 3 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 10 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvulkan.c | 17 | ||||
| -rwxr-xr-x | src/wrapped/wrappedvulkan_private.h | 55 |
16 files changed, 156 insertions, 25 deletions
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/custommem.c b/src/custommem.c index 5b399344..4d4ab240 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) @@ -1016,7 +1019,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 +1032,7 @@ static uintptr_t nextFree(uintptr_t addr) if(!memprot[idx>>16][i]) { return ((idx>>16)<<(16+12))+(i<<MEMPROT_SHIFT); } - addr += (1LL<<(16+12)); + addr += increment?increment:(1LL<<(16+12)); addr &= ~((1LL<<(16+12)-1LL)); } while(1); } @@ -1065,7 +1068,7 @@ void* find47bitBlock(size_t size) // slow iterative search... Would need something better one day uintptr_t addr = 0x100000000LL; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1075,7 +1078,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; @@ -1088,9 +1091,9 @@ 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); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1103,9 +1106,9 @@ 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); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; 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 diff --git a/src/include/debug.h b/src/include/debug.h index 0cb2be34..7fb8d558 100755 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -32,12 +32,14 @@ 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; 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/librarian/librarian.c b/src/librarian/librarian.c index a0419132..02a02ec6 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]); } @@ -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)); @@ -468,6 +469,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; diff --git a/src/librarian/library.c b/src/librarian/library.c index e390ebe6..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; @@ -894,7 +896,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); } 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 d344a1c9..34d2f58d 100755 --- a/src/main.c +++ b/src/main.c @@ -74,12 +74,14 @@ 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; 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; @@ -547,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; @@ -675,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"); @@ -1054,6 +1066,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/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; 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/wrappedlibc.c b/src/wrapped/wrappedlibc.c index e73e32cf..61429120 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2198,18 +2198,20 @@ 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? + 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) && ((uintptr_t)ret>0x7fffffffffffLL)) { + } 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); } 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 |