about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c19
-rwxr-xr-xsrc/emu/x64syscall.c23
-rwxr-xr-xsrc/include/debug.h2
-rwxr-xr-xsrc/librarian/librarian.c5
-rwxr-xr-xsrc/librarian/library.c4
-rwxr-xr-xsrc/libtools/signals.c2
-rwxr-xr-xsrc/main.c15
-rwxr-xr-xsrc/tools/box64stack.c1
-rw-r--r--src/wrapped/generated/functions_list.txt7
-rw-r--r--src/wrapped/generated/wrappedvulkantypes.h4
-rw-r--r--src/wrapped/generated/wrapper.c9
-rw-r--r--src/wrapped/generated/wrapper.h3
-rwxr-xr-xsrc/wrapped/wrappedlibc.c10
-rwxr-xr-xsrc/wrapped/wrappedvulkan.c17
-rwxr-xr-xsrc/wrapped/wrappedvulkan_private.h55
15 files changed, 151 insertions, 25 deletions
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