Implement SPU page faults notifications

* Implement both RawSPU and threaded SPU page fault recovery
* Guard page_fault_notification_entries access with a mutex
* Add missing lock in sys_ppu_thread_recover_page_fault/get_page_fault_context
* Fix EINVAL check in sys_ppu_thread_recover_page_fault, previously when the event was not found begin() was erased and
CELL_OK was returned.
* Fixed page fault recovery waiting logic:
- Do not rely on a single thread_ctrl notification (unsafe)
- Avoided a race where ::awake(ppu) can be called before ::sleep(ppu) therefore nop-ing out the notification
* Avoid inconsistencies with vm flags on page fault cause detection
* Fix sys_mmapper_enable_page_fault_notification EBUSY check
from RE it's allowed to register the same queue twice (on a different area) but not to enable page fault notifications twice
This commit is contained in:
eladash 2019-02-17 17:53:38 +02:00 committed by Ivan
parent 1875dc3f18
commit 4a28319edf
7 changed files with 212 additions and 99 deletions

View file

@ -257,8 +257,8 @@ const std::array<ppu_function_t, 1024> s_ppu_syscall_table
uns_func, //195 (0x0C3) UNS
BIND_FUNC(sys_raw_spu_set_spu_cfg), //196 (0x0C4)
BIND_FUNC(sys_raw_spu_get_spu_cfg), //197 (0x0C5)
null_func,//BIND_FUNC(sys_spu_thread_recover_page_fault)//198 (0x0C6)
null_func,//BIND_FUNC(sys_raw_spu_recover_page_fault) //199 (0x0C7)
BIND_FUNC(sys_spu_thread_recover_page_fault), //198 (0x0C6)
BIND_FUNC(sys_raw_spu_recover_page_fault), //199 (0x0C7)
null_func, null_func, null_func, null_func, null_func, //204 UNS?
null_func, null_func, null_func, null_func, null_func, //209 UNS?