diff options
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 28b65ca5e..4c13ea1e7 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -75,6 +75,29 @@ struct Memory::Impl { | |||
| 75 | std::make_pair(interval, std::set<Common::SpecialRegion>{region})); | 75 | std::make_pair(interval, std::set<Common::SpecialRegion>{region})); |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) const { | ||
| 79 | const auto& page_table = process.VMManager().page_table; | ||
| 80 | |||
| 81 | const u8* const page_pointer = page_table.pointers[vaddr >> PAGE_BITS]; | ||
| 82 | if (page_pointer != nullptr) { | ||
| 83 | return true; | ||
| 84 | } | ||
| 85 | |||
| 86 | if (page_table.attributes[vaddr >> PAGE_BITS] == Common::PageType::RasterizerCachedMemory) { | ||
| 87 | return true; | ||
| 88 | } | ||
| 89 | |||
| 90 | if (page_table.attributes[vaddr >> PAGE_BITS] != Common::PageType::Special) { | ||
| 91 | return false; | ||
| 92 | } | ||
| 93 | |||
| 94 | return false; | ||
| 95 | } | ||
| 96 | |||
| 97 | bool IsValidVirtualAddress(VAddr vaddr) const { | ||
| 98 | return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); | ||
| 99 | } | ||
| 100 | |||
| 78 | /** | 101 | /** |
| 79 | * Maps a region of pages as a specific type. | 102 | * Maps a region of pages as a specific type. |
| 80 | * | 103 | * |
| @@ -148,6 +171,14 @@ void Memory::RemoveDebugHook(Common::PageTable& page_table, VAddr base, u64 size | |||
| 148 | impl->RemoveDebugHook(page_table, base, size, std::move(hook)); | 171 | impl->RemoveDebugHook(page_table, base, size, std::move(hook)); |
| 149 | } | 172 | } |
| 150 | 173 | ||
| 174 | bool Memory::IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) const { | ||
| 175 | return impl->IsValidVirtualAddress(process, vaddr); | ||
| 176 | } | ||
| 177 | |||
| 178 | bool Memory::IsValidVirtualAddress(const VAddr vaddr) const { | ||
| 179 | return impl->IsValidVirtualAddress(vaddr); | ||
| 180 | } | ||
| 181 | |||
| 151 | void SetCurrentPageTable(Kernel::Process& process) { | 182 | void SetCurrentPageTable(Kernel::Process& process) { |
| 152 | current_page_table = &process.VMManager().page_table; | 183 | current_page_table = &process.VMManager().page_table; |
| 153 | 184 | ||
| @@ -256,26 +287,6 @@ void Write(const VAddr vaddr, const T data) { | |||
| 256 | } | 287 | } |
| 257 | } | 288 | } |
| 258 | 289 | ||
| 259 | bool IsValidVirtualAddress(const Kernel::Process& process, const VAddr vaddr) { | ||
| 260 | const auto& page_table = process.VMManager().page_table; | ||
| 261 | |||
| 262 | const u8* page_pointer = page_table.pointers[vaddr >> PAGE_BITS]; | ||
| 263 | if (page_pointer) | ||
| 264 | return true; | ||
| 265 | |||
| 266 | if (page_table.attributes[vaddr >> PAGE_BITS] == Common::PageType::RasterizerCachedMemory) | ||
| 267 | return true; | ||
| 268 | |||
| 269 | if (page_table.attributes[vaddr >> PAGE_BITS] != Common::PageType::Special) | ||
| 270 | return false; | ||
| 271 | |||
| 272 | return false; | ||
| 273 | } | ||
| 274 | |||
| 275 | bool IsValidVirtualAddress(const VAddr vaddr) { | ||
| 276 | return IsValidVirtualAddress(*Core::System::GetInstance().CurrentProcess(), vaddr); | ||
| 277 | } | ||
| 278 | |||
| 279 | bool IsKernelVirtualAddress(const VAddr vaddr) { | 290 | bool IsKernelVirtualAddress(const VAddr vaddr) { |
| 280 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; | 291 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
| 281 | } | 292 | } |