summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2017-12-31 17:23:36 -0500
committerGravatar bunnei2017-12-31 17:23:36 -0500
commit1cb978eb82253d6869d1c3729e976a98fb5a7a9c (patch)
tree8e1045990a52e489b6e7441aca8c68893959d6e7
parentsvc: Implement svcExitThread. (diff)
downloadyuzu-1cb978eb82253d6869d1c3729e976a98fb5a7a9c.tar.gz
yuzu-1cb978eb82253d6869d1c3729e976a98fb5a7a9c.tar.xz
yuzu-1cb978eb82253d6869d1c3729e976a98fb5a7a9c.zip
thread: Keep track of the initially created handle.
This is kinda crufty, but we need it for now to update guest state variables.
-rw-r--r--src/core/hle/kernel/thread.cpp3
-rw-r--r--src/core/hle/kernel/thread.h3
-rw-r--r--src/core/hle/svc.cpp3
3 files changed, 7 insertions, 2 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index b20092761..1588cfc7e 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -502,7 +502,8 @@ SharedPtr<Thread> SetupMainThread(VAddr entry_point, u32 priority,
502 SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); 502 SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
503 503
504 // Register 1 must be a handle to the main thread 504 // Register 1 must be a handle to the main thread
505 thread->context.cpu_registers[1] = Kernel::g_handle_table.Create(thread).Unwrap(); 505 thread->guest_handle = Kernel::g_handle_table.Create(thread).Unwrap();;
506 thread->context.cpu_registers[1] = thread->guest_handle;
506 thread->context.fpscr = 507 thread->context.fpscr =
507 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010 508 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010
508 509
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index 25d678ba3..ed44ee933 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -212,6 +212,9 @@ public:
212 212
213 std::string name; 213 std::string name;
214 214
215 /// Handle used by guest emulated application to access this thread
216 Handle guest_handle;
217
215 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue. 218 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
216 Handle callback_handle; 219 Handle callback_handle;
217 220
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index bffa18c39..133b868f2 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -268,7 +268,8 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
268 thread->context.fpscr = 268 thread->context.fpscr =
269 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO; // 0x03C00000 269 FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO; // 0x03C00000
270 270
271 CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(std::move(thread))); 271 CASCADE_RESULT(thread->guest_handle, Kernel::g_handle_table.Create(thread));
272 *out_handle = thread->guest_handle;
272 273
273 Core::System::GetInstance().PrepareReschedule(); 274 Core::System::GetInstance().PrepareReschedule();
274 275