diff options
Diffstat (limited to 'src/core/memory.cpp')
| -rw-r--r-- | src/core/memory.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 017033613..93cd67e39 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -195,6 +195,21 @@ struct Memory::Impl { | |||
| 195 | return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); | 195 | return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | u8* GetPointer(const VAddr vaddr) { | ||
| 199 | u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||
| 200 | if (page_pointer != nullptr) { | ||
| 201 | return page_pointer + (vaddr & PAGE_MASK); | ||
| 202 | } | ||
| 203 | |||
| 204 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == | ||
| 205 | Common::PageType::RasterizerCachedMemory) { | ||
| 206 | return GetPointerFromVMA(vaddr); | ||
| 207 | } | ||
| 208 | |||
| 209 | LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); | ||
| 210 | return nullptr; | ||
| 211 | } | ||
| 212 | |||
| 198 | /** | 213 | /** |
| 199 | * Maps a region of pages as a specific type. | 214 | * Maps a region of pages as a specific type. |
| 200 | * | 215 | * |
| @@ -276,6 +291,14 @@ bool Memory::IsValidVirtualAddress(const VAddr vaddr) const { | |||
| 276 | return impl->IsValidVirtualAddress(vaddr); | 291 | return impl->IsValidVirtualAddress(vaddr); |
| 277 | } | 292 | } |
| 278 | 293 | ||
| 294 | u8* Memory::GetPointer(VAddr vaddr) { | ||
| 295 | return impl->GetPointer(vaddr); | ||
| 296 | } | ||
| 297 | |||
| 298 | const u8* Memory::GetPointer(VAddr vaddr) const { | ||
| 299 | return impl->GetPointer(vaddr); | ||
| 300 | } | ||
| 301 | |||
| 279 | void SetCurrentPageTable(Kernel::Process& process) { | 302 | void SetCurrentPageTable(Kernel::Process& process) { |
| 280 | current_page_table = &process.VMManager().page_table; | 303 | current_page_table = &process.VMManager().page_table; |
| 281 | 304 | ||
| @@ -292,21 +315,6 @@ bool IsKernelVirtualAddress(const VAddr vaddr) { | |||
| 292 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; | 315 | return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
| 293 | } | 316 | } |
| 294 | 317 | ||
| 295 | u8* GetPointer(const VAddr vaddr) { | ||
| 296 | u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||
| 297 | if (page_pointer) { | ||
| 298 | return page_pointer + (vaddr & PAGE_MASK); | ||
| 299 | } | ||
| 300 | |||
| 301 | if (current_page_table->attributes[vaddr >> PAGE_BITS] == | ||
| 302 | Common::PageType::RasterizerCachedMemory) { | ||
| 303 | return GetPointerFromVMA(vaddr); | ||
| 304 | } | ||
| 305 | |||
| 306 | LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); | ||
| 307 | return nullptr; | ||
| 308 | } | ||
| 309 | |||
| 310 | std::string ReadCString(VAddr vaddr, std::size_t max_length) { | 318 | std::string ReadCString(VAddr vaddr, std::size_t max_length) { |
| 311 | std::string string; | 319 | std::string string; |
| 312 | string.reserve(max_length); | 320 | string.reserve(max_length); |