mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-24 12:26:26 -05:00
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:
parent
864280fabc
commit
e779686a76
4 changed files with 3 additions and 6 deletions
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue