mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 05:09:34 -06:00
Clean up usage of PowerPCState::Exceptions.
Accessing any member of ppcState from a thread other than the CPU thread is not allowed; don't pretend that there's any exception to that rule.
This commit is contained in:
@ -2,7 +2,6 @@
|
||||
// Licensed under GPLv2
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include "Common/Atomic.h"
|
||||
#include "Common/ChunkFile.h"
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/FPURoundMode.h"
|
||||
@ -311,7 +310,6 @@ void UpdatePerformanceMonitor(u32 cycles, u32 num_load_stores, u32 num_fp_inst)
|
||||
|
||||
void CheckExceptions()
|
||||
{
|
||||
// Read volatile data once
|
||||
u32 exceptions = ppcState.Exceptions;
|
||||
|
||||
// Example procedure:
|
||||
@ -341,7 +339,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000400;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_ISI");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_ISI);
|
||||
ppcState.Exceptions &= ~EXCEPTION_ISI;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_PROGRAM)
|
||||
{
|
||||
@ -353,7 +351,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000700;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_PROGRAM");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_PROGRAM);
|
||||
ppcState.Exceptions &= ~EXCEPTION_PROGRAM;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_SYSCALL)
|
||||
{
|
||||
@ -364,7 +362,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000C00;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_SYSCALL (PC=%08x)", PC);
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_SYSCALL);
|
||||
ppcState.Exceptions &= ~EXCEPTION_SYSCALL;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_FPU_UNAVAILABLE)
|
||||
{
|
||||
@ -376,7 +374,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000800;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_FPU_UNAVAILABLE");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_FPU_UNAVAILABLE);
|
||||
ppcState.Exceptions &= ~EXCEPTION_FPU_UNAVAILABLE;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_DSI)
|
||||
{
|
||||
@ -388,7 +386,7 @@ void CheckExceptions()
|
||||
//DSISR and DAR regs are changed in GenerateDSIException()
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_DSI");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_DSI);
|
||||
ppcState.Exceptions &= ~EXCEPTION_DSI;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_ALIGNMENT)
|
||||
{
|
||||
@ -403,7 +401,7 @@ void CheckExceptions()
|
||||
//TODO crazy amount of DSISR options to check out
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_ALIGNMENT");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_ALIGNMENT);
|
||||
ppcState.Exceptions &= ~EXCEPTION_ALIGNMENT;
|
||||
}
|
||||
|
||||
// EXTERNAL INTERRUPT
|
||||
@ -419,7 +417,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000500;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_EXTERNAL_INT");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_EXTERNAL_INT);
|
||||
ppcState.Exceptions &= ~EXCEPTION_EXTERNAL_INT;
|
||||
|
||||
_dbg_assert_msg_(POWERPC, (SRR1 & 0x02) != 0, "EXTERNAL_INT unrecoverable???");
|
||||
}
|
||||
@ -432,7 +430,7 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000F00;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_PERFORMANCE_MONITOR");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_PERFORMANCE_MONITOR);
|
||||
ppcState.Exceptions &= ~EXCEPTION_PERFORMANCE_MONITOR;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_DECREMENTER)
|
||||
{
|
||||
@ -443,14 +441,13 @@ void CheckExceptions()
|
||||
PC = NPC = 0x00000900;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_DECREMENTER");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_DECREMENTER);
|
||||
ppcState.Exceptions &= ~EXCEPTION_DECREMENTER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CheckExternalExceptions()
|
||||
{
|
||||
// Read volatile data once
|
||||
u32 exceptions = ppcState.Exceptions;
|
||||
|
||||
// EXTERNAL INTERRUPT
|
||||
@ -466,7 +463,7 @@ void CheckExternalExceptions()
|
||||
PC = NPC = 0x00000500;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_EXTERNAL_INT");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_EXTERNAL_INT);
|
||||
ppcState.Exceptions &= ~EXCEPTION_EXTERNAL_INT;
|
||||
|
||||
_dbg_assert_msg_(POWERPC, (SRR1 & 0x02) != 0, "EXTERNAL_INT unrecoverable???");
|
||||
}
|
||||
@ -479,7 +476,7 @@ void CheckExternalExceptions()
|
||||
PC = NPC = 0x00000F00;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_PERFORMANCE_MONITOR");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_PERFORMANCE_MONITOR);
|
||||
ppcState.Exceptions &= ~EXCEPTION_PERFORMANCE_MONITOR;
|
||||
}
|
||||
else if (exceptions & EXCEPTION_DECREMENTER)
|
||||
{
|
||||
@ -490,7 +487,7 @@ void CheckExternalExceptions()
|
||||
PC = NPC = 0x00000900;
|
||||
|
||||
INFO_LOG(POWERPC, "EXCEPTION_DECREMENTER");
|
||||
Common::AtomicAnd(ppcState.Exceptions, ~EXCEPTION_DECREMENTER);
|
||||
ppcState.Exceptions &= ~EXCEPTION_DECREMENTER;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Reference in New Issue
Block a user