|
@@ -17,8 +17,8 @@
|
|
|
#include "core/memory_setup.h"
|
|
#include "core/memory_setup.h"
|
|
|
|
|
|
|
|
namespace Kernel {
|
|
namespace Kernel {
|
|
|
-
|
|
|
|
|
-static const char* GetMemoryStateName(MemoryState state) {
|
|
|
|
|
|
|
+namespace {
|
|
|
|
|
+const char* GetMemoryStateName(MemoryState state) {
|
|
|
static constexpr const char* names[] = {
|
|
static constexpr const char* names[] = {
|
|
|
"Unmapped", "Io",
|
|
"Unmapped", "Io",
|
|
|
"Normal", "CodeStatic",
|
|
"Normal", "CodeStatic",
|
|
@@ -35,6 +35,14 @@ static const char* GetMemoryStateName(MemoryState state) {
|
|
|
return names[ToSvcMemoryState(state)];
|
|
return names[ToSvcMemoryState(state)];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Checks if a given address range lies within a larger address range.
|
|
|
|
|
+constexpr bool IsInsideAddressRange(VAddr address, u64 size, VAddr address_range_begin,
|
|
|
|
|
+ VAddr address_range_end) {
|
|
|
|
|
+ const VAddr end_address = address + size - 1;
|
|
|
|
|
+ return address_range_begin <= address && end_address <= address_range_end - 1;
|
|
|
|
|
+}
|
|
|
|
|
+} // Anonymous namespace
|
|
|
|
|
+
|
|
|
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 || state != next.state || attribute != next.attribute ||
|
|
if (permissions != next.permissions || state != next.state || attribute != next.attribute ||
|
|
@@ -249,8 +257,7 @@ ResultCode VMManager::ReprotectRange(VAddr target, u64 size, VMAPermission new_p
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ResultVal<VAddr> VMManager::HeapAllocate(VAddr target, u64 size, VMAPermission perms) {
|
|
ResultVal<VAddr> VMManager::HeapAllocate(VAddr target, u64 size, VMAPermission perms) {
|
|
|
- if (target < GetHeapRegionBaseAddress() || target + size > GetHeapRegionEndAddress() ||
|
|
|
|
|
- target + size < target) {
|
|
|
|
|
|
|
+ if (!IsWithinHeapRegion(target, size)) {
|
|
|
return ERR_INVALID_ADDRESS;
|
|
return ERR_INVALID_ADDRESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -285,8 +292,7 @@ ResultVal<VAddr> VMManager::HeapAllocate(VAddr target, u64 size, VMAPermission p
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ResultCode VMManager::HeapFree(VAddr target, u64 size) {
|
|
ResultCode VMManager::HeapFree(VAddr target, u64 size) {
|
|
|
- if (target < GetHeapRegionBaseAddress() || target + size > GetHeapRegionEndAddress() ||
|
|
|
|
|
- target + size < target) {
|
|
|
|
|
|
|
+ if (!IsWithinHeapRegion(target, size)) {
|
|
|
return ERR_INVALID_ADDRESS;
|
|
return ERR_INVALID_ADDRESS;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -706,6 +712,11 @@ u64 VMManager::GetAddressSpaceWidth() const {
|
|
|
return address_space_width;
|
|
return address_space_width;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinAddressSpace(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetAddressSpaceBaseAddress(),
|
|
|
|
|
+ GetAddressSpaceEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
VAddr VMManager::GetASLRRegionBaseAddress() const {
|
|
VAddr VMManager::GetASLRRegionBaseAddress() const {
|
|
|
return aslr_region_base;
|
|
return aslr_region_base;
|
|
|
}
|
|
}
|
|
@@ -750,6 +761,11 @@ u64 VMManager::GetCodeRegionSize() const {
|
|
|
return code_region_end - code_region_base;
|
|
return code_region_end - code_region_base;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinCodeRegion(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetCodeRegionBaseAddress(),
|
|
|
|
|
+ GetCodeRegionEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
VAddr VMManager::GetHeapRegionBaseAddress() const {
|
|
VAddr VMManager::GetHeapRegionBaseAddress() const {
|
|
|
return heap_region_base;
|
|
return heap_region_base;
|
|
|
}
|
|
}
|
|
@@ -762,6 +778,11 @@ u64 VMManager::GetHeapRegionSize() const {
|
|
|
return heap_region_end - heap_region_base;
|
|
return heap_region_end - heap_region_base;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinHeapRegion(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetHeapRegionBaseAddress(),
|
|
|
|
|
+ GetHeapRegionEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
VAddr VMManager::GetMapRegionBaseAddress() const {
|
|
VAddr VMManager::GetMapRegionBaseAddress() const {
|
|
|
return map_region_base;
|
|
return map_region_base;
|
|
|
}
|
|
}
|
|
@@ -774,6 +795,10 @@ u64 VMManager::GetMapRegionSize() const {
|
|
|
return map_region_end - map_region_base;
|
|
return map_region_end - map_region_base;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinMapRegion(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetMapRegionBaseAddress(), GetMapRegionEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
VAddr VMManager::GetNewMapRegionBaseAddress() const {
|
|
VAddr VMManager::GetNewMapRegionBaseAddress() const {
|
|
|
return new_map_region_base;
|
|
return new_map_region_base;
|
|
|
}
|
|
}
|
|
@@ -786,6 +811,11 @@ u64 VMManager::GetNewMapRegionSize() const {
|
|
|
return new_map_region_end - new_map_region_base;
|
|
return new_map_region_end - new_map_region_base;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinNewMapRegion(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetNewMapRegionBaseAddress(),
|
|
|
|
|
+ GetNewMapRegionEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
VAddr VMManager::GetTLSIORegionBaseAddress() const {
|
|
VAddr VMManager::GetTLSIORegionBaseAddress() const {
|
|
|
return tls_io_region_base;
|
|
return tls_io_region_base;
|
|
|
}
|
|
}
|
|
@@ -798,4 +828,9 @@ u64 VMManager::GetTLSIORegionSize() const {
|
|
|
return tls_io_region_end - tls_io_region_base;
|
|
return tls_io_region_end - tls_io_region_base;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool VMManager::IsWithinTLSIORegion(VAddr address, u64 size) const {
|
|
|
|
|
+ return IsInsideAddressRange(address, size, GetTLSIORegionBaseAddress(),
|
|
|
|
|
+ GetTLSIORegionEndAddress());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
} // namespace Kernel
|
|
} // namespace Kernel
|