|
|
|
@ -175,9 +175,9 @@ VMManager::VMAIter VMManager::Unmap(VMAIter vma_handle) {
|
|
|
|
|
|
|
|
|
|
ResultCode VMManager::UnmapRange(VAddr target, u64 size) {
|
|
|
|
|
CASCADE_RESULT(VMAIter vma, CarveVMARange(target, size));
|
|
|
|
|
VAddr target_end = target + size;
|
|
|
|
|
const VAddr target_end = target + size;
|
|
|
|
|
|
|
|
|
|
VMAIter end = vma_map.end();
|
|
|
|
|
const VMAIter end = vma_map.end();
|
|
|
|
|
// The comparison against the end of the range must be done using addresses since VMAs can be
|
|
|
|
|
// merged during this process, causing invalidation of the iterators.
|
|
|
|
|
while (vma != end && vma->second.base < target_end) {
|
|
|
|
@ -207,9 +207,9 @@ VMManager::VMAHandle VMManager::Reprotect(VMAHandle vma_handle, VMAPermission ne
|
|
|
|
|
|
|
|
|
|
ResultCode VMManager::ReprotectRange(VAddr target, u64 size, VMAPermission new_perms) {
|
|
|
|
|
CASCADE_RESULT(VMAIter vma, CarveVMARange(target, size));
|
|
|
|
|
VAddr target_end = target + size;
|
|
|
|
|
const VAddr target_end = target + size;
|
|
|
|
|
|
|
|
|
|
VMAIter end = vma_map.end();
|
|
|
|
|
const VMAIter end = vma_map.end();
|
|
|
|
|
// The comparison against the end of the range must be done using addresses since VMAs can be
|
|
|
|
|
// merged during this process, causing invalidation of the iterators.
|
|
|
|
|
while (vma != end && vma->second.base < target_end) {
|
|
|
|
@ -258,14 +258,14 @@ ResultVal<VMManager::VMAIter> VMManager::CarveVMA(VAddr base, u64 size) {
|
|
|
|
|
return ERR_INVALID_ADDRESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VirtualMemoryArea& vma = vma_handle->second;
|
|
|
|
|
const VirtualMemoryArea& vma = vma_handle->second;
|
|
|
|
|
if (vma.type != VMAType::Free) {
|
|
|
|
|
// Region is already allocated
|
|
|
|
|
return ERR_INVALID_ADDRESS_STATE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VAddr start_in_vma = base - vma.base;
|
|
|
|
|
VAddr end_in_vma = start_in_vma + size;
|
|
|
|
|
const VAddr start_in_vma = base - vma.base;
|
|
|
|
|
const VAddr end_in_vma = start_in_vma + size;
|
|
|
|
|
|
|
|
|
|
if (end_in_vma > vma.size) {
|
|
|
|
|
// Requested allocation doesn't fit inside VMA
|
|
|
|
@ -288,13 +288,13 @@ ResultVal<VMManager::VMAIter> VMManager::CarveVMARange(VAddr target, u64 size) {
|
|
|
|
|
ASSERT_MSG((size & Memory::PAGE_MASK) == 0, "non-page aligned size: 0x{:016X}", size);
|
|
|
|
|
ASSERT_MSG((target & Memory::PAGE_MASK) == 0, "non-page aligned base: 0x{:016X}", target);
|
|
|
|
|
|
|
|
|
|
VAddr target_end = target + size;
|
|
|
|
|
const VAddr target_end = target + size;
|
|
|
|
|
ASSERT(target_end >= target);
|
|
|
|
|
ASSERT(target_end <= MAX_ADDRESS);
|
|
|
|
|
ASSERT(size > 0);
|
|
|
|
|
|
|
|
|
|
VMAIter begin_vma = StripIterConstness(FindVMA(target));
|
|
|
|
|
VMAIter i_end = vma_map.lower_bound(target_end);
|
|
|
|
|
const VMAIter i_end = vma_map.lower_bound(target_end);
|
|
|
|
|
for (auto i = begin_vma; i != i_end; ++i) {
|
|
|
|
|
if (i->second.type == VMAType::Free) {
|
|
|
|
|
return ERR_INVALID_ADDRESS_STATE;
|
|
|
|
@ -346,7 +346,7 @@ VMManager::VMAIter VMManager::SplitVMA(VMAIter vma_handle, u64 offset_in_vma) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VMManager::VMAIter VMManager::MergeAdjacent(VMAIter iter) {
|
|
|
|
|
VMAIter next_vma = std::next(iter);
|
|
|
|
|
const VMAIter next_vma = std::next(iter);
|
|
|
|
|
if (next_vma != vma_map.end() && iter->second.CanBeMergedWith(next_vma->second)) {
|
|
|
|
|
iter->second.size += next_vma->second.size;
|
|
|
|
|
vma_map.erase(next_vma);
|
|
|
|
@ -382,22 +382,22 @@ void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u64 VMManager::GetTotalMemoryUsage() {
|
|
|
|
|
u64 VMManager::GetTotalMemoryUsage() const {
|
|
|
|
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
|
|
|
|
return 0xF8000000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u64 VMManager::GetTotalHeapUsage() {
|
|
|
|
|
u64 VMManager::GetTotalHeapUsage() const {
|
|
|
|
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
|
|
|
|
return 0x0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VAddr VMManager::GetAddressSpaceBaseAddr() {
|
|
|
|
|
VAddr VMManager::GetAddressSpaceBaseAddr() const {
|
|
|
|
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
|
|
|
|
return 0x8000000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u64 VMManager::GetAddressSpaceSize() {
|
|
|
|
|
u64 VMManager::GetAddressSpaceSize() const {
|
|
|
|
|
LOG_WARNING(Kernel, "(STUBBED) called");
|
|
|
|
|
return MAX_ADDRESS;
|
|
|
|
|
}
|
|
|
|
|