From 7f9873d7ece102eb9455b467b447925790f9f9d5 Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Thu, 8 Nov 2018 14:05:54 -0500 Subject: [PATCH] VMManager: change MapMemoryBlockToBase to use raw backing memory And let ServerSession.MappedBufferContext hold the mapped memory --- src/core/hle/kernel/ipc.cpp | 32 ++++++++++++++++-------------- src/core/hle/kernel/ipc.h | 4 ++++ src/core/hle/kernel/vm_manager.cpp | 7 +++---- src/core/hle/kernel/vm_manager.h | 8 +++----- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/core/hle/kernel/ipc.cpp b/src/core/hle/kernel/ipc.cpp index d62889e5b..4daee787d 100644 --- a/src/core/hle/kernel/ipc.cpp +++ b/src/core/hle/kernel/ipc.cpp @@ -181,29 +181,31 @@ ResultCode TranslateCommandBuffer(SharedPtr src_thread, SharedPtr>(Memory::PAGE_SIZE); - dst_process->vm_manager.MapMemoryBlockToBase( - Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, reserve_buffer, 0, - static_cast(reserve_buffer->size()), Kernel::MemoryState::Reserved); + auto reserve_buffer = std::make_unique(Memory::PAGE_SIZE); + dst_process->vm_manager.MapBackingMemoryToBase( + Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, reserve_buffer.get(), + Memory::PAGE_SIZE, Kernel::MemoryState::Reserved); - auto buffer = std::make_shared>(num_pages * Memory::PAGE_SIZE); - Memory::ReadBlock(*src_process, source_address, buffer->data() + page_offset, size); + auto buffer = std::make_unique(num_pages * Memory::PAGE_SIZE); + Memory::ReadBlock(*src_process, source_address, buffer.get() + page_offset, size); // Map the page(s) into the target process' address space. - target_address = dst_process->vm_manager - .MapMemoryBlockToBase( - Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, buffer, 0, - static_cast(buffer->size()), Kernel::MemoryState::Shared) - .Unwrap(); + target_address = + dst_process->vm_manager + .MapBackingMemoryToBase(Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, + buffer.get(), num_pages * Memory::PAGE_SIZE, + Kernel::MemoryState::Shared) + .Unwrap(); cmd_buf[i++] = target_address + page_offset; // Reserve a page of memory after the mapped buffer - dst_process->vm_manager.MapMemoryBlockToBase( - Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, reserve_buffer, 0, - static_cast(reserve_buffer->size()), Kernel::MemoryState::Reserved); + dst_process->vm_manager.MapBackingMemoryToBase( + Memory::IPC_MAPPING_VADDR, Memory::IPC_MAPPING_SIZE, reserve_buffer.get(), + Memory::PAGE_SIZE, Kernel::MemoryState::Reserved); - mapped_buffer_context.push_back({permissions, size, source_address, target_address}); + mapped_buffer_context.push_back({permissions, size, source_address, target_address, + std::move(buffer), std::move(reserve_buffer)}); break; } diff --git a/src/core/hle/kernel/ipc.h b/src/core/hle/kernel/ipc.h index 6ca4dbb6e..9f2d57a96 100644 --- a/src/core/hle/kernel/ipc.h +++ b/src/core/hle/kernel/ipc.h @@ -4,6 +4,7 @@ #pragma once +#include #include #include "common/common_types.h" #include "core/hle/ipc.h" @@ -16,6 +17,9 @@ struct MappedBufferContext { u32 size; VAddr source_address; VAddr target_address; + + std::unique_ptr buffer; + std::unique_ptr reserve_buffer; }; /// Performs IPC command buffer translation from one process to another. diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index bab8891bc..1b4577400 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp @@ -93,9 +93,8 @@ ResultVal VMManager::MapMemoryBlock(VAddr target, return MakeResult(MergeAdjacent(vma_handle)); } -ResultVal VMManager::MapMemoryBlockToBase(VAddr base, u32 region_size, - std::shared_ptr> block, - std::size_t offset, u32 size, MemoryState state) { +ResultVal VMManager::MapBackingMemoryToBase(VAddr base, u32 region_size, u8* memory, + u32 size, MemoryState state) { // Find the first Free VMA. VMAHandle vma_handle = std::find_if(vma_map.begin(), vma_map.end(), [&](const auto& vma) { @@ -115,7 +114,7 @@ ResultVal VMManager::MapMemoryBlockToBase(VAddr base, u32 region_size, ErrorSummary::OutOfResource, ErrorLevel::Permanent); } - auto result = MapMemoryBlock(target, block, offset, size, state); + auto result = MapBackingMemory(target, memory, size, state); if (result.Failed()) return result.Code(); diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 5464ad50b..865c3ee99 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h @@ -150,15 +150,13 @@ public: * * @param base The base address to start the mapping at. * @param region_size The max size of the region from where we'll try to find an address. - * @param block The block to be mapped. - * @param offset Offset into `block` to map from. + * @param memory The memory to be mapped. * @param size Size of the mapping. * @param state MemoryState tag to attach to the VMA. * @returns The address at which the memory was mapped. */ - ResultVal MapMemoryBlockToBase(VAddr base, u32 region_size, - std::shared_ptr> block, - std::size_t offset, u32 size, MemoryState state); + ResultVal MapBackingMemoryToBase(VAddr base, u32 region_size, u8* memory, u32 size, + MemoryState state); /** * Maps an unmanaged host memory pointer at a given address. *