SPU/PPU reservations: Optimizations for reservation locks and check_state() (non-TSX)

This commit is contained in:
Eladash 2020-06-05 12:36:28 +03:00 committed by Ani
parent e09c4b72c8
commit d9750e8f9f
20 changed files with 251 additions and 252 deletions

View File

@ -464,14 +464,8 @@ bool cpu_thread::check_state() noexcept
} }
bool cpu_sleep_called = false; bool cpu_sleep_called = false;
bool cpu_flag_memory = false;
bool escape, retval; bool escape, retval;
if (!(state & cpu_flag::wait))
{
state += cpu_flag::wait;
}
while (true) while (true)
{ {
// Process all flags in a single atomic op // Process all flags in a single atomic op
@ -490,20 +484,20 @@ bool cpu_thread::check_state() noexcept
if (!(flags & (cpu_flag::exit + cpu_flag::dbg_global_stop + cpu_flag::ret + cpu_flag::stop))) if (!(flags & (cpu_flag::exit + cpu_flag::dbg_global_stop + cpu_flag::ret + cpu_flag::stop)))
{ {
// Check pause flags which hold thread inside check_state // Check pause flags which hold thread inside check_state
if (flags & (cpu_flag::pause + cpu_flag::suspend + cpu_flag::dbg_global_pause + cpu_flag::dbg_pause)) if (flags & (cpu_flag::pause + cpu_flag::suspend + cpu_flag::dbg_global_pause + cpu_flag::dbg_pause + cpu_flag::memory))
{ {
if (!(flags & cpu_flag::wait))
{
flags += cpu_flag::wait;
store = true;
}
escape = false; escape = false;
return store; return store;
} }
if (flags & cpu_flag::memory) if (flags & cpu_flag::wait)
{ {
// wait flag will be cleared later (optimization)
cpu_flag_memory = true;
}
else
{
AUDIT(!cpu_flag_memory);
flags -= cpu_flag::wait; flags -= cpu_flag::wait;
store = true; store = true;
} }
@ -512,7 +506,12 @@ bool cpu_thread::check_state() noexcept
} }
else else
{ {
cpu_flag_memory = false; if (!(flags & cpu_flag::wait))
{
flags += cpu_flag::wait;
store = true;
}
retval = true; retval = true;
} }
@ -529,17 +528,6 @@ bool cpu_thread::check_state() noexcept
if (escape) if (escape)
{ {
if (cpu_flag_memory)
{
cpu_mem();
if (state & (cpu_flag::pause + cpu_flag::memory)) [[unlikely]]
{
state += cpu_flag::wait;
continue;
}
}
return retval; return retval;
} }
else if (!cpu_sleep_called && state0 & cpu_flag::suspend) else if (!cpu_sleep_called && state0 & cpu_flag::suspend)
@ -555,6 +543,12 @@ bool cpu_thread::check_state() noexcept
} }
else else
{ {
if (state0 == (cpu_flag::memory + cpu_flag::wait))
{
vm::passive_lock(*this);
continue;
}
// If only cpu_flag::pause was set, notification won't arrive // If only cpu_flag::pause was set, notification won't arrive
g_fxo->get<cpu_counter>()->cpu_suspend_lock.lock_unlock(); g_fxo->get<cpu_counter>()->cpu_suspend_lock.lock_unlock();
} }

View File

@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager<lv2_cond, u64>::g_ipc) {};
error_code sys_cond_create(ppu_thread& ppu, vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> attr) error_code sys_cond_create(ppu_thread& ppu, vm::ptr<u32> cond_id, u32 mutex_id, vm::ptr<sys_cond_attribute_t> attr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.warning("sys_cond_create(cond_id=*0x%x, mutex_id=0x%x, attr=*0x%x)", cond_id, mutex_id, attr); sys_cond.warning("sys_cond_create(cond_id=*0x%x, mutex_id=0x%x, attr=*0x%x)", cond_id, mutex_id, attr);
@ -46,7 +46,7 @@ error_code sys_cond_create(ppu_thread& ppu, vm::ptr<u32> cond_id, u32 mutex_id,
error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id) error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.warning("sys_cond_destroy(cond_id=0x%x)", cond_id); sys_cond.warning("sys_cond_destroy(cond_id=0x%x)", cond_id);
@ -78,7 +78,7 @@ error_code sys_cond_destroy(ppu_thread& ppu, u32 cond_id)
error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.trace("sys_cond_signal(cond_id=0x%x)", cond_id); sys_cond.trace("sys_cond_signal(cond_id=0x%x)", cond_id);
@ -111,7 +111,7 @@ error_code sys_cond_signal(ppu_thread& ppu, u32 cond_id)
error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id) error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.trace("sys_cond_signal_all(cond_id=0x%x)", cond_id); sys_cond.trace("sys_cond_signal_all(cond_id=0x%x)", cond_id);
@ -149,7 +149,7 @@ error_code sys_cond_signal_all(ppu_thread& ppu, u32 cond_id)
error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id) error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.trace("sys_cond_signal_to(cond_id=0x%x, thread_id=0x%x)", cond_id, thread_id); sys_cond.trace("sys_cond_signal_to(cond_id=0x%x, thread_id=0x%x)", cond_id, thread_id);
@ -201,7 +201,7 @@ error_code sys_cond_signal_to(ppu_thread& ppu, u32 cond_id, u32 thread_id)
error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout) error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_cond.trace("sys_cond_wait(cond_id=0x%x, timeout=%lld)", cond_id, timeout); sys_cond.trace("sys_cond_wait(cond_id=0x%x, timeout=%lld)", cond_id, timeout);

View File

