kernel: Handle page table switching within MakeCurrentProcess()
Centralizes the page table switching to one spot, rather than making calling code deal with it everywhere.
This commit is contained in:
		| @@ -21,6 +21,7 @@ | |||||||
| #include "core/hle/kernel/thread.h" | #include "core/hle/kernel/thread.h" | ||||||
| #include "core/hle/lock.h" | #include "core/hle/lock.h" | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
|  | #include "core/memory.h" | ||||||
|  |  | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
|  |  | ||||||
| @@ -181,6 +182,7 @@ void KernelCore::AppendNewProcess(SharedPtr<Process> process) { | |||||||
|  |  | ||||||
| void KernelCore::MakeCurrentProcess(Process* process) { | void KernelCore::MakeCurrentProcess(Process* process) { | ||||||
|     impl->current_process = process; |     impl->current_process = process; | ||||||
|  |     Memory::SetCurrentPageTable(&process->VMManager().page_table); | ||||||
| } | } | ||||||
|  |  | ||||||
| Process* KernelCore::CurrentProcess() { | Process* KernelCore::CurrentProcess() { | ||||||
|   | |||||||
| @@ -32,9 +32,6 @@ namespace { | |||||||
|  * @param priority The priority to give the main thread |  * @param priority The priority to give the main thread | ||||||
|  */ |  */ | ||||||
| void SetupMainThread(Process& owner_process, KernelCore& kernel, VAddr entry_point, u32 priority) { | void SetupMainThread(Process& owner_process, KernelCore& kernel, VAddr entry_point, u32 priority) { | ||||||
|     // Setup page table so we can write to memory |  | ||||||
|     Memory::SetCurrentPageTable(&owner_process.VMManager().page_table); |  | ||||||
|  |  | ||||||
|     // Initialize new "main" thread |     // Initialize new "main" thread | ||||||
|     const VAddr stack_top = owner_process.VMManager().GetTLSIORegionEndAddress(); |     const VAddr stack_top = owner_process.VMManager().GetTLSIORegionEndAddress(); | ||||||
|     auto thread_res = Thread::Create(kernel, "main", entry_point, priority, 0, |     auto thread_res = Thread::Create(kernel, "main", entry_point, priority, 0, | ||||||
|   | |||||||
| @@ -101,7 +101,6 @@ void Scheduler::SwitchContext(Thread* new_thread) { | |||||||
|         auto* const thread_owner_process = current_thread->GetOwnerProcess(); |         auto* const thread_owner_process = current_thread->GetOwnerProcess(); | ||||||
|         if (previous_process != thread_owner_process) { |         if (previous_process != thread_owner_process) { | ||||||
|             system.Kernel().MakeCurrentProcess(thread_owner_process); |             system.Kernel().MakeCurrentProcess(thread_owner_process); | ||||||
|             Memory::SetCurrentPageTable(&thread_owner_process->VMManager().page_table); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         cpu_core.LoadContext(new_thread->GetContext()); |         cpu_core.LoadContext(new_thread->GetContext()); | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) | |||||||
|     : mutable_memory(mutable_memory_), |     : mutable_memory(mutable_memory_), | ||||||
|       test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} { |       test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} { | ||||||
|     auto process = Kernel::Process::Create(Core::System::GetInstance(), ""); |     auto process = Kernel::Process::Create(Core::System::GetInstance(), ""); | ||||||
|     kernel.MakeCurrentProcess(process.get()); |  | ||||||
|     page_table = &process->VMManager().page_table; |     page_table = &process->VMManager().page_table; | ||||||
|  |  | ||||||
|     std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr); |     std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr); | ||||||
| @@ -28,7 +27,7 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) | |||||||
|     Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); |     Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); | ||||||
|     Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); |     Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); | ||||||
|  |  | ||||||
|     Memory::SetCurrentPageTable(page_table); |     kernel.MakeCurrentProcess(process.get()); | ||||||
| } | } | ||||||
|  |  | ||||||
| TestEnvironment::~TestEnvironment() { | TestEnvironment::~TestEnvironment() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user