mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Memory: IsValidVirtualAddress/IsValidPhysicalAddress
This commit is contained in:
		
							parent
							
								
									51ee2d2eb1
								
							
						
					
					
						commit
						c084fc824c
					
				
					 3 changed files with 26 additions and 0 deletions
				
			
		|  | @ -246,6 +246,26 @@ void Write(const VAddr vaddr, const T data) { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| bool IsValidVirtualAddress(const VAddr vaddr) { | ||||
|     const u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||||
|     if (page_pointer) | ||||
|         return true; | ||||
| 
 | ||||
|     if (current_page_table->attributes[vaddr >> PAGE_BITS] != PageType::Special) | ||||
|         return false; | ||||
| 
 | ||||
|     MMIORegionPointer mmio_region = GetMMIOHandler(vaddr); | ||||
|     if (mmio_region) { | ||||
|         return mmio_region->IsValidAddress(vaddr); | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool IsValidPhysicalAddress(const PAddr paddr) { | ||||
|     return IsValidVirtualAddress(PhysicalToVirtualAddress(paddr)); | ||||
| } | ||||
| 
 | ||||
| u8* GetPointer(const VAddr vaddr) { | ||||
|     u8* page_pointer = current_page_table->pointers[vaddr >> PAGE_BITS]; | ||||
|     if (page_pointer) { | ||||
|  | @ -261,6 +281,7 @@ u8* GetPointer(const VAddr vaddr) { | |||
| } | ||||
| 
 | ||||
| u8* GetPhysicalPointer(PAddr address) { | ||||
|     // TODO(Subv): This call should not go through the application's memory mapping.
 | ||||
|     return GetPointer(PhysicalToVirtualAddress(address)); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -110,6 +110,9 @@ enum : VAddr { | |||
|     NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE, | ||||
| }; | ||||
| 
 | ||||
| bool IsValidVirtualAddress(const VAddr addr); | ||||
| bool IsValidPhysicalAddress(const PAddr addr); | ||||
| 
 | ||||
| u8 Read8(VAddr addr); | ||||
| u16 Read16(VAddr addr); | ||||
| u32 Read32(VAddr addr); | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ class MMIORegion { | |||
| public: | ||||
|     virtual ~MMIORegion() = default; | ||||
| 
 | ||||
|     virtual bool IsValidAddress(VAddr addr) = 0; | ||||
| 
 | ||||
|     virtual u8 Read8(VAddr addr) = 0; | ||||
|     virtual u16 Read16(VAddr addr) = 0; | ||||
|     virtual u32 Read32(VAddr addr) = 0; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue