diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc index 2486f1f34..a289718fb 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.cc @@ -307,6 +307,49 @@ SHIM_CALL KeTlsSetValue_shim( } +int32_t xeKeResetEvent(void* event_ptr) { + return 0; +} + + +SHIM_CALL KeResetEvent_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + uint32_t event_ref = SHIM_GET_ARG_32(0); + + XELOGD( + "KeResetEvent(%.4X)", + event_ref); + + void* event_ptr = SHIM_MEM_ADDR(event_ref); + int32_t result = xeKeResetEvent(event_ptr); + + SHIM_SET_RETURN(result); +} + + +int32_t xeKeSetEvent(void* event_ptr, uint32_t increment, uint32_t wait) { + return 0; +} + + +SHIM_CALL KeSetEvent_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + uint32_t event_ref = SHIM_GET_ARG_32(0); + uint32_t increment = SHIM_GET_ARG_32(1); + uint32_t wait = SHIM_GET_ARG_32(2); + + XELOGD( + "KeSetEvent(%.4X, %.4X, %.4X)", + event_ref, increment, wait); + + void* event_ptr = SHIM_MEM_ADDR(event_ref); + int32_t result = xeKeSetEvent( + event_ptr, increment, wait); + + SHIM_SET_RETURN(result); +} + + X_STATUS xeKeWaitForSingleObject( void* object_ptr, uint32_t wait_reason, uint32_t processor_mode, uint32_t alertable, uint32_t* opt_timeout) { @@ -352,5 +395,8 @@ void xe::kernel::xboxkrnl::RegisterThreadingExports( SHIM_SET_MAPPING("xboxkrnl.exe", KeTlsGetValue, state); SHIM_SET_MAPPING("xboxkrnl.exe", KeTlsSetValue, state); + SHIM_SET_MAPPING("xboxkrnl.exe", KeResetEvent, state); + SHIM_SET_MAPPING("xboxkrnl.exe", KeSetEvent, state); + SHIM_SET_MAPPING("xboxkrnl.exe", KeWaitForSingleObject, state); } diff --git a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h index c8b9db654..f265225bb 100644 --- a/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h +++ b/src/xenia/kernel/modules/xboxkrnl/xboxkrnl_threading.h @@ -33,6 +33,9 @@ int KeTlsFree(uint32_t tls_index); uint32_t xeKeTlsGetValue(uint32_t tls_index); int xeKeTlsSetValue(uint32_t tls_index, uint32_t tls_value); +int32_t xeKeResetEvent(void* event_ptr); +int32_t xeKeSetEvent(void* event_ptr, uint32_t increment, uint32_t wait); + X_STATUS xeKeWaitForSingleObject( void* object_ptr, uint32_t wait_reason, uint32_t processor_mode, uint32_t alertable, uint64_t* opt_timeout);