瀏覽代碼

Memory: Add TryVirtualToPhysicalAddress, returning a boost::optional

Yuri Kunde Schlesner 9 年之前
父節點
當前提交
6ae0086b39
共有 2 個文件被更改,包括 23 次插入7 次删除
  1. 12 4
      src/core/memory.cpp
  2. 11 3
      src/core/memory.h

+ 12 - 4
src/core/memory.cpp

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

+ 11 - 3
src/core/memory.h

@@ -149,9 +149,17 @@ u8* GetPointer(VAddr virtual_address);
 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
-* address. This should be used by services to translate addresses for use by the hardware.
-*/
+ * 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.
+ */
+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);
 
 /**