diff options
Diffstat (limited to 'src/custommem.c')
| -rw-r--r-- | src/custommem.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/custommem.c b/src/custommem.c index 4cf1dd0a..45c7a01f 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -26,6 +26,7 @@ #include "threads.h" #ifdef DYNAREC #include "dynablock.h" +#include "dynarec/dynablock_private.h" #include "dynarec/native_lock.h" #include "dynarec/dynarec_next.h" @@ -770,6 +771,28 @@ dynablock_t* getDB(uintptr_t addr) return *(dynablock_t**)(ret - sizeof(void*)); } +int getNeedTest(uintptr_t addr) +{ + uintptr_t idx3, idx2, idx1, idx0; + idx3 = ((addr)>>JMPTABL_START3)&JMPTABLE_MASK3; + idx2 = ((addr)>>JMPTABL_START2)&JMPTABLE_MASK2; + idx1 = ((addr)>>JMPTABL_START1)&JMPTABLE_MASK1; + idx0 = ((addr) )&JMPTABLE_MASK0; + uintptr_t ret = (uintptr_t)box64_jmptbl3[idx3][idx2][idx1][idx0]; + dynablock_t* db = *(dynablock_t**)(ret - sizeof(void*)); + return db?((ret!=(uintptr_t)db->block)?1:0):0; +} + +uintptr_t getJumpAddress64(uintptr_t addr) +{ + uintptr_t idx3, idx2, idx1, idx0; + idx3 = ((addr)>>JMPTABL_START3)&JMPTABLE_MASK3; + idx2 = ((addr)>>JMPTABL_START2)&JMPTABLE_MASK2; + idx1 = ((addr)>>JMPTABL_START1)&JMPTABLE_MASK1; + idx0 = ((addr) )&JMPTABLE_MASK0; + return (uintptr_t)box64_jmptbl3[idx3][idx2][idx1][idx0]; +} + // Remove the Write flag from an adress range, so DB can be executed safely void protectDB(uintptr_t addr, uintptr_t size) { @@ -1032,8 +1055,10 @@ void refreshProtection(uintptr_t addr) uintptr_t idx = (addr>>MEMPROT_SHIFT); if(memprot[idx>>16].prot!=memprot_default) { int prot = memprot[idx>>16].prot[idx&0xffff]; - int ret = mprotect((void*)(idx<<MEMPROT_SHIFT), box64_pagesize, prot&~PROT_CUSTOM); + if(!(prot&PROT_DYNAREC)) { + int ret = mprotect((void*)(idx<<MEMPROT_SHIFT), box64_pagesize, prot&~PROT_CUSTOM); printf_log(LOG_INFO, "refreshProtection(%p): %p/0x%x (ret=%d/%s)\n", (void*)addr, (void*)(idx<<MEMPROT_SHIFT), prot, ret, ret?strerror(errno):"ok"); + } } mutex_unlock(&mutex_prot); } |