Memory: Add TryVirtualToPhysicalAddress, returning a boost::optional
This commit is contained in:
parent
326e7c7020
commit
6ae0086b39
2 changed files with 23 additions and 7 deletions
|
@ -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,10 +687,18 @@ 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) {
|
||||||
if (addr == 0) {
|
if (addr == 0) {
|
||||||
|
|
|
@ -152,6 +152,14 @@ 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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue