bugfixes related to mmap usage for ROM
authornotaz <notasas@gmail.com>
Wed, 27 Jan 2010 15:16:25 +0000 (15:16 +0000)
committernotaz <notasas@gmail.com>
Wed, 27 Jan 2010 15:16:25 +0000 (15:16 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@867 be3aeb3a-fb24-0410-a615-afba39da0efa

cpu/drc/cmn.c
pico/cart.c
pico/carthw/carthw.c
pico/carthw/svp/svp.c
pico/cd/sek.c
platform/linux/plat.c

index 0e79489..d796bfb 100644 (file)
@@ -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
 }
index 42d0817..fa283c8 100644 (file)
@@ -592,6 +592,17 @@ int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_
   return 0;\r
 }\r
 \r
+int PicoCartResize(int newsize)\r
+{\r
+  void *tmp = plat_mremap(Pico.rom, rom_alloc_size, newsize);\r
+  if (tmp == NULL)\r
+    return -1;\r
+\r
+  Pico.rom = tmp;\r
+  rom_alloc_size = newsize;\r
+  return 0;\r
+}\r
+\r
 void PicoCartUnload(void)\r
 {\r
   if (PicoCartUnloadHook != NULL) {\r
index 9d81f8e..e35ae75 100644 (file)
@@ -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;
index 76904ae..a3ed89e 100644 (file)
@@ -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;
 }
 
-
index 789bb18..65c8c23 100644 (file)
@@ -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;
 }
index 492007c..f5742b9 100644 (file)
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <string.h>
 #include <dirent.h>
@@ -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);