@ -161,7 +161,7 @@ error_code sys_event_queue_create(vm::ptr<u32> equeue_id, vm::ptr<sys_event_queu
error_code sys_event_queue_destroy(ppu_thread& ppu, u32 equeue_id, s32 mode) error_code sys_event_queue_destroy(ppu_thread& ppu, u32 equeue_id, s32 mode)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.warning("sys_event_queue_destroy(equeue_id=0x%x, mode=%d)", equeue_id, mode); sys_event.warning("sys_event_queue_destroy(equeue_id=0x%x, mode=%d)", equeue_id, mode);
@ -226,7 +226,7 @@ error_code sys_event_queue_destroy(ppu_thread& ppu, u32 equeue_id, s32 mode)
error_code sys_event_queue_tryreceive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_event_t> event_array, s32 size, vm::ptr<u32> number) error_code sys_event_queue_tryreceive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_event_t> event_array, s32 size, vm::ptr<u32> number)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.trace("sys_event_queue_tryreceive(equeue_id=0x%x, event_array=*0x%x, size=%d, number=*0x%x)", equeue_id, event_array, size, number); sys_event.trace("sys_event_queue_tryreceive(equeue_id=0x%x, event_array=*0x%x, size=%d, number=*0x%x)", equeue_id, event_array, size, number);
@ -262,7 +262,7 @@ error_code sys_event_queue_tryreceive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sy
error_code sys_event_queue_receive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_event_t> dummy_event, u64 timeout) error_code sys_event_queue_receive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_event_t> dummy_event, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.trace("sys_event_queue_receive(equeue_id=0x%x, *0x%x, timeout=0x%llx)", equeue_id, dummy_event, timeout); sys_event.trace("sys_event_queue_receive(equeue_id=0x%x, *0x%x, timeout=0x%llx)", equeue_id, dummy_event, timeout);
@ -346,7 +346,7 @@ error_code sys_event_queue_receive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_e
error_code sys_event_queue_drain(ppu_thread& ppu, u32 equeue_id) error_code sys_event_queue_drain(ppu_thread& ppu, u32 equeue_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.trace("sys_event_queue_drain(equeue_id=0x%x)", equeue_id); sys_event.trace("sys_event_queue_drain(equeue_id=0x%x)", equeue_id);
@ -388,7 +388,7 @@ error_code sys_event_port_create(vm::ptr<u32> eport_id, s32 port_type, u64 name)
error_code sys_event_port_destroy(ppu_thread& ppu, u32 eport_id) error_code sys_event_port_destroy(ppu_thread& ppu, u32 eport_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.warning("sys_event_port_destroy(eport_id=0x%x)", eport_id); sys_event.warning("sys_event_port_destroy(eport_id=0x%x)", eport_id);
@ -447,7 +447,7 @@ error_code sys_event_port_connect_local(u32 eport_id, u32 equeue_id)
error_code sys_event_port_connect_ipc(ppu_thread& ppu, u32 eport_id, u64 ipc_key) error_code sys_event_port_connect_ipc(ppu_thread& ppu, u32 eport_id, u64 ipc_key)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.warning("sys_event_port_connect_ipc(eport_id=0x%x, ipc_key=0x%x)", eport_id, ipc_key); sys_event.warning("sys_event_port_connect_ipc(eport_id=0x%x, ipc_key=0x%x)", eport_id, ipc_key);
@ -484,7 +484,7 @@ error_code sys_event_port_connect_ipc(ppu_thread& ppu, u32 eport_id, u64 ipc_key
error_code sys_event_port_disconnect(ppu_thread& ppu, u32 eport_id) error_code sys_event_port_disconnect(ppu_thread& ppu, u32 eport_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event.warning("sys_event_port_disconnect(eport_id=0x%x)", eport_id); sys_event.warning("sys_event_port_disconnect(eport_id=0x%x)", eport_id);

View File

@ -15,7 +15,7 @@ template<> DECLARE(ipc_manager<lv2_event_flag, u64>::g_ipc) {};
error_code sys_event_flag_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<sys_event_flag_attribute_t> attr, u64 init) error_code sys_event_flag_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<sys_event_flag_attribute_t> attr, u64 init)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.warning("sys_event_flag_create(id=*0x%x, attr=*0x%x, init=0x%llx)", id, attr, init); sys_event_flag.warning("sys_event_flag_create(id=*0x%x, attr=*0x%x, init=0x%llx)", id, attr, init);
@ -63,7 +63,7 @@ error_code sys_event_flag_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<sys_e
error_code sys_event_flag_destroy(ppu_thread& ppu, u32 id) error_code sys_event_flag_destroy(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.warning("sys_event_flag_destroy(id=0x%x)", id); sys_event_flag.warning("sys_event_flag_destroy(id=0x%x)", id);
@ -92,7 +92,7 @@ error_code sys_event_flag_destroy(ppu_thread& ppu, u32 id)
error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm::ptr<u64> result, u64 timeout) error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm::ptr<u64> result, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.trace("sys_event_flag_wait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x, timeout=0x%llx)", id, bitptn, mode, result, timeout); sys_event_flag.trace("sys_event_flag_wait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x, timeout=0x%llx)", id, bitptn, mode, result, timeout);
@ -208,7 +208,7 @@ error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm
error_code sys_event_flag_trywait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm::ptr<u64> result) error_code sys_event_flag_trywait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm::ptr<u64> result)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.trace("sys_event_flag_trywait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x)", id, bitptn, mode, result); sys_event_flag.trace("sys_event_flag_trywait(id=0x%x, bitptn=0x%llx, mode=0x%x, result=*0x%x)", id, bitptn, mode, result);
@ -335,7 +335,7 @@ error_code sys_event_flag_set(u32 id, u64 bitptn)
error_code sys_event_flag_clear(ppu_thread& ppu, u32 id, u64 bitptn) error_code sys_event_flag_clear(ppu_thread& ppu, u32 id, u64 bitptn)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.trace("sys_event_flag_clear(id=0x%x, bitptn=0x%llx)", id, bitptn); sys_event_flag.trace("sys_event_flag_clear(id=0x%x, bitptn=0x%llx)", id, bitptn);
@ -354,7 +354,7 @@ error_code sys_event_flag_clear(ppu_thread& ppu, u32 id, u64 bitptn)
error_code sys_event_flag_cancel(ppu_thread& ppu, u32 id, vm::ptr<u32> num) error_code sys_event_flag_cancel(ppu_thread& ppu, u32 id, vm::ptr<u32> num)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.trace("sys_event_flag_cancel(id=0x%x, num=*0x%x)", id, num); sys_event_flag.trace("sys_event_flag_cancel(id=0x%x, num=*0x%x)", id, num);
@ -406,7 +406,7 @@ error_code sys_event_flag_cancel(ppu_thread& ppu, u32 id, vm::ptr<u32> num)
error_code sys_event_flag_get(ppu_thread& ppu, u32 id, vm::ptr<u64> flags) error_code sys_event_flag_get(ppu_thread& ppu, u32 id, vm::ptr<u64> flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_event_flag.trace("sys_event_flag_get(id=0x%x, flags=*0x%x)", id, flags); sys_event_flag.trace("sys_event_flag_get(id=0x%x, flags=*0x%x)", id, flags);

View File

@ -44,7 +44,7 @@ void lv2_int_serv::join()
error_code sys_interrupt_tag_destroy(ppu_thread& ppu, u32 intrtag) error_code sys_interrupt_tag_destroy(ppu_thread& ppu, u32 intrtag)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_interrupt.warning("sys_interrupt_tag_destroy(intrtag=0x%x)", intrtag); sys_interrupt.warning("sys_interrupt_tag_destroy(intrtag=0x%x)", intrtag);
@ -73,7 +73,7 @@ error_code sys_interrupt_tag_destroy(ppu_thread& ppu, u32 intrtag)
error_code _sys_interrupt_thread_establish(ppu_thread& ppu, vm::ptr<u32> ih, u32 intrtag, u32 intrthread, u64 arg1, u64 arg2) error_code _sys_interrupt_thread_establish(ppu_thread& ppu, vm::ptr<u32> ih, u32 intrtag, u32 intrthread, u64 arg1, u64 arg2)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_interrupt.warning("_sys_interrupt_thread_establish(ih=*0x%x, intrtag=0x%x, intrthread=0x%x, arg1=0x%llx, arg2=0x%llx)", ih, intrtag, intrthread, arg1, arg2); sys_interrupt.warning("_sys_interrupt_thread_establish(ih=*0x%x, intrtag=0x%x, intrthread=0x%x, arg1=0x%llx, arg2=0x%llx)", ih, intrtag, intrthread, arg1, arg2);
@ -133,7 +133,7 @@ error_code _sys_interrupt_thread_establish(ppu_thread& ppu, vm::ptr<u32> ih, u32
error_code _sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih, vm::ptr<u64> r13) error_code _sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih, vm::ptr<u64> r13)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_interrupt.warning("_sys_interrupt_thread_disestablish(ih=0x%x, r13=*0x%x)", ih, r13); sys_interrupt.warning("_sys_interrupt_thread_disestablish(ih=0x%x, r13=*0x%x)", ih, r13);
@ -163,7 +163,7 @@ error_code _sys_interrupt_thread_disestablish(ppu_thread& ppu, u32 ih, vm::ptr<u
void sys_interrupt_thread_eoi(ppu_thread& ppu) void sys_interrupt_thread_eoi(ppu_thread& ppu)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_interrupt.trace("sys_interrupt_thread_eoi()"); sys_interrupt.trace("sys_interrupt_thread_eoi()");

View File

@ -11,7 +11,7 @@ LOG_CHANNEL(sys_lwcond);
error_code _sys_lwcond_create(ppu_thread& ppu, vm::ptr<u32> lwcond_id, u32 lwmutex_id, vm::ptr<sys_lwcond_t> control, u64 name) error_code _sys_lwcond_create(ppu_thread& ppu, vm::ptr<u32> lwcond_id, u32 lwmutex_id, vm::ptr<sys_lwcond_t> control, u64 name)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwcond.warning(u8"_sys_lwcond_create(lwcond_id=*0x%x, lwmutex_id=0x%x, control=*0x%x, name=0x%llx (“%s”))", lwcond_id, lwmutex_id, control, name, lv2_obj::name64(std::bit_cast<be_t<u64>>(name))); sys_lwcond.warning(u8"_sys_lwcond_create(lwcond_id=*0x%x, lwmutex_id=0x%x, control=*0x%x, name=0x%llx (“%s”))", lwcond_id, lwmutex_id, control, name, lv2_obj::name64(std::bit_cast<be_t<u64>>(name)));
@ -43,7 +43,7 @@ error_code _sys_lwcond_create(ppu_thread& ppu, vm::ptr<u32> lwcond_id, u32 lwmut
error_code _sys_lwcond_destroy(ppu_thread& ppu, u32 lwcond_id) error_code _sys_lwcond_destroy(ppu_thread& ppu, u32 lwcond_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwcond.warning("_sys_lwcond_destroy(lwcond_id=0x%x)", lwcond_id); sys_lwcond.warning("_sys_lwcond_destroy(lwcond_id=0x%x)", lwcond_id);
@ -72,7 +72,7 @@ error_code _sys_lwcond_destroy(ppu_thread& ppu, u32 lwcond_id)
error_code _sys_lwcond_signal(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 ppu_thread_id, u32 mode) error_code _sys_lwcond_signal(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 ppu_thread_id, u32 mode)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwcond.trace("_sys_lwcond_signal(lwcond_id=0x%x, lwmutex_id=0x%x, ppu_thread_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, ppu_thread_id, mode); sys_lwcond.trace("_sys_lwcond_signal(lwcond_id=0x%x, lwmutex_id=0x%x, ppu_thread_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, ppu_thread_id, mode);
@ -197,7 +197,7 @@ error_code _sys_lwcond_signal(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u3
error_code _sys_lwcond_signal_all(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 mode) error_code _sys_lwcond_signal_all(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u32 mode)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwcond.trace("_sys_lwcond_signal_all(lwcond_id=0x%x, lwmutex_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, mode); sys_lwcond.trace("_sys_lwcond_signal_all(lwcond_id=0x%x, lwmutex_id=0x%x, mode=%d)", lwcond_id, lwmutex_id, mode);
@ -282,7 +282,7 @@ error_code _sys_lwcond_signal_all(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id
error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u64 timeout) error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwcond.trace("_sys_lwcond_queue_wait(lwcond_id=0x%x, lwmutex_id=0x%x, timeout=0x%llx)", lwcond_id, lwmutex_id, timeout); sys_lwcond.trace("_sys_lwcond_queue_wait(lwcond_id=0x%x, lwmutex_id=0x%x, timeout=0x%llx)", lwcond_id, lwmutex_id, timeout);

View File

@ -10,7 +10,7 @@ LOG_CHANNEL(sys_lwmutex);
error_code _sys_lwmutex_create(ppu_thread& ppu, vm::ptr<u32> lwmutex_id, u32 protocol, vm::ptr<sys_lwmutex_t> control, s32 has_name, u64 name) error_code _sys_lwmutex_create(ppu_thread& ppu, vm::ptr<u32> lwmutex_id, u32 protocol, vm::ptr<sys_lwmutex_t> control, s32 has_name, u64 name)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.warning(u8"_sys_lwmutex_create(lwmutex_id=*0x%x, protocol=0x%x, control=*0x%x, has_name=0x%x, name=0x%llx (“%s”))", lwmutex_id, protocol, control, has_name, name, lv2_obj::name64(std::bit_cast<be_t<u64>>(name))); sys_lwmutex.warning(u8"_sys_lwmutex_create(lwmutex_id=*0x%x, protocol=0x%x, control=*0x%x, has_name=0x%x, name=0x%llx (“%s”))", lwmutex_id, protocol, control, has_name, name, lv2_obj::name64(std::bit_cast<be_t<u64>>(name)));
@ -36,7 +36,7 @@ error_code _sys_lwmutex_create(ppu_thread& ppu, vm::ptr<u32> lwmutex_id, u32 pro
error_code _sys_lwmutex_destroy(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_destroy(ppu_thread& ppu, u32 lwmutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.warning("_sys_lwmutex_destroy(lwmutex_id=0x%x)", lwmutex_id); sys_lwmutex.warning("_sys_lwmutex_destroy(lwmutex_id=0x%x)", lwmutex_id);
@ -97,7 +97,7 @@ error_code _sys_lwmutex_destroy(ppu_thread& ppu, u32 lwmutex_id)
error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout) error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.trace("_sys_lwmutex_lock(lwmutex_id=0x%x, timeout=0x%llx)", lwmutex_id, timeout); sys_lwmutex.trace("_sys_lwmutex_lock(lwmutex_id=0x%x, timeout=0x%llx)", lwmutex_id, timeout);
@ -192,7 +192,7 @@ error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout)
error_code _sys_lwmutex_trylock(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_trylock(ppu_thread& ppu, u32 lwmutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.trace("_sys_lwmutex_trylock(lwmutex_id=0x%x)", lwmutex_id); sys_lwmutex.trace("_sys_lwmutex_trylock(lwmutex_id=0x%x)", lwmutex_id);
@ -227,7 +227,7 @@ error_code _sys_lwmutex_trylock(ppu_thread& ppu, u32 lwmutex_id)
error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.trace("_sys_lwmutex_unlock(lwmutex_id=0x%x)", lwmutex_id); sys_lwmutex.trace("_sys_lwmutex_unlock(lwmutex_id=0x%x)", lwmutex_id);
@ -254,7 +254,7 @@ error_code _sys_lwmutex_unlock(ppu_thread& ppu, u32 lwmutex_id)
error_code _sys_lwmutex_unlock2(ppu_thread& ppu, u32 lwmutex_id) error_code _sys_lwmutex_unlock2(ppu_thread& ppu, u32 lwmutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_lwmutex.warning("_sys_lwmutex_unlock2(lwmutex_id=0x%x)", lwmutex_id); sys_lwmutex.warning("_sys_lwmutex_unlock2(lwmutex_id=0x%x)", lwmutex_id);

View File

@ -3,6 +3,7 @@
#include "Utilities/VirtualMemory.h" #include "Utilities/VirtualMemory.h"
#include "Emu/Memory/vm_locking.h" #include "Emu/Memory/vm_locking.h"
#include "Emu/CPU/CPUThread.h"
#include "Emu/IdManager.h" #include "Emu/IdManager.h"
#include <shared_mutex> #include <shared_mutex>

View File

@ -43,7 +43,7 @@ error_code create_lv2_shm(bool pshared, u64 ipc_key, u32 size, u32 align, u64 fl
error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u64 alignment, vm::ptr<u32> alloc_addr) error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u64 alignment, vm::ptr<u32> alloc_addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.error("sys_mmapper_allocate_address(size=0x%llx, flags=0x%llx, alignment=0x%llx, alloc_addr=*0x%x)", size, flags, alignment, alloc_addr); sys_mmapper.error("sys_mmapper_allocate_address(size=0x%llx, flags=0x%llx, alignment=0x%llx, alloc_addr=*0x%x)", size, flags, alignment, alloc_addr);
@ -86,7 +86,7 @@ error_code sys_mmapper_allocate_address(ppu_thread& ppu, u64 size, u64 flags, u6
error_code sys_mmapper_allocate_fixed_address(ppu_thread& ppu) error_code sys_mmapper_allocate_fixed_address(ppu_thread& ppu)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.error("sys_mmapper_allocate_fixed_address()"); sys_mmapper.error("sys_mmapper_allocate_fixed_address()");
@ -100,7 +100,7 @@ error_code sys_mmapper_allocate_fixed_address(ppu_thread& ppu)
error_code sys_mmapper_allocate_shared_memory(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, vm::ptr<u32> mem_id) error_code sys_mmapper_allocate_shared_memory(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, vm::ptr<u32> mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_allocate_shared_memory(ipc_key=0x%llx, size=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, flags, mem_id); sys_mmapper.warning("sys_mmapper_allocate_shared_memory(ipc_key=0x%llx, size=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, flags, mem_id);
@ -157,7 +157,7 @@ error_code sys_mmapper_allocate_shared_memory(ppu_thread& ppu, u64 ipc_key, u32
error_code sys_mmapper_allocate_shared_memory_from_container(ppu_thread& ppu, u64 ipc_key, u32 size, u32 cid, u64 flags, vm::ptr<u32> mem_id) error_code sys_mmapper_allocate_shared_memory_from_container(ppu_thread& ppu, u64 ipc_key, u32 size, u32 cid, u64 flags, vm::ptr<u32> mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_allocate_shared_memory_from_container(ipc_key=0x%llx, size=0x%x, cid=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, cid, flags, mem_id); sys_mmapper.warning("sys_mmapper_allocate_shared_memory_from_container(ipc_key=0x%llx, size=0x%x, cid=0x%x, flags=0x%llx, mem_id=*0x%x)", ipc_key, size, cid, flags, mem_id);
@ -227,7 +227,7 @@ error_code sys_mmapper_allocate_shared_memory_from_container(ppu_thread& ppu, u6
error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u32 flags, vm::ptr<mmapper_unk_entry_struct0> entries, s32 entry_count, vm::ptr<u32> mem_id) error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u32 flags, vm::ptr<mmapper_unk_entry_struct0> entries, s32 entry_count, vm::ptr<u32> mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.todo("sys_mmapper_allocate_shared_memory_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, entries, entry_count, mem_id); sys_mmapper.todo("sys_mmapper_allocate_shared_memory_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, entries, entry_count, mem_id);
@ -331,7 +331,7 @@ error_code sys_mmapper_allocate_shared_memory_ext(ppu_thread& ppu, u64 ipc_key,
error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, u32 cid, vm::ptr<mmapper_unk_entry_struct0> entries, s32 entry_count, vm::ptr<u32> mem_id) error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu, u64 ipc_key, u32 size, u64 flags, u32 cid, vm::ptr<mmapper_unk_entry_struct0> entries, s32 entry_count, vm::ptr<u32> mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.todo("sys_mmapper_allocate_shared_memory_from_container_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, cid=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, cid, entries, sys_mmapper.todo("sys_mmapper_allocate_shared_memory_from_container_ext(ipc_key=0x%x, size=0x%x, flags=0x%x, cid=0x%x, entries=*0x%x, entry_count=0x%x, mem_id=*0x%x)", ipc_key, size, flags, cid, entries,
entry_count, mem_id); entry_count, mem_id);
@ -443,7 +443,7 @@ error_code sys_mmapper_allocate_shared_memory_from_container_ext(ppu_thread& ppu
error_code sys_mmapper_change_address_access_right(ppu_thread& ppu, u32 addr, u64 flags) error_code sys_mmapper_change_address_access_right(ppu_thread& ppu, u32 addr, u64 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.todo("sys_mmapper_change_address_access_right(addr=0x%x, flags=0x%llx)", addr, flags); sys_mmapper.todo("sys_mmapper_change_address_access_right(addr=0x%x, flags=0x%llx)", addr, flags);
@ -452,7 +452,7 @@ error_code sys_mmapper_change_address_access_right(ppu_thread& ppu, u32 addr, u6
error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr) error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.error("sys_mmapper_free_address(addr=0x%x)", addr); sys_mmapper.error("sys_mmapper_free_address(addr=0x%x)", addr);
@ -509,7 +509,7 @@ error_code sys_mmapper_free_address(ppu_thread& ppu, u32 addr)
error_code sys_mmapper_free_shared_memory(ppu_thread& ppu, u32 mem_id) error_code sys_mmapper_free_shared_memory(ppu_thread& ppu, u32 mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_free_shared_memory(mem_id=0x%x)", mem_id); sys_mmapper.warning("sys_mmapper_free_shared_memory(mem_id=0x%x)", mem_id);
@ -542,7 +542,7 @@ error_code sys_mmapper_free_shared_memory(ppu_thread& ppu, u32 mem_id)
error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id, u64 flags) error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id, u64 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_map_shared_memory(addr=0x%x, mem_id=0x%x, flags=0x%llx)", addr, mem_id, flags); sys_mmapper.warning("sys_mmapper_map_shared_memory(addr=0x%x, mem_id=0x%x, flags=0x%llx)", addr, mem_id, flags);
@ -592,7 +592,7 @@ error_code sys_mmapper_map_shared_memory(ppu_thread& ppu, u32 addr, u32 mem_id,
error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_id, u64 flags, vm::ptr<u32> alloc_addr) error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_id, u64 flags, vm::ptr<u32> alloc_addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=*0x%x)", start_addr, mem_id, flags, alloc_addr); sys_mmapper.warning("sys_mmapper_search_and_map(start_addr=0x%x, mem_id=0x%x, flags=0x%llx, alloc_addr=*0x%x)", start_addr, mem_id, flags, alloc_addr);
@ -640,7 +640,7 @@ error_code sys_mmapper_search_and_map(ppu_thread& ppu, u32 start_addr, u32 mem_i
error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr<u32> mem_id) error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr<u32> mem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_unmap_shared_memory(addr=0x%x, mem_id=*0x%x)", addr, mem_id); sys_mmapper.warning("sys_mmapper_unmap_shared_memory(addr=0x%x, mem_id=*0x%x)", addr, mem_id);
@ -689,7 +689,7 @@ error_code sys_mmapper_unmap_shared_memory(ppu_thread& ppu, u32 addr, vm::ptr<u3
error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start_addr, u32 event_queue_id) error_code sys_mmapper_enable_page_fault_notification(ppu_thread& ppu, u32 start_addr, u32 event_queue_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mmapper.warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, event_queue_id=0x%x)", start_addr, event_queue_id); sys_mmapper.warning("sys_mmapper_enable_page_fault_notification(start_addr=0x%x, event_queue_id=0x%x)", start_addr, event_queue_id);

View File

@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager<lv2_mutex, u64>::g_ipc) {};
error_code sys_mutex_create(ppu_thread& ppu, vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr) error_code sys_mutex_create(ppu_thread& ppu, vm::ptr<u32> mutex_id, vm::ptr<sys_mutex_attribute_t> attr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mutex.warning("sys_mutex_create(mutex_id=*0x%x, attr=*0x%x)", mutex_id, attr); sys_mutex.warning("sys_mutex_create(mutex_id=*0x%x, attr=*0x%x)", mutex_id, attr);
@ -75,7 +75,7 @@ error_code sys_mutex_create(ppu_thread& ppu, vm::ptr<u32> mutex_id, vm::ptr<sys_
error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id) error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mutex.warning("sys_mutex_destroy(mutex_id=0x%x)", mutex_id); sys_mutex.warning("sys_mutex_destroy(mutex_id=0x%x)", mutex_id);
@ -121,7 +121,7 @@ error_code sys_mutex_destroy(ppu_thread& ppu, u32 mutex_id)
error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout) error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mutex.trace("sys_mutex_lock(mutex_id=0x%x, timeout=0x%llx)", mutex_id, timeout); sys_mutex.trace("sys_mutex_lock(mutex_id=0x%x, timeout=0x%llx)", mutex_id, timeout);
@ -204,7 +204,7 @@ error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout)
error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id) error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mutex.trace("sys_mutex_trylock(mutex_id=0x%x)", mutex_id); sys_mutex.trace("sys_mutex_trylock(mutex_id=0x%x)", mutex_id);
@ -233,7 +233,7 @@ error_code sys_mutex_trylock(ppu_thread& ppu, u32 mutex_id)
error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id) error_code sys_mutex_unlock(ppu_thread& ppu, u32 mutex_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_mutex.trace("sys_mutex_unlock(mutex_id=0x%x)", mutex_id); sys_mutex.trace("sys_mutex_unlock(mutex_id=0x%x)", mutex_id);

View File

@ -405,7 +405,7 @@ lv2_socket::~lv2_socket()
error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen) error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_accept(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); sys_net.warning("sys_net_bnet_accept(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen);
@ -536,7 +536,7 @@ error_code sys_net_bnet_accept(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr>
error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr> addr, u32 addrlen) error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr> addr, u32 addrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_bind(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen); sys_net.warning("sys_net_bnet_bind(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen);
@ -611,7 +611,7 @@ error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr>
error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, u32 addrlen) error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, u32 addrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_connect(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen); sys_net.warning("sys_net_bnet_connect(s=%d, addr=*0x%x, addrlen=%u)", s, addr, addrlen);
@ -803,7 +803,7 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr
error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen) error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_getpeername(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); sys_net.warning("sys_net_bnet_getpeername(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen);
@ -868,7 +868,7 @@ error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sock
error_code sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen) error_code sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_getsockname(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); sys_net.warning("sys_net_bnet_getsockname(s=%d, addr=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen);
@ -919,7 +919,7 @@ error_code sys_net_bnet_getsockname(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sock
error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::ptr<void> optval, vm::ptr<u32> optlen) error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::ptr<void> optval, vm::ptr<u32> optlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=*0x%x)", s, level, optname, optval, optlen); sys_net.warning("sys_net_bnet_getsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=*0x%x)", s, level, optname, optval, optlen);
@ -1145,7 +1145,7 @@ error_code sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog) error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_listen(s=%d, backlog=%d)", s, backlog); sys_net.warning("sys_net_bnet_listen(s=%d, backlog=%d)", s, backlog);
@ -1181,7 +1181,7 @@ error_code sys_net_bnet_listen(ppu_thread& ppu, s32 s, s32 backlog)
error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32 len, s32 flags, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen) error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32 len, s32 flags, vm::ptr<sys_net_sockaddr> addr, vm::ptr<u32> paddrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_recvfrom(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, paddrlen=*0x%x)", s, buf, len, flags, addr, paddrlen); sys_net.warning("sys_net_bnet_recvfrom(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, paddrlen=*0x%x)", s, buf, len, flags, addr, paddrlen);
@ -1386,7 +1386,7 @@ error_code sys_net_bnet_recvfrom(ppu_thread& ppu, s32 s, vm::ptr<void> buf, u32
error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr<sys_net_msghdr> msg, s32 flags) error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr<sys_net_msghdr> msg, s32 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_bnet_recvmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); sys_net.todo("sys_net_bnet_recvmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags);
return CELL_OK; return CELL_OK;
@ -1394,7 +1394,7 @@ error_code sys_net_bnet_recvmsg(ppu_thread& ppu, s32 s, vm::ptr<sys_net_msghdr>
error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr<sys_net_msghdr> msg, s32 flags) error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr<sys_net_msghdr> msg, s32 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_bnet_sendmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags); sys_net.todo("sys_net_bnet_sendmsg(s=%d, msg=*0x%x, flags=0x%x)", s, msg, flags);
return CELL_OK; return CELL_OK;
@ -1402,7 +1402,7 @@ error_code sys_net_bnet_sendmsg(ppu_thread& ppu, s32 s, vm::cptr<sys_net_msghdr>
error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 len, s32 flags, vm::cptr<sys_net_sockaddr> addr, u32 addrlen) error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 len, s32 flags, vm::cptr<sys_net_sockaddr> addr, u32 addrlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_sendto(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, addrlen=%u)", s, buf, len, flags, addr, addrlen); sys_net.warning("sys_net_bnet_sendto(s=%d, buf=*0x%x, len=%u, flags=0x%x, addr=*0x%x, addrlen=%u)", s, buf, len, flags, addr, addrlen);
@ -1578,7 +1578,7 @@ error_code sys_net_bnet_sendto(ppu_thread& ppu, s32 s, vm::cptr<void> buf, u32 l
error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::cptr<void> optval, u32 optlen) error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::cptr<void> optval, u32 optlen)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen); sys_net.warning("sys_net_bnet_setsockopt(s=%d, level=0x%x, optname=0x%x, optval=*0x%x, optlen=%u)", s, level, optname, optval, optlen);
@ -1772,7 +1772,7 @@ error_code sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optnam
error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how) error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_shutdown(s=%d, how=%d)", s, how); sys_net.warning("sys_net_bnet_shutdown(s=%d, how=%d)", s, how);
@ -1818,7 +1818,7 @@ error_code sys_net_bnet_shutdown(ppu_thread& ppu, s32 s, s32 how)
error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol) error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol); sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol);
@ -1873,7 +1873,7 @@ error_code sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protoc
error_code sys_net_bnet_close(ppu_thread& ppu, s32 s) error_code sys_net_bnet_close(ppu_thread& ppu, s32 s)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_close(s=%d)", s); sys_net.warning("sys_net_bnet_close(s=%d)", s);
@ -1895,7 +1895,7 @@ error_code sys_net_bnet_close(ppu_thread& ppu, s32 s)
error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 nfds, s32 ms) error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 nfds, s32 ms)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_poll(fds=*0x%x, nfds=%d, ms=%d)", fds, nfds, ms); sys_net.warning("sys_net_bnet_poll(fds=*0x%x, nfds=%d, ms=%d)", fds, nfds, ms);
@ -2076,7 +2076,7 @@ error_code sys_net_bnet_poll(ppu_thread& ppu, vm::ptr<sys_net_pollfd> fds, s32 n
error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readfds, vm::ptr<sys_net_fd_set> writefds, vm::ptr<sys_net_fd_set> exceptfds, vm::ptr<sys_net_timeval> _timeout) error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set> readfds, vm::ptr<sys_net_fd_set> writefds, vm::ptr<sys_net_fd_set> exceptfds, vm::ptr<sys_net_timeval> _timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.warning("sys_net_bnet_select(nfds=%d, readfds=*0x%x, writefds=*0x%x, exceptfds=*0x%x, timeout=*0x%x)", nfds, readfds, writefds, exceptfds, _timeout); sys_net.warning("sys_net_bnet_select(nfds=%d, readfds=*0x%x, writefds=*0x%x, exceptfds=*0x%x, timeout=*0x%x)", nfds, readfds, writefds, exceptfds, _timeout);
@ -2291,7 +2291,7 @@ error_code sys_net_bnet_select(ppu_thread& ppu, s32 nfds, vm::ptr<sys_net_fd_set
error_code _sys_net_open_dump(ppu_thread& ppu, s32 len, s32 flags) error_code _sys_net_open_dump(ppu_thread& ppu, s32 len, s32 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("_sys_net_open_dump(len=%d, flags=0x%x)", len, flags); sys_net.todo("_sys_net_open_dump(len=%d, flags=0x%x)", len, flags);
return CELL_OK; return CELL_OK;
@ -2299,7 +2299,7 @@ error_code _sys_net_open_dump(ppu_thread& ppu, s32 len, s32 flags)
error_code _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr<void> buf, s32 len, vm::ptr<s32> pflags) error_code _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr<void> buf, s32 len, vm::ptr<s32> pflags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("_sys_net_read_dump(id=0x%x, buf=*0x%x, len=%d, pflags=*0x%x)", id, buf, len, pflags); sys_net.todo("_sys_net_read_dump(id=0x%x, buf=*0x%x, len=%d, pflags=*0x%x)", id, buf, len, pflags);
return CELL_OK; return CELL_OK;
@ -2307,7 +2307,7 @@ error_code _sys_net_read_dump(ppu_thread& ppu, s32 id, vm::ptr<void> buf, s32 le
error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr<s32> pflags) error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr<s32> pflags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("_sys_net_close_dump(id=0x%x, pflags=*0x%x)", id, pflags); sys_net.todo("_sys_net_close_dump(id=0x%x, pflags=*0x%x)", id, pflags);
return CELL_OK; return CELL_OK;
@ -2315,7 +2315,7 @@ error_code _sys_net_close_dump(ppu_thread& ppu, s32 id, vm::ptr<s32> pflags)
error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr<void> buf, s32 len, u32 unknown) error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr<void> buf, s32 len, u32 unknown)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo(__func__); sys_net.todo(__func__);
return CELL_OK; return CELL_OK;
@ -2323,7 +2323,7 @@ error_code _sys_net_write_dump(ppu_thread& ppu, s32 id, vm::cptr<void> buf, s32
error_code sys_net_abort(ppu_thread& ppu, s32 type, u64 arg, s32 flags) error_code sys_net_abort(ppu_thread& ppu, s32 type, u64 arg, s32 flags)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_abort(type=%d, arg=0x%x, flags=0x%x)", type, arg, flags); sys_net.todo("sys_net_abort(type=%d, arg=0x%x, flags=0x%x)", type, arg, flags);
return CELL_OK; return CELL_OK;
@ -2338,7 +2338,7 @@ struct net_infoctl_cmd_9_t
error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr<void> arg) error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr<void> arg)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_infoctl(cmd=%d, arg=*0x%x)", cmd, arg); sys_net.todo("sys_net_infoctl(cmd=%d, arg=*0x%x)", cmd, arg);
@ -2379,7 +2379,7 @@ error_code sys_net_infoctl(ppu_thread& ppu, s32 cmd, vm::ptr<void> arg)
error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr<void> arg3, s32 arg4) error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr<void> arg3, s32 arg4)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_control(0x%x, %d, *0x%x, %d)", arg1, arg2, arg3, arg4); sys_net.todo("sys_net_control(0x%x, %d, *0x%x, %d)", arg1, arg2, arg3, arg4);
return CELL_OK; return CELL_OK;
@ -2387,7 +2387,7 @@ error_code sys_net_control(ppu_thread& ppu, u32 arg1, s32 arg2, vm::ptr<void> ar
error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_bnet_ioctl(%d, 0x%x, 0x%x)", arg1, arg2, arg3); sys_net.todo("sys_net_bnet_ioctl(%d, 0x%x, 0x%x)", arg1, arg2, arg3);
return CELL_OK; return CELL_OK;
@ -2395,7 +2395,7 @@ error_code sys_net_bnet_ioctl(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3)
error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm::ptr<void> arg4, u32 arg5, u32 arg6) error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm::ptr<void> arg4, u32 arg5, u32 arg6)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_bnet_sysctl(0x%x, 0x%x, 0x%x, *0x%x, 0x%x, 0x%x)", arg1, arg2, arg3, arg4, arg5, arg6); sys_net.todo("sys_net_bnet_sysctl(0x%x, 0x%x, 0x%x, *0x%x, 0x%x, 0x%x)", arg1, arg2, arg3, arg4, arg5, arg6);
return CELL_OK; return CELL_OK;
@ -2403,7 +2403,7 @@ error_code sys_net_bnet_sysctl(ppu_thread& ppu, u32 arg1, u32 arg2, u32 arg3, vm
error_code sys_net_eurus_post_command(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3) error_code sys_net_eurus_post_command(ppu_thread& ppu, s32 arg1, u32 arg2, u32 arg3)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_net.todo("sys_net_eurus_post_command(%d, 0x%x, 0x%x)", arg1, arg2, arg3); sys_net.todo("sys_net_eurus_post_command(%d, 0x%x, 0x%x)", arg1, arg2, arg3);
return CELL_OK; return CELL_OK;

View File

@ -35,7 +35,7 @@ struct ppu_thread_cleaner
void _sys_ppu_thread_exit(ppu_thread& ppu, u64 errorcode) void _sys_ppu_thread_exit(ppu_thread& ppu, u64 errorcode)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
// Need to wait until the current writer finish // Need to wait until the current writer finish
if (ppu.state & cpu_flag::memory) vm::g_mutex.lock_unlock(); if (ppu.state & cpu_flag::memory) vm::g_mutex.lock_unlock();
@ -90,7 +90,7 @@ s32 sys_ppu_thread_yield(ppu_thread& ppu)
error_code sys_ppu_thread_join(ppu_thread& ppu, u32 thread_id, vm::ptr<u64> vptr) error_code sys_ppu_thread_join(ppu_thread& ppu, u32 thread_id, vm::ptr<u64> vptr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_ppu_thread.trace("sys_ppu_thread_join(thread_id=0x%x, vptr=*0x%x)", thread_id, vptr); sys_ppu_thread.trace("sys_ppu_thread_join(thread_id=0x%x, vptr=*0x%x)", thread_id, vptr);

View File

@ -281,7 +281,7 @@ error_code sys_process_detach_child(u64 unk)
void _sys_process_exit(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3) void _sys_process_exit(ppu_thread& ppu, s32 status, u32 arg2, u32 arg3)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_process.warning("_sys_process_exit(status=%d, arg2=0x%x, arg3=0x%x)", status, arg2, arg3); sys_process.warning("_sys_process_exit(status=%d, arg2=0x%x, arg3=0x%x)", status, arg2, arg3);
@ -339,7 +339,7 @@ void _sys_process_exit2(ppu_thread& ppu, s32 status, vm::ptr<sys_exit2_param> ar
if (disc.empty() && !Emu.GetTitleID().empty()) if (disc.empty() && !Emu.GetTitleID().empty())
disc = vfs::get(Emu.GetDir()); disc = vfs::get(Emu.GetDir());
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
Emu.CallAfter([path = std::move(path), argv = std::move(argv), envp = std::move(envp), data = std::move(data), disc = std::move(disc), hdd1 = std::move(hdd1), klic = g_fxo->get<loaded_npdrm_keys>()->devKlic.load()]() mutable Emu.CallAfter([path = std::move(path), argv = std::move(argv), envp = std::move(envp), data = std::move(data), disc = std::move(disc), hdd1 = std::move(hdd1), klic = g_fxo->get<loaded_npdrm_keys>()->devKlic.load()]() mutable
{ {

View File

@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager<lv2_rwlock, u64>::g_ipc) {};
error_code sys_rwlock_create(ppu_thread& ppu, vm::ptr<u32> rw_lock_id, vm::ptr<sys_rwlock_attribute_t> attr) error_code sys_rwlock_create(ppu_thread& ppu, vm::ptr<u32> rw_lock_id, vm::ptr<sys_rwlock_attribute_t> attr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.warning("sys_rwlock_create(rw_lock_id=*0x%x, attr=*0x%x)", rw_lock_id, attr); sys_rwlock.warning("sys_rwlock_create(rw_lock_id=*0x%x, attr=*0x%x)", rw_lock_id, attr);
@ -46,7 +46,7 @@ error_code sys_rwlock_create(ppu_thread& ppu, vm::ptr<u32> rw_lock_id, vm::ptr<s
error_code sys_rwlock_destroy(ppu_thread& ppu, u32 rw_lock_id) error_code sys_rwlock_destroy(ppu_thread& ppu, u32 rw_lock_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.warning("sys_rwlock_destroy(rw_lock_id=0x%x)", rw_lock_id); sys_rwlock.warning("sys_rwlock_destroy(rw_lock_id=0x%x)", rw_lock_id);
@ -75,7 +75,7 @@ error_code sys_rwlock_destroy(ppu_thread& ppu, u32 rw_lock_id)
error_code sys_rwlock_rlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout) error_code sys_rwlock_rlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_rlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout); sys_rwlock.trace("sys_rwlock_rlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout);
@ -166,7 +166,7 @@ error_code sys_rwlock_rlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
error_code sys_rwlock_tryrlock(ppu_thread& ppu, u32 rw_lock_id) error_code sys_rwlock_tryrlock(ppu_thread& ppu, u32 rw_lock_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_tryrlock(rw_lock_id=0x%x)", rw_lock_id); sys_rwlock.trace("sys_rwlock_tryrlock(rw_lock_id=0x%x)", rw_lock_id);
@ -201,7 +201,7 @@ error_code sys_rwlock_tryrlock(ppu_thread& ppu, u32 rw_lock_id)
error_code sys_rwlock_runlock(ppu_thread& ppu, u32 rw_lock_id) error_code sys_rwlock_runlock(ppu_thread& ppu, u32 rw_lock_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_runlock(rw_lock_id=0x%x)", rw_lock_id); sys_rwlock.trace("sys_rwlock_runlock(rw_lock_id=0x%x)", rw_lock_id);
@ -269,7 +269,7 @@ error_code sys_rwlock_runlock(ppu_thread& ppu, u32 rw_lock_id)
error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout) error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_wlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout); sys_rwlock.trace("sys_rwlock_wlock(rw_lock_id=0x%x, timeout=0x%llx)", rw_lock_id, timeout);
@ -390,7 +390,7 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
error_code sys_rwlock_trywlock(ppu_thread& ppu, u32 rw_lock_id) error_code sys_rwlock_trywlock(ppu_thread& ppu, u32 rw_lock_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_trywlock(rw_lock_id=0x%x)", rw_lock_id); sys_rwlock.trace("sys_rwlock_trywlock(rw_lock_id=0x%x)", rw_lock_id);
@ -422,7 +422,7 @@ error_code sys_rwlock_trywlock(ppu_thread& ppu, u32 rw_lock_id)
error_code sys_rwlock_wunlock(ppu_thread& ppu, u32 rw_lock_id) error_code sys_rwlock_wunlock(ppu_thread& ppu, u32 rw_lock_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_rwlock.trace("sys_rwlock_wunlock(rw_lock_id=0x%x)", rw_lock_id); sys_rwlock.trace("sys_rwlock_wunlock(rw_lock_id=0x%x)", rw_lock_id);

View File

@ -13,7 +13,7 @@ template<> DECLARE(ipc_manager<lv2_sema, u64>::g_ipc) {};
error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr<u32> sem_id, vm::ptr<sys_semaphore_attribute_t> attr, s32 initial_val, s32 max_val) error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr<u32> sem_id, vm::ptr<sys_semaphore_attribute_t> attr, s32 initial_val, s32 max_val)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.warning("sys_semaphore_create(sem_id=*0x%x, attr=*0x%x, initial_val=%d, max_val=%d)", sem_id, attr, initial_val, max_val); sys_semaphore.warning("sys_semaphore_create(sem_id=*0x%x, attr=*0x%x, initial_val=%d, max_val=%d)", sem_id, attr, initial_val, max_val);
@ -52,7 +52,7 @@ error_code sys_semaphore_create(ppu_thread& ppu, vm::ptr<u32> sem_id, vm::ptr<sy
error_code sys_semaphore_destroy(ppu_thread& ppu, u32 sem_id) error_code sys_semaphore_destroy(ppu_thread& ppu, u32 sem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.warning("sys_semaphore_destroy(sem_id=0x%x)", sem_id); sys_semaphore.warning("sys_semaphore_destroy(sem_id=0x%x)", sem_id);
@ -81,7 +81,7 @@ error_code sys_semaphore_destroy(ppu_thread& ppu, u32 sem_id)
error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout) error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.trace("sys_semaphore_wait(sem_id=0x%x, timeout=0x%llx)", sem_id, timeout); sys_semaphore.trace("sys_semaphore_wait(sem_id=0x%x, timeout=0x%llx)", sem_id, timeout);
@ -168,7 +168,7 @@ error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout)
error_code sys_semaphore_trywait(ppu_thread& ppu, u32 sem_id) error_code sys_semaphore_trywait(ppu_thread& ppu, u32 sem_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.trace("sys_semaphore_trywait(sem_id=0x%x)", sem_id); sys_semaphore.trace("sys_semaphore_trywait(sem_id=0x%x)", sem_id);
@ -192,7 +192,7 @@ error_code sys_semaphore_trywait(ppu_thread& ppu, u32 sem_id)
error_code sys_semaphore_post(ppu_thread& ppu, u32 sem_id, s32 count) error_code sys_semaphore_post(ppu_thread& ppu, u32 sem_id, s32 count)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.trace("sys_semaphore_post(sem_id=0x%x, count=%d)", sem_id, count); sys_semaphore.trace("sys_semaphore_post(sem_id=0x%x, count=%d)", sem_id, count);
@ -264,7 +264,7 @@ error_code sys_semaphore_post(ppu_thread& ppu, u32 sem_id, s32 count)
error_code sys_semaphore_get_value(ppu_thread& ppu, u32 sem_id, vm::ptr<s32> count) error_code sys_semaphore_get_value(ppu_thread& ppu, u32 sem_id, vm::ptr<s32> count)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_semaphore.trace("sys_semaphore_get_value(sem_id=0x%x, count=*0x%x)", sem_id, count); sys_semaphore.trace("sys_semaphore_get_value(sem_id=0x%x, count=*0x%x)", sem_id, count);

View File

@ -201,7 +201,7 @@ std::pair<named_thread<spu_thread>*, std::shared_ptr<lv2_spu_group>> lv2_spu_gro
error_code sys_spu_initialize(ppu_thread& ppu, u32 max_usable_spu, u32 max_raw_spu) error_code sys_spu_initialize(ppu_thread& ppu, u32 max_usable_spu, u32 max_raw_spu)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu); sys_spu.warning("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu);
@ -215,7 +215,7 @@ error_code sys_spu_initialize(ppu_thread& ppu, u32 max_usable_spu, u32 max_raw_s
error_code _sys_spu_image_get_information(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::ptr<u32> entry_point, vm::ptr<s32> nsegs) error_code _sys_spu_image_get_information(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::ptr<u32> entry_point, vm::ptr<s32> nsegs)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("_sys_spu_image_get_information(img=*0x%x, entry_point=*0x%x, nsegs=*0x%x)", img, entry_point, nsegs); sys_spu.warning("_sys_spu_image_get_information(img=*0x%x, entry_point=*0x%x, nsegs=*0x%x)", img, entry_point, nsegs);
@ -238,7 +238,7 @@ error_code _sys_spu_image_get_information(ppu_thread& ppu, vm::ptr<sys_spu_image
error_code sys_spu_image_open(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::cptr<char> path) error_code sys_spu_image_open(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::cptr<char> path)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_image_open(img=*0x%x, path=%s)", img, path); sys_spu.warning("sys_spu_image_open(img=*0x%x, path=%s)", img, path);
@ -263,7 +263,7 @@ error_code sys_spu_image_open(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::c
error_code _sys_spu_image_import(ppu_thread& ppu, vm::ptr<sys_spu_image> img, u32 src, u32 size, u32 arg4) error_code _sys_spu_image_import(ppu_thread& ppu, vm::ptr<sys_spu_image> img, u32 src, u32 size, u32 arg4)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("_sys_spu_image_import(img=*0x%x, src=*0x%x, size=0x%x, arg4=0x%x)", img, src, size, arg4); sys_spu.warning("_sys_spu_image_import(img=*0x%x, src=*0x%x, size=0x%x, arg4=0x%x)", img, src, size, arg4);
@ -273,7 +273,7 @@ error_code _sys_spu_image_import(ppu_thread& ppu, vm::ptr<sys_spu_image> img, u3
error_code _sys_spu_image_close(ppu_thread& ppu, vm::ptr<sys_spu_image> img) error_code _sys_spu_image_close(ppu_thread& ppu, vm::ptr<sys_spu_image> img)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("_sys_spu_image_close(img=*0x%x)", img); sys_spu.warning("_sys_spu_image_close(img=*0x%x)", img);
@ -295,7 +295,7 @@ error_code _sys_spu_image_close(ppu_thread& ppu, vm::ptr<sys_spu_image> img)
error_code _sys_spu_image_get_segments(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::ptr<sys_spu_segment> segments, s32 nseg) error_code _sys_spu_image_get_segments(ppu_thread& ppu, vm::ptr<sys_spu_image> img, vm::ptr<sys_spu_segment> segments, s32 nseg)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.error("_sys_spu_image_get_segments(img=*0x%x, segments=*0x%x, nseg=%d)", img, segments, nseg); sys_spu.error("_sys_spu_image_get_segments(img=*0x%x, segments=*0x%x, nseg=%d)", img, segments, nseg);
@ -318,7 +318,7 @@ error_code _sys_spu_image_get_segments(ppu_thread& ppu, vm::ptr<sys_spu_image> i
error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 group_id, u32 spu_num, vm::ptr<sys_spu_image> img, vm::ptr<sys_spu_thread_attribute> attr, vm::ptr<sys_spu_thread_argument> arg) error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 group_id, u32 spu_num, vm::ptr<sys_spu_image> img, vm::ptr<sys_spu_thread_attribute> attr, vm::ptr<sys_spu_thread_argument> arg)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_initialize(thread=*0x%x, group=0x%x, spu_num=%d, img=*0x%x, attr=*0x%x, arg=*0x%x)", thread, group_id, spu_num, img, attr, arg); sys_spu.warning("sys_spu_thread_initialize(thread=*0x%x, group=0x%x, spu_num=%d, img=*0x%x, attr=*0x%x, arg=*0x%x)", thread, group_id, spu_num, img, attr, arg);
@ -451,7 +451,7 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
error_code sys_spu_thread_set_argument(ppu_thread& ppu, u32 id, vm::ptr<sys_spu_thread_argument> arg) error_code sys_spu_thread_set_argument(ppu_thread& ppu, u32 id, vm::ptr<sys_spu_thread_argument> arg)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_set_argument(id=0x%x, arg=*0x%x)", id, arg); sys_spu.warning("sys_spu_thread_set_argument(id=0x%x, arg=*0x%x)", id, arg);
@ -471,7 +471,7 @@ error_code sys_spu_thread_set_argument(ppu_thread& ppu, u32 id, vm::ptr<sys_spu_
error_code sys_spu_thread_get_exit_status(ppu_thread& ppu, u32 id, vm::ptr<s32> status) error_code sys_spu_thread_get_exit_status(ppu_thread& ppu, u32 id, vm::ptr<s32> status)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_get_exit_status(id=0x%x, status=*0x%x)", id, status); sys_spu.warning("sys_spu_thread_get_exit_status(id=0x%x, status=*0x%x)", id, status);
@ -495,7 +495,7 @@ error_code sys_spu_thread_get_exit_status(ppu_thread& ppu, u32 id, vm::ptr<s32>
error_code sys_spu_thread_group_create(ppu_thread& ppu, vm::ptr<u32> id, u32 num, s32 prio, vm::ptr<sys_spu_thread_group_attribute> attr) error_code sys_spu_thread_group_create(ppu_thread& ppu, vm::ptr<u32> id, u32 num, s32 prio, vm::ptr<sys_spu_thread_group_attribute> attr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_create(id=*0x%x, num=%d, prio=%d, attr=*0x%x)", id, num, prio, attr); sys_spu.warning("sys_spu_thread_group_create(id=*0x%x, num=%d, prio=%d, attr=*0x%x)", id, num, prio, attr);
@ -641,7 +641,7 @@ error_code sys_spu_thread_group_create(ppu_thread& ppu, vm::ptr<u32> id, u32 num
error_code sys_spu_thread_group_destroy(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_destroy(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_destroy(id=0x%x)", id); sys_spu.warning("sys_spu_thread_group_destroy(id=0x%x)", id);
@ -691,7 +691,7 @@ error_code sys_spu_thread_group_destroy(ppu_thread& ppu, u32 id)
error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_start(id=0x%x)", id); sys_spu.trace("sys_spu_thread_group_start(id=0x%x)", id);
@ -763,7 +763,7 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id)
error_code sys_spu_thread_group_suspend(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_suspend(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_suspend(id=0x%x)", id); sys_spu.trace("sys_spu_thread_group_suspend(id=0x%x)", id);
@ -846,7 +846,7 @@ error_code sys_spu_thread_group_suspend(ppu_thread& ppu, u32 id)
error_code sys_spu_thread_group_resume(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_resume(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_resume(id=0x%x)", id); sys_spu.trace("sys_spu_thread_group_resume(id=0x%x)", id);
@ -913,7 +913,7 @@ error_code sys_spu_thread_group_resume(ppu_thread& ppu, u32 id)
error_code sys_spu_thread_group_yield(ppu_thread& ppu, u32 id) error_code sys_spu_thread_group_yield(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_yield(id=0x%x)", id); sys_spu.trace("sys_spu_thread_group_yield(id=0x%x)", id);
@ -947,7 +947,7 @@ error_code sys_spu_thread_group_yield(ppu_thread& ppu, u32 id)
error_code sys_spu_thread_group_terminate(ppu_thread& ppu, u32 id, s32 value) error_code sys_spu_thread_group_terminate(ppu_thread& ppu, u32 id, s32 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_terminate(id=0x%x, value=0x%x)", id, value); sys_spu.trace("sys_spu_thread_group_terminate(id=0x%x, value=0x%x)", id, value);
@ -1033,7 +1033,7 @@ error_code sys_spu_thread_group_terminate(ppu_thread& ppu, u32 id, s32 value)
error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause, vm::ptr<u32> status) error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause, vm::ptr<u32> status)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_join(id=0x%x, cause=*0x%x, status=*0x%x)", id, cause, status); sys_spu.trace("sys_spu_thread_group_join(id=0x%x, cause=*0x%x, status=*0x%x)", id, cause, status);
@ -1119,7 +1119,7 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause
error_code sys_spu_thread_group_set_priority(ppu_thread& ppu, u32 id, s32 priority) error_code sys_spu_thread_group_set_priority(ppu_thread& ppu, u32 id, s32 priority)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_set_priority(id=0x%x, priority=%d)", id, priority); sys_spu.trace("sys_spu_thread_group_set_priority(id=0x%x, priority=%d)", id, priority);
@ -1142,7 +1142,7 @@ error_code sys_spu_thread_group_set_priority(ppu_thread& ppu, u32 id, s32 priori
error_code sys_spu_thread_group_get_priority(ppu_thread& ppu, u32 id, vm::ptr<s32> priority) error_code sys_spu_thread_group_get_priority(ppu_thread& ppu, u32 id, vm::ptr<s32> priority)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_group_get_priority(id=0x%x, priority=*0x%x)", id, priority); sys_spu.trace("sys_spu_thread_group_get_priority(id=0x%x, priority=*0x%x)", id, priority);
@ -1167,7 +1167,7 @@ error_code sys_spu_thread_group_get_priority(ppu_thread& ppu, u32 id, vm::ptr<s3
error_code sys_spu_thread_group_set_cooperative_victims(ppu_thread& ppu, u32 id, u32 threads_mask) error_code sys_spu_thread_group_set_cooperative_victims(ppu_thread& ppu, u32 id, u32 threads_mask)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_set_cooperative_victims(id=0x%x, threads_mask=0x%x)", id, threads_mask); sys_spu.warning("sys_spu_thread_group_set_cooperative_victims(id=0x%x, threads_mask=0x%x)", id, threads_mask);
@ -1195,7 +1195,7 @@ error_code sys_spu_thread_group_set_cooperative_victims(ppu_thread& ppu, u32 id,
error_code sys_spu_thread_group_syscall_253(ppu_thread& ppu, u32 id, vm::ptr<sys_spu_thread_group_syscall_253_info> info) error_code sys_spu_thread_group_syscall_253(ppu_thread& ppu, u32 id, vm::ptr<sys_spu_thread_group_syscall_253_info> info)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_syscall_253(id=0x%x, info=*0x%x)", id, info); sys_spu.warning("sys_spu_thread_group_syscall_253(id=0x%x, info=*0x%x)", id, info);
@ -1221,7 +1221,7 @@ error_code sys_spu_thread_group_syscall_253(ppu_thread& ppu, u32 id, vm::ptr<sys
error_code sys_spu_thread_write_ls(ppu_thread& ppu, u32 id, u32 lsa, u64 value, u32 type) error_code sys_spu_thread_write_ls(ppu_thread& ppu, u32 id, u32 lsa, u64 value, u32 type)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_write_ls(id=0x%x, lsa=0x%05x, value=0x%llx, type=%d)", id, lsa, value, type); sys_spu.trace("sys_spu_thread_write_ls(id=0x%x, lsa=0x%05x, value=0x%llx, type=%d)", id, lsa, value, type);
@ -1264,7 +1264,7 @@ error_code sys_spu_thread_write_ls(ppu_thread& ppu, u32 id, u32 lsa, u64 value,
error_code sys_spu_thread_read_ls(ppu_thread& ppu, u32 id, u32 lsa, vm::ptr<u64> value, u32 type) error_code sys_spu_thread_read_ls(ppu_thread& ppu, u32 id, u32 lsa, vm::ptr<u64> value, u32 type)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_read_ls(id=0x%x, lsa=0x%05x, value=*0x%x, type=%d)", id, lsa, value, type); sys_spu.trace("sys_spu_thread_read_ls(id=0x%x, lsa=0x%05x, value=*0x%x, type=%d)", id, lsa, value, type);
@ -1307,7 +1307,7 @@ error_code sys_spu_thread_read_ls(ppu_thread& ppu, u32 id, u32 lsa, vm::ptr<u64>
error_code sys_spu_thread_write_spu_mb(ppu_thread& ppu, u32 id, u32 value) error_code sys_spu_thread_write_spu_mb(ppu_thread& ppu, u32 id, u32 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_write_spu_mb(id=0x%x, value=0x%x)", id, value); sys_spu.warning("sys_spu_thread_write_spu_mb(id=0x%x, value=0x%x)", id, value);
@ -1327,7 +1327,7 @@ error_code sys_spu_thread_write_spu_mb(ppu_thread& ppu, u32 id, u32 value)
error_code sys_spu_thread_set_spu_cfg(ppu_thread& ppu, u32 id, u64 value) error_code sys_spu_thread_set_spu_cfg(ppu_thread& ppu, u32 id, u64 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_set_spu_cfg(id=0x%x, value=0x%x)", id, value); sys_spu.warning("sys_spu_thread_set_spu_cfg(id=0x%x, value=0x%x)", id, value);
@ -1350,7 +1350,7 @@ error_code sys_spu_thread_set_spu_cfg(ppu_thread& ppu, u32 id, u64 value)
error_code sys_spu_thread_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u64> value) error_code sys_spu_thread_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u64> value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_get_spu_cfg(id=0x%x, value=*0x%x)", id, value); sys_spu.warning("sys_spu_thread_get_spu_cfg(id=0x%x, value=*0x%x)", id, value);
@ -1368,7 +1368,7 @@ error_code sys_spu_thread_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u64> valu
error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 value) error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value); sys_spu.trace("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value);
@ -1391,7 +1391,7 @@ error_code sys_spu_thread_write_snr(ppu_thread& ppu, u32 id, u32 number, u32 val
error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et) error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_connect_event(id=0x%x, eq=0x%x, et=%d)", id, eq, et); sys_spu.warning("sys_spu_thread_group_connect_event(id=0x%x, eq=0x%x, et=%d)", id, eq, et);
@ -1440,7 +1440,7 @@ error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u
error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et) error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_disconnect_event(id=0x%x, et=%d)", id, et); sys_spu.warning("sys_spu_thread_group_disconnect_event(id=0x%x, et=%d)", id, et);
@ -1476,7 +1476,7 @@ error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et
error_code sys_spu_thread_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et, u8 spup) error_code sys_spu_thread_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et, u8 spup)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_connect_event(id=0x%x, eq=0x%x, et=%d, spup=%d)", id, eq, et, spup); sys_spu.warning("sys_spu_thread_connect_event(id=0x%x, eq=0x%x, et=%d, spup=%d)", id, eq, et, spup);
@ -1510,7 +1510,7 @@ error_code sys_spu_thread_connect_event(ppu_thread& ppu, u32 id, u32 eq, u32 et,
error_code sys_spu_thread_disconnect_event(ppu_thread& ppu, u32 id, u32 et, u8 spup) error_code sys_spu_thread_disconnect_event(ppu_thread& ppu, u32 id, u32 et, u8 spup)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_disconnect_event(id=0x%x, et=%d, spup=%d)", id, et, spup); sys_spu.warning("sys_spu_thread_disconnect_event(id=0x%x, et=%d, spup=%d)", id, et, spup);
@ -1543,7 +1543,7 @@ error_code sys_spu_thread_disconnect_event(ppu_thread& ppu, u32 id, u32 et, u8 s
error_code sys_spu_thread_bind_queue(ppu_thread& ppu, u32 id, u32 spuq, u32 spuq_num) error_code sys_spu_thread_bind_queue(ppu_thread& ppu, u32 id, u32 spuq, u32 spuq_num)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_bind_queue(id=0x%x, spuq=0x%x, spuq_num=0x%x)", id, spuq, spuq_num); sys_spu.warning("sys_spu_thread_bind_queue(id=0x%x, spuq=0x%x, spuq_num=0x%x)", id, spuq, spuq_num);
@ -1597,7 +1597,7 @@ error_code sys_spu_thread_bind_queue(ppu_thread& ppu, u32 id, u32 spuq, u32 spuq
error_code sys_spu_thread_unbind_queue(ppu_thread& ppu, u32 id, u32 spuq_num) error_code sys_spu_thread_unbind_queue(ppu_thread& ppu, u32 id, u32 spuq_num)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_unbind_queue(id=0x%x, spuq_num=0x%x)", id, spuq_num); sys_spu.warning("sys_spu_thread_unbind_queue(id=0x%x, spuq_num=0x%x)", id, spuq_num);
@ -1632,7 +1632,7 @@ error_code sys_spu_thread_unbind_queue(ppu_thread& ppu, u32 id, u32 spuq_num)
error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 id, u32 eq, u64 req, vm::ptr<u8> spup) error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 id, u32 eq, u64 req, vm::ptr<u8> spup)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_connect_event_all_threads(id=0x%x, eq=0x%x, req=0x%llx, spup=*0x%x)", id, eq, req, spup); sys_spu.warning("sys_spu_thread_group_connect_event_all_threads(id=0x%x, eq=0x%x, req=0x%llx, spup=*0x%x)", id, eq, req, spup);
@ -1711,7 +1711,7 @@ error_code sys_spu_thread_group_connect_event_all_threads(ppu_thread& ppu, u32 i
error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u32 id, u8 spup) error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u32 id, u8 spup)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_disconnect_event_all_threads(id=0x%x, spup=%d)", id, spup); sys_spu.warning("sys_spu_thread_group_disconnect_event_all_threads(id=0x%x, spup=%d)", id, spup);
@ -1742,7 +1742,7 @@ error_code sys_spu_thread_group_disconnect_event_all_threads(ppu_thread& ppu, u3
error_code sys_spu_thread_group_log(ppu_thread& ppu, s32 command, vm::ptr<s32> stat) error_code sys_spu_thread_group_log(ppu_thread& ppu, s32 command, vm::ptr<s32> stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_group_log(command=0x%x, stat=*0x%x)", command, stat); sys_spu.warning("sys_spu_thread_group_log(command=0x%x, stat=*0x%x)", command, stat);
@ -1779,7 +1779,7 @@ error_code sys_spu_thread_group_log(ppu_thread& ppu, s32 command, vm::ptr<s32> s
error_code sys_spu_thread_recover_page_fault(ppu_thread& ppu, u32 id) error_code sys_spu_thread_recover_page_fault(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_spu_thread_recover_page_fault(id=0x%x)", id); sys_spu.warning("sys_spu_thread_recover_page_fault(id=0x%x)", id);
@ -1795,7 +1795,7 @@ error_code sys_spu_thread_recover_page_fault(ppu_thread& ppu, u32 id)
error_code sys_raw_spu_recover_page_fault(ppu_thread& ppu, u32 id) error_code sys_raw_spu_recover_page_fault(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_raw_spu_recover_page_fault(id=0x%x)", id); sys_spu.warning("sys_raw_spu_recover_page_fault(id=0x%x)", id);
@ -1811,7 +1811,7 @@ error_code sys_raw_spu_recover_page_fault(ppu_thread& ppu, u32 id)
error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> attr) error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> attr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_raw_spu_create(id=*0x%x, attr=*0x%x)", id, attr); sys_spu.warning("sys_raw_spu_create(id=*0x%x, attr=*0x%x)", id, attr);
@ -1844,7 +1844,7 @@ error_code sys_raw_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> at
error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> image, u64 arg1, u64 arg2, u64 arg3, u64 arg4) error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<void> image, u64 arg1, u64 arg2, u64 arg3, u64 arg4)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_create(id=*0x%x, image=*0x%x, arg1=0x%llx, arg2=0x%llx, arg3=0x%llx, arg4=0x%llx)", id, image, arg1, arg2, arg3, arg4); sys_spu.todo("sys_isolated_spu_create(id=*0x%x, image=*0x%x, arg1=0x%llx, arg2=0x%llx, arg3=0x%llx, arg4=0x%llx)", id, image, arg1, arg2, arg3, arg4);
@ -1982,7 +1982,7 @@ error_code raw_spu_destroy(ppu_thread& ppu, u32 id)
error_code sys_raw_spu_destroy(ppu_thread& ppu, u32 id) error_code sys_raw_spu_destroy(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_raw_spu_destroy(id=%d)", id); sys_spu.warning("sys_raw_spu_destroy(id=%d)", id);
@ -1991,7 +1991,7 @@ error_code sys_raw_spu_destroy(ppu_thread& ppu, u32 id)
error_code sys_isolated_spu_destroy(ppu_thread& ppu, u32 id) error_code sys_isolated_spu_destroy(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_destroy(id=%d)", id); sys_spu.todo("sys_isolated_spu_destroy(id=%d)", id);
@ -2044,7 +2044,7 @@ error_code raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm::
error_code sys_raw_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr<u32> intrtag) error_code sys_raw_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr<u32> intrtag)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.warning("sys_raw_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag); sys_spu.warning("sys_raw_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag);
@ -2053,7 +2053,7 @@ error_code sys_raw_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_i
error_code sys_isolated_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr<u32> intrtag) error_code sys_isolated_spu_create_interrupt_tag(ppu_thread& ppu, u32 id, u32 class_id, u32 hwthread, vm::ptr<u32> intrtag)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag); sys_spu.todo("sys_isolated_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag=*0x%x)", id, class_id, hwthread, intrtag);
@ -2082,7 +2082,7 @@ error_code raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask)
error_code sys_raw_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask) error_code sys_raw_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask); sys_spu.trace("sys_raw_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask);
@ -2092,7 +2092,7 @@ error_code sys_raw_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 m
error_code sys_isolated_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask) error_code sys_isolated_spu_set_int_mask(ppu_thread& ppu, u32 id, u32 class_id, u64 mask)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask); sys_spu.todo("sys_isolated_spu_set_int_mask(id=%d, class_id=%d, mask=0x%llx)", id, class_id, mask);
@ -2121,7 +2121,7 @@ error_code raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat)
error_code sys_raw_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat) error_code sys_raw_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat); sys_spu.trace("sys_raw_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat);
@ -2130,7 +2130,7 @@ error_code sys_raw_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 s
error_code sys_isolated_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat) error_code sys_isolated_spu_set_int_stat(ppu_thread& ppu, u32 id, u32 class_id, u64 stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat); sys_spu.todo("sys_isolated_spu_set_int_stat(id=%d, class_id=%d, stat=0x%llx)", id, class_id, stat);
@ -2159,7 +2159,7 @@ error_code raw_spu_get_int_control(u32 id, u32 class_id, vm::ptr<u64> value, ato
error_code sys_raw_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> mask) error_code sys_raw_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> mask)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask); sys_spu.trace("sys_raw_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask);
@ -2168,7 +2168,7 @@ error_code sys_raw_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::p
error_code sys_isolated_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> mask) error_code sys_isolated_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> mask)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_isolated_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask); sys_spu.trace("sys_isolated_spu_get_int_mask(id=%d, class_id=%d, mask=*0x%x)", id, class_id, mask);
@ -2177,7 +2177,7 @@ error_code sys_isolated_spu_get_int_mask(ppu_thread& ppu, u32 id, u32 class_id,
error_code sys_raw_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> stat) error_code sys_raw_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat); sys_spu.trace("sys_raw_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat);
@ -2186,7 +2186,7 @@ error_code sys_raw_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::p
error_code sys_isolated_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> stat) error_code sys_isolated_spu_get_int_stat(ppu_thread& ppu, u32 id, u32 class_id, vm::ptr<u64> stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat); sys_spu.todo("sys_isolated_spu_get_int_stat(id=%d, class_id=%d, stat=*0x%x)", id, class_id, stat);
@ -2210,7 +2210,7 @@ error_code raw_spu_read_puint_mb(u32 id, vm::ptr<u32> value)
error_code sys_raw_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr<u32> value) error_code sys_raw_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr<u32> value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_read_puint_mb(id=%d, value=*0x%x)", id, value); sys_spu.trace("sys_raw_spu_read_puint_mb(id=%d, value=*0x%x)", id, value);
@ -2219,7 +2219,7 @@ error_code sys_raw_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr<u32> value
error_code sys_isolated_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr<u32> value) error_code sys_isolated_spu_read_puint_mb(ppu_thread& ppu, u32 id, vm::ptr<u32> value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_read_puint_mb(id=%d, value=*0x%x)", id, value); sys_spu.todo("sys_isolated_spu_read_puint_mb(id=%d, value=*0x%x)", id, value);
@ -2248,7 +2248,7 @@ error_code raw_spu_set_spu_cfg(u32 id, u32 value)
error_code sys_raw_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value) error_code sys_raw_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_set_spu_cfg(id=%d, value=0x%x)", id, value); sys_spu.trace("sys_raw_spu_set_spu_cfg(id=%d, value=0x%x)", id, value);
@ -2257,7 +2257,7 @@ error_code sys_raw_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value)
error_code sys_isolated_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value) error_code sys_isolated_spu_set_spu_cfg(ppu_thread& ppu, u32 id, u32 value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_set_spu_cfg(id=%d, value=0x%x)", id, value); sys_spu.todo("sys_isolated_spu_set_spu_cfg(id=%d, value=0x%x)", id, value);
@ -2281,7 +2281,7 @@ error_code raw_spu_get_spu_cfg(u32 id, vm::ptr<u32> value)
error_code sys_raw_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> value) error_code sys_raw_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.trace("sys_raw_spu_get_spu_afg(id=%d, value=*0x%x)", id, value); sys_spu.trace("sys_raw_spu_get_spu_afg(id=%d, value=*0x%x)", id, value);
@ -2290,7 +2290,7 @@ error_code sys_raw_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> value)
error_code sys_isolated_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> value) error_code sys_isolated_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> value)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_get_spu_afg(id=%d, value=*0x%x)", id, value); sys_spu.todo("sys_isolated_spu_get_spu_afg(id=%d, value=*0x%x)", id, value);
@ -2299,7 +2299,7 @@ error_code sys_isolated_spu_get_spu_cfg(ppu_thread& ppu, u32 id, vm::ptr<u32> va
error_code sys_isolated_spu_start(ppu_thread& ppu, u32 id) error_code sys_isolated_spu_start(ppu_thread& ppu, u32 id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_spu.todo("sys_isolated_spu_start(id=%d)", id); sys_spu.todo("sys_isolated_spu_start(id=%d)", id);

View File

@ -162,6 +162,7 @@ public:
static inline bool awake(cpu_thread* const thread, s32 prio = enqueue_cmd) static inline bool awake(cpu_thread* const thread, s32 prio = enqueue_cmd)
{ {
vm::temporary_unlock();
std::lock_guard lock(g_mutex); std::lock_guard lock(g_mutex);
return awake_unlocked(thread, prio); return awake_unlocked(thread, prio);
} }

View File

@ -61,7 +61,7 @@ void lv2_timer_context::operator()()
error_code sys_timer_create(ppu_thread& ppu, vm::ptr<u32> timer_id) error_code sys_timer_create(ppu_thread& ppu, vm::ptr<u32> timer_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.warning("sys_timer_create(timer_id=*0x%x)", timer_id); sys_timer.warning("sys_timer_create(timer_id=*0x%x)", timer_id);
@ -76,7 +76,7 @@ error_code sys_timer_create(ppu_thread& ppu, vm::ptr<u32> timer_id)
error_code sys_timer_destroy(ppu_thread& ppu, u32 timer_id) error_code sys_timer_destroy(ppu_thread& ppu, u32 timer_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.warning("sys_timer_destroy(timer_id=0x%x)", timer_id); sys_timer.warning("sys_timer_destroy(timer_id=0x%x)", timer_id);
@ -106,7 +106,7 @@ error_code sys_timer_destroy(ppu_thread& ppu, u32 timer_id)
error_code sys_timer_get_information(ppu_thread& ppu, u32 timer_id, vm::ptr<sys_timer_information_t> info) error_code sys_timer_get_information(ppu_thread& ppu, u32 timer_id, vm::ptr<sys_timer_information_t> info)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.trace("sys_timer_get_information(timer_id=0x%x, info=*0x%x)", timer_id, info); sys_timer.trace("sys_timer_get_information(timer_id=0x%x, info=*0x%x)", timer_id, info);
@ -128,7 +128,7 @@ error_code sys_timer_get_information(ppu_thread& ppu, u32 timer_id, vm::ptr<sys_
error_code _sys_timer_start(ppu_thread& ppu, u32 timer_id, u64 base_time, u64 period) error_code _sys_timer_start(ppu_thread& ppu, u32 timer_id, u64 base_time, u64 period)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.trace("_sys_timer_start(timer_id=0x%x, base_time=0x%llx, period=0x%llx)", timer_id, base_time, period); sys_timer.trace("_sys_timer_start(timer_id=0x%x, base_time=0x%llx, period=0x%llx)", timer_id, base_time, period);
@ -185,7 +185,7 @@ error_code _sys_timer_start(ppu_thread& ppu, u32 timer_id, u64 base_time, u64 pe
error_code sys_timer_stop(ppu_thread& ppu, u32 timer_id) error_code sys_timer_stop(ppu_thread& ppu, u32 timer_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.trace("sys_timer_stop()"); sys_timer.trace("sys_timer_stop()");
@ -206,7 +206,7 @@ error_code sys_timer_stop(ppu_thread& ppu, u32 timer_id)
error_code sys_timer_connect_event_queue(ppu_thread& ppu, u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2) error_code sys_timer_connect_event_queue(ppu_thread& ppu, u32 timer_id, u32 queue_id, u64 name, u64 data1, u64 data2)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.warning("sys_timer_connect_event_queue(timer_id=0x%x, queue_id=0x%x, name=0x%llx, data1=0x%llx, data2=0x%llx)", timer_id, queue_id, name, data1, data2); sys_timer.warning("sys_timer_connect_event_queue(timer_id=0x%x, queue_id=0x%x, name=0x%llx, data1=0x%llx, data2=0x%llx)", timer_id, queue_id, name, data1, data2);
@ -249,7 +249,7 @@ error_code sys_timer_connect_event_queue(ppu_thread& ppu, u32 timer_id, u32 queu
error_code sys_timer_disconnect_event_queue(ppu_thread& ppu, u32 timer_id) error_code sys_timer_disconnect_event_queue(ppu_thread& ppu, u32 timer_id)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.warning("sys_timer_disconnect_event_queue(timer_id=0x%x)", timer_id); sys_timer.warning("sys_timer_disconnect_event_queue(timer_id=0x%x)", timer_id);
@ -283,7 +283,7 @@ error_code sys_timer_disconnect_event_queue(ppu_thread& ppu, u32 timer_id)
error_code sys_timer_sleep(ppu_thread& ppu, u32 sleep_time) error_code sys_timer_sleep(ppu_thread& ppu, u32 sleep_time)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.trace("sys_timer_sleep(sleep_time=%d) -> sys_timer_usleep()", sleep_time); sys_timer.trace("sys_timer_sleep(sleep_time=%d) -> sys_timer_usleep()", sleep_time);
@ -292,7 +292,7 @@ error_code sys_timer_sleep(ppu_thread& ppu, u32 sleep_time)
error_code sys_timer_usleep(ppu_thread& ppu, u64 sleep_time) error_code sys_timer_usleep(ppu_thread& ppu, u64 sleep_time)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_timer.trace("sys_timer_usleep(sleep_time=0x%llx)", sleep_time); sys_timer.trace("sys_timer_usleep(sleep_time=0x%llx)", sleep_time);

View File

@ -35,7 +35,7 @@ struct sys_vm_global_t
error_code sys_vm_memory_map(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr<u32> addr) error_code sys_vm_memory_map(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr<u32> addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.error("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr); sys_vm.error("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr);
@ -94,7 +94,7 @@ error_code sys_vm_memory_map(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64
error_code sys_vm_memory_map_different(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr<u32> addr) error_code sys_vm_memory_map_different(ppu_thread& ppu, u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, vm::ptr<u32> addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_memory_map_different(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr); sys_vm.warning("sys_vm_memory_map_different(vsize=0x%x, psize=0x%x, cid=0x%x, flags=0x%llx, policy=0x%llx, addr=*0x%x)", vsize, psize, cid, flag, policy, addr);
// TODO: if needed implement different way to map memory, unconfirmed. // TODO: if needed implement different way to map memory, unconfirmed.
@ -104,7 +104,7 @@ error_code sys_vm_memory_map_different(ppu_thread& ppu, u32 vsize, u32 psize, u3
error_code sys_vm_unmap(ppu_thread& ppu, u32 addr) error_code sys_vm_unmap(ppu_thread& ppu, u32 addr)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_unmap(addr=0x%x)", addr); sys_vm.warning("sys_vm_unmap(addr=0x%x)", addr);
@ -135,7 +135,7 @@ error_code sys_vm_unmap(ppu_thread& ppu, u32 addr)
error_code sys_vm_append_memory(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_append_memory(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_append_memory(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_append_memory(addr=0x%x, size=0x%x)", addr, size);
@ -175,7 +175,7 @@ error_code sys_vm_append_memory(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_return_memory(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_return_memory(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_return_memory(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_return_memory(addr=0x%x, size=0x%x)", addr, size);
@ -226,7 +226,7 @@ error_code sys_vm_return_memory(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_lock(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_lock(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_lock(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_lock(addr=0x%x, size=0x%x)", addr, size);
@ -247,7 +247,7 @@ error_code sys_vm_lock(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_unlock(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_unlock(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_unlock(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_unlock(addr=0x%x, size=0x%x)", addr, size);
@ -268,7 +268,7 @@ error_code sys_vm_unlock(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_touch(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_touch(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_touch(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_touch(addr=0x%x, size=0x%x)", addr, size);
@ -289,7 +289,7 @@ error_code sys_vm_touch(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_flush(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_flush(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_flush(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_flush(addr=0x%x, size=0x%x)", addr, size);
@ -310,7 +310,7 @@ error_code sys_vm_flush(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_invalidate(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_invalidate(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_invalidate(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_invalidate(addr=0x%x, size=0x%x)", addr, size);
@ -331,7 +331,7 @@ error_code sys_vm_invalidate(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_store(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_store(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_store(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_store(addr=0x%x, size=0x%x)", addr, size);
@ -352,7 +352,7 @@ error_code sys_vm_store(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_sync(ppu_thread& ppu, u32 addr, u32 size) error_code sys_vm_sync(ppu_thread& ppu, u32 addr, u32 size)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_sync(addr=0x%x, size=0x%x)", addr, size); sys_vm.warning("sys_vm_sync(addr=0x%x, size=0x%x)", addr, size);
@ -373,7 +373,7 @@ error_code sys_vm_sync(ppu_thread& ppu, u32 addr, u32 size)
error_code sys_vm_test(ppu_thread& ppu, u32 addr, u32 size, vm::ptr<u64> result) error_code sys_vm_test(ppu_thread& ppu, u32 addr, u32 size, vm::ptr<u64> result)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_test(addr=0x%x, size=0x%x, result=*0x%x)", addr, size, result); sys_vm.warning("sys_vm_test(addr=0x%x, size=0x%x, result=*0x%x)", addr, size, result);
@ -391,7 +391,7 @@ error_code sys_vm_test(ppu_thread& ppu, u32 addr, u32 size, vm::ptr<u64> result)
error_code sys_vm_get_statistics(ppu_thread& ppu, u32 addr, vm::ptr<sys_vm_statistics_t> stat) error_code sys_vm_get_statistics(ppu_thread& ppu, u32 addr, vm::ptr<sys_vm_statistics_t> stat)
{ {
vm::temporary_unlock(ppu); ppu.state += cpu_flag::wait;
sys_vm.warning("sys_vm_get_statistics(addr=0x%x, stat=*0x%x)", addr, stat); sys_vm.warning("sys_vm_get_statistics(addr=0x%x, stat=*0x%x)", addr, stat);

View File

@ -86,7 +86,7 @@ namespace vm
if (!g_locks[i] && g_locks[i].compare_and_swap_test(nullptr, _cpu)) if (!g_locks[i] && g_locks[i].compare_and_swap_test(nullptr, _cpu))
{ {
g_tls_locked = g_locks.data() + i; g_tls_locked = g_locks.data() + i;
return; break;
} }
if (++i == max) i = 0; if (++i == max) i = 0;
@ -137,8 +137,23 @@ namespace vm
void passive_lock(cpu_thread& cpu) void passive_lock(cpu_thread& cpu)
{ {
if (g_tls_locked && *g_tls_locked == &cpu) [[unlikely]] if (!g_tls_locked || *g_tls_locked != &cpu) [[unlikely]]
{ {
_register_lock(&cpu);
if (cpu.state) [[likely]]
{
cpu.state -= cpu_flag::wait + cpu_flag::memory;
}
if (g_mutex.is_lockable())
{
return;
}
cpu.state += cpu_flag::wait;
}
if (cpu.state & cpu_flag::wait) if (cpu.state & cpu_flag::wait)
{ {
while (true) while (true)
@ -154,30 +169,6 @@ namespace vm
cpu.state += cpu_flag::wait; cpu.state += cpu_flag::wait;
} }
} }
return;
}
if (cpu.state & cpu_flag::memory)
{
cpu.state -= cpu_flag::memory + cpu_flag::wait;
}
if (g_mutex.is_lockable()) [[likely]]
{
// Optimistic path (hope that mutex is not exclusively locked)
_register_lock(&cpu);
if (g_mutex.is_lockable()) [[likely]]
{
return;
}
passive_unlock(cpu);
}
::reader_lock lock(g_mutex);
_register_lock(&cpu);
} }
atomic_t<u64>* range_lock(u32 addr, u32 end) atomic_t<u64>* range_lock(u32 addr, u32 end)
@ -284,7 +275,7 @@ namespace vm
void temporary_unlock(cpu_thread& cpu) noexcept void temporary_unlock(cpu_thread& cpu) noexcept
{ {
cpu.state += cpu_flag::wait; if (!(cpu.state & cpu_flag::wait)) cpu.state += cpu_flag::wait;
if (g_tls_locked && g_tls_locked->compare_and_swap_test(&cpu, nullptr)) if (g_tls_locked && g_tls_locked->compare_and_swap_test(&cpu, nullptr))
{ {
@ -304,17 +295,23 @@ namespace vm
{ {
auto cpu = get_current_cpu_thread(); auto cpu = get_current_cpu_thread();
if (!cpu || !g_tls_locked || !g_tls_locked->compare_and_swap_test(cpu, nullptr)) if (cpu)
{
if (!g_tls_locked || *g_tls_locked != cpu)
{ {
cpu = nullptr; cpu = nullptr;
} }
else
{
cpu->state += cpu_flag::wait;
}
}
g_mutex.lock_shared(); g_mutex.lock_shared();
if (cpu) if (cpu)
{ {
_register_lock(cpu); cpu->state -= cpu_flag::memory + cpu_flag::wait;
cpu->state -= cpu_flag::memory;
} }
} }
@ -345,10 +342,17 @@ namespace vm
{ {
auto cpu = get_current_cpu_thread(); auto cpu = get_current_cpu_thread();
if (!cpu || !g_tls_locked || !g_tls_locked->compare_and_swap_test(cpu, nullptr)) if (cpu)
{
if (!g_tls_locked || *g_tls_locked != cpu)
{ {
cpu = nullptr; cpu = nullptr;
} }
else
{
cpu->state += cpu_flag::wait;
}
}
g_mutex.lock(); g_mutex.lock();
@ -356,7 +360,7 @@ namespace vm
{ {
for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++) for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++)
{ {
if (cpu_thread* ptr = *lock) if (auto ptr = +*lock; ptr && !(ptr->state & cpu_flag::memory))
{ {
ptr->state.test_and_set(cpu_flag::memory); ptr->state.test_and_set(cpu_flag::memory);
} }
@ -394,9 +398,9 @@ namespace vm
for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++) for (auto lock = g_locks.cbegin(), end = lock + g_cfg.core.ppu_threads; lock != end; lock++)
{ {
cpu_thread* ptr; if (auto ptr = +*lock)
while ((ptr = *lock) && !(ptr->state & cpu_flag::wait))
{ {
while (!(ptr->state & cpu_flag::wait))
_mm_pause(); _mm_pause();
} }
} }
@ -404,8 +408,7 @@ namespace vm
if (cpu) if (cpu)
{ {
_register_lock(cpu); cpu->state -= cpu_flag::memory + cpu_flag::wait;
cpu->state -= cpu_flag::memory;
} }
} }