mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	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,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; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     LOG_ERROR(HW_Memory, "Unknown virtual address @ 0x%08X", addr); |     return boost::none; | ||||||
|     // To help with debugging, set bit on address so that it's obviously invalid.
 | } | ||||||
|     return addr | 0x80000000; | 
 | ||||||
|  | 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) { | boost::optional<VAddr> PhysicalToVirtualAddress(const PAddr addr) { | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue