diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 25 | ||||
| -rw-r--r-- | src/include/custommem.h | 3 | ||||
| -rw-r--r-- | src/libtools/signals.c | 14 |
3 files changed, 13 insertions, 29 deletions
diff --git a/src/custommem.c b/src/custommem.c index 87328bc1..940280bf 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1020,42 +1020,27 @@ void addDBFromAddressRange(uintptr_t addr, size_t size) } } -void cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy) +// Will return 1 if at least 1 db in the address range +int cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy) { uintptr_t start_addr = my_context?((addr<my_context->max_db_size)?0:(addr-my_context->max_db_size)):addr; dynarec_log(LOG_DEBUG, "cleanDBFromAddressRange %p/%p -> %p %s\n", (void*)addr, (void*)start_addr, (void*)(addr+size-1), destroy?"destroy":"mark"); dynablock_t* db = NULL; uintptr_t end = addr+size; + int ret = 0; while (start_addr<end) { start_addr = getDBSize(start_addr, end-start_addr, &db); if(db) { + ret = 1; if(destroy) FreeRangeDynablock(db, addr, size); else MarkRangeDynablock(db, addr, size); } } + return ret; } -// Will return 1 if at least 1 db in the address range -int isDBFromAddressRange(uintptr_t addr, size_t size) -{ - uintptr_t start_addr = my_context?((addr<my_context->max_db_size)?0:(addr-my_context->max_db_size)):addr; - dynarec_log(LOG_DEBUG, "isDBFromAddressRange %p/%p -> %p => ", (void*)addr, (void*)start_addr, (void*)(addr+size-1)); - dynablock_t* db = NULL; - uintptr_t end = addr+size; - while (start_addr<end) { - start_addr = getDBSize(start_addr, end-start_addr, &db); - if(db) { - dynarec_log_prefix(0, LOG_DEBUG, "1\n"); - return 1; - } - } - dynarec_log_prefix(0, LOG_DEBUG, "0\n"); - return 0; -} - - #ifdef JMPTABL_SHIFT4 static uintptr_t *create_jmptbl(uintptr_t idx0, uintptr_t idx1, uintptr_t idx2, uintptr_t idx3, uintptr_t idx4) { diff --git a/src/include/custommem.h b/src/include/custommem.h index 6c24981c..7acbda18 100644 --- a/src/include/custommem.h +++ b/src/include/custommem.h @@ -36,9 +36,8 @@ uintptr_t AllocDynarecMap(size_t size); void FreeDynarecMap(uintptr_t addr); void addDBFromAddressRange(uintptr_t addr, size_t size); -void cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy); // Will return 1 if at least 1 db in the address range -int isDBFromAddressRange(uintptr_t addr, size_t size); +int cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy); dynablock_t* getDB(uintptr_t idx); int getNeedTest(uintptr_t idx); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 452bbd6f..9b304e65 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1809,13 +1809,13 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % if((sig==SIGSEGV) && (info->si_code == SEGV_ACCERR) && ((prot&~PROT_CUSTOM)==(PROT_READ|PROT_WRITE) || (prot&~PROT_CUSTOM)==(PROT_READ|PROT_WRITE|PROT_EXEC))) { static uintptr_t old_addr = 0; #ifdef DYNAREC - if((prot==(PROT_READ|PROT_WRITE|PROT_EXEC)) && isDBFromAddressRange(((uintptr_t)addr)&~(box64_pagesize-1), box64_pagesize)) { - printf_log(/*LOG_DEBUG*/LOG_INFO, "%04d| Strange SIGSEGV with Access error on %p for %p with DynaBlock(s) in range, db=%p, Lock=0x%x)\n", tid, pc, addr, db, Locks); - cleanDBFromAddressRange(((uintptr_t)addr)&~(box64_pagesize-1), box64_pagesize, 0); - refreshProtection((uintptr_t)addr); - relockMutex(Locks); - return; - } + if(prot==(PROT_READ|PROT_WRITE|PROT_EXEC)) + if(cleanDBFromAddressRange(((uintptr_t)addr)&~(box64_pagesize-1), box64_pagesize, 0)) { + printf_log(/*LOG_DEBUG*/LOG_INFO, "%04d| Strange SIGSEGV with Access error on %p for %p with DynaBlock(s) in range, db=%p, Lock=0x%x)\n", tid, pc, addr, db, Locks); + refreshProtection((uintptr_t)addr); + relockMutex(Locks); + return; + } #endif printf_log(/*LOG_DEBUG*/LOG_INFO, "%04d| Strange SIGSEGV with Access error on %p for %p%s, db=%p, prot=0x%x (old_addr=%p, Lock=0x%x)\n", tid, pc, addr, mapped?" mapped":"", db, prot, (void*)old_addr, Locks); if(!(old_addr==(uintptr_t)addr && old_prot==prot) || mapped) { |