diff options
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 25 |
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 | */ |
| 113 | static MMIORegionPointer GetMMIOHandler(VAddr vaddr) { | 113 | static 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 | ||
| 123 | static 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 | |||
| 123 | template <typename T> | 128 | template <typename T> |
| 124 | T ReadMMIO(MMIORegionPointer mmio_handler, VAddr addr); | 129 | T 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 | ||
| 207 | bool IsValidVirtualAddress(const VAddr vaddr) { | 212 | bool 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 | ||
| 233 | bool IsValidVirtualAddress(const VAddr vaddr) { | ||
| 234 | return IsValidVirtualAddress(*Kernel::g_current_process, vaddr); | ||
| 235 | } | ||
| 236 | |||
| 226 | bool IsValidPhysicalAddress(const PAddr paddr) { | 237 | bool IsValidPhysicalAddress(const PAddr paddr) { |
| 227 | return GetPhysicalPointer(paddr) != nullptr; | 238 | return GetPhysicalPointer(paddr) != nullptr; |
| 228 | } | 239 | } |