|
@@ -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.
|