diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 83 |
2 files changed, 85 insertions, 1 deletions
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index d3b55a51e..ea3f59935 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp | |||
| @@ -38,7 +38,7 @@ static const char* GetMemoryStateName(MemoryState state) { | |||
| 38 | bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const { | 38 | bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const { |
| 39 | ASSERT(base + size == next.base); | 39 | ASSERT(base + size == next.base); |
| 40 | if (permissions != next.permissions || meminfo_state != next.meminfo_state || | 40 | if (permissions != next.permissions || meminfo_state != next.meminfo_state || |
| 41 | type != next.type) { | 41 | attribute != next.attribute || type != next.type) { |
| 42 | return false; | 42 | return false; |
| 43 | } | 43 | } |
| 44 | if (type == VMAType::AllocatedMemoryBlock && | 44 | if (type == VMAType::AllocatedMemoryBlock && |
| @@ -308,6 +308,7 @@ MemoryInfo VMManager::QueryMemory(VAddr address) const { | |||
| 308 | 308 | ||
| 309 | if (IsValidHandle(vma)) { | 309 | if (IsValidHandle(vma)) { |
| 310 | memory_info.base_address = vma->second.base; | 310 | memory_info.base_address = vma->second.base; |
| 311 | memory_info.attributes = ToSvcMemoryAttribute(vma->second.attribute); | ||
| 311 | memory_info.permission = static_cast<u32>(vma->second.permissions); | 312 | memory_info.permission = static_cast<u32>(vma->second.permissions); |
| 312 | memory_info.size = vma->second.size; | 313 | memory_info.size = vma->second.size; |
| 313 | memory_info.state = ToSvcMemoryState(vma->second.meminfo_state); | 314 | memory_info.state = ToSvcMemoryState(vma->second.meminfo_state); |
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 10bacac3e..99eeeffaa 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h | |||
| @@ -43,6 +43,88 @@ enum class VMAPermission : u8 { | |||
| 43 | ReadWriteExecute = Read | Write | Execute, | 43 | ReadWriteExecute = Read | Write | Execute, |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | constexpr VMAPermission operator|(VMAPermission lhs, VMAPermission rhs) { | ||
| 47 | return static_cast<VMAPermission>(u32(lhs) | u32(rhs)); | ||
| 48 | } | ||
| 49 | |||
| 50 | constexpr VMAPermission operator&(VMAPermission lhs, VMAPermission rhs) { | ||
| 51 | return static_cast<VMAPermission>(u32(lhs) & u32(rhs)); | ||
| 52 | } | ||
| 53 | |||
| 54 | constexpr VMAPermission operator^(VMAPermission lhs, VMAPermission rhs) { | ||
| 55 | return static_cast<VMAPermission>(u32(lhs) ^ u32(rhs)); | ||
| 56 | } | ||
| 57 | |||
| 58 | constexpr VMAPermission operator~(VMAPermission permission) { | ||
| 59 | return static_cast<VMAPermission>(~u32(permission)); | ||
| 60 | } | ||
| 61 | |||
| 62 | constexpr VMAPermission& operator|=(VMAPermission& lhs, VMAPermission rhs) { | ||
| 63 | lhs = lhs | rhs; | ||
| 64 | return lhs; | ||
| 65 | } | ||
| 66 | |||
| 67 | constexpr VMAPermission& operator&=(VMAPermission& lhs, VMAPermission rhs) { | ||
| 68 | lhs = lhs & rhs; | ||
| 69 | return lhs; | ||
| 70 | } | ||
| 71 | |||
| 72 | constexpr VMAPermission& operator^=(VMAPermission& lhs, VMAPermission rhs) { | ||
| 73 | lhs = lhs ^ rhs; | ||
| 74 | return lhs; | ||
| 75 | } | ||
| 76 | |||
| 77 | /// Attribute flags that can be applied to a VMA | ||
| 78 | enum class MemoryAttribute : u32 { | ||
| 79 | Mask = 0xFF, | ||
| 80 | |||
| 81 | /// No particular qualities | ||
| 82 | None = 0, | ||
| 83 | /// Memory locked/borrowed for use. e.g. This would be used by transfer memory. | ||
| 84 | Locked = 1, | ||
| 85 | /// Memory locked for use by IPC-related internals. | ||
| 86 | LockedForIPC = 2, | ||
| 87 | /// Mapped as part of the device address space. | ||
| 88 | DeviceMapped = 4, | ||
| 89 | /// Uncached memory | ||
| 90 | Uncached = 8, | ||
| 91 | }; | ||
| 92 | |||
| 93 | constexpr MemoryAttribute operator|(MemoryAttribute lhs, MemoryAttribute rhs) { | ||
| 94 | return static_cast<MemoryAttribute>(u32(lhs) | u32(rhs)); | ||
| 95 | } | ||
| 96 | |||
| 97 | constexpr MemoryAttribute operator&(MemoryAttribute lhs, MemoryAttribute rhs) { | ||
| 98 | return static_cast<MemoryAttribute>(u32(lhs) & u32(rhs)); | ||
| 99 | } | ||
| 100 | |||
| 101 | constexpr MemoryAttribute operator^(MemoryAttribute lhs, MemoryAttribute rhs) { | ||
| 102 | return static_cast<MemoryAttribute>(u32(lhs) ^ u32(rhs)); | ||
| 103 | } | ||
| 104 | |||
| 105 | constexpr MemoryAttribute operator~(MemoryAttribute attribute) { | ||
| 106 | return static_cast<MemoryAttribute>(~u32(attribute)); | ||
| 107 | } | ||
| 108 | |||
| 109 | constexpr MemoryAttribute& operator|=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||
| 110 | lhs = lhs | rhs; | ||
| 111 | return lhs; | ||
| 112 | } | ||
| 113 | |||
| 114 | constexpr MemoryAttribute& operator&=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||
| 115 | lhs = lhs & rhs; | ||
| 116 | return lhs; | ||
| 117 | } | ||
| 118 | |||
| 119 | constexpr MemoryAttribute& operator^=(MemoryAttribute& lhs, MemoryAttribute rhs) { | ||
| 120 | lhs = lhs ^ rhs; | ||
| 121 | return lhs; | ||
| 122 | } | ||
| 123 | |||
| 124 | constexpr u32 ToSvcMemoryAttribute(MemoryAttribute attribute) { | ||
| 125 | return static_cast<u32>(attribute & MemoryAttribute::Mask); | ||
| 126 | } | ||
| 127 | |||
| 46 | // clang-format off | 128 | // clang-format off |
| 47 | /// Represents memory states and any relevant flags, as used by the kernel. | 129 | /// Represents memory states and any relevant flags, as used by the kernel. |
| 48 | /// svcQueryMemory interprets these by masking away all but the first eight | 130 | /// svcQueryMemory interprets these by masking away all but the first eight |
| @@ -183,6 +265,7 @@ struct VirtualMemoryArea { | |||
| 183 | VMAPermission permissions = VMAPermission::None; | 265 | VMAPermission permissions = VMAPermission::None; |
| 184 | /// Tag returned by svcQueryMemory. Not otherwise used. | 266 | /// Tag returned by svcQueryMemory. Not otherwise used. |
| 185 | MemoryState meminfo_state = MemoryState::Unmapped; | 267 | MemoryState meminfo_state = MemoryState::Unmapped; |
| 268 | MemoryAttribute attribute = MemoryAttribute::None; | ||
| 186 | 269 | ||
| 187 | // Settings for type = AllocatedMemoryBlock | 270 | // Settings for type = AllocatedMemoryBlock |
| 188 | /// Memory block backing this VMA. | 271 | /// Memory block backing this VMA. |