diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index bd6c41324..a79301c8d 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -1782,6 +1782,36 @@ pointer_result_t InterlockedFlushSList_entry( } DECLARE_XBOXKRNL_EXPORT1(InterlockedFlushSList, kThreading, kImplemented); +dword_result_t KeSetPriorityThread_entry(pointer_t thread_ptr, + dword_t new_priority, + const ppc_context_t& context) { + if (!thread_ptr) { + XELOGE("{}: Invalid thread_ptr.", __func__); + return 0; + } + + if (thread_ptr->header.type != 6) { + XELOGW("{}: Invalid object type: {}", __func__, thread_ptr->header.type); + } + + X_KPRCB* prcb = context->TranslateVirtual(thread_ptr->a_prcb_ptr); + const uint32_t old_irql = xeKeKfAcquireSpinLock(context, &prcb->spin_lock); + const uint8_t old_priority = thread_ptr->priority; + + auto thread_ref = + XObject::GetNativeObject(kernel_state(), thread_ptr); + + if (!thread_ref) { + XELOGW("{}: Missing native thread: {}", __func__, thread_ptr->header.type); + } else { + thread_ref->SetPriority(new_priority); + } + + xeKeKfReleaseSpinLock(context, &prcb->spin_lock, old_irql); + return old_priority; +} +DECLARE_XBOXKRNL_EXPORT1(KeSetPriorityThread, kThreading, kImplemented); + } // namespace xboxkrnl } // namespace kernel } // namespace xe diff --git a/src/xenia/kernel/xthread.h b/src/xenia/kernel/xthread.h index 89f4c9348..d8664e5a2 100644 --- a/src/xenia/kernel/xthread.h +++ b/src/xenia/kernel/xthread.h @@ -107,7 +107,7 @@ struct X_KPRCB { xe::be dpc_lock; // 0x44 X_LIST_ENTRY queued_dpcs_list_head; // 0x48 xe::be dpc_active; // 0x50 - xe::be unk_54; // 0x54 + X_KSPINLOCK spin_lock; // 0x54 xe::be unk_58; // 0x58 // definitely scheduler related X_SINGLE_LIST_ENTRY unk_5C; // 0x5C