bugfixes related to mmap usage for ROM

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@867 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2010-01-27 15:16:25 +00:00
parent 1f1ff763e6
commit a736af3ecf
6 changed files with 38 additions and 24 deletions

View file

@ -13,7 +13,7 @@ void drc_cmn_init(void)
#ifdef __linux__ #ifdef __linux__
void *tmp; 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); printf("mmap tcache: %p, asked %p\n", tmp, tcache);
#endif #endif
} }

View file

@ -592,6 +592,17 @@ int PicoCartInsert(unsigned char *rom, unsigned int romsize, const char *carthw_
return 0; 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) void PicoCartUnload(void)
{ {
if (PicoCartUnloadHook != NULL) { if (PicoCartUnloadHook != NULL) {

View file

@ -203,20 +203,17 @@ static void carthw_realtec_reset(void)
void carthw_realtec_startup(void) void carthw_realtec_startup(void)
{ {
void *tmp;
int i; int i;
elprintf(EL_STATUS, "Realtec mapper startup"); elprintf(EL_STATUS, "Realtec mapper startup");
// allocate additional bank for boot code // allocate additional bank for boot code
// (we know those ROMs have aligned size) // (we know those ROMs have aligned size)
tmp = realloc(Pico.rom, Pico.romsize + M68K_BANK_SIZE); i = PicoCartResize(Pico.romsize + M68K_BANK_SIZE);
if (tmp == NULL) if (i != 0) {
{
elprintf(EL_STATUS, "OOM"); elprintf(EL_STATUS, "OOM");
return; return;
} }
Pico.rom = tmp;
// create bank for boot code // create bank for boot code
for (i = 0; i < M68K_BANK_SIZE; i += 0x2000) 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 carthw_prot_lk3_startup(void)
{ {
void *tmp; int ret;
elprintf(EL_STATUS, "lk3 prot emu startup"); elprintf(EL_STATUS, "lk3 prot emu startup");
// allocate space for bank0 backup // allocate space for bank0 backup
tmp = realloc(Pico.rom, Pico.romsize + 0x8000); ret = PicoCartResize(Pico.romsize + 0x8000);
if (tmp == NULL) if (ret != 0) {
{
elprintf(EL_STATUS, "OOM"); elprintf(EL_STATUS, "OOM");
return; return;
} }
Pico.rom = tmp;
memcpy(Pico.rom + Pico.romsize, Pico.rom, 0x8000); memcpy(Pico.rom + Pico.romsize, Pico.rom, 0x8000);
PicoCartMemSetup = carthw_prot_lk3_mem_setup; PicoCartMemSetup = carthw_prot_lk3_mem_setup;

View file

@ -115,20 +115,17 @@ static void PicoSVPExit(void)
void PicoSVPStartup(void) void PicoSVPStartup(void)
{ {
void *tmp; int ret;
elprintf(EL_STATUS, "SVP startup"); elprintf(EL_STATUS, "SVP startup");
tmp = realloc(Pico.rom, 0x200000 + sizeof(*svp)); ret = PicoCartResize(Pico.romsize + sizeof(*svp));
if (tmp == NULL) if (ret != 0) {
{
elprintf(EL_STATUS|EL_SVP, "OOM for SVP data"); elprintf(EL_STATUS|EL_SVP, "OOM for SVP data");
return; return;
} }
//PicoOpt &= ~0x20000; svp = (void *) ((char *)Pico.rom + Pico.romsize);
Pico.rom = tmp;
svp = (void *) ((char *)tmp + 0x200000);
memset(svp, 0, sizeof(*svp)); memset(svp, 0, sizeof(*svp));
// init SVP compiler // init SVP compiler
@ -156,4 +153,3 @@ void PicoSVPStartup(void)
PicoAHW |= PAHW_SVP; PicoAHW |= PAHW_SVP;
} }

View file

@ -52,10 +52,7 @@ static void SekResetAckS68k(void)
static int SekUnrecognizedOpcodeS68k(void) static int SekUnrecognizedOpcodeS68k(void)
{ {
unsigned int pc, op; elprintf(EL_ANOMALY, "Unrecognized Opcode @ %06x", SekPcS68k);
pc = SekPcS68k;
op = PicoCpuCS68k.read16(pc);
elprintf(EL_ANOMALY, "Unrecognized Opcode %04x @ %06x", op, pc);
//exit(1); //exit(1);
return 0; return 0;
} }

View file

@ -1,3 +1,4 @@
#define _GNU_SOURCE
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <dirent.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 *plat_mmap(unsigned long addr, size_t size)
{ {
void *req, *ret; void *req, *ret;
req = (void *)addr; 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) if (ret == MAP_FAILED)
return NULL; return NULL;
if (ret != req) if (ret != req)
@ -122,6 +124,19 @@ void *plat_mmap(unsigned long addr, size_t size)
return ret; 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) void plat_munmap(void *ptr, size_t size)
{ {
munmap(ptr, size); munmap(ptr, size);