about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-10-13 22:42:20 +0200
committerGitHub <noreply@github.com>2021-10-13 22:42:20 +0200
commit726228850220cf4f1a3e4aab26bde8ef51c1915a (patch)
tree41bc8432bab441a758865c268122fdce73895e8f
parent289deb3655b976610aa7b7f84a9273326451337f (diff)
parentbcb0bdea77207f30a988d9f0c3ec5841844efe55 (diff)
downloadbox64-726228850220cf4f1a3e4aab26bde8ef51c1915a.tar.gz
box64-726228850220cf4f1a3e4aab26bde8ef51c1915a.zip
Merge pull request #132 from mogery/memory-map-fix
Map bricks below first 2GB of address space
-rwxr-xr-xsrc/tools/bridge.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index 5f6bb5af..2574ddbd 100755
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -4,7 +4,9 @@
 #include <string.h>
 #include <dlfcn.h>
 #include <pthread.h>
+#include <sys/mman.h>
 
+#include <wrappedlibs.h>
 #include "custommem.h"
 #include "bridge.h"
 #include "bridge_private.h"
@@ -33,12 +35,18 @@ typedef struct bridge_s {
     kh_bridgemap_t  *bridgemap;
 } bridge_t;
 
+// from src/wrapped/wrappedlibc.c
+void* my_mmap(x64emu_t* emu, void* addr, unsigned long length, int prot, int flags, int fd, int64_t offset);
+int my_munmap(x64emu_t* emu, void* addr, unsigned long length);
+
 brick_t* NewBrick()
 {
     brick_t* ret = (brick_t*)calloc(1, sizeof(brick_t));
-    if(posix_memalign((void**)&ret->b, box64_pagesize, NBRICK*sizeof(onebridge_t))) {
+    void* ptr = my_mmap(thread_get_emu(), NULL, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0); // 0x40 is MAP_32BIT
+    if(ptr == MAP_FAILED) {
         printf_log(LOG_NONE, "Warning, cannot allocate 0x%lx aligned bytes for bridge, will probably crash later\n", NBRICK*sizeof(onebridge_t));
     }
+    ret->b = ptr;
     return ret;
 }
 
@@ -56,13 +64,14 @@ void FreeBridge(bridge_t** bridge)
     if(!bridge || !*bridge)
         return;
     brick_t *b = (*bridge)->head;
+    x64emu_t* emu = thread_get_emu();
     while(b) {
         brick_t *n = b->next;
         #ifdef DYNAREC
         if(getProtection((uintptr_t)b->b)&PROT_DYNAREC)
             unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t));
         #endif
-        free(b->b);
+        my_munmap(emu, b->b, NBRICK*sizeof(onebridge_t));
         free(b);
         b = n;
     }