From 1ebf7bb484f7bc64ff3fe392db129bd5c38210e3 Mon Sep 17 00:00:00 2001 From: gibbed Date: Sun, 4 Aug 2019 11:36:31 -0500 Subject: [PATCH] [Kernel] Implement KeTryToAcquireSpinLockAtRaisedIrql. Maybe correctly. --- src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index fc220404e..217538bda 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -922,6 +922,17 @@ void KeAcquireSpinLockAtRaisedIrql(lpdword_t lock_ptr) { DECLARE_XBOXKRNL_EXPORT3(KeAcquireSpinLockAtRaisedIrql, kThreading, kImplemented, kBlocking, kHighFrequency); +dword_t KeTryToAcquireSpinLockAtRaisedIrql(lpdword_t lock_ptr) { + // Lock. + auto lock = reinterpret_cast(lock_ptr.host_address()); + if (!xe::atomic_cas(0, 1, lock)) { + return 0; + } + return 1; +} +DECLARE_XBOXKRNL_EXPORT4(KeTryToAcquireSpinLockAtRaisedIrql, kThreading, + kImplemented, kBlocking, kHighFrequency, kSketchy); + void KeReleaseSpinLockFromRaisedIrql(lpdword_t lock_ptr) { // Unlock. auto lock = reinterpret_cast(lock_ptr.host_address());