about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-09 14:02:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-09 14:02:45 +0100
commitc5ced39665e7ba2a09c936ffb4cf80ca4f843e28 (patch)
treea0e7992f703fc2c71dc60538d28bb8b8d15cb611 /src/dynarec
parent7b2e77807dc46480986ddbbd053a5aa983e150d1 (diff)
downloadbox64-c5ced39665e7ba2a09c936ffb4cf80ca4f843e28.tar.gz
box64-c5ced39665e7ba2a09c936ffb4cf80ca4f843e28.zip
[DYNAREC] Only test page protection when needed (and using a fester way) (should address the performance regression of #2009)
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/dynablock.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index bfe10758..35c2fb03 100644
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -199,11 +199,12 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
 {
     if(hasAlternate((void*)addr))
         return NULL;
-    if((getProtection(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ))  // cannot be run, get out of the Dynarec
-        return NULL;
     dynablock_t* block = getDB(addr);
-    if(block || !create)
+    if(block || !create) {
+        if(block && getNeedTest(addr) && (getProtection(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ))
+            block = NULL;
         return block;
+    }
 
     if(need_lock) {
         if(box64_dynarec_wait) {
@@ -214,11 +215,18 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
         }
         block = getDB(addr);    // just in case
         if(block) {
+            if(block && getNeedTest(addr) && (getProtection_fast(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ))
+                block = NULL;
             mutex_unlock(&my_context->mutex_dyndump);
             return block;
         }
     }
-    
+
+    if((getProtection_fast(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ)) {// cannot be run, get out of the Dynarec
+        if(need_lock)
+            mutex_unlock(&my_context->mutex_dyndump);
+        return NULL;
+    }
     block = AddNewDynablock(addr);
 
     // fill the block