about summary refs log tree commit diff stats
path: root/src/custommem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/custommem.c')
-rw-r--r--src/custommem.c19
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;