about summary refs log tree commit diff stats
path: root/src/tools/env.c
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/env.c
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/env.c')
-rw-r--r--src/tools/env.c33
1 files changed, 32 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;
+}