X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fpsxmem.c;h=389bdba5166e491e345080abd03a448577f5faeb;hb=63b05f75121cffb317e0ef68fa90a00c7a9aabdb;hp=54219ae051543622e5da6d0338840c0042eff60e;hpb=826ba56b077130624f0b4c00f57ed7362449e5aa;p=pcsx_rearmed.git diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index 54219ae0..389bdba5 100644 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -44,15 +44,39 @@ static void * psxMapDefault(unsigned long addr, size_t size, int is_fixed, enum psxMapTag tag) { + void *ptr; +#if !P_HAVE_MMAP + ptr = calloc(1, size); + return ptr ? ptr : MAP_FAILED; +#else int flags = MAP_PRIVATE | MAP_ANONYMOUS; - return mmap((void *)(uintptr_t)addr, size, + ptr = mmap((void *)(uintptr_t)addr, size, PROT_READ | PROT_WRITE, flags, -1, 0); +#ifdef MADV_HUGEPAGE + if (size >= 2*1024*1024) { + if (ptr != MAP_FAILED && ((uintptr_t)ptr & (2*1024*1024 - 1))) { + // try to manually realign assuming bottom-to-top alloc + munmap(ptr, size); + addr = (uintptr_t)ptr & ~(2*1024*1024 - 1); + ptr = mmap((void *)(uintptr_t)addr, size, + PROT_READ | PROT_WRITE, flags, -1, 0); + } + if (ptr != MAP_FAILED) + madvise(ptr, size, MADV_HUGEPAGE); + } +#endif + return ptr; +#endif } static void psxUnmapDefault(void *ptr, size_t size, enum psxMapTag tag) { +#if !P_HAVE_MMAP + free(ptr); +#else munmap(ptr, size); +#endif } void *(*psxMapHook)(unsigned long addr, size_t size, int is_fixed,