diff options
| -rw-r--r-- | docs/USAGE.md | 2 | ||||
| -rw-r--r-- | src/custommem.c | 26 | ||||
| -rw-r--r-- | src/tools/rcfile.c | 5 | ||||
| -rw-r--r-- | system/box64.box64rc | 3 |
4 files changed, 27 insertions, 9 deletions
diff --git a/docs/USAGE.md b/docs/USAGE.md index 9a56cf23..138ef823 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -335,7 +335,7 @@ Define x86_64 bash to launch script * XXX=yyyy will add XXX=yyyy env. var. and continue with BOX86_ENV2 ... until var doesn't exist -#### BOX64_RESERVE_HIGH +#### BOX64_RESERVE_HIGH * * 0 : Don't try to pe-reserve high memory (beyond 47bits) (Default) * 1 : Try to reserve (without allocating it) memory beyond 47bits (seems unstable) diff --git a/src/custommem.c b/src/custommem.c index e5cf2e46..28a0fdee 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1499,15 +1499,12 @@ static void atfork_child_custommem(void) init_mutexes(); } -void reserveHighMem() +void my_reserveHighMem() { - char* p = getenv("BOX64_RESERVE_HIGH"); - #if 0//def ADLINK - if(p && p[0]=='0') - #else - if(!p || p[0]=='0') - #endif - return; // don't reserve by default + static int reserved = 0; + if(reserved || !have48bits) + return; + reserved = 1; uintptr_t cur = 1ULL<<47; uintptr_t bend = 0; uint32_t prot; @@ -1522,6 +1519,19 @@ void reserveHighMem() } cur = bend; } + +} + +void reserveHighMem() +{ + char* p = getenv("BOX64_RESERVE_HIGH"); + #if 0//def ADLINK + if(p && p[0]=='0') + #else + if(!p || p[0]=='0') + #endif + return; // don't reserve by default + my_reserveHighMem(); } void init_custommem_helper(box64context_t* ctx) diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c index cd1316f4..61ea607f 100644 --- a/src/tools/rcfile.c +++ b/src/tools/rcfile.c @@ -121,6 +121,7 @@ ENTRYSTRING_(BOX64_ENV1, new_env1) \ ENTRYSTRING_(BOX64_ENV2, new_env2) \ ENTRYSTRING_(BOX64_ENV3, new_env3) \ ENTRYSTRING_(BOX64_ENV4, new_env4) \ +ENTRYBOOL(BOX64_RESERVE_HIGH, new_reserve_high) \ #ifdef HAVE_TRACE #define SUPER2() \ @@ -491,6 +492,7 @@ void openFTrace(const char* newtrace); void addNewEnvVar(const char* s); void AddNewLibs(const char* libs); void computeRDTSC(); +void my_reserveHighMem(); #ifdef DYNAREC void GatherDynarecExtensions(); #endif @@ -511,6 +513,7 @@ void ApplyParams(const char* name) int new_maxcpu = box64_maxcpu; int new_avx = box64_avx2?2:box64_avx; int box64_dynarec_jvm = box64_jvm; + int new_reserve_high = 0; if(!strcmp(name, old_name)) { return; } @@ -558,6 +561,8 @@ void ApplyParams(const char* name) cycle_log = new_cycle_log; initCycleLog(my_context); } + if(new_reserve_high) + my_reserveHighMem(); if(param->is_new_avx_present) { if(!new_avx) { printf_log(LOG_INFO, "Hidding AVX extension"); diff --git a/system/box64.box64rc b/system/box64.box64rc index 28cb4c3c..e2025c3a 100644 --- a/system/box64.box64rc +++ b/system/box64.box64rc @@ -76,6 +76,7 @@ BOX64_DYNAREC_ALIGNED_ATOMICS=1 [geekbench6] BOX64_ENV=BOX64_DYNAREC_STRONGMEM=3 +BOX64_ENV1=BOX64_RESERVE_HIGH=1 [geekbench5] BOX64_ENV=BOX64_DYNAREC_BIGBLOCK=2 @@ -88,6 +89,8 @@ BOX64_NOSANDBOX=1 BOX64_DYNAREC_ALIGNED_ATOMICS=1 BOX64_MAXCPU=16 +[Kingdom Rush Origins] +BOX64_RESERVE_HIGH=1 [heroic] BOX64_NOSANDBOX=1 |