summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/CMakeLists.txt8
-rw-r--r--src/core/hle/kernel/k_memory_manager.cpp10
-rw-r--r--src/core/hle/kernel/k_memory_manager.h8
-rw-r--r--src/core/hle/kernel/k_page_heap.cpp (renamed from src/core/hle/kernel/memory/page_heap.cpp)21
-rw-r--r--src/core/hle/kernel/k_page_heap.h (renamed from src/core/hle/kernel/memory/page_heap.h)11
-rw-r--r--src/core/hle/kernel/k_page_table.cpp (renamed from src/core/hle/kernel/memory/page_table.cpp)123
-rw-r--r--src/core/hle/kernel/k_page_table.h (renamed from src/core/hle/kernel/memory/page_table.h)10
-rw-r--r--src/core/hle/kernel/k_shared_memory.cpp5
-rw-r--r--src/core/hle/kernel/process.cpp8
-rw-r--r--src/core/hle/kernel/process.h11
-rw-r--r--src/core/hle/kernel/process_capability.cpp14
-rw-r--r--src/core/hle/kernel/process_capability.h16
-rw-r--r--src/core/hle/kernel/svc.cpp6
-rw-r--r--src/core/hle/kernel/transfer_memory.cpp2
-rw-r--r--src/core/hle/service/ldr/ldr.cpp7
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp2
-rw-r--r--src/core/loader/elf.cpp2
-rw-r--r--src/core/loader/kip.cpp2
-rw-r--r--src/core/loader/nro.cpp2
-rw-r--r--src/core/loader/nso.cpp2
-rw-r--r--src/core/memory.cpp2
-rw-r--r--src/core/memory/cheat_engine.cpp2
-rw-r--r--src/core/reporter.cpp2
-rw-r--r--src/video_core/memory_manager.cpp2
24 files changed, 131 insertions, 147 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 2976187c0..17f251c37 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -173,7 +173,11 @@ add_library(core STATIC
173 hle/kernel/k_memory_manager.cpp 173 hle/kernel/k_memory_manager.cpp
174 hle/kernel/k_memory_manager.h 174 hle/kernel/k_memory_manager.h
175 hle/kernel/k_page_bitmap.h 175 hle/kernel/k_page_bitmap.h
176 hle/kernel/k_page_heap.cpp
177 hle/kernel/k_page_heap.h
176 hle/kernel/k_page_linked_list.h 178 hle/kernel/k_page_linked_list.h
179 hle/kernel/k_page_table.cpp
180 hle/kernel/k_page_table.h
177 hle/kernel/k_priority_queue.h 181 hle/kernel/k_priority_queue.h
178 hle/kernel/k_readable_event.cpp 182 hle/kernel/k_readable_event.cpp
179 hle/kernel/k_readable_event.h 183 hle/kernel/k_readable_event.h
@@ -202,10 +206,6 @@ add_library(core STATIC
202 hle/kernel/kernel.cpp 206 hle/kernel/kernel.cpp
203 hle/kernel/kernel.h 207 hle/kernel/kernel.h
204 hle/kernel/memory_types.h 208 hle/kernel/memory_types.h
205 hle/kernel/memory/page_heap.cpp
206 hle/kernel/memory/page_heap.h
207 hle/kernel/memory/page_table.cpp
208 hle/kernel/memory/page_table.h
209 hle/kernel/object.cpp 209 hle/kernel/object.cpp
210 hle/kernel/object.h 210 hle/kernel/object.h
211 hle/kernel/physical_core.cpp 211 hle/kernel/physical_core.cpp
diff --git a/src/core/hle/kernel/k_memory_manager.cpp b/src/core/hle/kernel/k_memory_manager.cpp
index 5ea11a918..9027602bf 100644
--- a/src/core/hle/kernel/k_memory_manager.cpp
+++ b/src/core/hle/kernel/k_memory_manager.cpp
@@ -21,7 +21,7 @@ std::size_t KMemoryManager::Impl::Initialize(Pool new_pool, u64 start_address, u
21 const auto ref_count_size{(size / PageSize) * sizeof(u16)}; 21 const auto ref_count_size{(size / PageSize) * sizeof(u16)};
22 const auto optimize_map_size{(Common::AlignUp((size / PageSize), 64) / 64) * sizeof(u64)}; 22 const auto optimize_map_size{(Common::AlignUp((size / PageSize), 64) / 64) * sizeof(u64)};
23 const auto manager_size{Common::AlignUp(optimize_map_size + ref_count_size, PageSize)}; 23 const auto manager_size{Common::AlignUp(optimize_map_size + ref_count_size, PageSize)};
24 const auto page_heap_size{Memory::PageHeap::CalculateManagementOverheadSize(size)}; 24 const auto page_heap_size{KPageHeap::CalculateManagementOverheadSize(size)};
25 const auto total_metadata_size{manager_size + page_heap_size}; 25 const auto total_metadata_size{manager_size + page_heap_size};
26 ASSERT(manager_size <= total_metadata_size); 26 ASSERT(manager_size <= total_metadata_size);
27 ASSERT(Common::IsAligned(total_metadata_size, PageSize)); 27 ASSERT(Common::IsAligned(total_metadata_size, PageSize));
@@ -59,7 +59,7 @@ VAddr KMemoryManager::AllocateAndOpenContinuous(std::size_t num_pages, std::size
59 std::lock_guard lock{pool_locks[pool_index]}; 59 std::lock_guard lock{pool_locks[pool_index]};
60 60
61 // Choose a heap based on our page size request 61 // Choose a heap based on our page size request
62 const s32 heap_index{Memory::PageHeap::GetAlignedBlockIndex(num_pages, align_pages)}; 62 const s32 heap_index{KPageHeap::GetAlignedBlockIndex(num_pages, align_pages)};
63 63
64 // Loop, trying to iterate from each block 64 // Loop, trying to iterate from each block
65 // TODO (bunnei): Support multiple managers 65 // TODO (bunnei): Support multiple managers
@@ -72,7 +72,7 @@ VAddr KMemoryManager::AllocateAndOpenContinuous(std::size_t num_pages, std::size
72 } 72 }
73 73
74 // If we allocated more than we need, free some 74 // If we allocated more than we need, free some
75 const auto allocated_pages{Memory::PageHeap::GetBlockNumPages(heap_index)}; 75 const auto allocated_pages{KPageHeap::GetBlockNumPages(heap_index)};
76 if (allocated_pages > num_pages) { 76 if (allocated_pages > num_pages) {
77 chosen_manager.Free(allocated_block + num_pages * PageSize, allocated_pages - num_pages); 77 chosen_manager.Free(allocated_block + num_pages * PageSize, allocated_pages - num_pages);
78 } 78 }
@@ -94,7 +94,7 @@ ResultCode KMemoryManager::Allocate(KPageLinkedList& page_list, std::size_t num_
94 std::lock_guard lock{pool_locks[pool_index]}; 94 std::lock_guard lock{pool_locks[pool_index]};
95 95
96 // Choose a heap based on our page size request 96 // Choose a heap based on our page size request
97 const s32 heap_index{Memory::PageHeap::GetBlockIndex(num_pages)}; 97 const s32 heap_index{KPageHeap::GetBlockIndex(num_pages)};
98 if (heap_index < 0) { 98 if (heap_index < 0) {
99 return ResultOutOfMemory; 99 return ResultOutOfMemory;
100 } 100 }
@@ -113,7 +113,7 @@ ResultCode KMemoryManager::Allocate(KPageLinkedList& page_list, std::size_t num_
113 113
114 // Keep allocating until we've allocated all our pages 114 // Keep allocating until we've allocated all our pages
115 for (s32 index{heap_index}; index >= 0 && num_pages > 0; index--) { 115 for (s32 index{heap_index}; index >= 0 && num_pages > 0; index--) {
116 const auto pages_per_alloc{Memory::PageHeap::GetBlockNumPages(index)}; 116 const auto pages_per_alloc{KPageHeap::GetBlockNumPages(index)};
117 117
118 while (num_pages >= pages_per_alloc) { 118 while (num_pages >= pages_per_alloc) {
119 // Allocate a block 119 // Allocate a block
diff --git a/src/core/hle/kernel/k_memory_manager.h b/src/core/hle/kernel/k_memory_manager.h
index 377f642d8..ae9f683b8 100644
--- a/src/core/hle/kernel/k_memory_manager.h
+++ b/src/core/hle/kernel/k_memory_manager.h
@@ -10,14 +10,12 @@
10 10
11#include "common/common_funcs.h" 11#include "common/common_funcs.h"
12#include "common/common_types.h" 12#include "common/common_types.h"
13#include "core/hle/kernel/memory/page_heap.h" 13#include "core/hle/kernel/k_page_heap.h"
14#include "core/hle/result.h" 14#include "core/hle/result.h"
15 15
16namespace Kernel { 16namespace Kernel {
17class KPageLinkedList;
18}
19 17
20namespace Kernel { 18class KPageLinkedList;
21 19
22class KMemoryManager final : NonCopyable { 20class KMemoryManager final : NonCopyable {
23public: 21public:
@@ -84,7 +82,7 @@ private:
84 using RefCount = u16; 82 using RefCount = u16;
85 83
86 private: 84 private:
87 Memory::PageHeap heap; 85 KPageHeap heap;
88 Pool pool{}; 86 Pool pool{};
89 87
90 public: 88 public:
diff --git a/src/core/hle/kernel/memory/page_heap.cpp b/src/core/hle/kernel/k_page_heap.cpp
index 8fb53a0e8..07e062922 100644
--- a/src/core/hle/kernel/memory/page_heap.cpp
+++ b/src/core/hle/kernel/k_page_heap.cpp
@@ -2,16 +2,13 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5// This file references various implementation details from Atmosphere, an open-source firmware for
6// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
7
8#include "core/core.h" 5#include "core/core.h"
9#include "core/hle/kernel/memory/page_heap.h" 6#include "core/hle/kernel/k_page_heap.h"
10#include "core/memory.h" 7#include "core/memory.h"
11 8
12namespace Kernel::Memory { 9namespace Kernel {
13 10
14void PageHeap::Initialize(VAddr address, std::size_t size, std::size_t metadata_size) { 11void KPageHeap::Initialize(VAddr address, std::size_t size, std::size_t metadata_size) {
15 // Check our assumptions 12 // Check our assumptions
16 ASSERT(Common::IsAligned((address), PageSize)); 13 ASSERT(Common::IsAligned((address), PageSize));
17 ASSERT(Common::IsAligned(size, PageSize)); 14 ASSERT(Common::IsAligned(size, PageSize));
@@ -32,7 +29,7 @@ void PageHeap::Initialize(VAddr address, std::size_t size, std::size_t metadata_
32 } 29 }
33} 30}
34 31
35VAddr PageHeap::AllocateBlock(s32 index, bool random) { 32VAddr KPageHeap::AllocateBlock(s32 index, bool random) {
36 const std::size_t needed_size{blocks[index].GetSize()}; 33 const std::size_t needed_size{blocks[index].GetSize()};
37 34
38 for (s32 i{index}; i < static_cast<s32>(MemoryBlockPageShifts.size()); i++) { 35 for (s32 i{index}; i < static_cast<s32>(MemoryBlockPageShifts.size()); i++) {
@@ -48,13 +45,13 @@ VAddr PageHeap::AllocateBlock(s32 index, bool random) {
48 return 0; 45 return 0;
49} 46}
50 47
51void PageHeap::FreeBlock(VAddr block, s32 index) { 48void KPageHeap::FreeBlock(VAddr block, s32 index) {
52 do { 49 do {
53 block = blocks[index++].PushBlock(block); 50 block = blocks[index++].PushBlock(block);
54 } while (block != 0); 51 } while (block != 0);
55} 52}
56 53
57void PageHeap::Free(VAddr addr, std::size_t num_pages) { 54void KPageHeap::Free(VAddr addr, std::size_t num_pages) {
58 // Freeing no pages is a no-op 55 // Freeing no pages is a no-op
59 if (num_pages == 0) { 56 if (num_pages == 0) {
60 return; 57 return;
@@ -104,16 +101,16 @@ void PageHeap::Free(VAddr addr, std::size_t num_pages) {
104 } 101 }
105} 102}
106 103
107std::size_t PageHeap::CalculateManagementOverheadSize(std::size_t region_size) { 104std::size_t KPageHeap::CalculateManagementOverheadSize(std::size_t region_size) {
108 std::size_t overhead_size = 0; 105 std::size_t overhead_size = 0;
109 for (std::size_t i = 0; i < MemoryBlockPageShifts.size(); i++) { 106 for (std::size_t i = 0; i < MemoryBlockPageShifts.size(); i++) {
110 const std::size_t cur_block_shift{MemoryBlockPageShifts[i]}; 107 const std::size_t cur_block_shift{MemoryBlockPageShifts[i]};
111 const std::size_t next_block_shift{ 108 const std::size_t next_block_shift{
112 (i != MemoryBlockPageShifts.size() - 1) ? MemoryBlockPageShifts[i + 1] : 0}; 109 (i != MemoryBlockPageShifts.size() - 1) ? MemoryBlockPageShifts[i + 1] : 0};
113 overhead_size += PageHeap::Block::CalculateManagementOverheadSize( 110 overhead_size += KPageHeap::Block::CalculateManagementOverheadSize(
114 region_size, cur_block_shift, next_block_shift); 111 region_size, cur_block_shift, next_block_shift);
115 } 112 }
116 return Common::AlignUp(overhead_size, PageSize); 113 return Common::AlignUp(overhead_size, PageSize);
117} 114}
118 115
119} // namespace Kernel::Memory 116} // namespace Kernel
diff --git a/src/core/hle/kernel/memory/page_heap.h b/src/core/hle/kernel/k_page_heap.h
index e21d60a54..de5d6a189 100644
--- a/src/core/hle/kernel/memory/page_heap.h
+++ b/src/core/hle/kernel/k_page_heap.h
@@ -2,9 +2,6 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5// This file references various implementation details from Atmosphere, an open-source firmware for
6// the Nintendo Switch. Copyright 2018-2020 Atmosphere-NX.
7
8#pragma once 5#pragma once
9 6
10#include <array> 7#include <array>
@@ -18,9 +15,9 @@
18#include "core/hle/kernel/k_page_bitmap.h" 15#include "core/hle/kernel/k_page_bitmap.h"
19#include "core/hle/kernel/memory_types.h" 16#include "core/hle/kernel/memory_types.h"
20 17
21namespace Kernel::Memory { 18namespace Kernel {
22 19
23class PageHeap final : NonCopyable { 20class KPageHeap final : NonCopyable {
24public: 21public:
25 static constexpr s32 GetAlignedBlockIndex(std::size_t num_pages, std::size_t align_pages) { 22 static constexpr s32 GetAlignedBlockIndex(std::size_t num_pages, std::size_t align_pages) {
26 const auto target_pages{std::max(num_pages, align_pages)}; 23 const auto target_pages{std::max(num_pages, align_pages)};
@@ -148,7 +145,7 @@ private:
148 }; 145 };
149 146
150public: 147public:
151 PageHeap() = default; 148 KPageHeap() = default;
152 149
153 constexpr VAddr GetAddress() const { 150 constexpr VAddr GetAddress() const {
154 return heap_address; 151 return heap_address;
@@ -193,4 +190,4 @@ private:
193 std::vector<u64> metadata; 190 std::vector<u64> metadata;
194}; 191};
195 192
196} // namespace Kernel::Memory 193} // namespace Kernel
diff --git a/src/core/hle/kernel/memory/page_table.cpp b/src/core/hle/kernel/k_page_table.cpp
index ef9d97413..d09d5ce48 100644
--- a/src/core/hle/kernel/memory/page_table.cpp
+++ b/src/core/hle/kernel/k_page_table.cpp
@@ -10,16 +10,16 @@
10#include "core/hle/kernel/k_memory_block.h" 10#include "core/hle/kernel/k_memory_block.h"
11#include "core/hle/kernel/k_memory_block_manager.h" 11#include "core/hle/kernel/k_memory_block_manager.h"
12#include "core/hle/kernel/k_page_linked_list.h" 12#include "core/hle/kernel/k_page_linked_list.h"
13#include "core/hle/kernel/k_page_table.h"
13#include "core/hle/kernel/k_resource_limit.h" 14#include "core/hle/kernel/k_resource_limit.h"
14#include "core/hle/kernel/k_scoped_resource_reservation.h" 15#include "core/hle/kernel/k_scoped_resource_reservation.h"
15#include "core/hle/kernel/k_system_control.h" 16#include "core/hle/kernel/k_system_control.h"
16#include "core/hle/kernel/kernel.h" 17#include "core/hle/kernel/kernel.h"
17#include "core/hle/kernel/memory/page_table.h"
18#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
19#include "core/hle/kernel/svc_results.h" 19#include "core/hle/kernel/svc_results.h"
20#include "core/memory.h" 20#include "core/memory.h"
21 21
22namespace Kernel::Memory { 22namespace Kernel {
23 23
24namespace { 24namespace {
25 25
@@ -58,11 +58,11 @@ constexpr std::size_t GetSizeInRange(const KMemoryInfo& info, VAddr start, VAddr
58 58
59} // namespace 59} // namespace
60 60
61PageTable::PageTable(Core::System& system) : system{system} {} 61KPageTable::KPageTable(Core::System& system) : system{system} {}
62 62
63ResultCode PageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, 63ResultCode KPageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type,
64 bool enable_aslr, VAddr code_addr, std::size_t code_size, 64 bool enable_aslr, VAddr code_addr,
65 KMemoryManager::Pool pool) { 65 std::size_t code_size, KMemoryManager::Pool pool) {
66 66
67 const auto GetSpaceStart = [this](KAddressSpaceInfo::Type type) { 67 const auto GetSpaceStart = [this](KAddressSpaceInfo::Type type) {
68 return KAddressSpaceInfo::GetAddressSpaceStart(address_space_width, type); 68 return KAddressSpaceInfo::GetAddressSpaceStart(address_space_width, type);
@@ -271,8 +271,8 @@ ResultCode PageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_t
271 return InitializeMemoryLayout(start, end); 271 return InitializeMemoryLayout(start, end);
272} 272}
273 273
274ResultCode PageTable::MapProcessCode(VAddr addr, std::size_t num_pages, KMemoryState state, 274ResultCode KPageTable::MapProcessCode(VAddr addr, std::size_t num_pages, KMemoryState state,
275 KMemoryPermission perm) { 275 KMemoryPermission perm) {
276 std::lock_guard lock{page_table_lock}; 276 std::lock_guard lock{page_table_lock};
277 277
278 const u64 size{num_pages * PageSize}; 278 const u64 size{num_pages * PageSize};
@@ -295,7 +295,7 @@ ResultCode PageTable::MapProcessCode(VAddr addr, std::size_t num_pages, KMemoryS
295 return RESULT_SUCCESS; 295 return RESULT_SUCCESS;
296} 296}
297 297
298ResultCode PageTable::MapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size) { 298ResultCode KPageTable::MapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size) {
299 std::lock_guard lock{page_table_lock}; 299 std::lock_guard lock{page_table_lock};
300 300
301 const std::size_t num_pages{size / PageSize}; 301 const std::size_t num_pages{size / PageSize};
@@ -332,7 +332,7 @@ ResultCode PageTable::MapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::
332 return RESULT_SUCCESS; 332 return RESULT_SUCCESS;
333} 333}
334 334
335ResultCode PageTable::UnmapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size) { 335ResultCode KPageTable::UnmapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std::size_t size) {
336 std::lock_guard lock{page_table_lock}; 336 std::lock_guard lock{page_table_lock};
337 337
338 if (!size) { 338 if (!size) {
@@ -363,7 +363,7 @@ ResultCode PageTable::UnmapProcessCodeMemory(VAddr dst_addr, VAddr src_addr, std
363 return RESULT_SUCCESS; 363 return RESULT_SUCCESS;
364} 364}
365 365
366void PageTable::MapPhysicalMemory(KPageLinkedList& page_linked_list, VAddr start, VAddr end) { 366void KPageTable::MapPhysicalMemory(KPageLinkedList& page_linked_list, VAddr start, VAddr end) {
367 auto node{page_linked_list.Nodes().begin()}; 367 auto node{page_linked_list.Nodes().begin()};
368 PAddr map_addr{node->GetAddress()}; 368 PAddr map_addr{node->GetAddress()};
369 std::size_t src_num_pages{node->GetNumPages()}; 369 std::size_t src_num_pages{node->GetNumPages()};
@@ -395,7 +395,7 @@ void PageTable::MapPhysicalMemory(KPageLinkedList& page_linked_list, VAddr start
395 }); 395 });
396} 396}
397 397
398ResultCode PageTable::MapPhysicalMemory(VAddr addr, std::size_t size) { 398ResultCode KPageTable::MapPhysicalMemory(VAddr addr, std::size_t size) {
399 std::lock_guard lock{page_table_lock}; 399 std::lock_guard lock{page_table_lock};
400 400
401 std::size_t mapped_size{}; 401 std::size_t mapped_size{};
@@ -443,7 +443,7 @@ ResultCode PageTable::MapPhysicalMemory(VAddr addr, std::size_t size) {
443 return RESULT_SUCCESS; 443 return RESULT_SUCCESS;
444} 444}
445 445
446ResultCode PageTable::UnmapPhysicalMemory(VAddr addr, std::size_t size) { 446ResultCode KPageTable::UnmapPhysicalMemory(VAddr addr, std::size_t size) {
447 std::lock_guard lock{page_table_lock}; 447 std::lock_guard lock{page_table_lock};
448 448
449 const VAddr end_addr{addr + size}; 449 const VAddr end_addr{addr + size};
@@ -480,7 +480,7 @@ ResultCode PageTable::UnmapPhysicalMemory(VAddr addr, std::size_t size) {
480 return RESULT_SUCCESS; 480 return RESULT_SUCCESS;
481} 481}
482 482
483ResultCode PageTable::UnmapMemory(VAddr addr, std::size_t size) { 483ResultCode KPageTable::UnmapMemory(VAddr addr, std::size_t size) {
484 std::lock_guard lock{page_table_lock}; 484 std::lock_guard lock{page_table_lock};
485 485
486 const VAddr end_addr{addr + size}; 486 const VAddr end_addr{addr + size};
@@ -516,7 +516,7 @@ ResultCode PageTable::UnmapMemory(VAddr addr, std::size_t size) {
516 return RESULT_SUCCESS; 516 return RESULT_SUCCESS;
517} 517}
518 518
519ResultCode PageTable::Map(VAddr dst_addr, VAddr src_addr, std::size_t size) { 519ResultCode KPageTable::Map(VAddr dst_addr, VAddr src_addr, std::size_t size) {
520 std::lock_guard lock{page_table_lock}; 520 std::lock_guard lock{page_table_lock};
521 521
522 KMemoryState src_state{}; 522 KMemoryState src_state{};
@@ -555,7 +555,7 @@ ResultCode PageTable::Map(VAddr dst_addr, VAddr src_addr, std::size_t size) {
555 return RESULT_SUCCESS; 555 return RESULT_SUCCESS;
556} 556}
557 557
558ResultCode PageTable::Unmap(VAddr dst_addr, VAddr src_addr, std::size_t size) { 558ResultCode KPageTable::Unmap(VAddr dst_addr, VAddr src_addr, std::size_t size) {
559 std::lock_guard lock{page_table_lock}; 559 std::lock_guard lock{page_table_lock};
560 560
561 KMemoryState src_state{}; 561 KMemoryState src_state{};
@@ -597,8 +597,8 @@ ResultCode PageTable::Unmap(VAddr dst_addr, VAddr src_addr, std::size_t size) {
597 return RESULT_SUCCESS; 597 return RESULT_SUCCESS;
598} 598}
599 599
600ResultCode PageTable::MapPages(VAddr addr, const KPageLinkedList& page_linked_list, 600ResultCode KPageTable::MapPages(VAddr addr, const KPageLinkedList& page_linked_list,
601 KMemoryPermission perm) { 601 KMemoryPermission perm) {
602 VAddr cur_addr{addr}; 602 VAddr cur_addr{addr};
603 603
604 for (const auto& node : page_linked_list.Nodes()) { 604 for (const auto& node : page_linked_list.Nodes()) {
@@ -619,8 +619,8 @@ ResultCode PageTable::MapPages(VAddr addr, const KPageLinkedList& page_linked_li
619 return RESULT_SUCCESS; 619 return RESULT_SUCCESS;
620} 620}
621 621
622ResultCode PageTable::MapPages(VAddr addr, KPageLinkedList& page_linked_list, KMemoryState state, 622ResultCode KPageTable::MapPages(VAddr addr, KPageLinkedList& page_linked_list, KMemoryState state,
623 KMemoryPermission perm) { 623 KMemoryPermission perm) {
624 std::lock_guard lock{page_table_lock}; 624 std::lock_guard lock{page_table_lock};
625 625
626 const std::size_t num_pages{page_linked_list.GetNumPages()}; 626 const std::size_t num_pages{page_linked_list.GetNumPages()};
@@ -641,8 +641,8 @@ ResultCode PageTable::MapPages(VAddr addr, KPageLinkedList& page_linked_list, KM
641 return RESULT_SUCCESS; 641 return RESULT_SUCCESS;
642} 642}
643 643
644ResultCode PageTable::SetCodeMemoryPermission(VAddr addr, std::size_t size, 644ResultCode KPageTable::SetCodeMemoryPermission(VAddr addr, std::size_t size,
645 KMemoryPermission perm) { 645 KMemoryPermission perm) {
646 646
647 std::lock_guard lock{page_table_lock}; 647 std::lock_guard lock{page_table_lock};
648 648
@@ -689,13 +689,13 @@ ResultCode PageTable::SetCodeMemoryPermission(VAddr addr, std::size_t size,
689 return RESULT_SUCCESS; 689 return RESULT_SUCCESS;
690} 690}
691 691
692KMemoryInfo PageTable::QueryInfoImpl(VAddr addr) { 692KMemoryInfo KPageTable::QueryInfoImpl(VAddr addr) {
693 std::lock_guard lock{page_table_lock}; 693 std::lock_guard lock{page_table_lock};
694 694
695 return block_manager->FindBlock(addr).GetMemoryInfo(); 695 return block_manager->FindBlock(addr).GetMemoryInfo();
696} 696}
697 697
698KMemoryInfo PageTable::QueryInfo(VAddr addr) { 698KMemoryInfo KPageTable::QueryInfo(VAddr addr) {
699 if (!Contains(addr, 1)) { 699 if (!Contains(addr, 1)) {
700 return {address_space_end, 0 - address_space_end, KMemoryState::Inaccessible, 700 return {address_space_end, 0 - address_space_end, KMemoryState::Inaccessible,
701 KMemoryPermission::None, KMemoryAttribute::None, KMemoryPermission::None}; 701 KMemoryPermission::None, KMemoryAttribute::None, KMemoryPermission::None};
@@ -704,7 +704,7 @@ KMemoryInfo PageTable::QueryInfo(VAddr addr) {
704 return QueryInfoImpl(addr); 704 return QueryInfoImpl(addr);
705} 705}
706 706
707ResultCode PageTable::ReserveTransferMemory(VAddr addr, std::size_t size, KMemoryPermission perm) { 707ResultCode KPageTable::ReserveTransferMemory(VAddr addr, std::size_t size, KMemoryPermission perm) {
708 std::lock_guard lock{page_table_lock}; 708 std::lock_guard lock{page_table_lock};
709 709
710 KMemoryState state{}; 710 KMemoryState state{};
@@ -722,7 +722,7 @@ ResultCode PageTable::ReserveTransferMemory(VAddr addr, std::size_t size, KMemor
722 return RESULT_SUCCESS; 722 return RESULT_SUCCESS;
723} 723}
724 724
725ResultCode PageTable::ResetTransferMemory(VAddr addr, std::size_t size) { 725ResultCode KPageTable::ResetTransferMemory(VAddr addr, std::size_t size) {
726 std::lock_guard lock{page_table_lock}; 726 std::lock_guard lock{page_table_lock};
727 727
728 KMemoryState state{}; 728 KMemoryState state{};
@@ -739,8 +739,8 @@ ResultCode PageTable::ResetTransferMemory(VAddr addr, std::size_t size) {
739 return RESULT_SUCCESS; 739 return RESULT_SUCCESS;
740} 740}
741 741
742ResultCode PageTable::SetMemoryAttribute(VAddr addr, std::size_t size, KMemoryAttribute mask, 742ResultCode KPageTable::SetMemoryAttribute(VAddr addr, std::size_t size, KMemoryAttribute mask,
743 KMemoryAttribute value) { 743 KMemoryAttribute value) {
744 std::lock_guard lock{page_table_lock}; 744 std::lock_guard lock{page_table_lock};
745 745
746 KMemoryState state{}; 746 KMemoryState state{};
@@ -761,13 +761,13 @@ ResultCode PageTable::SetMemoryAttribute(VAddr addr, std::size_t size, KMemoryAt
761 return RESULT_SUCCESS; 761 return RESULT_SUCCESS;
762} 762}
763 763
764ResultCode PageTable::SetHeapCapacity(std::size_t new_heap_capacity) { 764ResultCode KPageTable::SetHeapCapacity(std::size_t new_heap_capacity) {
765 std::lock_guard lock{page_table_lock}; 765 std::lock_guard lock{page_table_lock};
766 heap_capacity = new_heap_capacity; 766 heap_capacity = new_heap_capacity;
767 return RESULT_SUCCESS; 767 return RESULT_SUCCESS;
768} 768}
769 769
770ResultVal<VAddr> PageTable::SetHeapSize(std::size_t size) { 770ResultVal<VAddr> KPageTable::SetHeapSize(std::size_t size) {
771 771
772 if (size > heap_region_end - heap_region_start) { 772 if (size > heap_region_end - heap_region_start) {
773 return ResultOutOfMemory; 773 return ResultOutOfMemory;
@@ -818,10 +818,10 @@ ResultVal<VAddr> PageTable::SetHeapSize(std::size_t size) {
818 return MakeResult<VAddr>(heap_region_start); 818 return MakeResult<VAddr>(heap_region_start);
819} 819}
820 820
821ResultVal<VAddr> PageTable::AllocateAndMapMemory(std::size_t needed_num_pages, std::size_t align, 821ResultVal<VAddr> KPageTable::AllocateAndMapMemory(std::size_t needed_num_pages, std::size_t align,
822 bool is_map_only, VAddr region_start, 822 bool is_map_only, VAddr region_start,
823 std::size_t region_num_pages, KMemoryState state, 823 std::size_t region_num_pages, KMemoryState state,
824 KMemoryPermission perm, PAddr map_addr) { 824 KMemoryPermission perm, PAddr map_addr) {
825 std::lock_guard lock{page_table_lock}; 825 std::lock_guard lock{page_table_lock};
826 826
827 if (!CanContain(region_start, region_num_pages * PageSize, state)) { 827 if (!CanContain(region_start, region_num_pages * PageSize, state)) {
@@ -852,7 +852,7 @@ ResultVal<VAddr> PageTable::AllocateAndMapMemory(std::size_t needed_num_pages, s
852 return MakeResult<VAddr>(addr); 852 return MakeResult<VAddr>(addr);
853} 853}
854 854
855ResultCode PageTable::LockForDeviceAddressSpace(VAddr addr, std::size_t size) { 855ResultCode KPageTable::LockForDeviceAddressSpace(VAddr addr, std::size_t size) {
856 std::lock_guard lock{page_table_lock}; 856 std::lock_guard lock{page_table_lock};
857 857
858 KMemoryPermission perm{}; 858 KMemoryPermission perm{};
@@ -875,7 +875,7 @@ ResultCode PageTable::LockForDeviceAddressSpace(VAddr addr, std::size_t size) {
875 return RESULT_SUCCESS; 875 return RESULT_SUCCESS;
876} 876}
877 877
878ResultCode PageTable::UnlockForDeviceAddressSpace(VAddr addr, std::size_t size) { 878ResultCode KPageTable::UnlockForDeviceAddressSpace(VAddr addr, std::size_t size) {
879 std::lock_guard lock{page_table_lock}; 879 std::lock_guard lock{page_table_lock};
880 880
881 KMemoryPermission perm{}; 881 KMemoryPermission perm{};
@@ -898,13 +898,13 @@ ResultCode PageTable::UnlockForDeviceAddressSpace(VAddr addr, std::size_t size)
898 return RESULT_SUCCESS; 898 return RESULT_SUCCESS;
899} 899}
900 900
901ResultCode PageTable::InitializeMemoryLayout(VAddr start, VAddr end) { 901ResultCode KPageTable::InitializeMemoryLayout(VAddr start, VAddr end) {
902 block_manager = std::make_unique<KMemoryBlockManager>(start, end); 902 block_manager = std::make_unique<KMemoryBlockManager>(start, end);
903 903
904 return RESULT_SUCCESS; 904 return RESULT_SUCCESS;
905} 905}
906 906
907bool PageTable::IsRegionMapped(VAddr address, u64 size) { 907bool KPageTable::IsRegionMapped(VAddr address, u64 size) {
908 return CheckMemoryState(address, size, KMemoryState::All, KMemoryState::Free, 908 return CheckMemoryState(address, size, KMemoryState::All, KMemoryState::Free,
909 KMemoryPermission::Mask, KMemoryPermission::None, 909 KMemoryPermission::Mask, KMemoryPermission::None,
910 KMemoryAttribute::Mask, KMemoryAttribute::None, 910 KMemoryAttribute::Mask, KMemoryAttribute::None,
@@ -912,7 +912,7 @@ bool PageTable::IsRegionMapped(VAddr address, u64 size) {
912 .IsError(); 912 .IsError();
913} 913}
914 914
915bool PageTable::IsRegionContiguous(VAddr addr, u64 size) const { 915bool KPageTable::IsRegionContiguous(VAddr addr, u64 size) const {
916 auto start_ptr = system.Memory().GetPointer(addr); 916 auto start_ptr = system.Memory().GetPointer(addr);
917 for (u64 offset{}; offset < size; offset += PageSize) { 917 for (u64 offset{}; offset < size; offset += PageSize) {
918 if (start_ptr != system.Memory().GetPointer(addr + offset)) { 918 if (start_ptr != system.Memory().GetPointer(addr + offset)) {
@@ -923,8 +923,8 @@ bool PageTable::IsRegionContiguous(VAddr addr, u64 size) const {
923 return true; 923 return true;
924} 924}
925 925
926void PageTable::AddRegionToPages(VAddr start, std::size_t num_pages, 926void KPageTable::AddRegionToPages(VAddr start, std::size_t num_pages,
927 KPageLinkedList& page_linked_list) { 927 KPageLinkedList& page_linked_list) {
928 VAddr addr{start}; 928 VAddr addr{start};
929 while (addr < start + (num_pages * PageSize)) { 929 while (addr < start + (num_pages * PageSize)) {
930 const PAddr paddr{GetPhysicalAddr(addr)}; 930 const PAddr paddr{GetPhysicalAddr(addr)};
@@ -936,8 +936,8 @@ void PageTable::AddRegionToPages(VAddr start, std::size_t num_pages,
936 } 936 }
937} 937}
938 938
939VAddr PageTable::AllocateVirtualMemory(VAddr start, std::size_t region_num_pages, 939VAddr KPageTable::AllocateVirtualMemory(VAddr start, std::size_t region_num_pages,
940 u64 needed_num_pages, std::size_t align) { 940 u64 needed_num_pages, std::size_t align) {
941 if (is_aslr_enabled) { 941 if (is_aslr_enabled) {
942 UNIMPLEMENTED(); 942 UNIMPLEMENTED();
943 } 943 }
@@ -945,8 +945,8 @@ VAddr PageTable::AllocateVirtualMemory(VAddr start, std::size_t region_num_pages
945 IsKernel() ? 1 : 4); 945 IsKernel() ? 1 : 4);
946} 946}
947 947
948ResultCode PageTable::Operate(VAddr addr, std::size_t num_pages, const KPageLinkedList& page_group, 948ResultCode KPageTable::Operate(VAddr addr, std::size_t num_pages, const KPageLinkedList& page_group,
949 OperationType operation) { 949 OperationType operation) {
950 std::lock_guard lock{page_table_lock}; 950 std::lock_guard lock{page_table_lock};
951 951
952 ASSERT(Common::IsAligned(addr, PageSize)); 952 ASSERT(Common::IsAligned(addr, PageSize));
@@ -970,8 +970,8 @@ ResultCode PageTable::Operate(VAddr addr, std::size_t num_pages, const KPageLink
970 return RESULT_SUCCESS; 970 return RESULT_SUCCESS;
971} 971}
972 972
973ResultCode PageTable::Operate(VAddr addr, std::size_t num_pages, KMemoryPermission perm, 973ResultCode KPageTable::Operate(VAddr addr, std::size_t num_pages, KMemoryPermission perm,
974 OperationType operation, PAddr map_addr) { 974 OperationType operation, PAddr map_addr) {
975 std::lock_guard lock{page_table_lock}; 975 std::lock_guard lock{page_table_lock};
976 976
977 ASSERT(num_pages > 0); 977 ASSERT(num_pages > 0);
@@ -997,7 +997,7 @@ ResultCode PageTable::Operate(VAddr addr, std::size_t num_pages, KMemoryPermissi
997 return RESULT_SUCCESS; 997 return RESULT_SUCCESS;
998} 998}
999 999
1000constexpr VAddr PageTable::GetRegionAddress(KMemoryState state) const { 1000constexpr VAddr KPageTable::GetRegionAddress(KMemoryState state) const {
1001 switch (state) { 1001 switch (state) {
1002 case KMemoryState::Free: 1002 case KMemoryState::Free:
1003 case KMemoryState::Kernel: 1003 case KMemoryState::Kernel:
@@ -1032,7 +1032,7 @@ constexpr VAddr PageTable::GetRegionAddress(KMemoryState state) const {
1032 } 1032 }
1033} 1033}
1034 1034
1035constexpr std::size_t PageTable::GetRegionSize(KMemoryState state) const { 1035constexpr std::size_t KPageTable::GetRegionSize(KMemoryState state) const {
1036 switch (state) { 1036 switch (state) {
1037 case KMemoryState::Free: 1037 case KMemoryState::Free:
1038 case KMemoryState::Kernel: 1038 case KMemoryState::Kernel:
@@ -1067,7 +1067,7 @@ constexpr std::size_t PageTable::GetRegionSize(KMemoryState state) const {
1067 } 1067 }
1068} 1068}
1069 1069
1070constexpr bool PageTable::CanContain(VAddr addr, std::size_t size, KMemoryState state) const { 1070constexpr bool KPageTable::CanContain(VAddr addr, std::size_t size, KMemoryState state) const {
1071 const VAddr end{addr + size}; 1071 const VAddr end{addr + size};
1072 const VAddr last{end - 1}; 1072 const VAddr last{end - 1};
1073 const VAddr region_start{GetRegionAddress(state)}; 1073 const VAddr region_start{GetRegionAddress(state)};
@@ -1109,10 +1109,11 @@ constexpr bool PageTable::CanContain(VAddr addr, std::size_t size, KMemoryState
1109 } 1109 }
1110} 1110}
1111 1111
1112constexpr ResultCode PageTable::CheckMemoryState(const KMemoryInfo& info, KMemoryState state_mask, 1112constexpr ResultCode KPageTable::CheckMemoryState(const KMemoryInfo& info, KMemoryState state_mask,
1113 KMemoryState state, KMemoryPermission perm_mask, 1113 KMemoryState state, KMemoryPermission perm_mask,
1114 KMemoryPermission perm, KMemoryAttribute attr_mask, 1114 KMemoryPermission perm,
1115 KMemoryAttribute attr) const { 1115 KMemoryAttribute attr_mask,
1116 KMemoryAttribute attr) const {
1116 // Validate the states match expectation 1117 // Validate the states match expectation
1117 if ((info.state & state_mask) != state) { 1118 if ((info.state & state_mask) != state) {
1118 return ResultInvalidCurrentMemory; 1119 return ResultInvalidCurrentMemory;
@@ -1127,12 +1128,12 @@ constexpr ResultCode PageTable::CheckMemoryState(const KMemoryInfo& info, KMemor
1127 return RESULT_SUCCESS; 1128 return RESULT_SUCCESS;
1128} 1129}
1129 1130
1130ResultCode PageTable::CheckMemoryState(KMemoryState* out_state, KMemoryPermission* out_perm, 1131ResultCode KPageTable::CheckMemoryState(KMemoryState* out_state, KMemoryPermission* out_perm,
1131 KMemoryAttribute* out_attr, VAddr addr, std::size_t size, 1132 KMemoryAttribute* out_attr, VAddr addr, std::size_t size,
1132 KMemoryState state_mask, KMemoryState state, 1133 KMemoryState state_mask, KMemoryState state,
1133 KMemoryPermission perm_mask, KMemoryPermission perm, 1134 KMemoryPermission perm_mask, KMemoryPermission perm,
1134 KMemoryAttribute attr_mask, KMemoryAttribute attr, 1135 KMemoryAttribute attr_mask, KMemoryAttribute attr,
1135 KMemoryAttribute ignore_attr) { 1136 KMemoryAttribute ignore_attr) {
1136 std::lock_guard lock{page_table_lock}; 1137 std::lock_guard lock{page_table_lock};
1137 1138
1138 // Get information about the first block 1139 // Get information about the first block
@@ -1186,4 +1187,4 @@ ResultCode PageTable::CheckMemoryState(KMemoryState* out_state, KMemoryPermissio
1186 return RESULT_SUCCESS; 1187 return RESULT_SUCCESS;
1187} 1188}
1188 1189
1189} // namespace Kernel::Memory 1190} // namespace Kernel
diff --git a/src/core/hle/kernel/memory/page_table.h b/src/core/hle/kernel/k_page_table.h
index a9e850e01..49b824379 100644
--- a/src/core/hle/kernel/memory/page_table.h
+++ b/src/core/hle/kernel/k_page_table.h
@@ -19,14 +19,12 @@ class System;
19} 19}
20 20
21namespace Kernel { 21namespace Kernel {
22class KMemoryBlockManager;
23}
24 22
25namespace Kernel::Memory { 23class KMemoryBlockManager;
26 24
27class PageTable final : NonCopyable { 25class KPageTable final : NonCopyable {
28public: 26public:
29 explicit PageTable(Core::System& system); 27 explicit KPageTable(Core::System& system);
30 28
31 ResultCode InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, bool enable_aslr, 29 ResultCode InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, bool enable_aslr,
32 VAddr code_addr, std::size_t code_size, 30 VAddr code_addr, std::size_t code_size,
@@ -278,4 +276,4 @@ private:
278 Core::System& system; 276 Core::System& system;
279}; 277};
280 278
281} // namespace Kernel::Memory 279} // namespace Kernel
diff --git a/src/core/hle/kernel/k_shared_memory.cpp b/src/core/hle/kernel/k_shared_memory.cpp
index aade52764..9b14f42b5 100644
--- a/src/core/hle/kernel/k_shared_memory.cpp
+++ b/src/core/hle/kernel/k_shared_memory.cpp
@@ -4,10 +4,10 @@
4 4
5#include "common/assert.h" 5#include "common/assert.h"
6#include "core/core.h" 6#include "core/core.h"
7#include "core/hle/kernel/k_page_table.h"
7#include "core/hle/kernel/k_scoped_resource_reservation.h" 8#include "core/hle/kernel/k_scoped_resource_reservation.h"
8#include "core/hle/kernel/k_shared_memory.h" 9#include "core/hle/kernel/k_shared_memory.h"
9#include "core/hle/kernel/kernel.h" 10#include "core/hle/kernel/kernel.h"
10#include "core/hle/kernel/memory/page_table.h"
11 11
12namespace Kernel { 12namespace Kernel {
13 13
@@ -21,8 +21,7 @@ KSharedMemory::~KSharedMemory() {
21std::shared_ptr<KSharedMemory> KSharedMemory::Create( 21std::shared_ptr<KSharedMemory> KSharedMemory::Create(
22 KernelCore& kernel, Core::DeviceMemory& device_memory, Process* owner_process, 22 KernelCore& kernel, Core::DeviceMemory& device_memory, Process* owner_process,
23 KPageLinkedList&& page_list, KMemoryPermission owner_permission, 23 KPageLinkedList&& page_list, KMemoryPermission owner_permission,
24 KMemoryPermission user_permission, PAddr physical_address, std::size_t size, 24 KMemoryPermission user_permission, PAddr physical_address, std::size_t size, std::string name) {
25 std::string name) {
26 25
27 const auto resource_limit = kernel.GetSystemResourceLimit(); 26 const auto resource_limit = kernel.GetSystemResourceLimit();
28 KScopedResourceReservation memory_reservation(resource_limit, LimitableResource::PhysicalMemory, 27 KScopedResourceReservation memory_reservation(resource_limit, LimitableResource::PhysicalMemory,
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index e0359eb3c..73b85d6f9 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -15,13 +15,13 @@
15#include "core/file_sys/program_metadata.h" 15#include "core/file_sys/program_metadata.h"
16#include "core/hle/kernel/code_set.h" 16#include "core/hle/kernel/code_set.h"
17#include "core/hle/kernel/k_memory_block_manager.h" 17#include "core/hle/kernel/k_memory_block_manager.h"
18#include "core/hle/kernel/k_page_table.h"
18#include "core/hle/kernel/k_resource_limit.h" 19#include "core/hle/kernel/k_resource_limit.h"
19#include "core/hle/kernel/k_scheduler.h" 20#include "core/hle/kernel/k_scheduler.h"
20#include "core/hle/kernel/k_scoped_resource_reservation.h" 21#include "core/hle/kernel/k_scoped_resource_reservation.h"
21#include "core/hle/kernel/k_slab_heap.h" 22#include "core/hle/kernel/k_slab_heap.h"
22#include "core/hle/kernel/k_thread.h" 23#include "core/hle/kernel/k_thread.h"
23#include "core/hle/kernel/kernel.h" 24#include "core/hle/kernel/kernel.h"
24#include "core/hle/kernel/memory/page_table.h"
25#include "core/hle/kernel/process.h" 25#include "core/hle/kernel/process.h"
26#include "core/hle/kernel/svc_results.h" 26#include "core/hle/kernel/svc_results.h"
27#include "core/hle/lock.h" 27#include "core/hle/lock.h"
@@ -464,9 +464,9 @@ bool Process::IsSignaled() const {
464} 464}
465 465
466Process::Process(Core::System& system) 466Process::Process(Core::System& system)
467 : KSynchronizationObject{system.Kernel()}, 467 : KSynchronizationObject{system.Kernel()}, page_table{std::make_unique<KPageTable>(system)},
468 page_table{std::make_unique<Memory::PageTable>(system)}, handle_table{system.Kernel()}, 468 handle_table{system.Kernel()}, address_arbiter{system}, condition_var{system},
469 address_arbiter{system}, condition_var{system}, state_lock{system.Kernel()}, system{system} {} 469 state_lock{system.Kernel()}, system{system} {}
470 470
471Process::~Process() = default; 471Process::~Process() = default;
472 472
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index 320b0f347..45eefb90e 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -29,16 +29,13 @@ class ProgramMetadata;
29namespace Kernel { 29namespace Kernel {
30 30
31class KernelCore; 31class KernelCore;
32class KPageTable;
32class KResourceLimit; 33class KResourceLimit;
33class KThread; 34class KThread;
34class TLSPage; 35class TLSPage;
35 36
36struct CodeSet; 37struct CodeSet;
37 38
38namespace Memory {
39class PageTable;
40}
41
42enum class MemoryRegion : u16 { 39enum class MemoryRegion : u16 {
43 APPLICATION = 1, 40 APPLICATION = 1,
44 SYSTEM = 2, 41 SYSTEM = 2,
@@ -104,12 +101,12 @@ public:
104 } 101 }
105 102
106 /// Gets a reference to the process' page table. 103 /// Gets a reference to the process' page table.
107 Memory::PageTable& PageTable() { 104 KPageTable& PageTable() {
108 return *page_table; 105 return *page_table;
109 } 106 }
110 107
111 /// Gets const a reference to the process' page table. 108 /// Gets const a reference to the process' page table.
112 const Memory::PageTable& PageTable() const { 109 const KPageTable& PageTable() const {
113 return *page_table; 110 return *page_table;
114 } 111 }
115 112
@@ -385,7 +382,7 @@ private:
385 ResultCode AllocateMainThreadStack(std::size_t stack_size); 382 ResultCode AllocateMainThreadStack(std::size_t stack_size);
386 383
387 /// Memory manager for this process 384 /// Memory manager for this process
388 std::unique_ptr<Memory::PageTable> page_table; 385 std::unique_ptr<KPageTable> page_table;
389 386
390 /// Current status of the process 387 /// Current status of the process
391 ProcessStatus status{}; 388 ProcessStatus status{};
diff --git a/src/core/hle/kernel/process_capability.cpp b/src/core/hle/kernel/process_capability.cpp
index 7c567049e..3fc326eab 100644
--- a/src/core/hle/kernel/process_capability.cpp
+++ b/src/core/hle/kernel/process_capability.cpp
@@ -7,7 +7,7 @@
7#include "common/bit_util.h" 7#include "common/bit_util.h"
8#include "common/logging/log.h" 8#include "common/logging/log.h"
9#include "core/hle/kernel/handle_table.h" 9#include "core/hle/kernel/handle_table.h"
10#include "core/hle/kernel/memory/page_table.h" 10#include "core/hle/kernel/k_page_table.h"
11#include "core/hle/kernel/process_capability.h" 11#include "core/hle/kernel/process_capability.h"
12#include "core/hle/kernel/svc_results.h" 12#include "core/hle/kernel/svc_results.h"
13 13
@@ -69,7 +69,7 @@ u32 GetFlagBitOffset(CapabilityType type) {
69 69
70ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabilities, 70ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabilities,
71 std::size_t num_capabilities, 71 std::size_t num_capabilities,
72 Memory::PageTable& page_table) { 72 KPageTable& page_table) {
73 Clear(); 73 Clear();
74 74
75 // Allow all cores and priorities. 75 // Allow all cores and priorities.
@@ -82,7 +82,7 @@ ResultCode ProcessCapabilities::InitializeForKernelProcess(const u32* capabiliti
82 82
83ResultCode ProcessCapabilities::InitializeForUserProcess(const u32* capabilities, 83ResultCode ProcessCapabilities::InitializeForUserProcess(const u32* capabilities,
84 std::size_t num_capabilities, 84 std::size_t num_capabilities,
85 Memory::PageTable& page_table) { 85 KPageTable& page_table) {
86 Clear(); 86 Clear();
87 87
88 return ParseCapabilities(capabilities, num_capabilities, page_table); 88 return ParseCapabilities(capabilities, num_capabilities, page_table);
@@ -108,7 +108,7 @@ void ProcessCapabilities::InitializeForMetadatalessProcess() {
108 108
109ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities, 109ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
110 std::size_t num_capabilities, 110 std::size_t num_capabilities,
111 Memory::PageTable& page_table) { 111 KPageTable& page_table) {
112 u32 set_flags = 0; 112 u32 set_flags = 0;
113 u32 set_svc_bits = 0; 113 u32 set_svc_bits = 0;
114 114
@@ -155,7 +155,7 @@ ResultCode ProcessCapabilities::ParseCapabilities(const u32* capabilities,
155} 155}
156 156
157ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits, 157ResultCode ProcessCapabilities::ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits,
158 u32 flag, Memory::PageTable& page_table) { 158 u32 flag, KPageTable& page_table) {
159 const auto type = GetCapabilityType(flag); 159 const auto type = GetCapabilityType(flag);
160 160
161 if (type == CapabilityType::Unset) { 161 if (type == CapabilityType::Unset) {
@@ -293,12 +293,12 @@ ResultCode ProcessCapabilities::HandleSyscallFlags(u32& set_svc_bits, u32 flags)
293} 293}
294 294
295ResultCode ProcessCapabilities::HandleMapPhysicalFlags(u32 flags, u32 size_flags, 295ResultCode ProcessCapabilities::HandleMapPhysicalFlags(u32 flags, u32 size_flags,
296 Memory::PageTable& page_table) { 296 KPageTable& page_table) {
297 // TODO(Lioncache): Implement once the memory manager can handle this. 297 // TODO(Lioncache): Implement once the memory manager can handle this.
298 return RESULT_SUCCESS; 298 return RESULT_SUCCESS;
299} 299}
300 300
301ResultCode ProcessCapabilities::HandleMapIOFlags(u32 flags, Memory::PageTable& page_table) { 301ResultCode ProcessCapabilities::HandleMapIOFlags(u32 flags, KPageTable& page_table) {
302 // TODO(Lioncache): Implement once the memory manager can handle this. 302 // TODO(Lioncache): Implement once the memory manager can handle this.
303 return RESULT_SUCCESS; 303 return RESULT_SUCCESS;
304} 304}
diff --git a/src/core/hle/kernel/process_capability.h b/src/core/hle/kernel/process_capability.h
index ea9d12c16..73ad197fa 100644
--- a/src/core/hle/kernel/process_capability.h
+++ b/src/core/hle/kernel/process_capability.h
@@ -12,9 +12,7 @@ union ResultCode;
12 12
13namespace Kernel { 13namespace Kernel {
14 14
15namespace Memory { 15class KPageTable;
16class PageTable;
17}
18 16
19/// The possible types of programs that may be indicated 17/// The possible types of programs that may be indicated
20/// by the program type capability descriptor. 18/// by the program type capability descriptor.
@@ -90,7 +88,7 @@ public:
90 /// otherwise, an error code upon failure. 88 /// otherwise, an error code upon failure.
91 /// 89 ///
92 ResultCode InitializeForKernelProcess(const u32* capabilities, std::size_t num_capabilities, 90 ResultCode InitializeForKernelProcess(const u32* capabilities, std::size_t num_capabilities,
93 Memory::PageTable& page_table); 91 KPageTable& page_table);
94 92
95 /// Initializes this process capabilities instance for a userland process. 93 /// Initializes this process capabilities instance for a userland process.
96 /// 94 ///
@@ -103,7 +101,7 @@ public:
103 /// otherwise, an error code upon failure. 101 /// otherwise, an error code upon failure.
104 /// 102 ///
105 ResultCode InitializeForUserProcess(const u32* capabilities, std::size_t num_capabilities, 103 ResultCode InitializeForUserProcess(const u32* capabilities, std::size_t num_capabilities,
106 Memory::PageTable& page_table); 104 KPageTable& page_table);
107 105
108 /// Initializes this process capabilities instance for a process that does not 106 /// Initializes this process capabilities instance for a process that does not
109 /// have any metadata to parse. 107 /// have any metadata to parse.
@@ -189,7 +187,7 @@ private:
189 /// @return RESULT_SUCCESS if no errors occur, otherwise an error code. 187 /// @return RESULT_SUCCESS if no errors occur, otherwise an error code.
190 /// 188 ///
191 ResultCode ParseCapabilities(const u32* capabilities, std::size_t num_capabilities, 189 ResultCode ParseCapabilities(const u32* capabilities, std::size_t num_capabilities,
192 Memory::PageTable& page_table); 190 KPageTable& page_table);
193 191
194 /// Attempts to parse a capability descriptor that is only represented by a 192 /// Attempts to parse a capability descriptor that is only represented by a
195 /// single flag set. 193 /// single flag set.
@@ -204,7 +202,7 @@ private:
204 /// @return RESULT_SUCCESS if no errors occurred, otherwise an error code. 202 /// @return RESULT_SUCCESS if no errors occurred, otherwise an error code.
205 /// 203 ///
206 ResultCode ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits, u32 flag, 204 ResultCode ParseSingleFlagCapability(u32& set_flags, u32& set_svc_bits, u32 flag,
207 Memory::PageTable& page_table); 205 KPageTable& page_table);
208 206
209 /// Clears the internal state of this process capability instance. Necessary, 207 /// Clears the internal state of this process capability instance. Necessary,
210 /// to have a sane starting point due to us allowing running executables without 208 /// to have a sane starting point due to us allowing running executables without
@@ -228,10 +226,10 @@ private:
228 ResultCode HandleSyscallFlags(u32& set_svc_bits, u32 flags); 226 ResultCode HandleSyscallFlags(u32& set_svc_bits, u32 flags);
229 227
230 /// Handles flags related to mapping physical memory pages. 228 /// Handles flags related to mapping physical memory pages.
231 ResultCode HandleMapPhysicalFlags(u32 flags, u32 size_flags, Memory::PageTable& page_table); 229 ResultCode HandleMapPhysicalFlags(u32 flags, u32 size_flags, KPageTable& page_table);
232 230
233 /// Handles flags related to mapping IO pages. 231 /// Handles flags related to mapping IO pages.
234 ResultCode HandleMapIOFlags(u32 flags, Memory::PageTable& page_table); 232 ResultCode HandleMapIOFlags(u32 flags, KPageTable& page_table);
235 233
236 /// Handles flags related to the interrupt capability flags. 234 /// Handles flags related to the interrupt capability flags.
237 ResultCode HandleInterruptFlags(u32 flags); 235 ResultCode HandleInterruptFlags(u32 flags);
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index 4ffd65d33..cc8fa6576 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -29,6 +29,7 @@
29#include "core/hle/kernel/k_event.h" 29#include "core/hle/kernel/k_event.h"
30#include "core/hle/kernel/k_memory_block.h" 30#include "core/hle/kernel/k_memory_block.h"
31#include "core/hle/kernel/k_memory_layout.h" 31#include "core/hle/kernel/k_memory_layout.h"
32#include "core/hle/kernel/k_page_table.h"
32#include "core/hle/kernel/k_readable_event.h" 33#include "core/hle/kernel/k_readable_event.h"
33#include "core/hle/kernel/k_resource_limit.h" 34#include "core/hle/kernel/k_resource_limit.h"
34#include "core/hle/kernel/k_scheduler.h" 35#include "core/hle/kernel/k_scheduler.h"
@@ -39,7 +40,6 @@
39#include "core/hle/kernel/k_thread.h" 40#include "core/hle/kernel/k_thread.h"
40#include "core/hle/kernel/k_writable_event.h" 41#include "core/hle/kernel/k_writable_event.h"
41#include "core/hle/kernel/kernel.h" 42#include "core/hle/kernel/kernel.h"
42#include "core/hle/kernel/memory/page_table.h"
43#include "core/hle/kernel/physical_core.h" 43#include "core/hle/kernel/physical_core.h"
44#include "core/hle/kernel/process.h" 44#include "core/hle/kernel/process.h"
45#include "core/hle/kernel/svc.h" 45#include "core/hle/kernel/svc.h"
@@ -67,8 +67,8 @@ constexpr bool IsValidAddressRange(VAddr address, u64 size) {
67// Helper function that performs the common sanity checks for svcMapMemory 67// Helper function that performs the common sanity checks for svcMapMemory
68// and svcUnmapMemory. This is doable, as both functions perform their sanitizing 68// and svcUnmapMemory. This is doable, as both functions perform their sanitizing
69// in the same order. 69// in the same order.
70ResultCode MapUnmapMemorySanityChecks(const Memory::PageTable& manager, VAddr dst_addr, 70ResultCode MapUnmapMemorySanityChecks(const KPageTable& manager, VAddr dst_addr, VAddr src_addr,
71 VAddr src_addr, u64 size) { 71 u64 size) {
72 if (!Common::Is4KBAligned(dst_addr)) { 72 if (!Common::Is4KBAligned(dst_addr)) {
73 LOG_ERROR(Kernel_SVC, "Destination address is not aligned to 4KB, 0x{:016X}", dst_addr); 73 LOG_ERROR(Kernel_SVC, "Destination address is not aligned to 4KB, 0x{:016X}", dst_addr);
74 return ResultInvalidAddress; 74 return ResultInvalidAddress;
diff --git a/src/core/hle/kernel/transfer_memory.cpp b/src/core/hle/kernel/transfer_memory.cpp
index b92559616..cad063e4d 100644
--- a/src/core/hle/kernel/transfer_memory.cpp
+++ b/src/core/hle/kernel/transfer_memory.cpp
@@ -2,9 +2,9 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/hle/kernel/k_page_table.h"
5#include "core/hle/kernel/k_resource_limit.h" 6#include "core/hle/kernel/k_resource_limit.h"
6#include "core/hle/kernel/kernel.h" 7#include "core/hle/kernel/kernel.h"
7#include "core/hle/kernel/memory/page_table.h"
8#include "core/hle/kernel/process.h" 8#include "core/hle/kernel/process.h"
9#include "core/hle/kernel/transfer_memory.h" 9#include "core/hle/kernel/transfer_memory.h"
10#include "core/hle/result.h" 10#include "core/hle/result.h"
diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp
index b42184a3b..d111c1357 100644
--- a/src/core/hle/service/ldr/ldr.cpp
+++ b/src/core/hle/service/ldr/ldr.cpp
@@ -11,8 +11,8 @@
11#include "common/scope_exit.h" 11#include "common/scope_exit.h"
12#include "core/core.h" 12#include "core/core.h"
13#include "core/hle/ipc_helpers.h" 13#include "core/hle/ipc_helpers.h"
14#include "core/hle/kernel/k_page_table.h"
14#include "core/hle/kernel/k_system_control.h" 15#include "core/hle/kernel/k_system_control.h"
15#include "core/hle/kernel/memory/page_table.h"
16#include "core/hle/kernel/process.h" 16#include "core/hle/kernel/process.h"
17#include "core/hle/kernel/svc_results.h" 17#include "core/hle/kernel/svc_results.h"
18#include "core/hle/service/ldr/ldr.h" 18#include "core/hle/service/ldr/ldr.h"
@@ -287,8 +287,7 @@ public:
287 rb.Push(RESULT_SUCCESS); 287 rb.Push(RESULT_SUCCESS);
288 } 288 }
289 289
290 bool ValidateRegionForMap(Kernel::Memory::PageTable& page_table, VAddr start, 290 bool ValidateRegionForMap(Kernel::KPageTable& page_table, VAddr start, std::size_t size) const {
291 std::size_t size) const {
292 constexpr std::size_t padding_size{4 * Kernel::PageSize}; 291 constexpr std::size_t padding_size{4 * Kernel::PageSize};
293 const auto start_info{page_table.QueryInfo(start - 1)}; 292 const auto start_info{page_table.QueryInfo(start - 1)};
294 293
@@ -309,7 +308,7 @@ public:
309 return (start + size + padding_size) <= (end_info.GetAddress() + end_info.GetSize()); 308 return (start + size + padding_size) <= (end_info.GetAddress() + end_info.GetSize());
310 } 309 }
311 310
312 VAddr GetRandomMapRegion(const Kernel::Memory::PageTable& page_table, std::size_t size) const { 311 VAddr GetRandomMapRegion(const Kernel::KPageTable& page_table, std::size_t size) const {
313 VAddr addr{}; 312 VAddr addr{};
314 const std::size_t end_pages{(page_table.GetAliasCodeRegionSize() - size) >> 313 const std::size_t end_pages{(page_table.GetAliasCodeRegionSize() - size) >>
315 Kernel::PageBits}; 314 Kernel::PageBits};
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 79ebf11de..4a10211f6 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -12,8 +12,8 @@
12#include "core/file_sys/control_metadata.h" 12#include "core/file_sys/control_metadata.h"
13#include "core/file_sys/patch_manager.h" 13#include "core/file_sys/patch_manager.h"
14#include "core/file_sys/romfs_factory.h" 14#include "core/file_sys/romfs_factory.h"
15#include "core/hle/kernel/k_page_table.h"
15#include "core/hle/kernel/kernel.h" 16#include "core/hle/kernel/kernel.h"
16#include "core/hle/kernel/memory/page_table.h"
17#include "core/hle/kernel/process.h" 17#include "core/hle/kernel/process.h"
18#include "core/hle/service/filesystem/filesystem.h" 18#include "core/hle/service/filesystem/filesystem.h"
19#include "core/loader/deconstructed_rom_directory.h" 19#include "core/loader/deconstructed_rom_directory.h"
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index dca1fcb18..f4a339390 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -10,7 +10,7 @@
10#include "common/file_util.h" 10#include "common/file_util.h"
11#include "common/logging/log.h" 11#include "common/logging/log.h"
12#include "core/hle/kernel/code_set.h" 12#include "core/hle/kernel/code_set.h"
13#include "core/hle/kernel/memory/page_table.h" 13#include "core/hle/kernel/k_page_table.h"
14#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/loader/elf.h" 15#include "core/loader/elf.h"
16#include "core/memory.h" 16#include "core/memory.h"
diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp
index e162c4ff0..3f4ba233d 100644
--- a/src/core/loader/kip.cpp
+++ b/src/core/loader/kip.cpp
@@ -6,7 +6,7 @@
6#include "core/file_sys/kernel_executable.h" 6#include "core/file_sys/kernel_executable.h"
7#include "core/file_sys/program_metadata.h" 7#include "core/file_sys/program_metadata.h"
8#include "core/hle/kernel/code_set.h" 8#include "core/hle/kernel/code_set.h"
9#include "core/hle/kernel/memory/page_table.h" 9#include "core/hle/kernel/k_page_table.h"
10#include "core/hle/kernel/process.h" 10#include "core/hle/kernel/process.h"
11#include "core/loader/kip.h" 11#include "core/loader/kip.h"
12#include "core/memory.h" 12#include "core/memory.h"
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index f976d0a9c..14618cb40 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -15,8 +15,8 @@
15#include "core/file_sys/romfs_factory.h" 15#include "core/file_sys/romfs_factory.h"
16#include "core/file_sys/vfs_offset.h" 16#include "core/file_sys/vfs_offset.h"
17#include "core/hle/kernel/code_set.h" 17#include "core/hle/kernel/code_set.h"
18#include "core/hle/kernel/k_page_table.h"
18#include "core/hle/kernel/k_thread.h" 19#include "core/hle/kernel/k_thread.h"
19#include "core/hle/kernel/memory/page_table.h"
20#include "core/hle/kernel/process.h" 20#include "core/hle/kernel/process.h"
21#include "core/hle/service/filesystem/filesystem.h" 21#include "core/hle/service/filesystem/filesystem.h"
22#include "core/loader/nro.h" 22#include "core/loader/nro.h"
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index ea347ea83..cbd048695 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -15,8 +15,8 @@
15#include "core/core.h" 15#include "core/core.h"
16#include "core/file_sys/patch_manager.h" 16#include "core/file_sys/patch_manager.h"
17#include "core/hle/kernel/code_set.h" 17#include "core/hle/kernel/code_set.h"
18#include "core/hle/kernel/k_page_table.h"
18#include "core/hle/kernel/k_thread.h" 19#include "core/hle/kernel/k_thread.h"
19#include "core/hle/kernel/memory/page_table.h"
20#include "core/hle/kernel/process.h" 20#include "core/hle/kernel/process.h"
21#include "core/loader/nso.h" 21#include "core/loader/nso.h"
22#include "core/memory.h" 22#include "core/memory.h"
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 11609682a..b9dd3e275 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -16,7 +16,7 @@
16#include "core/arm/arm_interface.h" 16#include "core/arm/arm_interface.h"
17#include "core/core.h" 17#include "core/core.h"
18#include "core/device_memory.h" 18#include "core/device_memory.h"
19#include "core/hle/kernel/memory/page_table.h" 19#include "core/hle/kernel/k_page_table.h"
20#include "core/hle/kernel/physical_memory.h" 20#include "core/hle/kernel/physical_memory.h"
21#include "core/hle/kernel/process.h" 21#include "core/hle/kernel/process.h"
22#include "core/memory.h" 22#include "core/memory.h"
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp
index 2dd0eb0f8..8eec567ab 100644
--- a/src/core/memory/cheat_engine.cpp
+++ b/src/core/memory/cheat_engine.cpp
@@ -10,7 +10,7 @@
10#include "core/core_timing.h" 10#include "core/core_timing.h"
11#include "core/core_timing_util.h" 11#include "core/core_timing_util.h"
12#include "core/hardware_properties.h" 12#include "core/hardware_properties.h"
13#include "core/hle/kernel/memory/page_table.h" 13#include "core/hle/kernel/k_page_table.h"
14#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/hle/service/hid/controllers/npad.h" 15#include "core/hle/service/hid/controllers/npad.h"
16#include "core/hle/service/hid/hid.h" 16#include "core/hle/service/hid/hid.h"
diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp
index f199c3362..74fb32814 100644
--- a/src/core/reporter.cpp
+++ b/src/core/reporter.cpp
@@ -17,7 +17,7 @@
17#include "core/arm/arm_interface.h" 17#include "core/arm/arm_interface.h"
18#include "core/core.h" 18#include "core/core.h"
19#include "core/hle/kernel/hle_ipc.h" 19#include "core/hle/kernel/hle_ipc.h"
20#include "core/hle/kernel/memory/page_table.h" 20#include "core/hle/kernel/k_page_table.h"
21#include "core/hle/kernel/process.h" 21#include "core/hle/kernel/process.h"
22#include "core/hle/result.h" 22#include "core/hle/result.h"
23#include "core/memory.h" 23#include "core/memory.h"
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp
index 44240a9c4..4eb71efbd 100644
--- a/src/video_core/memory_manager.cpp
+++ b/src/video_core/memory_manager.cpp
@@ -6,7 +6,7 @@
6#include "common/assert.h" 6#include "common/assert.h"
7#include "common/logging/log.h" 7#include "common/logging/log.h"
8#include "core/core.h" 8#include "core/core.h"
9#include "core/hle/kernel/memory/page_table.h" 9#include "core/hle/kernel/k_page_table.h"
10#include "core/hle/kernel/process.h" 10#include "core/hle/kernel/process.h"
11#include "core/memory.h" 11#include "core/memory.h"
12#include "video_core/gpu.h" 12#include "video_core/gpu.h"