diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-12-03 11:24:01 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-12-03 11:24:01 +0100 |
| commit | 3f1c37aa76ff13d90e60eb66c4516f8feebaf3f5 (patch) | |
| tree | 3296bb38797457339220b3a20c0d29f5ad68cc8b /src/libtools | |
| parent | 8165342670e0e28832f97522d2aa9f47612767c2 (diff) | |
| download | box64-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-x | src/libtools/signals.c | 21 |
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) |