X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fpsxmem.c;h=42755e52957396bfe2a74319382b66f6ecb4d17f;hb=0471495852ef192cd232e97dddfd8b79b5238a1f;hp=fb48f77bf28be897895fd24b4798e23b5be0ab1a;hpb=4d66d894c6563cbfb78fe8ccc0b374809fc44b0d;p=pcsx_rearmed.git diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index fb48f77b..42755e52 100644 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -41,34 +41,47 @@ #define MAP_ANONYMOUS MAP_ANON #endif +static void * psxMapDefault(unsigned long addr, size_t size, + int is_fixed, enum psxMapTag tag) +{ +#if !P_HAVE_MMAP + void *ptr; + + ptr = malloc(size); + return ptr ? ptr : MAP_FAILED; +#else + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + + return mmap((void *)(uintptr_t)addr, size, + PROT_READ | PROT_WRITE, flags, -1, 0); +#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, - enum psxMapTag tag); -void (*psxUnmapHook)(void *ptr, size_t size, enum psxMapTag tag); + enum psxMapTag tag) = psxMapDefault; +void (*psxUnmapHook)(void *ptr, size_t size, + enum psxMapTag tag) = psxUnmapDefault; void *psxMap(unsigned long addr, size_t size, int is_fixed, enum psxMapTag tag) { - int flags = MAP_PRIVATE | MAP_ANONYMOUS; int try_ = 0; unsigned long mask; - void *req, *ret; + void *ret; retry: - if (psxMapHook != NULL) { - ret = psxMapHook(addr, size, 0, tag); - if (ret == NULL) - return MAP_FAILED; - } - else { - /* avoid MAP_FIXED, it overrides existing mappings.. */ - /* if (is_fixed) - flags |= MAP_FIXED; */ - - req = (void *)(uintptr_t)addr; - ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); - if (ret == MAP_FAILED) - return ret; - } + ret = psxMapHook(addr, size, 0, tag); + if (ret == NULL) + return MAP_FAILED; if (addr != 0 && ret != (void *)(uintptr_t)addr) { SysMessage("psxMap: warning: wanted to map @%08x, got %p\n", @@ -97,13 +110,7 @@ retry: void psxUnmap(void *ptr, size_t size, enum psxMapTag tag) { - if (psxUnmapHook != NULL) { - psxUnmapHook(ptr, size, tag); - return; - } - - if (ptr) - munmap(ptr, size); + psxUnmapHook(ptr, size, tag); } s8 *psxM = NULL; // Kernel & User Memory (2 Meg)