From bcd504eb055af1a13d69dbb3cbe0c7f00654d468 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 21 Jun 2021 10:49:42 +0200 Subject: Various change to try improve stability on JIT'd program (like mono for Terraria, with moderate success) --- src/custommem.c | 41 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 29 deletions(-) (limited to 'src/custommem.c') diff --git a/src/custommem.c b/src/custommem.c index 151dad63..e1413157 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -561,20 +561,22 @@ void cleanDBFromAddressRange(uintptr_t addr, size_t size, int destroy) dynablocklist_t* dblist = dynmap123[idx3][idx2][idx1]; if(dblist) { if(destroy) { - if(FreeRangeDynablock(dblist, addr, size)) { // dblist is empty, check if we can delete more... + if(FreeRangeDynablock(dblist, addr, size) && 0) { // dblist is empty, check if we can delete more... + // disabling this for now. It seems to cause random crash in Terraria if(!arm64_lock_storeifref(&dynmap123[idx3][idx2][idx1], NULL, dblist)) { - free(dblist); dynablocklist_t** p = dynmap123[idx3][idx2]; if(dynmapempty((void**)p)) { if(!arm64_lock_storeifref(&dynmap123[idx3][idx2], NULL, p)) { - free(p); dynablocklist_t*** p2 = dynmap123[idx3]; if(dynmapempty((void**)p2)) { - if(!arm64_lock_storeifref(&dynmap123[idx3], NULL, p2)) + if(!arm64_lock_storeifref(&dynmap123[idx3], NULL, p2)) { free(p2); + } } + free(p); } } + FreeDynablockList(&dblist); } } } else @@ -690,15 +692,13 @@ uintptr_t getJumpTableAddress64(uintptr_t addr) return (uintptr_t)&box64_jmptbl3[idx3][idx2][idx1][idx0]; } -// Remove the Write flag from an adress range, so DB can be executed -// no log, as it can be executed inside a signal handler -void protectDB(uintptr_t addr, size_t size) +// Remove the Write flag from an adress range, so DB can be executed safely +void protectDBnolock(uintptr_t addr, uintptr_t size) { dynarec_log(LOG_DEBUG, "protectDB %p -> %p\n", (void*)addr, (void*)(addr+size-1)); uintptr_t idx = (addr>>MEMPROT_SHIFT); uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); int ret; - pthread_mutex_lock(&mutex_prot); for (uintptr_t i=idx; i<=end; ++i) { const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; khint_t k = kh_put(memprot, memprot, key, &ret); @@ -714,30 +714,13 @@ void protectDB(uintptr_t addr, size_t size) if(!(prot&PROT_DYNAREC)) mprotect((void*)(i< %p\n", (void*)addr, (void*)(addr+size-1)); - uintptr_t idx = (addr>>MEMPROT_SHIFT); - uintptr_t end = ((addr+size-1LL)>>MEMPROT_SHIFT); - int ret; - for (uintptr_t i=idx; i<=end; ++i) { - const uint32_t key = (i>>MEMPROT_SHIFT2)&0xffffffff; - khint_t k = kh_put(memprot, memprot, key, &ret); - if(ret) { - uint8_t *m = (uint8_t*)calloc(1, MEMPROT_SIZE); - kh_value(memprot, k) = m; - } - const uintptr_t ii = i&(MEMPROT_SIZE-1); - uint8_t prot = kh_value(memprot, k)[ii]; - if(!prot) - prot = PROT_READ | PROT_WRITE; // comes from malloc & co, so should not be able to execute - kh_value(memprot, k)[ii] = prot|PROT_DYNAREC; - if(!(prot&PROT_DYNAREC)) - mprotect((void*)(i<