about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/custommmap.c8
-rw-r--r--src/librarian/librarian.c4
-rw-r--r--src/librarian/library.c36
-rwxr-xr-xsrc/libtools/threads32.c8
-rw-r--r--src/tools/box32stack.c2
-rw-r--r--src/tools/box64stack.c2
-rw-r--r--src/wrapped/wrappedlibc.c26
7 files changed, 47 insertions, 39 deletions
diff --git a/src/custommmap.c b/src/custommmap.c
index 7ad26b7d..ab5288dd 100644
--- a/src/custommmap.c
+++ b/src/custommmap.c
@@ -13,6 +13,10 @@
 #define EXPORTDYN
 #endif
 
+#ifndef MAP_32BIT
+#define MAP_32BIT   0x40
+#endif
+
 typedef void x64emu_t;
 extern void* mapallmem;
 extern int box64_is32bits;
@@ -29,8 +33,8 @@ extern int box64_mmap32;
 EXPORT void* mmap64(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset)
 {
     void* ret;
-    if(!addr && ((running32bits && box64_mmap32) || (flags&0x40) || box64_is32bits))
-        ret = my_mmap64(NULL, addr, length, prot, flags | 0x40, fd, offset);
+    if(!addr && ((running32bits && box64_mmap32) || (flags&MAP_32BIT) || box64_is32bits))
+        ret = my_mmap64(NULL, addr, length, prot, flags | MAP_32BIT, fd, offset);
     else
         ret = internal_mmap(addr, length, prot, flags, fd, offset);
     if(ret!=MAP_FAILED && mapallmem)
diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c
index ddeb063b..aee6acf0 100644
--- a/src/librarian/librarian.c
+++ b/src/librarian/librarian.c
@@ -511,7 +511,7 @@ int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u
     if(GetGlobalSymbolStartEnd_internal(maplib, name, start, end, self, &version, &vername, &veropt, elfsym)) {
         if(start && end && *end==*start) {  // object is of 0 sized, try to see an "_END" object of null size
             uintptr_t start2, end2;
-            char* buff = (char*)malloc(strlen(name) + strlen("_END") + 1);
+            char* buff = (char*)box_malloc(strlen(name) + strlen("_END") + 1);
             strcpy(buff, name);
             strcat(buff, "_END");
             if(GetGlobalSymbolStartEnd_internal(maplib, buff, &start2, &end2, self, &version, &vername, &veropt, elfsym)) {
@@ -584,7 +584,7 @@ int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* star
     if(GetGlobalWeakSymbolStartEnd_internal(maplib, name, start, end, self, &version, &vername, &veropt, elfsym)) {
         if(start && end && *end==*start) {  // object is of 0 sized, try to see an "_END" object of null size
             uintptr_t start2, end2;
-            char* buff = (char*)malloc(strlen(name) + strlen("_END") + 1);
+            char* buff = (char*)box_malloc(strlen(name) + strlen("_END") + 1);
             strcpy(buff, name);
             strcat(buff, "_END");
             if(GetGlobalWeakSymbolStartEnd_internal(maplib, buff, &start2, &end2, self, &version, &vername, &veropt, elfsym)) {
diff --git a/src/librarian/library.c b/src/librarian/library.c
index e4ab45e5..e21e648c 100644
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -452,7 +452,7 @@ library_t *NewLibrary(const char* path, box64context_t* context, elfheader_t* ve
     printf_dump(LOG_DEBUG, "Trying to load \"%s\"\n", path);
     //library_t *lib = (library_t*)box_calloc(1, sizeof(library_t));
     if(cur_lib==lib_cap) {
-        lib_brick_t *new_brick = calloc(1, sizeof(lib_brick_t));
+        lib_brick_t *new_brick = box_calloc(1, sizeof(lib_brick_t));
         if(!lib_head)
             cur_brick = lib_head = new_brick;
         else {
@@ -1211,23 +1211,23 @@ void AddMainElfToLinkmap(elfheader_t* elf)
 
 needed_libs_t* new_neededlib(int n)
 {
-    needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t));
+    needed_libs_t* ret = (needed_libs_t*)box_calloc(1, sizeof(needed_libs_t));
     ret->cap = ret->size = n;
     ret->init_size = n;
-    ret->libs = (library_t**)calloc(n, sizeof(library_t*));
-    ret->names = (char**)calloc(n, sizeof(char*));
+    ret->libs = (library_t**)box_calloc(n, sizeof(library_t*));
+    ret->names = (char**)box_calloc(n, sizeof(char*));
     return ret;
 }
 void free_neededlib(needed_libs_t* needed)
 {
     if(!needed)
         return;
-    free(needed->libs);
-    free(needed->names);
+    box_free(needed->libs);
+    box_free(needed->names);
     needed->libs = NULL;
     needed->names = NULL;
     needed->cap = needed->size = 0;
-    free(needed);
+    box_free(needed);
 }
 void add1_neededlib(needed_libs_t* needed)
 {
@@ -1236,8 +1236,8 @@ void add1_neededlib(needed_libs_t* needed)
     if(needed->size+1<=needed->cap)
         return;
     needed->cap = needed->size+1;
-    needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
-    needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+    needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*));
+    needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*));
     needed->size++;
     needed->init_size++;
 }
@@ -1252,8 +1252,8 @@ void add1lib_neededlib(needed_libs_t* needed, library_t* lib, const char* name)
     // add it
     if(needed->size==needed->cap) {
         needed->cap = needed->size+1;
-        needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
-        needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+        needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*));
+        needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*));
     }
     needed->libs[needed->size] = lib;
     needed->names[needed->size] = (char*)name;
