Update CPStatus before processing the FIFO events and force an exception check on interrupts.
Added more information into the FIFO unknown opcode error message.
This commit is contained in:
parent
b2c02e216c
commit
3d448e49c6
|
@ -304,6 +304,9 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
|
|
||||||
void GatherPipeBursted()
|
void GatherPipeBursted()
|
||||||
{
|
{
|
||||||
|
if (IsOnThread())
|
||||||
|
SetCPStatusFromCPU();
|
||||||
|
|
||||||
ProcessFifoEvents();
|
ProcessFifoEvents();
|
||||||
// if we aren't linked, we don't care about gather pipe data
|
// if we aren't linked, we don't care about gather pipe data
|
||||||
if (!m_CPCtrlReg.GPLinkEnable)
|
if (!m_CPCtrlReg.GPLinkEnable)
|
||||||
|
@ -326,9 +329,6 @@ void GatherPipeBursted()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsOnThread())
|
|
||||||
SetCPStatusFromCPU();
|
|
||||||
|
|
||||||
// update the fifo pointer
|
// update the fifo pointer
|
||||||
if (fifo.CPWritePointer >= fifo.CPEnd)
|
if (fifo.CPWritePointer >= fifo.CPEnd)
|
||||||
fifo.CPWritePointer = fifo.CPBase;
|
fifo.CPWritePointer = fifo.CPBase;
|
||||||
|
@ -369,6 +369,7 @@ void UpdateInterrupts(u64 userdata)
|
||||||
INFO_LOG(COMMANDPROCESSOR,"Interrupt cleared");
|
INFO_LOG(COMMANDPROCESSOR,"Interrupt cleared");
|
||||||
ProcessorInterface::SetInterrupt(INT_CAUSE_CP, false);
|
ProcessorInterface::SetInterrupt(INT_CAUSE_CP, false);
|
||||||
}
|
}
|
||||||
|
CoreTiming::ForceExceptionCheck(0);
|
||||||
interruptWaiting = false;
|
interruptWaiting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,6 +405,7 @@ void SetCPStatusFromGPU()
|
||||||
INFO_LOG(COMMANDPROCESSOR, "Cleared breakpoint at %i", fifo.CPReadPointer);
|
INFO_LOG(COMMANDPROCESSOR, "Cleared breakpoint at %i", fifo.CPReadPointer);
|
||||||
fifo.bFF_Breakpoint = false;
|
fifo.bFF_Breakpoint = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// overflow & underflow check
|
// overflow & underflow check
|
||||||
fifo.bFF_HiWatermark = (fifo.CPReadWriteDistance > fifo.CPHiWatermark);
|
fifo.bFF_HiWatermark = (fifo.CPReadWriteDistance > fifo.CPHiWatermark);
|
||||||
fifo.bFF_LoWatermark = (fifo.CPReadWriteDistance < fifo.CPLoWatermark);
|
fifo.bFF_LoWatermark = (fifo.CPReadWriteDistance < fifo.CPLoWatermark);
|
||||||
|
@ -447,7 +449,7 @@ void SetCPStatusFromCPU()
|
||||||
|
|
||||||
if (interrupt != interruptSet && !interruptWaiting)
|
if (interrupt != interruptSet && !interruptWaiting)
|
||||||
{
|
{
|
||||||
u64 userdata = interrupt?1:0;
|
u64 userdata = interrupt ? 1 : 0;
|
||||||
if (IsOnThread())
|
if (IsOnThread())
|
||||||
{
|
{
|
||||||
if (!interrupt || bpInt || undfInt || ovfInt)
|
if (!interrupt || bpInt || undfInt || ovfInt)
|
||||||
|
|
|
@ -118,10 +118,19 @@ static void UnknownOpcode(u8 cmd_byte, void *buffer, bool preprocess)
|
||||||
"bFF_BPEnable: %s\n"
|
"bFF_BPEnable: %s\n"
|
||||||
"bFF_BPInt: %s\n"
|
"bFF_BPInt: %s\n"
|
||||||
"bFF_Breakpoint: %s\n"
|
"bFF_Breakpoint: %s\n"
|
||||||
|
"bFF_GPLinkEnable: %s\n"
|
||||||
|
"bFF_HiWatermarkInt: %s\n"
|
||||||
|
"bFF_LoWatermarkInt: %s\n"
|
||||||
,cmd_byte, fifo.CPBase, fifo.CPEnd, fifo.CPHiWatermark, fifo.CPLoWatermark, fifo.CPReadWriteDistance
|
,cmd_byte, fifo.CPBase, fifo.CPEnd, fifo.CPHiWatermark, fifo.CPLoWatermark, fifo.CPReadWriteDistance
|
||||||
,fifo.CPWritePointer, fifo.CPReadPointer, fifo.CPBreakpoint, fifo.bFF_GPReadEnable ? "true" : "false"
|
,fifo.CPWritePointer, fifo.CPReadPointer, fifo.CPBreakpoint
|
||||||
,fifo.bFF_BPEnable ? "true" : "false" ,fifo.bFF_BPInt ? "true" : "false"
|
,fifo.bFF_GPReadEnable ? "true" : "false"
|
||||||
,fifo.bFF_Breakpoint ? "true" : "false");
|
,fifo.bFF_BPEnable ? "true" : "false"
|
||||||
|
,fifo.bFF_BPInt ? "true" : "false"
|
||||||
|
,fifo.bFF_Breakpoint ? "true" : "false"
|
||||||
|
,fifo.bFF_GPLinkEnable ? "true" : "false"
|
||||||
|
,fifo.bFF_HiWatermarkInt ? "true" : "false"
|
||||||
|
,fifo.bFF_LoWatermarkInt ? "true" : "false"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue