|
|
|
@ -17,8 +17,8 @@
|
|
|
|
|
#include "core/memory_setup.h"
|
|
|
|
|
|
|
|
|
|
namespace Kernel {
|
|
|
|
|
|
|
|
|
|
static const char* GetMemoryStateName(MemoryState state) {
|
|
|
|
|
namespace {
|
|
|
|
|
const char* GetMemoryStateName(MemoryState state) {
|
|
|
|
|
static constexpr const char* names[] = {
|
|
|
|
|
"Unmapped", "Io",
|
|
|
|
|
"Normal", "CodeStatic",
|
|
|
|
@ -35,6 +35,14 @@ static const char* GetMemoryStateName(MemoryState 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 {
|
|
|
|
|
ASSERT(base + size == next.base);
|
|
|
|
|
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) {
|
|
|
|
|
if (target < GetHeapRegionBaseAddress() || target + size > GetHeapRegionEndAddress() ||
|
|
|
|
|
target + size < target) {
|
|
|
|
|
if (!IsWithinHeapRegion(target, size)) {
|
|
|
|
|
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) {
|
|
|
|
|
if (target < GetHeapRegionBaseAddress() || target + size > GetHeapRegionEndAddress() ||
|
|
|
|
|
target + size < target) {
|
|
|
|
|
if (!IsWithinHeapRegion(target, size)) {
|
|
|
|
|
return ERR_INVALID_ADDRESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -706,6 +712,11 @@ u64 VMManager::GetAddressSpaceWidth() const {
|
|
|
|
|
return address_space_width;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool VMManager::IsWithinAddressSpace(VAddr address, u64 size) const {
|
|
|
|
|
return IsInsideAddressRange(address, size, GetAddressSpaceBaseAddress(),
|
|
|
|
|
GetAddressSpaceEndAddress());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VAddr VMManager::GetASLRRegionBaseAddress() const {
|
|
|
|
|
return aslr_region_base;
|
|
|
|
|
}
|
|
|
|
@ -750,6 +761,11 @@ u64 VMManager::GetCodeRegionSize() const {
|
|
|
|
|
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 {
|
|
|
|
|
return heap_region_base;
|
|
|
|
|
}
|
|
|
|
@ -762,6 +778,11 @@ u64 VMManager::GetHeapRegionSize() const {
|
|
|
|
|
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 {
|
|
|
|
|
return map_region_base;
|
|
|
|
|
}
|
|
|
|
@ -774,6 +795,10 @@ u64 VMManager::GetMapRegionSize() const {
|
|
|
|
|
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 {
|
|
|
|
|
return new_map_region_base;
|
|
|
|
|
}
|
|
|
|
@ -786,6 +811,11 @@ u64 VMManager::GetNewMapRegionSize() const {
|
|
|
|
|
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 {
|
|
|
|
|
return tls_io_region_base;
|
|
|
|
|
}
|
|
|
|
@ -798,4 +828,9 @@ u64 VMManager::GetTLSIORegionSize() const {
|
|
|
|
|
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
|
|
|
|
|