Stub "RDRAM size" value in RDRAM to fix bug described in previous commit message
This commit is contained in:
@@ -40,15 +40,18 @@ u32 Mem::LoadROM(const std::string& filename) {
|
|||||||
util::SwapN64Rom(crc, sizeAdjusted, cart.data());
|
util::SwapN64Rom(crc, sizeAdjusted, cart.data());
|
||||||
memcpy(mmio.rsp.dmem, cart.data(), 0x1000);
|
memcpy(mmio.rsp.dmem, cart.data(), 0x1000);
|
||||||
|
|
||||||
|
u32 rdram_size = RDRAM_SIZE;
|
||||||
|
memcpy(&mmio.rdp.dram[0x318], &rdram_size, sizeof(u32));
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
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;
|
paddr = vaddr & 0x1FFFFFFF;
|
||||||
if constexpr(!tlb) return true;
|
if constexpr(!tlb) return true;
|
||||||
|
|
||||||
switch(vaddr >> 29) {
|
switch(u32(vaddr) >> 29) {
|
||||||
case 0 ... 3: case 7:
|
case 0 ... 3: case 7:
|
||||||
return ProbeTLB(regs, accessType, vaddr, paddr, nullptr);
|
return ProbeTLB(regs, accessType, vaddr, paddr, nullptr);
|
||||||
case 4 ... 5: return true;
|
case 4 ... 5: return true;
|
||||||
@@ -60,11 +63,11 @@ bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template bool MapVAddr<true>(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, u32 vaddr, u32& paddr);
|
template bool MapVAddr<false>(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
|
||||||
|
|
||||||
template <bool tlb>
|
template <bool tlb>
|
||||||
u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc) {
|
u8 Mem::Read8(n64::Registers ®s, u64 vaddr, s64 pc) {
|
||||||
u32 paddr = vaddr;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -97,7 +100,7 @@ u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
template <bool tlb>
|
||||||
u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc) {
|
u16 Mem::Read16(n64::Registers ®s, u64 vaddr, s64 pc) {
|
||||||
u32 paddr = vaddr;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -130,7 +133,7 @@ u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
template <bool tlb>
|
||||||
u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc) {
|
u32 Mem::Read32(n64::Registers ®s, u64 vaddr, s64 pc) {
|
||||||
u32 paddr = vaddr;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -162,7 +165,7 @@ u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
template <bool tlb>
|
||||||
u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc) {
|
u64 Mem::Read64(n64::Registers ®s, u64 vaddr, s64 pc) {
|
||||||
u32 paddr = vaddr;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, LOAD, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -193,17 +196,17 @@ u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template u8 Mem::Read8<false>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u8 Mem::Read8<false>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u8 Mem::Read8<true>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u8 Mem::Read8<true>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u16 Mem::Read16<false>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u16 Mem::Read16<false>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u16 Mem::Read16<true>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u16 Mem::Read16<true>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u32 Mem::Read32<false>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u32 Mem::Read32<false>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u32 Mem::Read32<true>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u32 Mem::Read32<true>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u64 Mem::Read64<false>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u64 Mem::Read64<false>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
template u64 Mem::Read64<true>(n64::Registers ®s, u32 vaddr, s64 pc);
|
template u64 Mem::Read64<true>(n64::Registers ®s, u64 vaddr, s64 pc);
|
||||||
|
|
||||||
template <bool tlb>
|
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;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -239,7 +242,7 @@ void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
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;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
@@ -275,12 +278,9 @@ void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
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;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
||||||
if(pc == 0xFFFFFFFF80002C14) {
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
HandleTLBException(regs, vaddr);
|
HandleTLBException(regs, vaddr);
|
||||||
FireException(regs, GetTLBExceptionCode(regs.cop0.tlbError, STORE), 0, pc);
|
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>
|
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;
|
u32 paddr = vaddr;
|
||||||
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
|
||||||
HandleTLBException(regs, vaddr);
|
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<false>(Registers& regs, u64 vaddr, u32 val, s64 pc);
|
||||||
template void Mem::Write8<true>(Registers& regs, u32 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, u32 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, u32 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, u32 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, u32 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, u32 vaddr, u64 val, s64 pc);
|
template void Mem::Write64<false>(Registers& regs, u64 vaddr, u64 val, s64 pc);
|
||||||
template void Mem::Write64<true>(Registers& regs, u32 vaddr, u64 val, s64 pc);
|
template void Mem::Write64<true>(Registers& regs, u64 vaddr, u64 val, s64 pc);
|
||||||
}
|
}
|
||||||
@@ -17,21 +17,21 @@ struct Mem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
u8 Read8(Registers&, u32, s64);
|
u8 Read8(Registers&, u64, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
u16 Read16(Registers&, u32, s64);
|
u16 Read16(Registers&, u64, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
u32 Read32(Registers&, u32, s64);
|
u32 Read32(Registers&, u64, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
u64 Read64(Registers&, u32, s64);
|
u64 Read64(Registers&, u64, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
void Write8(Registers&, u32, u32, s64);
|
void Write8(Registers&, u64, u32, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
void Write16(Registers&, u32, u32, s64);
|
void Write16(Registers&, u64, u32, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
void Write32(Registers&, u32, u32, s64);
|
void Write32(Registers&, u64, u32, s64);
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
void Write64(Registers&, u32, u64, s64);
|
void Write64(Registers&, u64, u64, s64);
|
||||||
|
|
||||||
MMIO mmio;
|
MMIO mmio;
|
||||||
u8 pifRam[PIF_RAM_SIZE]{};
|
u8 pifRam[PIF_RAM_SIZE]{};
|
||||||
@@ -49,5 +49,5 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <bool tlb = true>
|
template <bool tlb = true>
|
||||||
bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr);
|
bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ void Cpu::lh(Mem& mem, u32 instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Cpu::lw(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)) {
|
if (check_address_error(address, 0b11)) {
|
||||||
HandleTLBException(regs, address);
|
HandleTLBException(regs, address);
|
||||||
FireException(regs, ExceptionCode::AddressErrorLoad, 0, regs.oldPC);
|
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) {
|
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)) {
|
if (check_address_error(address, 0b11)) {
|
||||||
HandleTLBException(regs, address);
|
HandleTLBException(regs, address);
|
||||||
FireException(regs, ExceptionCode::AddressErrorStore, 0, regs.oldPC);
|
FireException(regs, ExceptionCode::AddressErrorStore, 0, regs.oldPC);
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ u64 getVPN(u64 addr, u64 pageMask) {
|
|||||||
return vpn & ~mask;
|
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++) {
|
for(int i = 0; i < 32; i++) {
|
||||||
TLBEntry *entry = ®s.cop0.tlb[i];
|
TLBEntry *entry = ®s.cop0.tlb[i];
|
||||||
u64 entry_vpn = getVPN(entry->entryHi.raw, entry->pageMask.raw);
|
u64 entry_vpn = getVPN(entry->entryHi.raw, entry->pageMask.raw);
|
||||||
@@ -190,7 +190,7 @@ TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match) {
|
|||||||
return nullptr;
|
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);
|
TLBEntry* entry = TLBTryMatch(regs, vaddr, match);
|
||||||
if(!entry) {
|
if(!entry) {
|
||||||
regs.cop0.tlbError = MISS;
|
regs.cop0.tlbError = MISS;
|
||||||
|
|||||||
@@ -267,8 +267,8 @@ private:
|
|||||||
struct Registers;
|
struct Registers;
|
||||||
enum class ExceptionCode : u8;
|
enum class ExceptionCode : u8;
|
||||||
|
|
||||||
TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match);
|
TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match);
|
||||||
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);
|
||||||
void HandleTLBException(Registers& regs, u64 vaddr);
|
void HandleTLBException(Registers& regs, u64 vaddr);
|
||||||
ExceptionCode GetTLBExceptionCode(TLBError error, TLBAccessType access_type);
|
ExceptionCode GetTLBExceptionCode(TLBError error, TLBAccessType access_type);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user