about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-12-03 11:24:01 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-12-03 11:24:01 +0100
commit3f1c37aa76ff13d90e60eb66c4516f8feebaf3f5 (patch)
tree3296bb38797457339220b3a20c0d29f5ad68cc8b /src/libtools
parent8165342670e0e28832f97522d2aa9f47612767c2 (diff)
downloadbox64-3f1c37aa76ff13d90e60eb66c4516f8feebaf3f5.tar.gz
box64-3f1c37aa76ff13d90e60eb66c4516f8feebaf3f5.zip
[DYNAREC] Reworked dynarec memory allocator, and a bit of protection tracking too (might help #455)
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/signals.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 657cdad3..394c67db 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -910,6 +910,27 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "Repeated SIGSEGV with Access error on %p for
             glitch_addr = NULL;
             glitch_prot = 0;
         }
+        if(addr && pc && ((prot&(PROT_READ|PROT_WRITE))==(PROT_READ|PROT_WRITE))) {
+            static void* glitch2_pc = NULL;
+            static void* glitch2_addr = NULL;
+            static int glitch2_prot = 0;
+            if((glitch2_pc!=pc || glitch2_addr!=addr || glitch2_prot!=prot)) {
+                dynarec_log(LOG_INFO, "Is that a multi process glitch too?\n");
+                //printf_log(LOG_INFO, "Is that a multi process glitch too?\n");
+                glitch2_pc = pc;
+                glitch2_addr = addr;
+                glitch2_prot = prot;
+                sched_yield();  // give time to the other process
+                refreshProtection((uintptr_t)addr);
+                relockMutex(Locks);
+                sched_yield();  // give time to the other process
+                pthread_mutex_unlock(&mutex_dynarec_prot);
+                return; // try again
+            }
+            glitch2_pc = NULL;
+            glitch2_addr = NULL;
+            glitch2_prot = 0;
+        }
         pthread_mutex_unlock(&mutex_dynarec_prot);
     }
     if(!db_searched)