diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index e5a8caf2..88debe5c 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -65,26 +65,6 @@ CartInfo Mem::LoadROM(const std::string& filename) { return result; } -template -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(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); -template bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); - u8 Mem::Read8(n64::Registers ®s, u32 paddr) { const auto page = paddr >> 12; const auto offset = paddr & 0xFFF; diff --git a/src/backend/core/Mem.hpp b/src/backend/core/Mem.hpp index 5593d79e..a3a6a68d 100644 --- a/src/backend/core/Mem.hpp +++ b/src/backend/core/Mem.hpp @@ -127,7 +127,4 @@ private: // return false; } }; - -template -bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); } diff --git a/src/backend/core/registers/Cop0.hpp b/src/backend/core/registers/Cop0.hpp index d165bb8b..55ab0e0e 100644 --- a/src/backend/core/registers/Cop0.hpp +++ b/src/backend/core/registers/Cop0.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include "log.hpp" namespace n64 { #define STATUS_MASK 0xFF57FFFF @@ -272,8 +273,24 @@ enum TLBAccessType { LOAD, STORE }; -TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, 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); ExceptionCode GetTLBExceptionCode(TLBError error, TLBAccessType access_type); } \ No newline at end of file