Memory: Add TryVirtualToPhysicalAddress, returning a boost::optional

This commit is contained in:
Yuri Kunde Schlesner 2017-06-21 20:25:46 -07:00
parent 326e7c7020
commit 6ae0086b39
2 changed files with 23 additions and 7 deletions

View file

@ -670,7 +670,7 @@ void WriteMMIO<u64>(MMIORegionPointer mmio_handler, VAddr addr, const u64 data)
mmio_handler->Write64(addr, data); mmio_handler->Write64(addr, data);
} }
PAddr VirtualToPhysicalAddress(const VAddr addr) { boost::optional<PAddr> TryVirtualToPhysicalAddress(const VAddr addr) {
if (addr == 0) { if (addr == 0) {
return 0; return 0;
} else if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) { } else if (addr >= VRAM_VADDR && addr < VRAM_VADDR_END) {
@ -687,9 +687,17 @@ PAddr VirtualToPhysicalAddress(const VAddr addr) {
return addr - N3DS_EXTRA_RAM_VADDR + N3DS_EXTRA_RAM_PADDR; return addr - N3DS_EXTRA_RAM_VADDR + N3DS_EXTRA_RAM_PADDR;
} }
return boost::none;
}
PAddr VirtualToPhysicalAddress(const VAddr addr) {
auto paddr = TryVirtualToPhysicalAddress(addr);
if (!paddr) {
LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr); LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr);
// To help with debugging, set bit on address so that it's obviously invalid. // To help with debugging, set bit on address so that it's obviously invalid.
return addr | 0x80000000; return addr | 0x80000000;
}
return *paddr;
} }
boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) { boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) {

View file

@ -149,9 +149,17 @@ u8* GetPointer(VAddr virtual_address);
std::string ReadCString(VAddr virtual_address, std::size_t max_length); std::string ReadCString(VAddr virtual_address, std::size_t max_length);
/** /**
* Converts a virtual address inside a region with 1:1 mapping to physical memory to a physical * Converts a virtual address inside a region with 1:1 mapping to physical memory to a physical
* address. This should be used by services to translate addresses for use by the hardware. * address. This should be used by services to translate addresses for use by the hardware.
*/ */
boost::optional<PAddr> TryVirtualToPhysicalAddress(VAddr addr);
/**
* Converts a virtual address inside a region with 1:1 mapping to physical memory to a physical
* address. This should be used by services to translate addresses for use by the hardware.
*
* @deprecated Use TryVirtualToPhysicalAddress(), which reports failure.
*/
PAddr VirtualToPhysicalAddress(VAddr addr); PAddr VirtualToPhysicalAddress(VAddr addr);
/** /**