about summary refs log tree commit diff stats
path: root/src/tools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-27 16:35:50 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-27 16:35:50 +0100
commit3ab56994daab4d193e3f7bdc70c514a0c876f07b (patch)
treeba254a924a0f1080fc38430ff5eaca4dc5452d52 /src/tools
parenta54afc8e0476c774ee0c1e3c35a1636e025c2d50 (diff)
downloadbox64-3ab56994daab4d193e3f7bdc70c514a0c876f07b.tar.gz
box64-3ab56994daab4d193e3f7bdc70c514a0c876f07b.zip
Improved file map tracking, and use file map info in dynarec for bigblock setting
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/env.c33
-rw-r--r--src/tools/rbtree.c14
2 files changed, 46 insertions, 1 deletions
diff --git a/src/tools/env.c b/src/tools/env.c
index 9383c7d7..b22da4b3 100644
--- a/src/tools/env.c
+++ b/src/tools/env.c
@@ -591,8 +591,30 @@ void RecordEnvMappings(uintptr_t addr, size_t length, int fd)
 void RemoveMapping(uintptr_t addr, size_t length)
 {
     if(!envmap) return;
-    // TODO: handling memory to free mapping_entries entry when needed
+    mapping_t* mapping = (mapping_t*)rb_get_64(envmap, addr);
     rb_unset(envmap, addr, addr+length);
+    // quick check at next address
+    if(mapping) {
+        if(mapping == (mapping_t*)rb_get_64(envmap, addr+length))
+            return; // still present, don't purge mapping
+        // Will traverse the tree to find any left over
+        uintptr_t start = rb_get_lefter(envmap);
+        uintptr_t end;
+        uint64_t val;
+        do {
+            rb_get_end_64(envmap, start, &val, &end);
+            if((mapping_t*)val==mapping)
+                return; // found more occurance, exiting
+            start = end;
+        } while(end!=UINTPTR_MAX);
+        // no occurence found, delete mapping
+        khint_t k = kh_get(mapping_entry, mapping_entries, mapping->filename);
+        if(k!=kh_end(mapping_entries))
+            kh_del(mapping_entry, mapping_entries, k);
+        box_free(mapping->filename);
+        box_free(mapping->fullname);
+        box_free(mapping);
+    }
 }
 
 box64env_t* GetCurEnvByAddr(uintptr_t addr)
@@ -604,3 +626,12 @@ box64env_t* GetCurEnvByAddr(uintptr_t addr)
     if(!env) return &box64env;
     return env;
 }
+
+int IsAddrFileMapped(uintptr_t addr)
+{
+    if(!envmap) return 0;
+    mapping_t* mapping = ((mapping_t*)rb_get_64(envmap, addr));
+    if(!mapping) return 0;
+    if(mapping->fullname) return 1;
+    return 0;
+}
diff --git a/src/tools/rbtree.c b/src/tools/rbtree.c
index daa01f35..cc19c4e5 100644
--- a/src/tools/rbtree.c
+++ b/src/tools/rbtree.c
@@ -830,6 +830,20 @@ dynarec_log(LOG_DEBUG, "rb_get_righter(%s);\n", tree->name);
     return 0;
 }
 
+uintptr_t rb_get_lefter(rbtree_t* tree)
+{
+dynarec_log(LOG_DEBUG, "rb_get_lefter(%s);\n", tree->name);
+    if (!tree->root) return 0;
+
+    rbnode *node = tree->root;
+    while (node) {
+        if(!node->left)
+            return node->start;
+        node = node->left;
+    }
+    return 0;
+}
+
 #include <stdio.h>
 static void print_rbnode(const rbnode *node, unsigned depth, uintptr_t minstart, uintptr_t maxend, unsigned *bdepth) {
     if (!node) {