move MapVAddr to Cop0.hpp and no template necessary
This commit is contained in:
@@ -65,26 +65,6 @@ CartInfo Mem::LoadROM(const std::string& filename) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool tlb>
|
|
||||||
bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr) {
|
|
||||||
paddr = vaddr & 0x1FFFFFFF;
|
|
||||||
if constexpr(!tlb) return true;
|
|
||||||
|
|
||||||
switch(u32(vaddr) >> 29) {
|
|
||||||
case 0 ... 3: case 7:
|
|
||||||
return ProbeTLB(regs, accessType, vaddr, paddr, nullptr);
|
|
||||||
case 4 ... 5: return true;
|
|
||||||
case 6: Util::panic("Unimplemented virtual mapping in KSSEG! ({:08X})\n", vaddr);
|
|
||||||
default:
|
|
||||||
Util::panic("Should never end up in default case in map_vaddr! ({:08X})\n", vaddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
template bool MapVAddr<true>(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
|
|
||||||
template bool MapVAddr<false>(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
|
|
||||||
|
|
||||||
u8 Mem::Read8(n64::Registers ®s, u32 paddr) {
|
u8 Mem::Read8(n64::Registers ®s, u32 paddr) {
|
||||||
const auto page = paddr >> 12;
|
const auto page = paddr >> 12;
|
||||||
const auto offset = paddr & 0xFFF;
|
const auto offset = paddr & 0xFFF;
|
||||||
|
|||||||
@@ -127,7 +127,4 @@ private:
|
|||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <bool tlb = true>
|
|
||||||
bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <common.hpp>
|
#include <common.hpp>
|
||||||
|
#include "log.hpp"
|
||||||
|
|
||||||
namespace n64 {
|
namespace n64 {
|
||||||
#define STATUS_MASK 0xFF57FFFF
|
#define STATUS_MASK 0xFF57FFFF
|
||||||
@@ -272,8 +273,24 @@ enum TLBAccessType {
|
|||||||
LOAD, STORE
|
LOAD, STORE
|
||||||
};
|
};
|
||||||
|
|
||||||
TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match);
|
|
||||||
bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match);
|
bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match);
|
||||||
|
|
||||||
|
static inline bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr) {
|
||||||
|
switch(u32(vaddr) >> 29) {
|
||||||
|
case 0 ... 3: case 7:
|
||||||
|
return ProbeTLB(regs, accessType, vaddr, paddr, nullptr);
|
||||||
|
case 4 ... 5:
|
||||||
|
paddr = vaddr & 0x1FFFFFFF;
|
||||||
|
return true;
|
||||||
|
case 6: Util::panic("Unimplemented virtual mapping in KSSEG! ({:08X})\n", vaddr);
|
||||||
|
default:
|
||||||
|
Util::panic("Should never end up in default case in map_vaddr! ({:08X})\n", vaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, 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