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.
|
||||||
|
|
Reference in New Issue