diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-08 16:40:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-08 16:40:35 +0100 |
| commit | e05796674bd7648faa4bbb4d61de2e641bed34b9 (patch) | |
| tree | 7d38c44b030c69de44fc9988840832999d7d719c /src/custommem.c | |
| parent | 0ce169e7f55a84eef801fec61e352c800ac8e5e6 (diff) | |
| parent | 726af707ebe92f0f1a98ea985343f6641fa45ba8 (diff) | |
| download | box64-e05796674bd7648faa4bbb4d61de2e641bed34b9.tar.gz box64-e05796674bd7648faa4bbb4d61de2e641bed34b9.zip | |
Merge branch 'main' of https://github.com/ptitSeb/box64 into main
Diffstat (limited to 'src/custommem.c')
| -rw-r--r-- | src/custommem.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/custommem.c b/src/custommem.c index 5b399344..4d4ab240 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -940,6 +940,8 @@ void allocProtection(uintptr_t addr, size_t size, uint32_t prot) void loadProtectionFromMap() { + if(box64_mapclean) + return; char buf[500]; FILE *f = fopen("/proc/self/maps", "r"); if(!f) @@ -955,6 +957,7 @@ void loadProtectionFromMap() } } fclose(f); + box64_mapclean = 1; } static int blockempty(uint8_t* mem) @@ -1016,7 +1019,7 @@ uint32_t getProtection(uintptr_t addr) } #define LOWEST (void*)0x20000 -static uintptr_t nextFree(uintptr_t addr) +static uintptr_t nextFree(uintptr_t addr, uintptr_t increment) { if(addr>=(1LL<<48)) return 0; @@ -1029,7 +1032,7 @@ static uintptr_t nextFree(uintptr_t addr) if(!memprot[idx>>16][i]) { return ((idx>>16)<<(16+12))+(i<<MEMPROT_SHIFT); } - addr += (1LL<<(16+12)); + addr += increment?increment:(1LL<<(16+12)); addr &= ~((1LL<<(16+12)-1LL)); } while(1); } @@ -1065,7 +1068,7 @@ void* find47bitBlock(size_t size) // slow iterative search... Would need something better one day uintptr_t addr = 0x100000000LL; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1075,7 +1078,7 @@ void* find47bitBlock(size_t size) // search in 32bits as a backup addr = (uintptr_t)LOWEST; do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1088,9 +1091,9 @@ void* find47bitBlock(size_t size) void* find47bitBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; @@ -1103,9 +1106,9 @@ void* find47bitBlockNearHint(void* hint, size_t size) void* findBlockNearHint(void* hint, size_t size) { // slow iterative search... Would need something better one day - uintptr_t addr = (uintptr_t)hint; + uintptr_t addr = (uintptr_t)(hint?hint:LOWEST); do { - addr = nextFree(addr); + addr = nextFree(addr, 0x10000); uintptr_t sz = maxFree(addr, size); if(sz>=size) { return (void*)addr; |