diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-09 14:02:38 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-09 14:02:45 +0100 |
| commit | c5ced39665e7ba2a09c936ffb4cf80ca4f843e28 (patch) | |
| tree | a0e7992f703fc2c71dc60538d28bb8b8d15cb611 /src/dynarec | |
| parent | 7b2e77807dc46480986ddbbd053a5aa983e150d1 (diff) | |
| download | box64-c5ced39665e7ba2a09c936ffb4cf80ca4f843e28.tar.gz box64-c5ced39665e7ba2a09c936ffb4cf80ca4f843e28.zip | |
[DYNAREC] Only test page protection when needed (and using a fester way) (should address the performance regression of #2009)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/dynablock.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c index bfe10758..35c2fb03 100644 --- a/src/dynarec/dynablock.c +++ b/src/dynarec/dynablock.c @@ -199,11 +199,12 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t { if(hasAlternate((void*)addr)) return NULL; - if((getProtection(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ)) // cannot be run, get out of the Dynarec - return NULL; dynablock_t* block = getDB(addr); - if(block || !create) + if(block || !create) { + if(block && getNeedTest(addr) && (getProtection(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ)) + block = NULL; return block; + } if(need_lock) { if(box64_dynarec_wait) { @@ -214,11 +215,18 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t } block = getDB(addr); // just in case if(block) { + if(block && getNeedTest(addr) && (getProtection_fast(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ)) + block = NULL; mutex_unlock(&my_context->mutex_dyndump); return block; } } - + + if((getProtection_fast(addr)&(PROT_EXEC|PROT_READ))!=(PROT_EXEC|PROT_READ)) {// cannot be run, get out of the Dynarec + if(need_lock) + mutex_unlock(&my_context->mutex_dyndump); + return NULL; + } block = AddNewDynablock(addr); // fill the block |