about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-10-29 09:41:46 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-10-29 09:41:46 +0200
commitee63a9f368f5e0002dab0ad4247458171b4ae426 (patch)
treef2fca4372dd701e8815fa015c0f7577e7887796b /src
parent9a73c15b8493911000683683bb2a49f7c466fab6 (diff)
downloadbox64-ee63a9f368f5e0002dab0ad4247458171b4ae426.tar.gz
box64-ee63a9f368f5e0002dab0ad4247458171b4ae426.zip
Imrpoved Bridges, again
Diffstat (limited to 'src')
-rwxr-xr-xsrc/tools/bridge.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index 6e18496b..f30c5360 100755
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -21,14 +21,21 @@
 
 KHASH_MAP_INIT_INT64(bridgemap, uintptr_t)
 
-//onebridge is 32 bytes
-#define NBRICK  4096/32
 typedef struct brick_s brick_t;
 typedef struct brick_s {
     onebridge_t *b;
     int         sz;
     brick_t     *next;
 } brick_t;
+#ifdef PAGE8K
+#define NBRICK  (8192/sizeof(onebridge_t))
+#elif defined(PAGE16K)
+#define NBRICK  (16384/sizeof(onebridge_t))
+#elif defined(PAGE64K)
+#define NBRICK  (65536/sizeof(onebridge_t))
+#else
+#define NBRICK  (4096/sizeof(onebridge_t))
+#endif
 
 typedef struct bridge_s {
     brick_t         *head;
@@ -40,13 +47,18 @@ typedef struct bridge_s {
 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* NewBrick(void* old)
 {
     brick_t* ret = (brick_t*)box_calloc(1, sizeof(brick_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(old)
+        old = old + NBRICK * sizeof(onebridge_t);
+    void* ptr = my_mmap(thread_get_emu(), old, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0); // 0x40 is MAP_32BIT
+    if(ptr == MAP_FAILED)
+        ptr = my_mmap(thread_get_emu(), NULL, NBRICK * sizeof(onebridge_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | 0x40 | MAP_ANONYMOUS, -1, 0);
     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));
     }
+    dynarec_log(LOG_INFO, "New Bridge brick at %p (size 0x%x)\n", ptr, NBRICK*sizeof(onebridge_t));
     ret->b = ptr;
     return ret;
 }
@@ -54,7 +66,7 @@ brick_t* NewBrick()
 bridge_t *NewBridge()
 {
     bridge_t *b = (bridge_t*)box_calloc(1, sizeof(bridge_t));
-    b->head = NewBrick();
+    b->head = NewBrick(NULL);
     b->last = b->head;
     b->bridgemap = kh_init(bridgemap);
 
@@ -96,7 +108,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
         pthread_mutex_lock(&my_context->mutex_bridge);
         b = bridge->last;
         if(b->sz == NBRICK) {
-            b->next = NewBrick();
+            b->next = NewBrick(b->b);
             b = b->next;
             bridge->last = b;
         }
@@ -106,9 +118,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
         if(box64_dynarec) {
             prot=(getProtection((uintptr_t)b->b)&(PROT_DYNAREC|PROT_DYNAREC_R))?1:0;
             if(prot)
-                unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 1);
-            else    // only add DB if there is no protection
-                addDBFromAddressRange((uintptr_t)&b->b[b->sz].CC, sizeof(onebridge_t));
+                unprotectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t), 0);    // don't mark blocks, it's only new one
         }
     } while(sz!=b->sz); // this while loop if someone took the slot when the bridge mutex was unlocked doing memory protection managment
     pthread_mutex_lock(&my_context->mutex_bridge);
@@ -125,10 +135,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
     khint_t k = kh_put(bridgemap, bridge->bridgemap, (uintptr_t)fnc, &ret);
     kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC;
     pthread_mutex_unlock(&my_context->mutex_bridge);
-    #ifdef DYNAREC
-    if(box64_dynarec)
-        protectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t));
-    #endif
+    // no need to reprotect the block, it will be protected later if needed
     #ifdef HAVE_TRACE
     if(name)
         addBridgeName(fnc, name);
@@ -229,7 +236,7 @@ uintptr_t AddVSyscall(bridge_t* bridge, int num)
         pthread_mutex_lock(&my_context->mutex_bridge);
         b = bridge->last;
         if(b->sz == NBRICK) {
-            b->next = NewBrick();
+            b->next = NewBrick(b->b);
             b = b->next;
             bridge->last = b;
         }