mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
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:
parent
1f1ff763e6
commit
a736af3ecf
6 changed files with 38 additions and 24 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
11
pico/cart.c
11
pico/cart.c
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue