about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-12-01 17:15:46 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-12-01 17:15:46 +0100
commit3f007d2dbb2b0319d9c2ff4ef6dff10d77a9b6ab (patch)
tree8d5c8ed93420b9eed74938a82dcaef61f13da87e /src
parentcde68af79aa0c05dedaed7f440e7023a349501fb (diff)
downloadbox64-3f007d2dbb2b0319d9c2ff4ef6dff10d77a9b6ab.tar.gz
box64-3f007d2dbb2b0319d9c2ff4ef6dff10d77a9b6ab.zip
[DYNAREC] More control over HotPage handling with BOX64_DYNARC_HOTPAGE
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c16
-rwxr-xr-xsrc/dynarec/dynarec_native.c7
-rwxr-xr-xsrc/include/debug.h1
-rwxr-xr-xsrc/main.c13
-rwxr-xr-xsrc/tools/bridge.c3
-rw-r--r--src/tools/rcfile.c2
6 files changed, 29 insertions, 13 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 3b31b326..a6f2693f 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1172,7 +1172,6 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot)
 }
 
 #ifdef DYNAREC
-#define HOTPAGE_STEP 16
 int IsInHotPage(uintptr_t addr) {
     if(addr<=(1LL<<48))
         return 0;
@@ -1189,31 +1188,30 @@ int IsInHotPage(uintptr_t addr) {
 }
 
 int AreaInHotPage(uintptr_t start, uintptr_t end_) {
-    //dynarec_log(LOG_DEBUG, "AreaInHotPage %p -> %p => ", (void*)start, (void*)end_);
     uintptr_t idx = (start>>MEMPROT_SHIFT);
     uintptr_t end = (end_>>MEMPROT_SHIFT);
     if(end>=(1LL<<(48-MEMPROT_SHIFT)))
         end = (1LL<<(48-MEMPROT_SHIFT))-1LL;
     if(end<idx) { // memory addresses higher than 48bits are not tracked
-        //dynarec_log(LOG_DEBUG, "00\n");
         return 0;
     }
     int ret = 0;
     for (uintptr_t i=idx; i<=end; ++i) {
         uint8_t *block = memprot[i>>16].hot;
+        int base = i&0xffff;
         if(block) {
-            uint32_t hot = block[i&0xffff];
+            uint32_t hot = block[base];
             if(hot) {
                 // decrement hot
-                native_lock_decifnot0b(&block[i&0xffff]);
-                //dynarec_log(LOG_DEBUG, "1\n");
+                native_lock_decifnot0b(&block[base]);
                 ret = 1;
             }
         } else {
-            i+=0xffff;
+            i+=0xffff-base;
         }
     }
-    //dynarec_log(LOG_DEBUG, "0\n");
+    if(ret && box64_dynarec_log>LOG_INFO)
+        dynarec_log(LOG_DEBUG, "BOX64: AreaInHotPage %p-%p\n", (void*)start, (void*)end_);
     return ret;
 
 }
@@ -1227,7 +1225,7 @@ void AddHotPage(uintptr_t addr) {
                 box_free(newblock);
             }
     }
-    native_lock_storeb(&memprot[idx].hot[base], HOTPAGE_STEP);
+    native_lock_storeb(&memprot[idx].hot[base], box64_dynarec_hotpage);
 }
 #endif
 
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index b4c93c74..2f58b2d8 100755
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -457,6 +457,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
     }
     if(!isprotectedDB(addr, 1)) {
         dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr);
+        AddHotPage(addr);
         CancelBlock64();
         return NULL;
     }
