diff options
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 21 |
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 | ||
| 112 | Thread* ArbitrateHighestPriorityThread(u32 address) { | 114 | Thread* 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 | ||
| 504 | VAddr Thread::GetTLSAddress() const { | 513 | VAddr Thread::GetTLSAddress() const { |
| 505 | return tls_address; | 514 | return Memory::TLS_AREA_VADDR + tls_index * 0x200; |
| 506 | } | 515 | } |
| 507 | 516 | ||
| 508 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 517 | //////////////////////////////////////////////////////////////////////////////////////////////////// |