mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00: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
					
				@ -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 New Issue
	
	Block a user