Merge pull request #2361 from lioncash/pagetable
core/memory: Minor simplifications to page table management
This commit is contained in:
		@@ -163,7 +163,6 @@ MICROPROFILE_DEFINE(ARM_Jit_Dynarmic, "ARM JIT", "Dynarmic", MP_RGB(255, 64, 64)
 | 
			
		||||
 | 
			
		||||
void ARM_Dynarmic::Run() {
 | 
			
		||||
    MICROPROFILE_SCOPE(ARM_Jit_Dynarmic);
 | 
			
		||||
    ASSERT(Memory::GetCurrentPageTable() == current_page_table);
 | 
			
		||||
 | 
			
		||||
    jit->Run();
 | 
			
		||||
}
 | 
			
		||||
@@ -278,7 +277,6 @@ void ARM_Dynarmic::ClearExclusiveState() {
 | 
			
		||||
 | 
			
		||||
void ARM_Dynarmic::PageTableChanged() {
 | 
			
		||||
    jit = MakeJit();
 | 
			
		||||
    current_page_table = Memory::GetCurrentPageTable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DynarmicExclusiveMonitor::DynarmicExclusiveMonitor(std::size_t core_count) : monitor(core_count) {}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,10 +12,6 @@
 | 
			
		||||
#include "core/arm/exclusive_monitor.h"
 | 
			
		||||
#include "core/arm/unicorn/arm_unicorn.h"
 | 
			
		||||
 | 
			
		||||
namespace Common {
 | 
			
		||||
struct PageTable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Core::Timing {
 | 
			
		||||
class CoreTiming;
 | 
			
		||||
}
 | 
			
		||||
@@ -69,8 +65,6 @@ private:
 | 
			
		||||
    std::size_t core_index;
 | 
			
		||||
    Timing::CoreTiming& core_timing;
 | 
			
		||||
    DynarmicExclusiveMonitor& exclusive_monitor;
 | 
			
		||||
 | 
			
		||||
    Common::PageTable* current_page_table = nullptr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class DynarmicExclusiveMonitor final : public ExclusiveMonitor {
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
#include "core/hle/kernel/thread.h"
 | 
			
		||||
#include "core/hle/lock.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
#include "core/memory.h"
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
 | 
			
		||||
@@ -181,6 +182,7 @@ void KernelCore::AppendNewProcess(SharedPtr<Process> process) {
 | 
			
		||||
 | 
			
		||||
void KernelCore::MakeCurrentProcess(Process* process) {
 | 
			
		||||
    impl->current_process = process;
 | 
			
		||||
    Memory::SetCurrentPageTable(&process->VMManager().page_table);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Process* KernelCore::CurrentProcess() {
 | 
			
		||||
 
 | 
			
		||||
@@ -32,9 +32,6 @@ namespace {
 | 
			
		||||
 * @param priority The priority to give the main thread
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
    const VAddr stack_top = owner_process.VMManager().GetTLSIORegionEndAddress();
 | 
			
		||||
    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();
 | 
			
		||||
        if (previous_process != thread_owner_process) {
 | 
			
		||||
            system.Kernel().MakeCurrentProcess(thread_owner_process);
 | 
			
		||||
            Memory::SetCurrentPageTable(&thread_owner_process->VMManager().page_table);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        cpu_core.LoadContext(new_thread->GetContext());
 | 
			
		||||
 
 | 
			
		||||
@@ -38,10 +38,6 @@ void SetCurrentPageTable(Common::PageTable* page_table) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Common::PageTable* GetCurrentPageTable() {
 | 
			
		||||
    return current_page_table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void MapPages(Common::PageTable& page_table, VAddr base, u64 size, u8* memory,
 | 
			
		||||
                     Common::PageType type) {
 | 
			
		||||
    LOG_DEBUG(HW_Memory, "Mapping {} onto {:016X}-{:016X}", fmt::ptr(memory), base * PAGE_SIZE,
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,8 @@ enum : VAddr {
 | 
			
		||||
    KERNEL_REGION_END = KERNEL_REGION_VADDR + KERNEL_REGION_SIZE,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Currently active page table
 | 
			
		||||
/// Changes the currently active page table.
 | 
			
		||||
void SetCurrentPageTable(Common::PageTable* page_table);
 | 
			
		||||
Common::PageTable* GetCurrentPageTable();
 | 
			
		||||
 | 
			
		||||
/// Determines if the given VAddr is valid for the specified process.
 | 
			
		||||
bool IsValidVirtualAddress(const Kernel::Process& process, VAddr vaddr);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ TestEnvironment::TestEnvironment(bool mutable_memory_)
 | 
			
		||||
    : mutable_memory(mutable_memory_),
 | 
			
		||||
      test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} {
 | 
			
		||||
    auto process = Kernel::Process::Create(Core::System::GetInstance(), "");
 | 
			
		||||
    kernel.MakeCurrentProcess(process.get());
 | 
			
		||||
    page_table = &process->VMManager().page_table;
 | 
			
		||||
 | 
			
		||||
    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, 0x80000000, 0x80000000, test_memory);
 | 
			
		||||
 | 
			
		||||
    Memory::SetCurrentPageTable(page_table);
 | 
			
		||||
    kernel.MakeCurrentProcess(process.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TestEnvironment::~TestEnvironment() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user