mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-11-30 16:03:05 +00:00
VMManager: remove all backing block related functions
The shared_ptr<vector> type backing memory is unused now, and is not expected to be used in the future
This commit is contained in:
parent
7f9873d7ec
commit
b6ab4e466b
|
@ -28,10 +28,6 @@ bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const {
|
||||||
type != next.type) {
|
type != next.type) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (type == VMAType::AllocatedMemoryBlock &&
|
|
||||||
(backing_block != next.backing_block || offset + size != next.offset)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (type == VMAType::BackingMemory && backing_memory + size != next.backing_memory) {
|
if (type == VMAType::BackingMemory && backing_memory + size != next.backing_memory) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -71,28 +67,6 @@ VMManager::VMAHandle VMManager::FindVMA(VAddr target) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultVal<VMManager::VMAHandle> VMManager::MapMemoryBlock(VAddr target,
|
|
||||||
std::shared_ptr<std::vector<u8>> block,
|
|
||||||
std::size_t offset, u32 size,
|
|
||||||
MemoryState state) {
|
|
||||||
ASSERT(block != nullptr);
|
|
||||||
ASSERT(offset + size <= block->size());
|
|
||||||
|
|
||||||
// This is the appropriately sized VMA that will turn into our allocation.
|
|
||||||
CASCADE_RESULT(VMAIter vma_handle, CarveVMA(target, size));
|
|
||||||
VirtualMemoryArea& final_vma = vma_handle->second;
|
|
||||||
ASSERT(final_vma.size == size);
|
|
||||||
|
|
||||||
final_vma.type = VMAType::AllocatedMemoryBlock;
|
|
||||||
final_vma.permissions = VMAPermission::ReadWrite;
|
|
||||||
final_vma.meminfo_state = state;
|
|
||||||
final_vma.backing_block = block;
|
|
||||||
final_vma.offset = offset;
|
|
||||||
UpdatePageTableForVMA(final_vma);
|
|
||||||
|
|
||||||
return MakeResult<VMAHandle>(MergeAdjacent(vma_handle));
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultVal<VAddr> VMManager::MapBackingMemoryToBase(VAddr base, u32 region_size, u8* memory,
|
ResultVal<VAddr> VMManager::MapBackingMemoryToBase(VAddr base, u32 region_size, u8* memory,
|
||||||
u32 size, MemoryState state) {
|
u32 size, MemoryState state) {
|
||||||
|
|
||||||
|
@ -197,8 +171,6 @@ VMManager::VMAIter VMManager::Unmap(VMAIter vma_handle) {
|
||||||
vma.permissions = VMAPermission::None;
|
vma.permissions = VMAPermission::None;
|
||||||
vma.meminfo_state = MemoryState::Free;
|
vma.meminfo_state = MemoryState::Free;
|
||||||
|
|
||||||
vma.backing_block = nullptr;
|
|
||||||
vma.offset = 0;
|
|
||||||
vma.backing_memory = nullptr;
|
vma.backing_memory = nullptr;
|
||||||
vma.paddr = 0;
|
vma.paddr = 0;
|
||||||
|
|
||||||
|
@ -246,17 +218,6 @@ ResultCode VMManager::ReprotectRange(VAddr target, u32 size, VMAPermission new_p
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VMManager::RefreshMemoryBlockMappings(const std::vector<u8>* block) {
|
|
||||||
// If this ever proves to have a noticeable performance impact, allow users of the function to
|
|
||||||
// specify a specific range of addresses to limit the scan to.
|
|
||||||
for (const auto& p : vma_map) {
|
|
||||||
const VirtualMemoryArea& vma = p.second;
|
|
||||||
if (block == vma.backing_block.get()) {
|
|
||||||
UpdatePageTableForVMA(vma);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VMManager::LogLayout(Log::Level log_level) const {
|
void VMManager::LogLayout(Log::Level log_level) const {
|
||||||
for (const auto& p : vma_map) {
|
for (const auto& p : vma_map) {
|
||||||
const VirtualMemoryArea& vma = p.second;
|
const VirtualMemoryArea& vma = p.second;
|
||||||
|
@ -355,9 +316,6 @@ VMManager::VMAIter VMManager::SplitVMA(VMAIter vma_handle, u32 offset_in_vma) {
|
||||||
switch (new_vma.type) {
|
switch (new_vma.type) {
|
||||||
case VMAType::Free:
|
case VMAType::Free:
|
||||||
break;
|
break;
|
||||||
case VMAType::AllocatedMemoryBlock:
|
|
||||||
new_vma.offset += offset_in_vma;
|
|
||||||
break;
|
|
||||||
case VMAType::BackingMemory:
|
case VMAType::BackingMemory:
|
||||||
new_vma.backing_memory += offset_in_vma;
|
new_vma.backing_memory += offset_in_vma;
|
||||||
break;
|
break;
|
||||||
|
@ -395,10 +353,6 @@ void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
|
||||||
case VMAType::Free:
|
case VMAType::Free:
|
||||||
Memory::UnmapRegion(page_table, vma.base, vma.size);
|
Memory::UnmapRegion(page_table, vma.base, vma.size);
|
||||||
break;
|
break;
|
||||||
case VMAType::AllocatedMemoryBlock:
|
|
||||||
Memory::MapMemoryRegion(page_table, vma.base, vma.size,
|
|
||||||
vma.backing_block->data() + vma.offset);
|
|
||||||
break;
|
|
||||||
case VMAType::BackingMemory:
|
case VMAType::BackingMemory:
|
||||||
Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory);
|
Memory::MapMemoryRegion(page_table, vma.base, vma.size, vma.backing_memory);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -18,13 +18,10 @@ namespace Kernel {
|
||||||
enum class VMAType : u8 {
|
enum class VMAType : u8 {
|
||||||
/// VMA represents an unmapped region of the address space.
|
/// VMA represents an unmapped region of the address space.
|
||||||
Free,
|
Free,
|
||||||
/// VMA is backed by a ref-counted allocate memory block.
|
|
||||||
AllocatedMemoryBlock,
|
|
||||||
/// VMA is backed by a raw, unmanaged pointer.
|
/// VMA is backed by a raw, unmanaged pointer.
|
||||||
BackingMemory,
|
BackingMemory,
|
||||||
/// VMA is mapped to MMIO registers at a fixed PAddr.
|
/// VMA is mapped to MMIO registers at a fixed PAddr.
|
||||||
MMIO,
|
MMIO,
|
||||||
// TODO(yuriks): Implement MemoryAlias to support MAP/UNMAP
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Permissions for mapped memory blocks
|
/// Permissions for mapped memory blocks
|
||||||
|
@ -72,12 +69,6 @@ struct VirtualMemoryArea {
|
||||||
/// Tag returned by svcQueryMemory. Not otherwise used.
|
/// Tag returned by svcQueryMemory. Not otherwise used.
|
||||||
MemoryState meminfo_state = MemoryState::Free;
|
MemoryState meminfo_state = MemoryState::Free;
|
||||||
|
|
||||||
// Settings for type = AllocatedMemoryBlock
|
|
||||||
/// Memory block backing this VMA.
|
|
||||||
std::shared_ptr<std::vector<u8>> backing_block = nullptr;
|
|
||||||
/// Offset into the backing_memory the mapping starts from.
|
|
||||||
std::size_t offset = 0;
|
|
||||||
|
|
||||||
// Settings for type = BackingMemory
|
// Settings for type = BackingMemory
|
||||||
/// Pointer backing this VMA. It will not be destroyed or freed when the VMA is removed.
|
/// Pointer backing this VMA. It will not be destroyed or freed when the VMA is removed.
|
||||||
u8* backing_memory = nullptr;
|
u8* backing_memory = nullptr;
|
||||||
|
@ -133,18 +124,6 @@ public:
|
||||||
|
|
||||||
// TODO(yuriks): Should these functions actually return the handle?
|
// TODO(yuriks): Should these functions actually return the handle?
|
||||||
|
|
||||||
/**
|
|
||||||
* Maps part of a ref-counted block of memory at a given address.
|
|
||||||
*
|
|
||||||
* @param target The guest address to start the mapping at.
|
|
||||||
* @param block The block to be mapped.
|
|
||||||
* @param offset Offset into `block` to map from.
|
|
||||||
* @param size Size of the mapping.
|
|
||||||
* @param state MemoryState tag to attach to the VMA.
|
|
||||||
*/
|
|
||||||
ResultVal<VMAHandle> MapMemoryBlock(VAddr target, std::shared_ptr<std::vector<u8>> block,
|
|
||||||
std::size_t offset, u32 size, MemoryState state);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maps part of a ref-counted block of memory at the first free address after the given base.
|
* Maps part of a ref-counted block of memory at the first free address after the given base.
|
||||||
*
|
*
|
||||||
|
@ -203,12 +182,6 @@ public:
|
||||||
/// Changes the permissions of a range of addresses, splitting VMAs as necessary.
|
/// Changes the permissions of a range of addresses, splitting VMAs as necessary.
|
||||||
ResultCode ReprotectRange(VAddr target, u32 size, VMAPermission new_perms);
|
ResultCode ReprotectRange(VAddr target, u32 size, VMAPermission new_perms);
|
||||||
|
|
||||||
/**
|
|
||||||
* Scans all VMAs and updates the page table range of any that use the given vector as backing
|
|
||||||
* memory. This should be called after any operation that causes reallocation of the vector.
|
|
||||||
*/
|
|
||||||
void RefreshMemoryBlockMappings(const std::vector<u8>* block);
|
|
||||||
|
|
||||||
/// Dumps the address space layout to the log, for debugging
|
/// Dumps the address space layout to the log, for debugging
|
||||||
void LogLayout(Log::Level log_level) const;
|
void LogLayout(Log::Level log_level) const;
|
||||||
|
|
||||||
|
|
|
@ -92,9 +92,6 @@ static u8* GetPointerFromVMA(const Kernel::Process& process, VAddr vaddr) {
|
||||||
|
|
||||||
auto& vma = it->second;
|
auto& vma = it->second;
|
||||||
switch (vma.type) {
|
switch (vma.type) {
|
||||||
case Kernel::VMAType::AllocatedMemoryBlock:
|
|
||||||
direct_pointer = vma.backing_block->data() + vma.offset;
|
|
||||||
break;
|
|
||||||
case Kernel::VMAType::BackingMemory:
|
case Kernel::VMAType::BackingMemory:
|
||||||
direct_pointer = vma.backing_memory;
|
direct_pointer = vma.backing_memory;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -39,7 +39,7 @@ TEST_CASE("Memory Basics", "[kernel][memory]") {
|
||||||
auto vma = manager->FindVMA(Memory::HEAP_VADDR);
|
auto vma = manager->FindVMA(Memory::HEAP_VADDR);
|
||||||
CHECK(vma != manager->vma_map.end());
|
CHECK(vma != manager->vma_map.end());
|
||||||
CHECK(vma->second.type == Kernel::VMAType::Free);
|
CHECK(vma->second.type == Kernel::VMAType::Free);
|
||||||
CHECK(vma->second.backing_block == nullptr);
|
CHECK(vma->second.backing_memory == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("changing memory permissions") {
|
SECTION("changing memory permissions") {
|
||||||
|
|
Loading…
Reference in a new issue