diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-27 16:35:50 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-27 16:35:50 +0100 |
| commit | 3ab56994daab4d193e3f7bdc70c514a0c876f07b (patch) | |
| tree | ba254a924a0f1080fc38430ff5eaca4dc5452d52 /src/tools/env.c | |
| parent | a54afc8e0476c774ee0c1e3c35a1636e025c2d50 (diff) | |
| download | box64-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.c | 33 |
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; +} |