mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 23:49:01 -05:00 
			
		
		
		
	Memory: IsValidVirtualAddress/IsValidPhysicalAddress
This commit is contained in:
		| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 MerryMage
					MerryMage