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
					
				@ -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…
	
		Reference in New Issue
	
	Block a user