Stub "RDRAM size" value in RDRAM to fix bug described in previous commit message

This commit is contained in:
CocoSimone
2022-10-01 04:23:09 +02:00
parent 770339f84e
commit 3ff64c04fe
5 changed files with 46 additions and 46 deletions

View File

@@ -40,15 +40,18 @@ u32 Mem::LoadROM(const std::string& filename) {
util::SwapN64Rom(crc, sizeAdjusted, cart.data());
memcpy(mmio.rsp.dmem, cart.data(), 0x1000);
u32 rdram_size = RDRAM_SIZE;
memcpy(&mmio.rdp.dram[0x318], &rdram_size, sizeof(u32));
return crc;
}
template <bool tlb>
bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr) {
bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr) {
paddr = vaddr & 0x1FFFFFFF;
if constexpr(!tlb) return true;
switch(vaddr >> 29) {
switch(u32(vaddr) >> 29) {
case 0 ... 3: case 7:
return ProbeTLB(regs, accessType, vaddr, paddr, nullptr);
case 4 ... 5: return true;
@@ -60,11 +63,11 @@ bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr)
return false;
}
template bool MapVAddr<true>(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr);
template bool MapVAddr<false>(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr);
template bool MapVAddr<true>(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
template bool MapVAddr<false>(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
template <bool tlb>
u8 Mem::Read8(n64::Registers &regs, u32 vaddr, s64 pc) {
u8 Mem::Read8(n64::Registers &regs, u64 vaddr, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -97,7 +100,7 @@ u8 Mem::Read8(n64::Registers &regs, u32 vaddr, s64 pc) {
}
template <bool tlb>
u16 Mem::Read16(n64::Registers &regs, u32 vaddr, s64 pc) {
u16 Mem::Read16(n64::Registers &regs, u64 vaddr, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -130,7 +133,7 @@ u16 Mem::Read16(n64::Registers &regs, u32 vaddr, s64 pc) {
}
template <bool tlb>
u32 Mem::Read32(n64::Registers &regs, u32 vaddr, s64 pc) {
u32 Mem::Read32(n64::Registers &regs, u64 vaddr, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -162,7 +165,7 @@ u32 Mem::Read32(n64::Registers &regs, u32 vaddr, s64 pc) {
}
template <bool tlb>
u64 Mem::Read64(n64::Registers &regs, u32 vaddr, s64 pc) {
u64 Mem::Read64(n64::Registers &regs, u64 vaddr, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -193,17 +196,17 @@ u64 Mem::Read64(n64::Registers &regs, u32 vaddr, s64 pc) {
}
}
template u8 Mem::Read8<false>(n64::Registers &regs, u32 vaddr, s64 pc);
template u8 Mem::Read8<true>(n64::Registers &regs, u32 vaddr, s64 pc);
template u16 Mem::Read16<false>(n64::Registers &regs, u32 vaddr, s64 pc);
template u16 Mem::Read16<true>(n64::Registers &regs, u32 vaddr, s64 pc);
template u32 Mem::Read32<false>(n64::Registers &regs, u32 vaddr, s64 pc);
template u32 Mem::Read32<true>(n64::Registers &regs, u32 vaddr, s64 pc);
template u64 Mem::Read64<false>(n64::Registers &regs, u32 vaddr, s64 pc);
template u64 Mem::Read64<true>(n64::Registers &regs, u32 vaddr, s64 pc);
template u8 Mem::Read8<false>(n64::Registers &regs, u64 vaddr, s64 pc);
template u8 Mem::Read8<true>(n64::Registers &regs, u64 vaddr, s64 pc);
template u16 Mem::Read16<false>(n64::Registers &regs, u64 vaddr, s64 pc);
template u16 Mem::Read16<true>(n64::Registers &regs, u64 vaddr, s64 pc);
template u32 Mem::Read32<false>(n64::Registers &regs, u64 vaddr, s64 pc);
template u32 Mem::Read32<true>(n64::Registers &regs, u64 vaddr, s64 pc);
template u64 Mem::Read64<false>(n64::Registers &regs, u64 vaddr, s64 pc);
template u64 Mem::Read64<true>(n64::Registers &regs, u64 vaddr, s64 pc);
template <bool tlb>
void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc) {
void Mem::Write8(Registers& regs, u64 vaddr, u32 val, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -239,7 +242,7 @@ void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc) {
}
template <bool tlb>
void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc) {
void Mem::Write16(Registers& regs, u64 vaddr, u32 val, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -275,12 +278,9 @@ void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc) {
}
template <bool tlb>
void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) {
void Mem::Write32(Registers& regs, u64 vaddr, u32 val, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
if(pc == 0xFFFFFFFF80002C14) {
printf("\n");
}
HandleTLBException(regs, vaddr);
FireException(regs, GetTLBExceptionCode(regs.cop0.tlbError, STORE), 0, pc);
}
@@ -321,7 +321,7 @@ void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) {
}
template <bool tlb>
void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc) {
void Mem::Write64(Registers& regs, u64 vaddr, u64 val, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
HandleTLBException(regs, vaddr);
@@ -353,12 +353,12 @@ void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc) {
}
}
template void Mem::Write8<false>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write8<true>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write16<false>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write16<true>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write32<false>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write32<true>(Registers& regs, u32 vaddr, u32 val, s64 pc);
template void Mem::Write64<false>(Registers& regs, u32 vaddr, u64 val, s64 pc);
template void Mem::Write64<true>(Registers& regs, u32 vaddr, u64 val, s64 pc);
template void Mem::Write8<false>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write8<true>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write16<false>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write16<true>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write32<false>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write32<true>(Registers& regs, u64 vaddr, u32 val, s64 pc);
template void Mem::Write64<false>(Registers& regs, u64 vaddr, u64 val, s64 pc);
template void Mem::Write64<true>(Registers& regs, u64 vaddr, u64 val, s64 pc);
}

View File

@@ -17,21 +17,21 @@ struct Mem {
}
template <bool tlb = true>
u8 Read8(Registers&, u32, s64);
u8 Read8(Registers&, u64, s64);
template <bool tlb = true>
u16 Read16(Registers&, u32, s64);
u16 Read16(Registers&, u64, s64);
template <bool tlb = true>
u32 Read32(Registers&, u32, s64);
u32 Read32(Registers&, u64, s64);
template <bool tlb = true>
u64 Read64(Registers&, u32, s64);
u64 Read64(Registers&, u64, s64);
template <bool tlb = true>
void Write8(Registers&, u32, u32, s64);
void Write8(Registers&, u64, u32, s64);
template <bool tlb = true>
void Write16(Registers&, u32, u32, s64);
void Write16(Registers&, u64, u32, s64);
template <bool tlb = true>
void Write32(Registers&, u32, u32, s64);
void Write32(Registers&, u64, u32, s64);
template <bool tlb = true>
void Write64(Registers&, u32, u64, s64);
void Write64(Registers&, u64, u64, s64);
MMIO mmio;
u8 pifRam[PIF_RAM_SIZE]{};
@@ -49,5 +49,5 @@ private:
};
template <bool tlb = true>
bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr);
bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
}

View File

@@ -209,7 +209,7 @@ void Cpu::lh(Mem& mem, u32 instr) {
}
void Cpu::lw(Mem& mem, u32 instr) {
s64 address = regs.gpr[RS(instr)] + (s16)instr;
u64 address = regs.gpr[RS(instr)] + (s16)instr;
if (check_address_error(address, 0b11)) {
HandleTLBException(regs, address);
FireException(regs, ExceptionCode::AddressErrorLoad, 0, regs.oldPC);
@@ -391,7 +391,7 @@ void Cpu::sh(Mem& mem, u32 instr) {
}
void Cpu::sw(Mem& mem, u32 instr) {
s64 address = regs.gpr[RS(instr)] + (s16)instr;
u64 address = regs.gpr[RS(instr)] + (s16)instr;
if (check_address_error(address, 0b11)) {
HandleTLBException(regs, address);
FireException(regs, ExceptionCode::AddressErrorStore, 0, regs.oldPC);

View File

@@ -170,7 +170,7 @@ u64 getVPN(u64 addr, u64 pageMask) {
return vpn & ~mask;
}
TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match) {
TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match) {
for(int i = 0; i < 32; i++) {
TLBEntry *entry = &regs.cop0.tlb[i];
u64 entry_vpn = getVPN(entry->entryHi.raw, entry->pageMask.raw);
@@ -190,7 +190,7 @@ TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match) {
return nullptr;
}
bool ProbeTLB(Registers& regs, TLBAccessType access_type, s64 vaddr, u32& paddr, int* match) {
bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match) {
TLBEntry* entry = TLBTryMatch(regs, vaddr, match);
if(!entry) {
regs.cop0.tlbError = MISS;

View File

@@ -267,8 +267,8 @@ private:
struct Registers;
enum class ExceptionCode : u8;
TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match);
bool ProbeTLB(Registers& regs, TLBAccessType access_type, s64 vaddr, u32& paddr, int* match);
TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match);
bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match);
void HandleTLBException(Registers& regs, u64 vaddr);
ExceptionCode GetTLBExceptionCode(TLBError error, TLBAccessType access_type);
}