From a736af3ecf708652f90e9cb05445d984960a0eec Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 27 Jan 2010 15:16:25 +0000 Subject: [PATCH] bugfixes related to mmap usage for ROM git-svn-id: file:///home/notaz/opt/svn/PicoDrive@867 be3aeb3a-fb24-0410-a615-afba39da0efa --- cpu/drc/cmn.c | 2 +- pico/cart.c | 11 +++++++++++ pico/carthw/carthw.c | 15 +++++---------- pico/carthw/svp/svp.c | 12 ++++-------- pico/cd/sek.c | 5 +---- platform/linux/plat.c | 17 ++++++++++++++++- 6 files changed, 38 insertions(+), 24 deletions(-) diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 0e79489..d796bfb 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -13,7 +13,7 @@ void drc_cmn_init(void) #ifdef __linux__ void *tmp; - tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0); + tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); printf("mmap tcache: %p, asked %p\n", tmp, tcache); #endif } diff --git a/pico/cart.c b/pico/cart.c index 42d0817..fa283c8 100644 --- a/pico/cart.c +++ b/pico/cart.c @@ -592,6 +592,17 @@ int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_ return 0; } +int PicoCartResize(int newsize) +{ + void *tmp = plat_mremap(Pico.rom, rom_alloc_size, newsize); + if (tmp == NULL) + return -1; + + Pico.rom = tmp; + rom_alloc_size = newsize; + return 0; +} + void PicoCartUnload(void) { if (PicoCartUnloadHook != NULL) { diff --git a/pico/carthw/carthw.c b/pico/carthw/carthw.c index 9d81f8e..e35ae75 100644 --- a/pico/carthw/carthw.c +++ b/pico/carthw/carthw.c @@ -203,20 +203,17 @@ static void carthw_realtec_reset(void) void carthw_realtec_startup(void) { - void *tmp; int i; elprintf(EL_STATUS, "Realtec mapper startup"); // allocate additional bank for boot code // (we know those ROMs have aligned size) - tmp = realloc(Pico.rom, Pico.romsize + M68K_BANK_SIZE); - if (tmp == NULL) - { + i = PicoCartResize(Pico.romsize + M68K_BANK_SIZE); + if (i != 0) { elprintf(EL_STATUS, "OOM"); return; } - Pico.rom = tmp; // create bank for boot code for (i = 0; i < M68K_BANK_SIZE; i += 0x2000) @@ -487,18 +484,16 @@ static void carthw_prot_lk3_mem_setup(void) void carthw_prot_lk3_startup(void) { - void *tmp; + int ret; elprintf(EL_STATUS, "lk3 prot emu startup"); // allocate space for bank0 backup - tmp = realloc(Pico.rom, Pico.romsize + 0x8000); - if (tmp == NULL) - { + ret = PicoCartResize(Pico.romsize + 0x8000); + if (ret != 0) { elprintf(EL_STATUS, "OOM"); return; } - Pico.rom = tmp; memcpy(Pico.rom + Pico.romsize, Pico.rom, 0x8000); PicoCartMemSetup = carthw_prot_lk3_mem_setup; diff --git a/pico/carthw/svp/svp.c b/pico/carthw/svp/svp.c index 76904ae..a3ed89e 100644 --- a/pico/carthw/svp/svp.c +++ b/pico/carthw/svp/svp.c @@ -115,20 +115,17 @@ static void PicoSVPExit(void) void PicoSVPStartup(void) { - void *tmp; + int ret; elprintf(EL_STATUS, "SVP startup"); - tmp = realloc(Pico.rom, 0x200000 + sizeof(*svp)); - if (tmp == NULL) - { + ret = PicoCartResize(Pico.romsize + sizeof(*svp)); + if (ret != 0) { elprintf(EL_STATUS|EL_SVP, "OOM for SVP data"); return; } - //PicoOpt &= ~0x20000; - Pico.rom = tmp; - svp = (void *) ((char *)tmp + 0x200000); + svp = (void *) ((char *)Pico.rom + Pico.romsize); memset(svp, 0, sizeof(*svp)); // init SVP compiler @@ -156,4 +153,3 @@ void PicoSVPStartup(void) PicoAHW |= PAHW_SVP; } - diff --git a/pico/cd/sek.c b/pico/cd/sek.c index 789bb18..65c8c23 100644 --- a/pico/cd/sek.c +++ b/pico/cd/sek.c @@ -52,10 +52,7 @@ static void SekResetAckS68k(void) static int SekUnrecognizedOpcodeS68k(void) { - unsigned int pc, op; - pc = SekPcS68k; - op = PicoCpuCS68k.read16(pc); - elprintf(EL_ANOMALY, "Unrecognized Opcode %04x @ %06x", op, pc); + elprintf(EL_ANOMALY, "Unrecognized Opcode @ %06x", SekPcS68k); //exit(1); return 0; } diff --git a/platform/linux/plat.c b/platform/linux/plat.c index 492007c..f5742b9 100644 --- a/platform/linux/plat.c +++ b/platform/linux/plat.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE #include #include #include @@ -112,8 +113,9 @@ int plat_wait_event(int *fds_hnds, int count, int timeout_ms) void *plat_mmap(unsigned long addr, size_t size) { void *req, *ret; + req = (void *)addr; - ret = mmap(req, size, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); + ret = mmap(req, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (ret == MAP_FAILED) return NULL; if (ret != req) @@ -122,6 +124,19 @@ void *plat_mmap(unsigned long addr, size_t size) 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) { munmap(ptr, size); -- 2.39.2