@@ -583,12 +584,14 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
     block->hash = X31_hash_code(block->x64_addr, block->x64_size);
     // Check if something changed, to abbort if it as
     if((block->hash != hash)) {
-        dynarec_log(LOG_INFO, "Warning, a block changed while beeing processed hash(%p:%ld)=%x/%x\n", block->x64_addr, block->x64_size, block->hash, hash);
+        dynarec_log(LOG_DEBUG, "Warning, a block changed while beeing processed hash(%p:%ld)=%x/%x\n", block->x64_addr, block->x64_size, block->hash, hash);
+        AddHotPage(addr);
         CancelBlock64();
         return NULL;
     }
     if(!isprotectedDB(addr, end-addr)) {
-        dynarec_log(LOG_INFO, "Warning, block unprotected while beeing processed %p:%ld, cancelling\n", block->x64_addr, block->x64_size);
+        dynarec_log(LOG_DEBUG, "Warning, block unprotected while beeing processed %p:%ld, cancelling\n", block->x64_addr, block->x64_size);
+        AddHotPage(addr);
         CancelBlock64();
         return NULL;
         //protectDB(addr, end-addr);
diff --git a/src/include/debug.h b/src/include/debug.h
index 3b45911d..815597a7 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -20,6 +20,7 @@ extern int box64_dynarec_fastnan;
 extern int box64_dynarec_x87double;
 extern int box64_dynarec_safeflags;
 extern int box64_dynarec_callret;
+extern int box64_dynarec_hotpage;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
diff --git a/src/main.c b/src/main.c
index da01c4e5..13d39784 100755
--- a/src/main.c
+++ b/src/main.c
@@ -52,6 +52,7 @@ int box64_dynarec_x87double = 0;
 int box64_dynarec_fastnan = 1;
 int box64_dynarec_safeflags = 1;
 int box64_dynarec_callret = 0;
+int box64_dynarec_hotpage = 16;
 uintptr_t box64_nodynarec_start = 0;
 uintptr_t box64_nodynarec_end = 0;
 #ifdef ARM64
@@ -490,6 +491,18 @@ void LoadLogEnv()
         if(!box64_dynarec_callret)
             printf_log(LOG_INFO, "Dynarec will optimize CALL/RET\n");
     }
+    p = getenv("BOX64_DYNAREC_HOTPAGE");
+    if(p) {
+        int val = -1;
+        if(sscanf("%d", p, &val)==1) {
+            if(val>=0)
+                box64_dynarec_hotpage = val;
+        }
+        if(!box64_dynarec_hotpage)
+            printf_log(LOG_INFO, "Dynarec will have HotPage tagged for %d ticks\n", box64_dynarec_hotpage);
+        else
+            printf_log(LOG_INFO, "Dynarec will not tag HotPage\n");
+    }
     p = getenv("BOX64_NODYNAREC");
     if(p) {
         if (strchr(p,'-')) {
diff --git a/src/tools/bridge.c b/src/tools/bridge.c
index eb6939fb..5884e48a 100755
--- a/src/tools/bridge.c
+++ b/src/tools/bridge.c
@@ -136,8 +136,7 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
     kh_value(bridge->bridgemap, k) = (uintptr_t)&b->b[sz].CC;
     pthread_mutex_unlock(&my_context->mutex_bridge);
     #ifdef DYNAREC
-    // only reprotect the block when stuffs are running
-    if(!my_context->deferedInit && box64_dynarec)
+    if(box64_dynarec)
         protectDB((uintptr_t)b->b, NBRICK*sizeof(onebridge_t));
     #endif
     #ifdef HAVE_TRACE
diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c
index 93ef8081..b20a88fc 100644
--- a/src/tools/rcfile.c
+++ b/src/tools/rcfile.c
@@ -76,6 +76,7 @@ ENTRYBOOL(BOX64_DYNAREC_X87DOUBLE, box64_dynarec_x87double)         \
 ENTRYBOOL(BOX64_DYNAREC_FASTNAN, box64_dynarec_fastnan)             \
 ENTRYINT(BOX64_DYNAREC_SAFEFLAGS, box64_dynarec_safeflags, 0, 2, 2) \
 ENTRYBOOL(BOX64_DYNAREC_CALLRET, box64_dynarec_callret)             \
+ENTRYINT(BOX64_DYNAREC_HOTPAGE, box64_dynarec_hotpage, 0, 255, 8)   \
 ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec)                      \
 
 #else
@@ -89,6 +90,7 @@ IGNORE(BOX64_DYNAREC_X87DOUBLE)                                     \
 IGNORE(BOX64_DYNAREC_FASTNAN)                                       \
 IGNORE(BOX64_DYNAREC_SAFEFLAGS)                                     \
 IGNORE(BOX64_DYNAREC_CALLRET)                                       \
+IGNORE(BOX64_DYNAREC_HOTPAGE)                                       \
 IGNORE(BOX64_NODYNAREC)                                             \
 
 #endif