XThread bool guest thread
This commit is contained in:
parent
6bb5b002e0
commit
4fdebd530f
|
@ -41,7 +41,8 @@ xe::mutex critical_region_;
|
||||||
|
|
||||||
XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
|
XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
|
||||||
uint32_t xapi_thread_startup, uint32_t start_address,
|
uint32_t xapi_thread_startup, uint32_t start_address,
|
||||||
uint32_t start_context, uint32_t creation_flags)
|
uint32_t start_context, uint32_t creation_flags,
|
||||||
|
bool guest_thread)
|
||||||
: XObject(kernel_state, kTypeThread),
|
: XObject(kernel_state, kTypeThread),
|
||||||
thread_id_(++next_xthread_id),
|
thread_id_(++next_xthread_id),
|
||||||
thread_handle_(0),
|
thread_handle_(0),
|
||||||
|
@ -50,7 +51,8 @@ XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
|
||||||
thread_state_(0),
|
thread_state_(0),
|
||||||
priority_(0),
|
priority_(0),
|
||||||
affinity_(0),
|
affinity_(0),
|
||||||
irql_(0) {
|
irql_(0),
|
||||||
|
guest_thread_(guest_thread) {
|
||||||
creation_params_.stack_size = stack_size;
|
creation_params_.stack_size = stack_size;
|
||||||
creation_params_.xapi_thread_startup = xapi_thread_startup;
|
creation_params_.xapi_thread_startup = xapi_thread_startup;
|
||||||
creation_params_.start_address = start_address;
|
creation_params_.start_address = start_address;
|
||||||
|
@ -758,7 +760,7 @@ void* XThread::GetWaitHandle() { return event_->GetWaitHandle(); }
|
||||||
|
|
||||||
XHostThread::XHostThread(KernelState* kernel_state, uint32_t stack_size,
|
XHostThread::XHostThread(KernelState* kernel_state, uint32_t stack_size,
|
||||||
uint32_t creation_flags, std::function<int()> host_fn)
|
uint32_t creation_flags, std::function<int()> host_fn)
|
||||||
: XThread(kernel_state, stack_size, 0, 0, 0, creation_flags),
|
: XThread(kernel_state, stack_size, 0, 0, 0, creation_flags, false),
|
||||||
host_fn_(host_fn) {}
|
host_fn_(host_fn) {}
|
||||||
|
|
||||||
void XHostThread::Execute() {
|
void XHostThread::Execute() {
|
||||||
|
|
|
@ -81,7 +81,7 @@ class XThread : public XObject {
|
||||||
public:
|
public:
|
||||||
XThread(KernelState* kernel_state, uint32_t stack_size,
|
XThread(KernelState* kernel_state, uint32_t stack_size,
|
||||||
uint32_t xapi_thread_startup, uint32_t start_address,
|
uint32_t xapi_thread_startup, uint32_t start_address,
|
||||||
uint32_t start_context, uint32_t creation_flags);
|
uint32_t start_context, uint32_t creation_flags, bool guest_thread);
|
||||||
virtual ~XThread();
|
virtual ~XThread();
|
||||||
|
|
||||||
static bool IsInThread(XThread* other);
|
static bool IsInThread(XThread* other);
|
||||||
|
@ -92,6 +92,7 @@ class XThread : public XObject {
|
||||||
uint32_t tls_ptr() const { return tls_address_; }
|
uint32_t tls_ptr() const { return tls_address_; }
|
||||||
uint32_t pcr_ptr() const { return pcr_address_; }
|
uint32_t pcr_ptr() const { return pcr_address_; }
|
||||||
uint32_t thread_state_ptr() const { return thread_state_address_; }
|
uint32_t thread_state_ptr() const { return thread_state_address_; }
|
||||||
|
bool guest_thread() const { return guest_thread_; }
|
||||||
|
|
||||||
cpu::ThreadState* thread_state() const { return thread_state_; }
|
cpu::ThreadState* thread_state() const { return thread_state_; }
|
||||||
uint32_t thread_id() const { return thread_id_; }
|
uint32_t thread_id() const { return thread_id_; }
|
||||||
|
@ -156,6 +157,7 @@ class XThread : public XObject {
|
||||||
uint32_t pcr_address_;
|
uint32_t pcr_address_;
|
||||||
uint32_t thread_state_address_;
|
uint32_t thread_state_address_;
|
||||||
cpu::ThreadState* thread_state_;
|
cpu::ThreadState* thread_state_;
|
||||||
|
bool guest_thread_; // Launched into guest code?
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ X_STATUS XUserModule::Launch(uint32_t flags) {
|
||||||
|
|
||||||
// Create a thread to run in.
|
// Create a thread to run in.
|
||||||
auto thread = object_ref<XThread>(
|
auto thread = object_ref<XThread>(
|
||||||
new XThread(kernel_state(), stack_size_, 0, entry_point_, 0, 0));
|
new XThread(kernel_state(), stack_size_, 0, entry_point_, 0, 0, true));
|
||||||
|
|
||||||
X_STATUS result = thread->Create();
|
X_STATUS result = thread->Create();
|
||||||
if (XFAILED(result)) {
|
if (XFAILED(result)) {
|
||||||
|
|
|
@ -117,7 +117,7 @@ SHIM_CALL ExCreateThread_shim(PPCContext* ppc_context,
|
||||||
|
|
||||||
auto thread = object_ref<XThread>(
|
auto thread = object_ref<XThread>(
|
||||||
new XThread(kernel_state, stack_size, xapi_thread_startup, start_address,
|
new XThread(kernel_state, stack_size, xapi_thread_startup, start_address,
|
||||||
start_context, creation_flags));
|
start_context, creation_flags, true));
|
||||||
|
|
||||||
X_STATUS result = thread->Create();
|
X_STATUS result = thread->Create();
|
||||||
if (XFAILED(result)) {
|
if (XFAILED(result)) {
|
||||||
|
|
Loading…
Reference in New Issue