mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-26 04:32:35 +01:00
Add EFAULT checks to spu_thread_group_join, ppu_thread_join
Order of checks is based on firmware
This commit is contained in:
parent
0861226271
commit
84d42ecb65
@ -574,7 +574,7 @@ void _spurs::handler_entry(ppu_thread& ppu, vm::ptr<CellSpurs> spurs)
|
||||
|
||||
CHECK_SUCCESS(sys_spu_thread_group_start(ppu, spurs->spuTG));
|
||||
|
||||
if (s32 rc = sys_spu_thread_group_join(ppu, spurs->spuTG, vm::null, vm::null))
|
||||
if (s32 rc = sys_spu_thread_group_join(ppu, spurs->spuTG, vm::var<u32>{}, vm::var<u32>{}))
|
||||
{
|
||||
if (rc == CELL_ESTAT)
|
||||
{
|
||||
|
@ -120,19 +120,21 @@ error_code sys_ppu_thread_join(ppu_thread& ppu, u32 thread_id, vm::ptr<u64> vptr
|
||||
// Wait for cleanup
|
||||
(*thread.ptr)();
|
||||
|
||||
// Get the exit status from the register
|
||||
if (vptr)
|
||||
if (ppu.test_stopped())
|
||||
{
|
||||
if (ppu.test_stopped())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
*vptr = thread->gpr[3];
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
idm::remove<named_thread<ppu_thread>>(thread->id);
|
||||
|
||||
if (!vptr)
|
||||
{
|
||||
return CELL_EFAULT;
|
||||
}
|
||||
|
||||
// Get the exit status from the register
|
||||
*vptr = thread->gpr[3];
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
|
@ -683,16 +683,19 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cause)
|
||||
if (!cause)
|
||||
{
|
||||
*cause = static_cast<u32>(ppu.gpr[4]);
|
||||
return CELL_EFAULT;
|
||||
}
|
||||
|
||||
if (status)
|
||||
*cause = static_cast<u32>(ppu.gpr[4]);
|
||||
|
||||
if (!status)
|
||||
{
|
||||
*status = static_cast<s32>(ppu.gpr[5]);
|
||||
return CELL_EFAULT;
|
||||
}
|
||||
|
||||
*status = static_cast<s32>(ppu.gpr[5]);
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user