forked from eden-emu/eden
		
	vm_manager: Add backing functionality for memory attributes
Adds the barebones enumeration constants and functions in place to handle memory attributes, while also essentially leaving the attribute itself non-functional.
This commit is contained in:
		
							parent
							
								
									2f2fc47af2
								
							
						
					
					
						commit
						34b24a47e9
					
				
					 2 changed files with 85 additions and 1 deletions
				
			
		|  | @ -38,7 +38,7 @@ static const char* GetMemoryStateName(MemoryState state) { | ||||||
| bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const { | bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const { | ||||||
|     ASSERT(base + size == next.base); |     ASSERT(base + size == next.base); | ||||||
|     if (permissions != next.permissions || meminfo_state != next.meminfo_state || |     if (permissions != next.permissions || meminfo_state != next.meminfo_state || | ||||||
|         type != next.type) { |         attribute != next.attribute || type != next.type) { | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|     if (type == VMAType::AllocatedMemoryBlock && |     if (type == VMAType::AllocatedMemoryBlock && | ||||||
|  | @ -308,6 +308,7 @@ MemoryInfo VMManager::QueryMemory(VAddr address) const { | ||||||
| 
 | 
 | ||||||
|     if (IsValidHandle(vma)) { |     if (IsValidHandle(vma)) { | ||||||
|         memory_info.base_address = vma->second.base; |         memory_info.base_address = vma->second.base; | ||||||
|  |         memory_info.attributes = ToSvcMemoryAttribute(vma->second.attribute); | ||||||
|         memory_info.permission = static_cast<u32>(vma->second.permissions); |         memory_info.permission = static_cast<u32>(vma->second.permissions); | ||||||
|         memory_info.size = vma->second.size; |         memory_info.size = vma->second.size; | ||||||
|         memory_info.state = ToSvcMemoryState(vma->second.meminfo_state); |         memory_info.state = ToSvcMemoryState(vma->second.meminfo_state); | ||||||
|  |  | ||||||
|  | @ -43,6 +43,88 @@ enum class VMAPermission : u8 { | ||||||
|     ReadWriteExecute = Read | Write | Execute, |     ReadWriteExecute = Read | Write | Execute, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | constexpr VMAPermission operator|(VMAPermission lhs, VMAPermission rhs) { | ||||||
|  |     return static_cast<VMAPermission>(u32(lhs) | u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission operator&(VMAPermission lhs, VMAPermission rhs) { | ||||||
|  |     return static_cast<VMAPermission>(u32(lhs) & u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission operator^(VMAPermission lhs, VMAPermission rhs) { | ||||||
|  |     return static_cast<VMAPermission>(u32(lhs) ^ u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission operator~(VMAPermission permission) { | ||||||
|  |     return static_cast<VMAPermission>(~u32(permission)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission& operator|=(VMAPermission& lhs, VMAPermission rhs) { | ||||||
|  |     lhs = lhs | rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission& operator&=(VMAPermission& lhs, VMAPermission rhs) { | ||||||
|  |     lhs = lhs & rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr VMAPermission& operator^=(VMAPermission& lhs, VMAPermission rhs) { | ||||||
|  |     lhs = lhs ^ rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Attribute flags that can be applied to a VMA
 | ||||||
|  | enum class MemoryAttribute : u32 { | ||||||
|  |     Mask = 0xFF, | ||||||
|  | 
 | ||||||
|  |     /// No particular qualities
 | ||||||
|  |     None = 0, | ||||||
|  |     /// Memory locked/borrowed for use. e.g. This would be used by transfer memory.
 | ||||||
|  |     Locked = 1, | ||||||
|  |     /// Memory locked for use by IPC-related internals.
 | ||||||
|  |     LockedForIPC = 2, | ||||||
|  |     /// Mapped as part of the device address space.
 | ||||||
|  |     DeviceMapped = 4, | ||||||
|  |     /// Uncached memory
 | ||||||
|  |     Uncached = 8, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute operator|(MemoryAttribute lhs, MemoryAttribute rhs) { | ||||||
|  |     return static_cast<MemoryAttribute>(u32(lhs) | u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute operator&(MemoryAttribute lhs, MemoryAttribute rhs) { | ||||||
|  |     return static_cast<MemoryAttribute>(u32(lhs) & u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute operator^(MemoryAttribute lhs, MemoryAttribute rhs) { | ||||||
|  |     return static_cast<MemoryAttribute>(u32(lhs) ^ u32(rhs)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute operator~(MemoryAttribute attribute) { | ||||||
|  |     return static_cast<MemoryAttribute>(~u32(attribute)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute& operator|=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||||||
|  |     lhs = lhs | rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute& operator&=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||||||
|  |     lhs = lhs & rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr MemoryAttribute& operator^=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||||||
|  |     lhs = lhs ^ rhs; | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | constexpr u32 ToSvcMemoryAttribute(MemoryAttribute attribute) { | ||||||
|  |     return static_cast<u32>(attribute & MemoryAttribute::Mask); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // clang-format off
 | // clang-format off
 | ||||||
| /// Represents memory states and any relevant flags, as used by the kernel.
 | /// Represents memory states and any relevant flags, as used by the kernel.
 | ||||||
| /// svcQueryMemory interprets these by masking away all but the first eight
 | /// svcQueryMemory interprets these by masking away all but the first eight
 | ||||||
|  | @ -183,6 +265,7 @@ struct VirtualMemoryArea { | ||||||
|     VMAPermission permissions = VMAPermission::None; |     VMAPermission permissions = VMAPermission::None; | ||||||
|     /// Tag returned by svcQueryMemory. Not otherwise used.
 |     /// Tag returned by svcQueryMemory. Not otherwise used.
 | ||||||
|     MemoryState meminfo_state = MemoryState::Unmapped; |     MemoryState meminfo_state = MemoryState::Unmapped; | ||||||
|  |     MemoryAttribute attribute = MemoryAttribute::None; | ||||||
| 
 | 
 | ||||||
|     // Settings for type = AllocatedMemoryBlock
 |     // Settings for type = AllocatedMemoryBlock
 | ||||||
|     /// Memory block backing this VMA.
 |     /// Memory block backing this VMA.
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lioncash
						Lioncash