about summary refs log tree commit diff stats
path: root/src/custommem.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-28 15:08:55 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-28 15:08:55 +0200
commitba1493857f16f8d8e9eec8f3d421e49784761e8d (patch)
tree5a26df7bf3ab0bc6dd6505a0dc21890f5deddf25 /src/custommem.c
parentfb7a0318a0e93b099cf781ea5bb285b97092d277 (diff)
downloadbox64-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.c19
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;