summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
-rw-r--r--src/core/hle/kernel/thread.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index c7731c9e9..afaf0cd5d 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -107,6 +107,8 @@ void Thread::Stop() {
107 for (auto& wait_object : wait_objects) { 107 for (auto& wait_object : wait_objects) {
108 wait_object->RemoveWaitingThread(this); 108 wait_object->RemoveWaitingThread(this);
109 } 109 }
110
111 Kernel::g_current_process->used_tls_slots[tls_index] = false;
110} 112}
111 113
112Thread* ArbitrateHighestPriorityThread(u32 address) { 114Thread* ArbitrateHighestPriorityThread(u32 address) {
@@ -408,12 +410,19 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point,
408 thread->name = std::move(name); 410 thread->name = std::move(name);
409 thread->callback_handle = wakeup_callback_handle_table.Create(thread).MoveFrom(); 411 thread->callback_handle = wakeup_callback_handle_table.Create(thread).MoveFrom();
410 thread->owner_process = g_current_process; 412 thread->owner_process = g_current_process;
413 thread->tls_index = -1;
414
415 // Find the next available TLS index, and mark it as used
416 auto& used_tls_slots = Kernel::g_current_process->used_tls_slots;
417 for (unsigned int i = 0; i < used_tls_slots.size(); ++i) {
418 if (used_tls_slots[i] == false) {
419 thread->tls_index = i;
420 used_tls_slots[i] = true;
421 break;
422 }
423 }
411 424
412 VAddr tls_address = Memory::TLS_AREA_VADDR + (thread->thread_id - 1) * 0x200; 425 ASSERT_MSG(thread->tls_index != -1, "Out of TLS space");
413
414 ASSERT_MSG(tls_address < Memory::TLS_AREA_VADDR_END, "Too many threads");
415
416 thread->tls_address = tls_address;
417 426
418 // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used 427 // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used
419 // to initialize the context 428 // to initialize the context
@@ -502,7 +511,7 @@ void Thread::SetWaitSynchronizationOutput(s32 output) {
502} 511}
503 512
504VAddr Thread::GetTLSAddress() const { 513VAddr Thread::GetTLSAddress() const {
505 return tls_address; 514 return Memory::TLS_AREA_VADDR + tls_index * 0x200;
506} 515}
507 516
508//////////////////////////////////////////////////////////////////////////////////////////////////// 517////////////////////////////////////////////////////////////////////////////////////////////////////