[Threading] Implement priority boost on wake
When a thread wakes from a kernel wait, the Xenon scheduler boosts its effective priority by the increment passed to the signaling call (KeSetEvent, KeReleaseSemaphore, KeReleaseMutant). The boost is clamped to the per-thread max_dynamic_priority cap, respects the guest boost_disabled flag, and is drained on the next quantum expiry. Guest KTHREAD priority fields are now initialized from parent process defaults, and the previously unknown fields involved have been renamed to match their identified purpose.
This commit is contained in:
@@ -66,10 +66,10 @@ struct X_KPROCESS {
|
||||
// so it sets this ptr to 0x1C0000
|
||||
xe::be<uint32_t> clrdataa_masked_ptr;
|
||||
xe::be<uint32_t> thread_count;
|
||||
uint8_t unk_18;
|
||||
uint8_t unk_19;
|
||||
uint8_t unk_1A;
|
||||
uint8_t unk_1B;
|
||||
uint8_t process_priority_class;
|
||||
uint8_t default_thread_priority;
|
||||
uint8_t max_dynamic_priority;
|
||||
uint8_t disable_quantum_decay;
|
||||
xe::be<uint32_t> kernel_stack_size;
|
||||
xe::be<uint32_t> tls_static_data_address;
|
||||
xe::be<uint32_t> tls_data_size;
|
||||
@@ -332,8 +332,9 @@ class KernelState {
|
||||
|
||||
private:
|
||||
void LoadKernelModule(object_ref<KernelModule> kernel_module);
|
||||
void InitializeProcess(X_KPROCESS* process, uint32_t type, char unk_18,
|
||||
char unk_19, char unk_1A);
|
||||
void InitializeProcess(X_KPROCESS* process, uint32_t type,
|
||||
char priority_class, char default_priority,
|
||||
char max_dynamic_priority);
|
||||
void SetProcessTLSVars(X_KPROCESS* process, int num_slots, int tls_data_size,
|
||||
int tls_static_data_address);
|
||||
void InitializeKernelGuestGlobals();
|
||||
|
||||
Reference in New Issue
Block a user