Browse Source
Merge pull request #2361 from lioncash/pagetable
core/memory: Minor simplifications to page table management
pull/15/merge
bunnei
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with
4 additions and
20 deletions
-
src/core/arm/dynarmic/arm_dynarmic.cpp
-
src/core/arm/dynarmic/arm_dynarmic.h
-
src/core/hle/kernel/kernel.cpp
-
src/core/hle/kernel/process.cpp
-
src/core/hle/kernel/scheduler.cpp
-
src/core/memory.cpp
-
src/core/memory.h
-
src/tests/core/arm/arm_test_common.cpp
|
|
|
@ -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() { |
|
|
|
|