1
0
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:
eladash 2019-02-09 18:58:54 +02:00 committed by Ivan
parent 0861226271
commit 84d42ecb65
3 changed files with 18 additions and 13 deletions

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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;
}