@@ -1271,8 +1271,8 @@ void add1lib_neededlib_name(needed_libs_t* needed, library_t* lib, const char* n
     // add it
     if(needed->size==needed->cap) {
         needed->cap = needed->size+1;
-        needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
-        needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+        needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*));
+        needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*));
     }
     needed->libs[needed->size] = lib;
     needed->names[needed->size] = (char*)name;
@@ -1290,8 +1290,8 @@ void add1libref_neededlib(needed_libs_t* needed, library_t* lib)
     // add it
     if(needed->size==needed->cap) {
         needed->cap = needed->size+4;
-        needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
-        needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*));
+        needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*));
+        needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*));
     }
     needed->libs[needed->size] = lib;
     needed->names[needed->size] = (char*)lib->name;
@@ -1302,12 +1302,12 @@ needed_libs_t* copy_neededlib(needed_libs_t* needed)
 {
     if(!needed)
         return NULL;
-    needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t));
+    needed_libs_t* ret = (needed_libs_t*)box_calloc(1, sizeof(needed_libs_t));
     ret->cap = needed->cap;
     ret->size = needed->size;
     ret->init_size = needed->init_size;
-    ret->libs = (library_t**)calloc(ret->cap, sizeof(library_t*));
-    ret->names = (char**)calloc(ret->cap, sizeof(char*));
+    ret->libs = (library_t**)box_calloc(ret->cap, sizeof(library_t*));
+    ret->names = (char**)box_calloc(ret->cap, sizeof(char*));
     memcpy(ret->libs, needed->libs, ret->size*sizeof(library_t*));
     memcpy(ret->names, needed->names, ret->size*sizeof(char*));
     return ret;
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c
index d99a085e..bd437633 100755
--- a/src/libtools/threads32.c
+++ b/src/libtools/threads32.c
@@ -29,6 +29,10 @@
 #include "dynablock.h"
 #endif
 
+#ifndef MAP_32BIT
+#define MAP_32BIT 0x40
+#endif
+
 typedef void (*vFppp_t)(void*, void*, void*);
 typedef void (*vFpi_t)(void*, int);
 //starting with glibc 2.34+, those 2 functions are in libc.so as versionned symbol only
@@ -205,7 +209,7 @@ EXPORT int my32_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_r
 		own = 0;
 	} else {
 		//stack = malloc(stacksize);
-		stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
+		stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_32BIT, -1, 0);
 		own = 1;
 	}
 
@@ -250,7 +254,7 @@ void* my32_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** p
 {
 	int stacksize = (ssize)?ssize:(2*1024*1024);	//default stack size is 2Mo
 	//void* stack = malloc(stacksize);
-	void* stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
+	void* stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_32BIT, -1, 0);
 	emuthread_t *et = (emuthread_t*)calloc(1, sizeof(emuthread_t));
     x64emu_t *emuthread = NewX64Emu(emu->context, (uintptr_t)f, (uintptr_t)stack, stacksize, 1);
 	SetupX64Emu(emuthread, emu);
diff --git a/src/tools/box32stack.c b/src/tools/box32stack.c
index 441b27ab..0fa1460e 100644
--- a/src/tools/box32stack.c
+++ b/src/tools/box32stack.c
@@ -48,7 +48,7 @@ void SetupInitialStack32(x64emu_t *emu)
     for (int i=emu->context->argc-1; i>=0; --i) {
         PushString32(emu, emu->context->argv[i]);
         p_argv[i] = R_ESP;
-        free(emu->context->argv[i]);
+        box_free(emu->context->argv[i]);
         emu->context->argv[i] = (char*)p_argv[i];
     }
     // align
diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c
index 82dc9a63..9036bda4 100644
--- a/src/tools/box64stack.c
+++ b/src/tools/box64stack.c
@@ -22,7 +22,7 @@ int CalcStackSize(box64context_t *context)
         CalcStack(context->elfs[i], &context->stacksz, &context->stackalign);
 
     //if (posix_memalign((void**)&context->stack, context->stackalign, context->stacksz)) {
