summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/vm_manager.cpp3
-rw-r--r--src/core/hle/kernel/vm_manager.h83
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) {
38bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const { 38bool 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
46constexpr VMAPermission operator|(VMAPermission lhs, VMAPermission rhs) {
47 return static_cast<VMAPermission>(u32(lhs) | u32(rhs));
48}
49
50constexpr VMAPermission operator&(VMAPermission lhs, VMAPermission rhs) {
51 return static_cast<VMAPermission>(u32(lhs) & u32(rhs));
52}
53
54constexpr VMAPermission operator^(VMAPermission lhs, VMAPermission rhs) {
55 return static_cast<VMAPermission>(u32(lhs) ^ u32(rhs));
56}
57
58constexpr VMAPermission operator~(VMAPermission permission) {
59 return static_cast<VMAPermission>(~u32(permission));
60}
61
62constexpr VMAPermission& operator|=(VMAPermission& lhs, VMAPermission rhs) {
63 lhs = lhs | rhs;
64 return lhs;
65}
66
67constexpr VMAPermission& operator&=(VMAPermission& lhs, VMAPermission rhs) {
68 lhs = lhs & rhs;
69 return lhs;
70}
71
72constexpr 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
78enum 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
93constexpr MemoryAttribute operator|(MemoryAttribute lhs, MemoryAttribute rhs) {
94 return static_cast<MemoryAttribute>(u32(lhs) | u32(rhs));
95}
96
97constexpr MemoryAttribute operator&(MemoryAttribute lhs, MemoryAttribute rhs) {
98 return static_cast<MemoryAttribute>(u32(lhs) & u32(rhs));
99}
100
101constexpr MemoryAttribute operator^(MemoryAttribute lhs, MemoryAttribute rhs) {
102 return static_cast<MemoryAttribute>(u32(lhs) ^ u32(rhs));
103}
104
105constexpr MemoryAttribute operator~(MemoryAttribute attribute) {
106 return static_cast<MemoryAttribute>(~u32(attribute));
107}
108
109constexpr MemoryAttribute& operator|=(MemoryAttribute& lhs, MemoryAttribute rhs) {
110 lhs = lhs | rhs;
111 return lhs;
112}
113
114constexpr MemoryAttribute& operator&=(MemoryAttribute& lhs, MemoryAttribute rhs) {
115 lhs = lhs & rhs;
116 return lhs;
117}
118
119constexpr MemoryAttribute& operator^=(MemoryAttribute& lhs, MemoryAttribute rhs) {
120 lhs = lhs ^ rhs;
121 return lhs;
122}
123
124constexpr 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.