From c8e10a004bbca5dcb653dd0a30833cded45bc612 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 8 Oct 2024 12:56:45 +0200 Subject: [BOX32][DYNAREC] Allocate Dynarec memory in higher prereserve regions --- src/custommem.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'src/custommem.c') diff --git a/src/custommem.c b/src/custommem.c index 26496844..f0b1f72d 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -806,6 +806,31 @@ dynablock_t* FindDynablockFromNativeAddress(void* p) return NULL; } +#ifdef BOX32 +void* box32_dynarec_mmap(size_t size) +{ + // find a block that was prereserve before and big enough + uint32_t flag; + static uintptr_t cur = 0x100000000LL; + uintptr_t bend = 0; + while(bend<0x800000000000LL) { + if(rb_get_end(mapallmem, cur, &flag, &bend)) { + if(flag==2 && bend-cur>=size) { + void* ret = internal_mmap((void*)cur, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + if(ret!=MAP_FAILED) + rb_set(mapallmem, cur, cur+size, 1); // mark as allocated + else + printf_log(LOG_INFO, "BOX32: Error allocating Dynarec memory: %s\n", strerror(errno)); + cur = cur+size; + return ret; + } + } + cur = bend; + } + return MAP_FAILED; +} +#endif + #ifdef TRACE_MEMSTAT static uint64_t dynarec_allocated = 0; #endif @@ -841,11 +866,15 @@ uintptr_t AllocDynarecMap(size_t size) // allign sz with pagesize allocsize = (allocsize+(box64_pagesize-1))&~(box64_pagesize-1); void* p=MAP_FAILED; + #ifdef BOX32 + if(box64_is32bits) + p = box32_dynarec_mmap(allocsize); + #endif // disabling for now. explicit hugepage needs to be enabled to be used on userspace // with`/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages` as the number of allowaed 2M huge page // At least with a 2M allocation, transparent huge page should kick-in #if 0//def MAP_HUGETLB - if(allocsize==DYNMMAPSZ) { + if(p==MAP_FAILED && allocsize==DYNMMAPSZ) { p = internal_mmap(NULL, allocsize, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANONYMOUS|MAP_PRIVATE|MAP_HUGETLB, -1, 0); if(p!=MAP_FAILED) printf_log(LOG_INFO, "Allocated a dynarec memory block with HugeTLB\n"); else printf_log(LOG_INFO, "Failled to allocated a dynarec memory block with HugeTLB (%s)\n", strerror(errno)); @@ -1817,7 +1846,7 @@ void reverveHigMem32(void) } else printf_log(LOG_DEBUG, " Failed to reserve %zx sized block (%s)\n", bend-cur, strerror(errno)); } else { - rb_set(mapallmem, (uintptr_t)cur, (uintptr_t)bend, 1); + rb_set(mapallmem, (uintptr_t)cur, (uintptr_t)bend, 2); printf_log(LOG_DEBUG, "Reserved high %p (%zx)\n", cur, bend-cur); } } -- cgit 1.4.1