diff options
| author | Lioncash <mathew1800@gmail.com> | 2018-08-03 20:45:39 -0400 |
|---|---|---|
| committer | Lioncash <mathew1800@gmail.com> | 2018-08-03 23:49:10 -0400 |
| commit | 6f3a3ed8c5a786d14f0238c21f1442fbb0397583 (patch) | |
| tree | 3c54d3fc5af88d887123897e0c69b7dd54e2601e /src/core/hle/kernel/thread.cpp | |
| parent | 67b4326d93e2c88374ab1394c8df69880b0e5207 (diff) | |
kernel/thread: Fix potential crashes introduced in 3bcf090d37e20e0096954c478179487d071bb37b
This amends cases where crashes can occur that were missed due to the
odd way the previous code was set up (using 3DS memory regions that
don't exist).
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index ea9554cbb5..b9022feae2 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -339,6 +339,17 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, tls_slots.emplace_back(0); // The page is completely available at the start available_page = tls_slots.size() - 1; available_slot = 0; // Use the first slot in the new page + + // Allocate some memory from the end of the linear heap for this region. + const size_t offset = thread->tls_memory->size(); + thread->tls_memory->insert(thread->tls_memory->end(), Memory::PAGE_SIZE, 0); + + auto& vm_manager = owner_process->vm_manager; + vm_manager.RefreshMemoryBlockMappings(thread->tls_memory.get()); + + vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE, + thread->tls_memory, 0, Memory::PAGE_SIZE, + MemoryState::ThreadLocal); } // Mark the slot as used |
