Skip to content

Commit

Permalink
Tentative fix for new_dynarec.
Browse files Browse the repository at this point in the history
Proper map_region is done for rdram and mi_regs.
TLB translation is done inside {read,write}_aligned_{d,}word.
  • Loading branch information
bsmiles32 committed Jul 3, 2017
1 parent 326e490 commit bd42118
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 19 deletions.
25 changes: 10 additions & 15 deletions src/device/r4300/new_dynarec/new_dynarec.c
Expand Up @@ -32,6 +32,7 @@
#include "new_dynarec.h"
#include "main/main.h"
#include "main/rom.h"
#include "device/device.h"
#include "device/memory/memory.h"
#include "device/rsp/rsp_core.h"
#include "device/r4300/cached_interp.h"
Expand Down Expand Up @@ -276,14 +277,14 @@ static signed char regmap_entry[MAXBLOCK][HOST_REGS];
#endif


static void read_nomem_new2(void* opaque, uint32_t address, uint32_t* value)
void read_nomem_new2(void* opaque, uint32_t address, uint32_t* value)
{
*r4300_address(&g_dev.r4300) = address;
read_nomem_new();
*value = (uint32_t)(*g_dev.r4300.rdword);
}

static void write_nomem_new2(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
void write_nomem_new2(void* opaque, uint32_t address, uint32_t value, uint32_t mask)
{
*r4300_address(&g_dev.r4300) = address;
*r4300_wword(&g_dev.r4300) = value;
Expand Down Expand Up @@ -7663,20 +7664,14 @@ void new_dynarec_init(void)
g_dev.r4300.new_dynarec_hot_state.memory_map[n]=((u_int)g_dev.ri.rdram.dram-0x80000000)>>2;
for(n=526336;n<1048576;n++) // 0x80800000 .. 0xFFFFFFFF
g_dev.r4300.new_dynarec_hot_state.memory_map[n]=-1;
for(n=0;n<0x8000;n++) { // 0 .. 0x7FFFFFFF
g_dev.mem.handlers[n].write32 = write_nomem_new2;
g_dev.mem.handlers[n].read32 = read_nomem_new2;
}
for(n=0x8000;n<0x8080;n++) { // 0x80000000 .. 0x807FFFFF
g_dev.mem.handlers[n].write32 = write_rdram_new2;
}
for(n=0xC000;n<0x10000;n++) { // 0xC0000000 .. 0xFFFFFFFF
g_dev.mem.handlers[n].write32 = write_nomem_new2;
g_dev.mem.handlers[n].read32 = read_nomem_new2;
}

g_dev.mem.handlers[0x8430].write32 = write_mi_new2;
g_dev.mem.handlers[0xa430].write32 = write_mi_new2;
struct mem_handler mi_handler = { &g_dev.r4300, read_mi_regs, write_mi_new2 };
struct mem_handler rdram_handler = { &g_dev.ri, read_rdram_dram, write_rdram_new2 };

for(n=(MM_RDRAM_DRAM >> 16);n<0x0080;n++) {
map_region(&g_dev.mem, n, M64P_MEM_RDRAM, &rdram_handler);
}
map_region(&g_dev.mem, (MM_MI_REGS >> 16), M64P_MEM_MI, &mi_handler);

tlb_hacks();
arch_init();
Expand Down
3 changes: 3 additions & 0 deletions src/device/r4300/new_dynarec/new_dynarec.h
Expand Up @@ -100,4 +100,7 @@ void new_dynarec_init(void);
void new_dyna_start(void);
void new_dynarec_cleanup(void);

void read_nomem_new2(void* opaque, uint32_t address, uint32_t* value);
void write_nomem_new2(void* opaque, uint32_t address, uint32_t value, uint32_t mask);

#endif /* M64P_DEVICE_R4300_NEW_DYNAREC_H */
52 changes: 48 additions & 4 deletions src/device/r4300/r4300_core.c
Expand Up @@ -333,7 +333,18 @@ uint32_t *fast_mem_access(struct r4300_core* r4300, uint32_t address)
int r4300_read_aligned_word(struct r4300_core* r4300, uint32_t address, uint32_t* value)
{
if ((address & UINT32_C(0xc0000000)) != UINT32_C(0x80000000)) {
address = virtual_to_physical_address(r4300, address, 0);
#ifdef NEW_DYNAREC
if (r4300->emumode == EMUMODE_DYNAREC)
{
read_nomem_new2(r4300, address, value);
address = *r4300_address(r4300);
}
else
#endif
{
address = virtual_to_physical_address(r4300, address, 0);
}

if (address == 0) {
return 0;
}
Expand All @@ -354,7 +365,18 @@ int r4300_read_aligned_dword(struct r4300_core* r4300, uint32_t address, uint64_
assert((address & 0x7) == 0);

if ((address & UINT32_C(0xc0000000)) != UINT32_C(0x80000000)) {
address = virtual_to_physical_address(r4300, address, 0);
#ifdef NEW_DYNAREC
if (r4300->emumode == EMUMODE_DYNAREC)
{
read_nomem_new2(r4300, address, &w[0]);
address = *r4300_address(r4300);
}
else
#endif
{
address = virtual_to_physical_address(r4300, address, 0);
}

if (address == 0) {
return 0;
}
Expand All @@ -381,7 +403,18 @@ int r4300_write_aligned_word(struct r4300_core* r4300, uint32_t address, uint32_

invalidate_r4300_cached_code(r4300, address, 4);

address = virtual_to_physical_address(r4300, address, 1);
#ifdef NEW_DYNAREC
if (r4300->emumode == EMUMODE_DYNAREC)
{
write_nomem_new2(r4300, address, value, mask);
address = *r4300_address(r4300);
}
else
#endif
{
address = virtual_to_physical_address(r4300, address, 1);
}

if (address == 0) {
return 0;
}
Expand All @@ -405,7 +438,18 @@ int r4300_write_aligned_dword(struct r4300_core* r4300, uint32_t address, uint64

invalidate_r4300_cached_code(r4300, address, 8);

address = virtual_to_physical_address(r4300, address, 1);
#ifdef NEW_DYNAREC
if (r4300->emumode == EMUMODE_DYNAREC)
{
write_nomem_new2(r4300, address, value, mask);
address = *r4300_address(r4300);
}
else
#endif
{
address = virtual_to_physical_address(r4300, address, 1);
}

if (address == 0) {
return 0;
}
Expand Down

0 comments on commit bd42118

Please sign in to comment.