mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00: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));
|
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)
|
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
|
// Wait for cleanup
|
||||||
(*thread.ptr)();
|
(*thread.ptr)();
|
||||||
|
|
||||||
// Get the exit status from the register
|
if (ppu.test_stopped())
|
||||||
if (vptr)
|
|
||||||
{
|
{
|
||||||
if (ppu.test_stopped())
|
return 0;
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
*vptr = thread->gpr[3];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
idm::remove<named_thread<ppu_thread>>(thread->id);
|
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;
|
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;
|
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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user