|
|
@@ -20,9 +20,6 @@
|
|
|
#include "video_core/gpu.h"
|
|
|
|
|
|
namespace Memory {
|
|
|
-namespace {
|
|
|
-Common::PageTable* current_page_table = nullptr;
|
|
|
-} // Anonymous namespace
|
|
|
|
|
|
// Implementation class used to keep the specifics of the memory subsystem hidden
|
|
|
// from outside classes. This also allows modification to the internals of the memory
|
|
|
@@ -30,6 +27,17 @@ Common::PageTable* current_page_table = nullptr;
|
|
|
struct Memory::Impl {
|
|
|
explicit Impl(Core::System& system_) : system{system_} {}
|
|
|
|
|
|
+ void SetCurrentPageTable(Kernel::Process& process) {
|
|
|
+ current_page_table = &process.VMManager().page_table;
|
|
|
+
|
|
|
+ const std::size_t address_space_width = process.VMManager().GetAddressSpaceWidth();
|
|
|
+
|
|
|
+ system.ArmInterface(0).PageTableChanged(*current_page_table, address_space_width);
|
|
|
+ system.ArmInterface(1).PageTableChanged(*current_page_table, address_space_width);
|
|
|
+ system.ArmInterface(2).PageTableChanged(*current_page_table, address_space_width);
|
|
|
+ system.ArmInterface(3).PageTableChanged(*current_page_table, address_space_width);
|
|
|
+ }
|
|
|
+
|
|
|
void MapMemoryRegion(Common::PageTable& page_table, VAddr base, u64 size, u8* target) {
|
|
|
ASSERT_MSG((size & PAGE_MASK) == 0, "non-page aligned size: {:016X}", size);
|
|
|
ASSERT_MSG((base & PAGE_MASK) == 0, "non-page aligned base: {:016X}", base);
|
|
|
@@ -575,12 +583,17 @@ struct Memory::Impl {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ Common::PageTable* current_page_table = nullptr;
|
|
|
Core::System& system;
|
|
|
};
|
|
|
|
|
|
Memory::Memory(Core::System& system) : impl{std::make_unique<Impl>(system)} {}
|
|
|
Memory::~Memory() = default;
|
|
|
|
|
|
+void Memory::SetCurrentPageTable(Kernel::Process& process) {
|
|
|
+ impl->SetCurrentPageTable(process);
|
|
|
+}
|
|
|
+
|
|
|
void Memory::MapMemoryRegion(Common::PageTable& page_table, VAddr base, u64 size, u8* target) {
|
|
|
impl->MapMemoryRegion(page_table, base, size, target);
|
|
|
}
|
|
|
@@ -695,18 +708,6 @@ void Memory::RasterizerMarkRegionCached(VAddr vaddr, u64 size, bool cached) {
|
|
|
impl->RasterizerMarkRegionCached(vaddr, size, cached);
|
|
|
}
|
|
|
|
|
|
-void SetCurrentPageTable(Kernel::Process& process) {
|
|
|
- current_page_table = &process.VMManager().page_table;
|
|
|
-
|
|
|
- const std::size_t address_space_width = process.VMManager().GetAddressSpaceWidth();
|
|
|
-
|
|
|
- auto& system = Core::System::GetInstance();
|
|
|
- system.ArmInterface(0).PageTableChanged(*current_page_table, address_space_width);
|
|
|
- system.ArmInterface(1).PageTableChanged(*current_page_table, address_space_width);
|
|
|
- system.ArmInterface(2).PageTableChanged(*current_page_table, address_space_width);
|
|
|
- system.ArmInterface(3).PageTableChanged(*current_page_table, address_space_width);
|
|
|
-}
|
|
|
-
|
|
|
bool IsKernelVirtualAddress(const VAddr vaddr) {
|
|
|
return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END;
|
|
|
}
|