mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-14 10:48:36 +12:00
sys_spu: add vm::temporary_unlock
This commit is contained in:
parent
1a1eff66bc
commit
cfa1416d64
4 changed files with 189 additions and 103 deletions
|
@ -19,7 +19,7 @@
|
|||
|
||||
LOG_CHANNEL(cellSpurs);
|
||||
|
||||
error_code sys_spu_image_close(vm::ptr<sys_spu_image> img);
|
||||
error_code sys_spu_image_close(ppu_thread&, vm::ptr<sys_spu_image> img);
|
||||
|
||||
// TODO
|
||||
struct cell_error_t
|
||||
|
@ -125,7 +125,7 @@ namespace _spurs
|
|||
//s32 cellSpursDetachLv2EventQueue(vm::ptr<CellSpurs> spurs, u8 port);
|
||||
|
||||
// Enable the SPU exception event handler
|
||||
s32 cellSpursEnableExceptionEventHandler(vm::ptr<CellSpurs> spurs, b8 flag);
|
||||
s32 cellSpursEnableExceptionEventHandler(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, b8 flag);
|
||||
|
||||
//s32 cellSpursSetGlobalExceptionEventHandler(vm::ptr<CellSpurs> spurs, vm::ptr<CellSpursGlobalExceptionEventHandler> eaHandler, vm::ptr<void> arg);
|
||||
//s32 cellSpursUnsetGlobalExceptionEventHandler(vm::ptr<CellSpurs> spurs);
|
||||
|
@ -427,7 +427,7 @@ s32 _spurs::attach_lv2_eq(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, u32 queue,
|
|||
portMask |= 1ull << (i);
|
||||
}
|
||||
|
||||
if (s32 res = sys_spu_thread_group_connect_event_all_threads(spurs->spuTG, queue, portMask, port))
|
||||
if (s32 res = sys_spu_thread_group_connect_event_all_threads(ppu, spurs->spuTG, queue, portMask, port))
|
||||
{
|
||||
if (res == CELL_EISCONN)
|
||||
{
|
||||
|
@ -849,7 +849,7 @@ s32 _spurs::finalize_spu(ppu_thread& ppu, vm::ptr<CellSpurs> spurs)
|
|||
{
|
||||
CHECK_SUCCESS(sys_spu_thread_group_join(ppu, spurs->spuTG, vm::null, vm::null));
|
||||
|
||||
if (s32 rc = sys_spu_thread_group_destroy(spurs->spuTG))
|
||||
if (s32 rc = sys_spu_thread_group_destroy(ppu, spurs->spuTG))
|
||||
{
|
||||
if (rc == CELL_EBUSY)
|
||||
{
|
||||
|
@ -864,13 +864,13 @@ s32 _spurs::finalize_spu(ppu_thread& ppu, vm::ptr<CellSpurs> spurs)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (s32 rc = sys_spu_thread_group_destroy(spurs->spuTG))
|
||||
if (s32 rc = sys_spu_thread_group_destroy(ppu, spurs->spuTG))
|
||||
{
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
CHECK_SUCCESS(sys_spu_image_close(spurs.ptr(&CellSpurs::spuImg)));
|
||||
CHECK_SUCCESS(sys_spu_image_close(ppu, spurs.ptr(&CellSpurs::spuImg)));
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
|
@ -1090,9 +1090,9 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, u32 revision,
|
|||
if (flags & SAF_UNKNOWN_FLAG_9) spuTgAttr->type |= 0x0800;
|
||||
if (flags & SAF_SYSTEM_WORKLOAD_ENABLED) spuTgAttr->type |= SYS_SPU_THREAD_GROUP_TYPE_COOPERATE_WITH_SYSTEM;
|
||||
|
||||
if (s32 rc = sys_spu_thread_group_create(spurs.ptr(&CellSpurs::spuTG), nSpus, spuPriority, spuTgAttr))
|
||||
if (s32 rc = sys_spu_thread_group_create(ppu, spurs.ptr(&CellSpurs::spuTG), nSpus, spuPriority, spuTgAttr))
|
||||
{
|
||||
sys_spu_image_close(spurs.ptr(&CellSpurs::spuImg));
|
||||
sys_spu_image_close(ppu, spurs.ptr(&CellSpurs::spuImg));
|
||||
return rollback(), rc;
|
||||
}
|
||||
|
||||
|
@ -1112,10 +1112,10 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, u32 revision,
|
|||
spuThArgs->arg1 = (u64)num << 32;
|
||||
spuThArgs->arg2 = (u64)spurs.addr();
|
||||
|
||||
if (s32 rc = sys_spu_thread_initialize(spurs.ptr(&CellSpurs::spus, num), spurs->spuTG, num, spurs.ptr(&CellSpurs::spuImg), spuThAttr, spuThArgs))
|
||||
if (s32 rc = sys_spu_thread_initialize(ppu, spurs.ptr(&CellSpurs::spus, num), spurs->spuTG, num, spurs.ptr(&CellSpurs::spuImg), spuThAttr, spuThArgs))
|
||||
{
|
||||
sys_spu_thread_group_destroy(spurs->spuTG);
|
||||
sys_spu_image_close(spurs.ptr(&CellSpurs::spuImg));
|
||||
sys_spu_thread_group_destroy(ppu, spurs->spuTG);
|
||||
sys_spu_image_close(ppu, spurs.ptr(&CellSpurs::spuImg));
|
||||
return rollback(), rc;
|
||||
}
|
||||
|
||||
|
@ -1184,7 +1184,7 @@ s32 _spurs::initialize(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, u32 revision,
|
|||
}
|
||||
|
||||
// Enable SPURS exception handler
|
||||
if (s32 rc = cellSpursEnableExceptionEventHandler(spurs, true /*enable*/))
|
||||
if (s32 rc = cellSpursEnableExceptionEventHandler(ppu, spurs, true /*enable*/))
|
||||
{
|
||||
_spurs::signal_to_handler_thread(ppu, spurs);
|
||||
_spurs::join_handler_thread(ppu, spurs);
|
||||
|
@ -1717,7 +1717,7 @@ s32 cellSpursDetachLv2EventQueue(vm::ptr<CellSpurs> spurs, u8 port)
|
|||
return _spurs::detach_lv2_eq(spurs, port, false);
|
||||
}
|
||||
|
||||
s32 cellSpursEnableExceptionEventHandler(vm::ptr<CellSpurs> spurs, b8 flag)
|
||||
s32 cellSpursEnableExceptionEventHandler(ppu_thread& ppu, vm::ptr<CellSpurs> spurs, b8 flag)
|
||||
{
|
||||
cellSpurs.warning("cellSpursEnableExceptionEventHandler(spurs=*0x%x, flag=%d)", spurs, flag);
|
||||
|
||||
|
@ -1737,14 +1737,14 @@ s32 cellSpursEnableExceptionEventHandler(vm::ptr<CellSpurs> spurs, b8 flag)
|
|||
{
|
||||
if (oldEnableEH == 0)
|
||||
{
|
||||
rc = sys_spu_thread_group_connect_event(spurs->spuTG, spurs->eventQueue, SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION);
|
||||
rc = sys_spu_thread_group_connect_event(ppu, spurs->spuTG, spurs->eventQueue, SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oldEnableEH == 1)
|
||||
{
|
||||
rc = sys_spu_thread_group_disconnect_event(spurs->eventQueue, SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION);
|
||||
rc = sys_spu_thread_group_disconnect_event(ppu, spurs->eventQueue, SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue