From de0ed1a5fba7790212102f2920ea2a06b64c773f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 1 Apr 2018 23:22:28 -0400 Subject: [PATCH] Interpreter_LoadStore: Update the DAR if a DSI exception occurs in eciwx and ecowx Also once a DSI exception occurs, execution is supposed to leave the instruction immediately. It doesn't finish execution. --- .../PowerPC/Interpreter/Interpreter_LoadStore.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp b/Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp index d090142287..85aac4f524 100644 --- a/Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp +++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp @@ -24,6 +24,12 @@ void GenerateAlignmentException(u32 address) PowerPC::ppcState.Exceptions |= EXCEPTION_ALIGNMENT; PowerPC::ppcState.spr[SPR_DAR] = address; } + +void GenerateDSIException(u32 address) +{ + PowerPC::ppcState.Exceptions |= EXCEPTION_DSI; + PowerPC::ppcState.spr[SPR_DAR] = address; +} } u32 Interpreter::Helper_Get_EA(const UGeckoInstruction inst) @@ -431,7 +437,8 @@ void Interpreter::eciwx(UGeckoInstruction inst) if (!(PowerPC::ppcState.spr[SPR_EAR] & 0x80000000)) { - PowerPC::ppcState.Exceptions |= EXCEPTION_DSI; + GenerateDSIException(EA); + return; } if (EA & 3) @@ -449,7 +456,8 @@ void Interpreter::ecowx(UGeckoInstruction inst) if (!(PowerPC::ppcState.spr[SPR_EAR] & 0x80000000)) { - PowerPC::ppcState.Exceptions |= EXCEPTION_DSI; + GenerateDSIException(EA); + return; } if (EA & 3)