Interrupt handling changed

This commit is contained in:
Nekotekina 2014-08-21 05:02:55 +04:00
parent 126b636edf
commit 1941f3d916
2 changed files with 10 additions and 14 deletions

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "PPCThread.h" #include "PPUThread.h"
#include "Emu/Event.h" #include "Emu/Event.h"
#include "Emu/SysCalls/lv2/sys_spu.h" #include "Emu/SysCalls/lv2/sys_spu.h"
#include "Emu/SysCalls/lv2/sys_event_flag.h" #include "Emu/SysCalls/lv2/sys_event_flag.h"
@ -889,7 +889,8 @@ public:
if (*(u64*)&Memory[reservation.addr + i * 8] != reservation.data[i]) if (*(u64*)&Memory[reservation.addr + i * 8] != reservation.data[i])
{ {
m_events |= SPU_EVENT_LR; m_events |= SPU_EVENT_LR;
reservation.clear(); //reservation.clear(); // ???
break;
} }
} }
} }
@ -942,25 +943,20 @@ public:
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
if (Emu.IsStopped()) if (Emu.IsStopped())
{ {
LOG_WARNING(Log::SPU, "%s(%s) aborted (I)", __FUNCTION__, spu_ch_name[ch]); LOG_WARNING(Log::SPU, "%s(%s) aborted", __FUNCTION__, spu_ch_name[ch]);
return; return;
} }
} }
m_intrtag[2].stat |= 1; m_intrtag[2].stat |= 1;
if (CPUThread* t = Emu.GetCPU().GetThread(m_intrtag[2].thread)) if (CPUThread* t = Emu.GetCPU().GetThread(m_intrtag[2].thread))
{ {
while (t->IsAlive()) // TODO: ??? if (t->GetType() == CPU_THREAD_PPU && !t->IsAlive())
{ {
std::this_thread::sleep_for(std::chrono::milliseconds(1)); PPUThread& ppu = *(PPUThread*)t;
if (Emu.IsStopped()) ppu.FastStop();
{ ppu.Run();
LOG_WARNING(Log::SPU, "%s(%s) aborted (II)", __FUNCTION__, spu_ch_name[ch]); ppu.FastCall(ppu.PC, ppu.GPR[2], ppu.m_interrupt_arg);
return;
}
} }
t->SetArg(0, t->m_interrupt_arg);
t->Run();
t->Exec();
} }
} }
else else

View file

@ -100,6 +100,6 @@ void sys_interrupt_thread_eoi()
{ {
sc_int.Log("sys_interrupt_thread_eoi()"); sc_int.Log("sys_interrupt_thread_eoi()");
GetCurrentPPUThread().Stop(); GetCurrentPPUThread().FastStop();
return; return;
} }