From: notaz Date: Tue, 27 Nov 2012 15:08:39 +0000 (+0200) Subject: clean up mmap hacks X-Git-Tag: r18~58 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=commitdiff_plain;h=87e5b45fe1aa734289cf57531c89988cfafff524 clean up mmap hacks still messy but perhaps beter --- diff --git a/Makefile b/Makefile index 548d8a05..83f343f8 100644 --- a/Makefile +++ b/Makefile @@ -152,7 +152,6 @@ OBJS += frontend/libpicofe/gp2x/in_gp2x.o frontend/warm/warm.o OBJS += frontend/libpicofe/gp2x/soc_pollux.o OBJS += frontend/libpicofe/linux/in_evdev.o OBJS += frontend/plat_pollux.o frontend/in_tsbutton.o frontend/blit320.o -libpcsxcore/new_dynarec/pcsxmem.o: CFLAGS += -DCUSTOM_MEMMAPS frontend/main.o frontend/menu.o: CFLAGS += -include 320240/ui_gp2x.h USE_PLUGIN_LIB = 1 USE_FRONTEND = 1 @@ -164,7 +163,6 @@ USE_PLUGIN_LIB = 1 endif ifeq "$(PLATFORM)" "libretro" OBJS += frontend/libretro.o -OBJS += frontend/linux/plat_mmap.o endif ifeq "$(USE_PLUGIN_LIB)" "1" diff --git a/frontend/libretro.c b/frontend/libretro.c index b832a4ef..db13d7a2 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -11,10 +11,10 @@ #include "../libpcsxcore/misc.h" #include "../libpcsxcore/psxcounters.h" +#include "../libpcsxcore/psxmem_map.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../plugins/dfsound/out.h" #include "../plugins/gpulib/cspace.h" -#include "linux/plat_mmap.h" #include "main.h" #include "plugin.h" #include "plugin_lib.h" @@ -98,12 +98,12 @@ static void vout_close(void) static void *pl_mmap(unsigned int size) { - return plat_mmap(0, size, 0, 0); + return psxMap(0, size, 0, MAP_TAG_VRAM); } static void pl_munmap(void *ptr, unsigned int size) { - plat_munmap(ptr, size); + psxUnmap(ptr, size, MAP_TAG_VRAM); } struct rearmed_cbs pl_rearmed_cbs = { diff --git a/frontend/linux/plat_mmap.c b/frontend/linux/plat_mmap.c deleted file mode 100644 index db661b6d..00000000 --- a/frontend/linux/plat_mmap.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * (C) Gražvydas "notaz" Ignotas, 2008-2010 - * - * This work is licensed under the terms of any of these licenses - * (at your option): - * - GNU GPL, version 2 or later. - * - GNU LGPL, version 2.1 or later. - * See the COPYING file in the top-level directory. - */ - -#define _GNU_SOURCE 1 -#include -#include -#include -#include -#include -#include - -// this is some dupe code to avoid libpicofe dep - -//#include "../libpicofe/plat.h" - -/* XXX: maybe unhardcode pagesize? */ -#define HUGETLB_PAGESIZE (2 * 1024 * 1024) -#define HUGETLB_THRESHOLD (HUGETLB_PAGESIZE / 2) -#ifndef MAP_HUGETLB -#define MAP_HUGETLB 0x40000 /* arch specific */ -#endif - -void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) -{ - static int hugetlb_disabled; - int prot = PROT_READ | PROT_WRITE; - int flags = MAP_PRIVATE | MAP_ANONYMOUS; - void *req, *ret; - - req = (void *)addr; - if (need_exec) - prot |= PROT_EXEC; - if (is_fixed) - flags |= MAP_FIXED; - if (size >= HUGETLB_THRESHOLD && !hugetlb_disabled) - flags |= MAP_HUGETLB; - - ret = mmap(req, size, prot, flags, -1, 0); - if (ret == MAP_FAILED && (flags & MAP_HUGETLB)) { - fprintf(stderr, - "warning: failed to do hugetlb mmap (%p, %zu): %d\n", - req, size, errno); - hugetlb_disabled = 1; - flags &= ~MAP_HUGETLB; - ret = mmap(req, size, prot, flags, -1, 0); - } - if (ret == MAP_FAILED) - return NULL; - - if (req != NULL && ret != req) - fprintf(stderr, - "warning: mmaped to %p, requested %p\n", ret, req); - - return ret; -} - -void *plat_mremap(void *ptr, size_t oldsize, size_t newsize) -{ - void *ret; - - ret = mremap(ptr, oldsize, newsize, MREMAP_MAYMOVE); - if (ret == MAP_FAILED) - return NULL; - if (ret != ptr) - printf("warning: mremap moved: %p -> %p\n", ptr, ret); - - return ret; -} - -void plat_munmap(void *ptr, size_t size) -{ - int ret; - - ret = munmap(ptr, size); - if (ret != 0 && (size & (HUGETLB_PAGESIZE - 1))) { - // prehaps an autorounded hugetlb mapping? - size = (size + HUGETLB_PAGESIZE - 1) & ~(HUGETLB_PAGESIZE - 1); - ret = munmap(ptr, size); - } - if (ret != 0) { - fprintf(stderr, - "munmap(%p, %zu) failed: %d\n", ptr, size, errno); - } -} diff --git a/frontend/linux/plat_mmap.h b/frontend/linux/plat_mmap.h deleted file mode 100644 index 175246ea..00000000 --- a/frontend/linux/plat_mmap.h +++ /dev/null @@ -1,5 +0,0 @@ -#include - -void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed); -void *plat_mremap(void *ptr, size_t oldsize, size_t newsize); -void plat_munmap(void *ptr, size_t size); diff --git a/frontend/main.c b/frontend/main.c index 29d2c257..59b68d50 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -31,6 +31,8 @@ #include "libpicofe/input.h" #include "libpicofe/plat.h" #include "libpicofe/readpng.h" + +static void toggle_fast_forward(int force_off); #endif #ifndef BOOT_MSG #define BOOT_MSG "Booting up..." @@ -54,8 +56,6 @@ enum sched_action emu_action, emu_action_old; char hud_msg[64]; int hud_new_msg; -static void toggle_fast_forward(int force_off); - static void make_path(char *buf, size_t size, const char *dir, const char *fname) { if (fname) diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 73ddc825..095d3bed 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -30,6 +30,7 @@ #include "pl_gun_ts.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psemu_plugin_defs.h" +#include "../libpcsxcore/psxmem_map.h" #include "../plugins/gpulib/cspace.h" #include "../plugins/dfinput/externals.h" @@ -697,15 +698,8 @@ static void pl_get_layer_pos(int *x, int *y, int *w, int *h) *h = g_layer_h; } -static void *pl_mmap(unsigned int size) -{ - return plat_mmap(0, size, 0, 0); -} - -static void pl_munmap(void *ptr, unsigned int size) -{ - plat_munmap(ptr, size); -} +static void *pl_mmap(unsigned int size); +static void pl_munmap(void *ptr, unsigned int size); struct rearmed_cbs pl_rearmed_cbs = { pl_get_layer_pos, @@ -773,6 +767,27 @@ void pl_start_watchdog(void) fprintf(stderr, "could not start watchdog: %d\n", ret); } +static void *pl_emu_mmap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag) +{ + return plat_mmap(addr, size, 0, is_fixed); +} + +static void pl_emu_munmap(void *ptr, size_t size, enum psxMapTag tag) +{ + plat_munmap(ptr, size); +} + +static void *pl_mmap(unsigned int size) +{ + return psxMapHook(0, size, 0, MAP_TAG_VRAM); +} + +static void pl_munmap(void *ptr, unsigned int size) +{ + psxUnmapHook(ptr, size, MAP_TAG_VRAM); +} + void pl_init(void) { extern unsigned int hSyncCount; // from psxcounters @@ -785,4 +800,7 @@ void pl_init(void) pl_rearmed_cbs.gpu_hcnt = &hSyncCount; pl_rearmed_cbs.gpu_frame_count = &frame_counter; + + psxMapHook = pl_emu_mmap; + psxUnmapHook = pl_emu_munmap; } diff --git a/libpcsxcore/new_dynarec/pcsxmem.c b/libpcsxcore/new_dynarec/pcsxmem.c index f98ae22d..88e8112f 100644 --- a/libpcsxcore/new_dynarec/pcsxmem.c +++ b/libpcsxcore/new_dynarec/pcsxmem.c @@ -6,11 +6,11 @@ */ #include -#include #include "../psxhw.h" #include "../cdrom.h" #include "../mdec.h" #include "../gpu.h" +#include "../psxmem_map.h" #include "emu_if.h" #include "pcsxmem.h" @@ -300,16 +300,9 @@ void new_dyna_pcsx_mem_init(void) { int i; -#ifdef CUSTOM_MEMMAPS - // WIZ lack-of-RAM hack - extern void *memtab_mmap(void *addr, size_t size); - mem_readtab = memtab_mmap((void *)0x08000000, 0x200000 * 4); -#else // have to map these further to keep tcache close to .text - mem_readtab = mmap((void *)0x08000000, 0x200000 * 4, PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - if (mem_readtab == MAP_FAILED) { + mem_readtab = psxMap(0x08000000, 0x200000 * 4, 0, MAP_TAG_LUTS); + if (mem_readtab == NULL) { fprintf(stderr, "failed to map mem tables\n"); exit(1); } diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index ddcd05be..db902b04 100644 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -24,6 +24,7 @@ // TODO: Implement caches & cycle penalty. #include "psxmem.h" +#include "psxmem_map.h" #include "r3000a.h" #include "psxhw.h" #include "debug.h" @@ -33,6 +34,44 @@ #define MAP_ANONYMOUS MAP_ANON #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); + +void *psxMap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag) +{ + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + void *req, *ret; + + if (psxMapHook != NULL) + return psxMapHook(addr, size, is_fixed, tag); + + if (is_fixed) + flags |= MAP_FIXED; + + req = (void *)addr; + ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); + if (ret == MAP_FAILED) + return NULL; + + if (ret != req) + SysMessage("psxMap: warning: wanted to map @%p, got %p\n", + req, ret); + + return ret; +} + +void psxUnmap(void *ptr, size_t size, enum psxMapTag tag) +{ + if (psxUnmapHook != NULL) { + psxUnmapHook(ptr, size, tag); + return; + } + + munmap(ptr, size); +} + s8 *psxM = NULL; // Kernel & User Memory (2 Meg) s8 *psxP = NULL; // Parallel Port (64K) s8 *psxR = NULL; // BIOS ROM (512K) @@ -60,16 +99,6 @@ u8 **psxMemRLUT = NULL; 0xbfc0_0000-0xbfc7_ffff BIOS Mirror (512K) Uncached */ -#if 1 -void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed); -void plat_munmap(void *ptr, size_t size); -#else -#define plat_mmap(addr, size, need_exec, is_fixed) \ - mmap((void *)addr, size, PROT_WRITE | PROT_READ, \ - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0) -#define plat_munmap munmap -#endif - int psxMemInit() { int i; @@ -78,27 +107,22 @@ int psxMemInit() { memset(psxMemRLUT, 0, 0x10000 * sizeof(void *)); memset(psxMemWLUT, 0, 0x10000 * sizeof(void *)); - psxM = plat_mmap(0x80000000, 0x00210000, 0, 1); + psxM = psxMap(0x80000000, 0x00210000, 1, MAP_TAG_RAM); #ifndef RAM_FIXED - if (psxM == MAP_FAILED) - psxM = mmap((void *)0x70000000, 0x00210000, - PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (psxM == NULL) + psxM = psxMap(0x70000000, 0x00210000, 0, MAP_TAG_RAM); #endif - if (psxM == MAP_FAILED) { + if (psxM == NULL) { SysMessage(_("mapping main RAM failed")); return -1; } psxP = &psxM[0x200000]; - psxH = mmap((void *)0x1f800000, 0x00010000, - PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - - psxR = mmap((void *)0x1fc00000, 0x80000, - PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + psxH = psxMap(0x1f800000, 0x10000, 1, MAP_TAG_OTHER); + psxR = psxMap(0x1fc00000, 0x80000, 0, MAP_TAG_OTHER); if (psxMemRLUT == NULL || psxMemWLUT == NULL || - psxR == MAP_FAILED || - psxP == NULL || psxH != (void *)0x1f800000) { + psxR == NULL || psxP == NULL || psxH != (void *)0x1f800000) { SysMessage(_("Error allocating memory!")); return -1; } @@ -153,9 +177,9 @@ void psxMemReset() { } void psxMemShutdown() { - plat_munmap(psxM, 0x00210000); - munmap(psxH, 0x1f800000); - munmap(psxR, 0x80000); + psxUnmap(psxM, 0x00210000, MAP_TAG_RAM); + psxUnmap(psxH, 0x1f800000, MAP_TAG_OTHER); + psxUnmap(psxR, 0x80000, MAP_TAG_OTHER); free(psxMemRLUT); free(psxMemWLUT); diff --git a/libpcsxcore/psxmem_map.h b/libpcsxcore/psxmem_map.h new file mode 100644 index 00000000..df5fa51a --- /dev/null +++ b/libpcsxcore/psxmem_map.h @@ -0,0 +1,26 @@ +#ifndef __PSXMEM_MAP_H__ +#define __PSXMEM_MAP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +enum psxMapTag { + MAP_TAG_OTHER = 0, + MAP_TAG_RAM, + MAP_TAG_VRAM, + MAP_TAG_LUTS, +}; + +extern void *(*psxMapHook)(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag); +extern void (*psxUnmapHook)(void *ptr, size_t size, enum psxMapTag tag); + +void *psxMap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag); +void psxUnmap(void *ptr, size_t size, enum psxMapTag tag); + +#ifdef __cplusplus +} +#endif +#endif