-    context->stack = internal_mmap(NULL, context->stacksz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
+    context->stack = mmap(NULL, context->stacksz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
     if (context->stack==(void*)-1) {
         printf_log(LOG_NONE, "Cannot allocate aligned memory (0x%lx/0x%zx) for stack\n", context->stacksz, context->stackalign);
         return 1;
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 4f7e6dc6..51160827 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2816,45 +2816,45 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
     (void)emu;
     if(prot&PROT_WRITE)
         prot|=PROT_READ;    // PROT_READ is implicit with PROT_WRITE on i386
-    if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mmap64(%p, 0x%lx, 0x%x, 0x%x, %d, %ld) => ", addr, length, prot, flags, fd, offset);}
+    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mmap64(%p, 0x%lx, 0x%x, 0x%x, %d, %ld) => ", addr, length, prot, flags, fd, offset);}
     int new_flags = flags;
     #ifndef NOALIGN
     void* old_addr = addr;
     new_flags&=~MAP_32BIT;   // remove MAP_32BIT
     if(flags&MAP_32BIT) {
         // MAP_32BIT only exist on x86_64!
-        addr = find31bitBlockNearHint(addr, length, 0);
+        addr = find31bitBlockNearHint(old_addr, length, 0);
     } else if (box64_wine || 1) {   // other mmap should be restricted to 47bits
         if(!addr)
             addr = find47bitBlock(length);
     }
     #endif
     void* ret = internal_mmap(addr, length, prot, new_flags, fd, offset);
-    #ifndef NOALIGN
+    #if !defined(NOALIGN) || defined(BOX32)
     if((ret!=MAP_FAILED) && (flags&MAP_32BIT) &&
       (((uintptr_t)ret>0xffffffffLL) || ((box64_wine) && ((uintptr_t)ret&0xffff) && (ret!=addr)))) {
         int olderr = errno;
-        if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret);
-        munmap(ret, length);
+        if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret);
+        internal_munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously
         addr = find31bitBlockNearHint(old_addr, length, 0); // is this the best way?
         new_flags = (addr && isBlockFree(addr, length) )? (new_flags|MAP_FIXED) : new_flags;
         if((new_flags&(MAP_FIXED|MAP_FIXED_NOREPLACE))==(MAP_FIXED|MAP_FIXED_NOREPLACE)) new_flags&=~MAP_FIXED_NOREPLACE;
         ret = internal_mmap(addr, length, prot, new_flags, fd, offset);
-        if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret);
+        if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret);
         if(old_addr && ret!=old_addr && ret!=MAP_FAILED)
             errno = olderr;
     } else if((ret!=MAP_FAILED) && !(flags&MAP_FIXED) && ((box64_wine)) && (addr && (addr!=ret)) &&
              (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff))) {
         int olderr = errno;
-        if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret);
-        munmap(ret, length);
+        if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret);
+        internal_munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously
         addr = find47bitBlockNearHint(old_addr, length, 0); // is this the best way?
         new_flags = (addr && isBlockFree(addr, length)) ? (new_flags|MAP_FIXED) : new_flags;
         if((new_flags&(MAP_FIXED|MAP_FIXED_NOREPLACE))==(MAP_FIXED|MAP_FIXED_NOREPLACE)) new_flags&=~MAP_FIXED_NOREPLACE;
         ret = internal_mmap(addr, length, prot, new_flags, fd, offset);
-        if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret);
+        if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret);
         if(old_addr && ret!=old_addr && ret!=MAP_FAILED) {
             errno = olderr;
             if(old_addr>(void*)0x7fffffffff && !have48bits)
@@ -2867,7 +2867,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
         errno = EEXIST;
         return MAP_FAILED;
     }
-    if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
+    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
     #ifdef DYNAREC
     if(box64_dynarec && ret!=MAP_FAILED) {
         /*if(flags&0x100000 && addr!=ret)
@@ -2918,9 +2918,9 @@ EXPORT void* my_mmap(x64emu_t* emu, void *addr, unsigned long length, int prot,
 EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t new_size, int flags, void* new_addr)
 {
     (void)emu;
-    if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mremap(%p, %lu, %lu, %d, %p)=>", old_addr, old_size, new_size, flags, new_addr);}
+    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mremap(%p, %lu, %lu, %d, %p)=>", old_addr, old_size, new_size, flags, new_addr);}
     void* ret = mremap(old_addr, old_size, new_size, flags, new_addr);
-    if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
+    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
     if(ret!=(void*)-1) {
         uint32_t prot = getProtection((uintptr_t)old_addr)&~PROT_CUSTOM;
         if(ret==old_addr) {
@@ -2968,7 +2968,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne
 EXPORT int my_munmap(x64emu_t* emu, void* addr, unsigned long length)
 {
     (void)emu;
-    if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "munmap(%p, %lu)\n", addr, length);}
+    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "munmap(%p, %lu)\n", addr, length);}
     int ret = internal_munmap(addr, length);
     #ifdef DYNAREC
     if(!ret && box64_dynarec && length) {