summaryrefslogtreecommitdiff
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 9b394f84b..5ea0694a9 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -110,8 +110,8 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
110/** 110/**
111 * This function should only be called for virtual addreses with attribute `PageType::Special`. 111 * This function should only be called for virtual addreses with attribute `PageType::Special`.
112 */ 112 */
113static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { 113static MMIORegionPointer GetMMIOHandler(const PageTable& page_table, VAddr vaddr) {
114 for (const auto& region : current_page_table->special_regions) { 114 for (const auto& region : page_table.special_regions) {
115 if (vaddr >= region.base && vaddr < (region.base + region.size)) { 115 if (vaddr >= region.base && vaddr < (region.base + region.size)) {
116 return region.handler; 116 return region.handler;
117 } 117 }
@@ -120,6 +120,11 @@ static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
120 return nullptr; // Should never happen 120 return nullptr; // Should never happen
121} 121}
122 122
123static MMIORegionPointer GetMMIOHandler(VAddr vaddr) {
124 const PageTable& page_table = Kernel::g_current_process->vm_manager.page_table;
125 return GetMMIOHandler(page_table, vaddr);
126}
127
123template <typename T> 128template <typename T>
124T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); 129T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr);
125 130
@@ -204,18 +209,20 @@ void Write(const VAddr vaddr, const T data) {
204 } 209 }
205} 210}
206 211
207bool IsValidVirtualAddress(const VAddr vaddr) { 212bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) {
208 const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; 213 auto& page_table = process.vm_manager.page_table;
214
215 const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS];
209 if (page_pointer) 216 if (page_pointer)
210 return true; 217 return true;
211 218
212 if (current_page_table->attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory) 219 if (page_table.attributes[vaddr >> PAGE_BITS] == PageType::RasterizerCachedMemory)
213 return true; 220 return true;
214 221
215 if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special) 222 if (page_table.attributes[vaddr >> PAGE_BITS] != PageType::Special)
216 return false; 223 return false;
217 224
218 MMIORegionPointer mmio_region = GetMMIOHandler(vaddr); 225 MMIORegionPointer mmio_region = GetMMIOHandler(page_table, vaddr);
219 if (mmio_region) { 226 if (mmio_region) {
220 return mmio_region->IsValidAddress(vaddr); 227 return mmio_region->IsValidAddress(vaddr);
221 } 228 }
@@ -223,6 +230,10 @@ bool IsValidVirtualAddress(const VAddr vaddr) {
223 return false; 230 return false;
224} 231}
225 232
233bool IsValidVirtualAddress(const VAddr vaddr) {
234 return IsValidVirtualAddress(*Kernel::g_current_process, vaddr);
235}
236
226bool IsValidPhysicalAddress(const PAddr paddr) { 237bool IsValidPhysicalAddress(const PAddr paddr) {
227 return GetPhysicalPointer(paddr) != nullptr; 238 return GetPhysicalPointer(paddr) != nullptr;
228} 239}