diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-05-28 09:39:26 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-05-28 09:39:26 +0200 |
| commit | 0b67bba12111bad3bdc7abc83d82e7016efb97ec (patch) | |
| tree | afae06a6dd18028d3f523c8c8a0acc41e2f38992 | |
| parent | a791677534315fb4c7708db907605ed61cb8b239 (diff) | |
| download | box64-0b67bba12111bad3bdc7abc83d82e7016efb97ec.tar.gz box64-0b67bba12111bad3bdc7abc83d82e7016efb97ec.zip | |
[DYNAREC] Do not track memory that is not accessible (should save some memory)
| -rw-r--r-- | src/custommem.c | 8 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 15 |
2 files changed, 18 insertions, 5 deletions
diff --git a/src/custommem.c b/src/custommem.c index 8d7925ab..6cb7cedb 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1100,7 +1100,13 @@ void setProtection(uintptr_t addr, size_t size, uint32_t prot) void setProtection_mmap(uintptr_t addr, size_t size, uint32_t prot) { - setProtection(addr, size, prot|PROT_MMAP); + if(prot) + setProtection(addr, size, prot|PROT_MMAP); + else { + mutex_lock(&mutex_prot); + addMapMem(addr, addr+size-1); + mutex_unlock(&mutex_prot); + } } void refreshProtection(uintptr_t addr) diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 6052d964..d0792d3c 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2595,7 +2595,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne uint32_t prot = getProtection((uintptr_t)old_addr)&~PROT_CUSTOM; if(ret==old_addr) { if(old_size && old_size<new_size) { - setProtection((uintptr_t)ret+old_size, new_size-old_size, prot); + setProtection_mmap((uintptr_t)ret+old_size, new_size-old_size, prot); #ifdef DYNAREC if(box64_dynarec) addDBFromAddressRange((uintptr_t)ret+old_size, new_size-old_size); @@ -2607,7 +2607,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne cleanDBFromAddressRange((uintptr_t)ret+new_size, old_size-new_size, 1); #endif } else if(!old_size) { - setProtection((uintptr_t)ret, new_size, prot); + setProtection_mmap((uintptr_t)ret, new_size, prot); #ifdef DYNAREC if(box64_dynarec) addDBFromAddressRange((uintptr_t)ret, new_size); @@ -2665,8 +2665,15 @@ EXPORT int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot) cleanDBFromAddressRange((uintptr_t)addr, len, 1); } #endif - if(!ret && len) - updateProtection((uintptr_t)addr, len, prot); + if(!ret && len) { + if(prot) + updateProtection((uintptr_t)addr, len, prot); + else { + // avoid allocating detailled protection for a no prot 0 + freeProtection((uintptr_t)addr, len); + setProtection_mmap((uintptr_t)addr, len, prot); + } + } return ret; } |