|
|
|
@ -322,6 +322,34 @@ MemoryInfo VMManager::QueryMemory(VAddr address) const { |
|
|
|
return memory_info; |
|
|
|
} |
|
|
|
|
|
|
|
ResultCode VMManager::SetMemoryAttribute(VAddr address, u64 size, MemoryAttribute mask, |
|
|
|
MemoryAttribute attribute) { |
|
|
|
constexpr auto ignore_mask = MemoryAttribute::Uncached | MemoryAttribute::DeviceMapped; |
|
|
|
constexpr auto attribute_mask = ~ignore_mask; |
|
|
|
|
|
|
|
const auto result = CheckRangeState( |
|
|
|
address, size, MemoryState::FlagUncached, MemoryState::FlagUncached, VMAPermission::None, |
|
|
|
VMAPermission::None, attribute_mask, MemoryAttribute::None, ignore_mask); |
|
|
|
|
|
|
|
if (result.Failed()) { |
|
|
|
return result.Code(); |
|
|
|
} |
|
|
|
|
|
|
|
const auto [prev_state, prev_permissions, prev_attributes] = *result; |
|
|
|
const auto new_attribute = (prev_attributes & ~mask) | (mask & attribute); |
|
|
|
|
|
|
|
const auto carve_result = CarveVMARange(address, size); |
|
|
|
if (carve_result.Failed()) { |
|
|
|
return carve_result.Code(); |
|
|
|
} |
|
|
|
|
|
|
|
auto vma_iter = *carve_result; |
|
|
|
vma_iter->second.attribute = new_attribute; |
|
|
|
|
|
|
|
MergeAdjacent(vma_iter); |
|
|
|
return RESULT_SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
ResultCode VMManager::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size, MemoryState state) { |
|
|
|
const auto vma = FindVMA(src_addr); |
|
|
|
|
|
|
|
|