diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-28 15:08:55 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-28 15:08:55 +0200 |
| commit | ba1493857f16f8d8e9eec8f3d421e49784761e8d (patch) | |
| tree | 5a26df7bf3ab0bc6dd6505a0dc21890f5deddf25 /src/custommem.c | |
| parent | fb7a0318a0e93b099cf781ea5bb285b97092d277 (diff) | |
| download | box64-ba1493857f16f8d8e9eec8f3d421e49784761e8d.tar.gz box64-ba1493857f16f8d8e9eec8f3d421e49784761e8d.zip | |
[DYNAREC] Improved Dynablock construction, stopping when overlaping block is detected
Diffstat (limited to 'src/custommem.c')
| -rw-r--r-- | src/custommem.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/custommem.c b/src/custommem.c index 6b245112..eeba5f97 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -470,6 +470,8 @@ uintptr_t AllocDynarecMap(dynablock_t* db, int size) void FreeDynarecMap(dynablock_t* db, uintptr_t addr, uint32_t size) { + if(!addr || !size) + return; if(size>MMAPSIZE-2*sizeof(blockmark_t)) { #ifndef USE_MMAP free((void*)addr); @@ -594,6 +596,23 @@ void setJumpTableDefault64(void* addr) return; box64_jmptbl3[idx3][idx2][idx1][idx0] = (uintptr_t)arm64_next; } +int isJumpTableDefault64(void* addr) +{ + uintptr_t idx3, idx2, idx1, idx0; + idx3 = (((uintptr_t)addr)>>48)&0xffff; + idx2 = (((uintptr_t)addr)>>32)&0xffff; + idx1 = (((uintptr_t)addr)>>16)&0xffff; + idx0 = (((uintptr_t)addr) )&0xffff; + if(box64_jmptbl3[idx3] == box64_jmptbldefault2) + return 1; + if(box64_jmptbl3[idx3][idx2] == box64_jmptbldefault1) + return 1; + if(box64_jmptbl3[idx3][idx2][idx1] == box64_jmptbldefault0) + return 1; + if(box64_jmptbl3[idx3][idx2][idx1][idx0]==(uintptr_t)arm64_next) + return 1; + return (box64_jmptbl3[idx3][idx2][idx1][idx0]==(uintptr_t)arm64_next)?1:0; +} uintptr_t getJumpTable64() { return (uintptr_t)box64_jmptbl3; |