|
|
@ -195,6 +195,21 @@ struct Memory::Impl { |
|
|
return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); |
|
|
return IsValidVirtualAddress(*system.CurrentProcess(), vaddr); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
u8* GetPointer(const VAddr vaddr) { |
|
|
|
|
|
u8* const page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |
|
|
|
|
|
if (page_pointer != nullptr) { |
|
|
|
|
|
return page_pointer + (vaddr & PAGE_MASK); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (current_page_table->attributes[vaddr >> PAGE_BITS] == |
|
|
|
|
|
Common::PageType::RasterizerCachedMemory) { |
|
|
|
|
|
return GetPointerFromVMA(vaddr); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); |
|
|
|
|
|
return nullptr; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Maps a region of pages as a specific type. |
|
|
* Maps a region of pages as a specific type. |
|
|
* |
|
|
* |
|
|
@ -276,6 +291,14 @@ bool Memory::IsValidVirtualAddress(const VAddr vaddr) const { |
|
|
return impl->IsValidVirtualAddress(vaddr); |
|
|
return impl->IsValidVirtualAddress(vaddr); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
u8* Memory::GetPointer(VAddr vaddr) { |
|
|
|
|
|
return impl->GetPointer(vaddr); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const u8* Memory::GetPointer(VAddr vaddr) const { |
|
|
|
|
|
return impl->GetPointer(vaddr); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void SetCurrentPageTable(Kernel::Process& process) { |
|
|
void SetCurrentPageTable(Kernel::Process& process) { |
|
|
current_page_table = &process.VMManager().page_table; |
|
|
current_page_table = &process.VMManager().page_table; |
|
|
|
|
|
|
|
|
@ -292,21 +315,6 @@ bool IsKernelVirtualAddress(const VAddr vaddr) { |
|
|
return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
|
|
return KERNEL_REGION_VADDR <= vaddr && vaddr < KERNEL_REGION_END; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
u8* GetPointer(const VAddr vaddr) { |
|
|
|
|
|
u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; |
|
|
|
|
|
if (page_pointer) { |
|
|
|
|
|
return page_pointer + (vaddr & PAGE_MASK); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (current_page_table->attributes[vaddr >> PAGE_BITS] == |
|
|
|
|
|
Common::PageType::RasterizerCachedMemory) { |
|
|
|
|
|
return GetPointerFromVMA(vaddr); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LOG_ERROR(HW_Memory, "Unknown GetPointer @ 0x{:016X}", vaddr); |
|
|
|
|
|
return nullptr; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::string ReadCString(VAddr vaddr, std::size_t max_length) { |
|
|
std::string ReadCString(VAddr vaddr, std::size_t max_length) { |
|
|
std::string string; |
|
|
std::string string; |
|
|
string.reserve(max_length); |
|
|
string.reserve(max_length); |
|
|
|