Partial thread data plumbing.
This commit is contained in:
@@ -46,6 +46,8 @@ XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
|
||||
pcr_address_(0),
|
||||
thread_state_address_(0),
|
||||
thread_state_(0),
|
||||
priority_(0),
|
||||
affinity_(0),
|
||||
irql_(0) {
|
||||
creation_params_.stack_size = stack_size;
|
||||
creation_params_.xapi_thread_startup = xapi_thread_startup;
|
||||
@@ -613,6 +615,7 @@ void XThread::RundownAPCs() {
|
||||
int32_t XThread::QueryPriority() { return GetThreadPriority(thread_handle_); }
|
||||
|
||||
void XThread::SetPriority(int32_t increment) {
|
||||
priority_ = increment;
|
||||
int target_priority = 0;
|
||||
if (increment > 0x22) {
|
||||
target_priority = THREAD_PRIORITY_HIGHEST;
|
||||
@@ -647,11 +650,17 @@ void XThread::SetAffinity(uint32_t affinity) {
|
||||
XELOGW("Too few processors - scheduling will be wonky");
|
||||
}
|
||||
SetActiveCpu(GetFakeCpuNumber(affinity));
|
||||
affinity_ = affinity;
|
||||
if (!FLAGS_ignore_thread_affinities) {
|
||||
SetThreadAffinityMask(reinterpret_cast<HANDLE>(thread_handle_), affinity);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t XThread::active_cpu() const {
|
||||
uint8_t* pcr = memory()->TranslateVirtual(pcr_address_);
|
||||
return xe::load_and_swap<uint8_t>(pcr + 0x10C);
|
||||
}
|
||||
|
||||
void XThread::SetActiveCpu(uint32_t cpu_index) {
|
||||
uint8_t* pcr = memory()->TranslateVirtual(pcr_address_);
|
||||
xe::store_and_swap<uint8_t>(pcr + 0x10C, cpu_index);
|
||||
|
||||
@@ -85,6 +85,7 @@ class XThread : public XObject {
|
||||
static uint32_t GetCurrentThreadHandle();
|
||||
static uint32_t GetCurrentThreadId(const uint8_t* pcr);
|
||||
|
||||
uint32_t tls_ptr() const { return tls_address_; }
|
||||
uint32_t pcr_ptr() const { return pcr_address_; }
|
||||
uint32_t thread_state_ptr() const { return thread_state_address_; }
|
||||
|
||||
@@ -112,9 +113,12 @@ class XThread : public XObject {
|
||||
void EnqueueApc(uint32_t normal_routine, uint32_t normal_context,
|
||||
uint32_t arg1, uint32_t arg2);
|
||||
|
||||
int32_t priority() const { return priority_; }
|
||||
int32_t QueryPriority();
|
||||
void SetPriority(int32_t increment);
|
||||
uint32_t affinity() const { return affinity_; }
|
||||
void SetAffinity(uint32_t affinity);
|
||||
uint32_t active_cpu() const;
|
||||
void SetActiveCpu(uint32_t cpu_index);
|
||||
|
||||
X_STATUS Resume(uint32_t* out_suspend_count = nullptr);
|
||||
@@ -151,6 +155,9 @@ class XThread : public XObject {
|
||||
|
||||
std::string name_;
|
||||
|
||||
int32_t priority_;
|
||||
uint32_t affinity_;
|
||||
|
||||
std::atomic<uint32_t> irql_;
|
||||
xe::mutex apc_lock_;
|
||||
NativeList* apc_list_;
|
||||
|
||||
Reference in New Issue
Block a user