diff --git a/Source/Project64-core/N64System/Mips/Register.cpp b/Source/Project64-core/N64System/Mips/Register.cpp index a9d6cfdce..bfe70b73e 100644 --- a/Source/Project64-core/N64System/Mips/Register.cpp +++ b/Source/Project64-core/N64System/Mips/Register.cpp @@ -748,8 +748,7 @@ void CRegisters::DoAddressError(uint64_t BadVaddr, bool FromRead) g_Notify->BreakPoint(__FILE__, __LINE__); } - AddressException(BadVaddr); - TriggerException(FromRead ? EXC_RADE : EXC_WADE); + TriggerAddressException(BadVaddr, FromRead ? EXC_RADE : EXC_WADE); } void CRegisters::FixFpuLocations() @@ -784,17 +783,15 @@ bool CRegisters::DoIntrException() void CRegisters::DoTLBReadMiss(uint64_t BadVaddr) { - AddressException(BadVaddr); - TriggerException(EXC_RMISS, 0, !m_TLB.AddressDefined(BadVaddr)); + TriggerAddressException(BadVaddr, EXC_RMISS, !m_TLB.AddressDefined(BadVaddr)); } void CRegisters::DoTLBWriteMiss(uint64_t BadVaddr) { - AddressException(BadVaddr); - TriggerException(EXC_WMISS, 0, !m_TLB.AddressDefined(BadVaddr)); + TriggerAddressException(BadVaddr, EXC_WMISS, !m_TLB.AddressDefined(BadVaddr)); } -void CRegisters::AddressException(uint64_t Address) +void CRegisters::TriggerAddressException(uint64_t Address, uint32_t ExceptionCode, bool SpecialOffset) { BAD_VADDR_REGISTER = Address; ENTRYHI_REGISTER.VPN2 = Address >> 13; @@ -802,9 +799,27 @@ void CRegisters::AddressException(uint64_t Address) CONTEXT_REGISTER.BadVPN2 = Address >> 13; XCONTEXT_REGISTER.BadVPN2 = Address >> 13; XCONTEXT_REGISTER.R = Address >> 62; + + TriggerException(ExceptionCode, 0); + if (SpecialOffset && STATUS_REGISTER.ExceptionLevel == 0) + { + m_System.m_JumpToLocation = (m_System.m_JumpToLocation & 0xFFFF0000); + switch (STATUS_REGISTER.PrivilegeMode) + { + case PrivilegeMode_Kernel: + m_System.m_JumpToLocation |= STATUS_REGISTER.KernelExtendedAddressing == 0 ? 0x0000 : 0x0080; + break; + case PrivilegeMode_Supervisor: + m_System.m_JumpToLocation |= STATUS_REGISTER.SupervisorExtendedAddressing == 0 ? 0x0000 : 0x0080; + break; + case PrivilegeMode_User: + m_System.m_JumpToLocation |= STATUS_REGISTER.UserExtendedAddressing == 0 ? 0x0000 : 0x0080; + break; + } + } } -void CRegisters::TriggerException(uint32_t ExceptionCode, uint32_t Coprocessor, bool SpecialOffset) +void CRegisters::TriggerException(uint32_t ExceptionCode, uint32_t Coprocessor) { if (GenerateLog() && LogExceptions()) { @@ -818,29 +833,11 @@ void CRegisters::TriggerException(uint32_t ExceptionCode, uint32_t Coprocessor, } } - uint32_t ExceptionBase = 0x80000000; - uint16_t ExceptionOffset = 0x0180; - if (SpecialOffset && STATUS_REGISTER.ExceptionLevel == 0) - { - switch (STATUS_REGISTER.PrivilegeMode) - { - case PrivilegeMode_Kernel: - ExceptionOffset = STATUS_REGISTER.KernelExtendedAddressing == 0 ? 0x0000 : 0x0080; - break; - case PrivilegeMode_Supervisor: - ExceptionOffset = STATUS_REGISTER.SupervisorExtendedAddressing == 0 ? 0x0000 : 0x0080; - break; - case PrivilegeMode_User: - ExceptionOffset = STATUS_REGISTER.UserExtendedAddressing == 0 ? 0x0000 : 0x0080; - break; - } - } - CAUSE_REGISTER.ExceptionCode = ExceptionCode; CAUSE_REGISTER.CoprocessorUnitNumber = Coprocessor; CAUSE_REGISTER.BranchDelay = m_System.m_PipelineStage == PIPELINE_STAGE_JUMP; EPC_REGISTER = (int64_t)((int32_t)m_PROGRAM_COUNTER - (CAUSE_REGISTER.BranchDelay ? 4 : 0)); STATUS_REGISTER.ExceptionLevel = 1; m_System.m_PipelineStage = PIPELINE_STAGE_JUMP; - m_System.m_JumpToLocation = ExceptionBase | ExceptionOffset; + m_System.m_JumpToLocation = 0x80000180; } \ No newline at end of file diff --git a/Source/Project64-core/N64System/Mips/Register.h b/Source/Project64-core/N64System/Mips/Register.h index 99fcf8f64..0edf6a857 100644 --- a/Source/Project64-core/N64System/Mips/Register.h +++ b/Source/Project64-core/N64System/Mips/Register.h @@ -473,8 +473,8 @@ public: void FixFpuLocations(); void Reset(bool bPostPif, CMipsMemoryVM & MMU); void SetAsCurrentSystem(); - void AddressException(uint64_t Address); - void TriggerException(uint32_t ExceptionCode, uint32_t Coprocessor = 0, bool SpecialOffset = false); + void TriggerAddressException(uint64_t Address, uint32_t ExceptionCode, bool SpecialOffset = false); + void TriggerException(uint32_t ExceptionCode, uint32_t Coprocessor = 0); uint64_t Cop0_MF(COP0Reg Reg); void Cop0_MT(COP0Reg Reg, uint64_t Value); diff --git a/Source/Project64-core/N64System/N64System.cpp b/Source/Project64-core/N64System/N64System.cpp index 6aa55f5f1..83e9ed976 100644 --- a/Source/Project64-core/N64System/N64System.cpp +++ b/Source/Project64-core/N64System/N64System.cpp @@ -1539,9 +1539,8 @@ void CN64System::DumpSyncErrors(CN64System * SecondCPU) Error.Log("\r\n"); for (count = 0; count < 32; count++) { - Error.LogF("CP0[%s],%*s0x%08X, 0x%08X\r\n", CRegName::Cop0[count], - 12 - strlen(CRegName::Cop0[count]), "", - m_Reg.m_CP0[count], SecondCPU->m_Reg.m_CP0[count]); + Error.LogF("CP0[%s] %*s0x%08X%08X, 0x%08X%08X\r\n", CRegName::Cop0[count], 12 - strlen(CRegName::Cop0[count]), "", + (uint32_t)(m_Reg.m_CP0[count] >> 32), (uint32_t)m_Reg.m_CP0[count], (uint32_t)(SecondCPU->m_Reg.m_CP0[count] >> 32), (uint32_t)(SecondCPU->m_Reg.m_CP0[count])); } Error.Log("\r\n"); for (count = 0; count < 32; count++)