Merge pull request #1953 from lioncash/mem
kernel/process: Remove most allocation functions from Process' interface
This commit is contained in:
		| @@ -198,22 +198,6 @@ void Process::LoadModule(CodeSet module_, VAddr base_addr) { | |||||||
|     Core::System::GetInstance().ArmInterface(3).ClearInstructionCache(); |     Core::System::GetInstance().ArmInterface(3).ClearInstructionCache(); | ||||||
| } | } | ||||||
|  |  | ||||||
| ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { |  | ||||||
|     return vm_manager.HeapAllocate(target, size, perms); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ResultCode Process::HeapFree(VAddr target, u32 size) { |  | ||||||
|     return vm_manager.HeapFree(target, size); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ResultCode Process::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size, MemoryState state) { |  | ||||||
|     return vm_manager.MirrorMemory(dst_addr, src_addr, size, state); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ResultCode Process::UnmapMemory(VAddr dst_addr, VAddr /*src_addr*/, u64 size) { |  | ||||||
|     return vm_manager.UnmapRange(dst_addr, size); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| Kernel::Process::Process(KernelCore& kernel) : WaitObject{kernel} {} | Kernel::Process::Process(KernelCore& kernel) : WaitObject{kernel} {} | ||||||
| Kernel::Process::~Process() {} | Kernel::Process::~Process() {} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -242,7 +242,7 @@ public: | |||||||
|     void LoadModule(CodeSet module_, VAddr base_addr); |     void LoadModule(CodeSet module_, VAddr base_addr); | ||||||
|  |  | ||||||
|     /////////////////////////////////////////////////////////////////////////////////////////////// |     /////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|     // Memory Management |     // Thread-local storage management | ||||||
|  |  | ||||||
|     // Marks the next available region as used and returns the address of the slot. |     // Marks the next available region as used and returns the address of the slot. | ||||||
|     VAddr MarkNextAvailableTLSSlotAsUsed(Thread& thread); |     VAddr MarkNextAvailableTLSSlotAsUsed(Thread& thread); | ||||||
| @@ -250,13 +250,6 @@ public: | |||||||
|     // Frees a used TLS slot identified by the given address |     // Frees a used TLS slot identified by the given address | ||||||
|     void FreeTLSSlot(VAddr tls_address); |     void FreeTLSSlot(VAddr tls_address); | ||||||
|  |  | ||||||
|     ResultVal<VAddr> HeapAllocate(VAddr target, u64 size, VMAPermission perms); |  | ||||||
|     ResultCode HeapFree(VAddr target, u32 size); |  | ||||||
|  |  | ||||||
|     ResultCode MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size, MemoryState state); |  | ||||||
|  |  | ||||||
|     ResultCode UnmapMemory(VAddr dst_addr, VAddr src_addr, u64 size); |  | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     explicit Process(KernelCore& kernel); |     explicit Process(KernelCore& kernel); | ||||||
|     ~Process() override; |     ~Process() override; | ||||||
|   | |||||||
| @@ -190,10 +190,16 @@ static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) { | |||||||
|         return ERR_INVALID_SIZE; |         return ERR_INVALID_SIZE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     auto& process = *Core::CurrentProcess(); |     auto& vm_manager = Core::CurrentProcess()->VMManager(); | ||||||
|     const VAddr heap_base = process.VMManager().GetHeapRegionBaseAddress(); |     const VAddr heap_base = vm_manager.GetHeapRegionBaseAddress(); | ||||||
|     CASCADE_RESULT(*heap_addr, |     const auto alloc_result = | ||||||
|                    process.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite)); |         vm_manager.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite); | ||||||
|  |  | ||||||
|  |     if (alloc_result.Failed()) { | ||||||
|  |         return alloc_result.Code(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     *heap_addr = *alloc_result; | ||||||
|     return RESULT_SUCCESS; |     return RESULT_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -307,15 +313,14 @@ static ResultCode MapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { | |||||||
|     LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, |     LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, | ||||||
|               src_addr, size); |               src_addr, size); | ||||||
|  |  | ||||||
|     auto* const current_process = Core::CurrentProcess(); |     auto& vm_manager = Core::CurrentProcess()->VMManager(); | ||||||
|     const auto& vm_manager = current_process->VMManager(); |  | ||||||
|  |  | ||||||
|     const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); |     const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); | ||||||
|     if (result != RESULT_SUCCESS) { |  | ||||||
|  |     if (result.IsError()) { | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return current_process->MirrorMemory(dst_addr, src_addr, size, MemoryState::Stack); |     return vm_manager.MirrorMemory(dst_addr, src_addr, size, MemoryState::Stack); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Unmaps a region that was previously mapped with svcMapMemory | /// Unmaps a region that was previously mapped with svcMapMemory | ||||||
| @@ -323,15 +328,14 @@ static ResultCode UnmapMemory(VAddr dst_addr, VAddr src_addr, u64 size) { | |||||||
|     LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, |     LOG_TRACE(Kernel_SVC, "called, dst_addr=0x{:X}, src_addr=0x{:X}, size=0x{:X}", dst_addr, | ||||||
|               src_addr, size); |               src_addr, size); | ||||||
|  |  | ||||||
|     auto* const current_process = Core::CurrentProcess(); |     auto& vm_manager = Core::CurrentProcess()->VMManager(); | ||||||
|     const auto& vm_manager = current_process->VMManager(); |  | ||||||
|  |  | ||||||
|     const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); |     const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); | ||||||
|     if (result != RESULT_SUCCESS) { |  | ||||||
|  |     if (result.IsError()) { | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return current_process->UnmapMemory(dst_addr, src_addr, size); |     return vm_manager.UnmapRange(dst_addr, size); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Connect to an OS service given the port name, returns the handle to the port to out | /// Connect to an OS service given the port name, returns the handle to the port to out | ||||||
|   | |||||||
| @@ -318,14 +318,18 @@ public: | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ASSERT(process->MirrorMemory(*map_address, nro_addr, nro_size, |         ASSERT(vm_manager | ||||||
|                                      Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); |                    .MirrorMemory(*map_address, nro_addr, nro_size, | ||||||
|         ASSERT(process->UnmapMemory(nro_addr, 0, nro_size) == RESULT_SUCCESS); |                                  Kernel::MemoryState::ModuleCodeStatic) | ||||||
|  |                    .IsSuccess()); | ||||||
|  |         ASSERT(vm_manager.UnmapRange(nro_addr, nro_size).IsSuccess()); | ||||||
|  |  | ||||||
|         if (bss_size > 0) { |         if (bss_size > 0) { | ||||||
|             ASSERT(process->MirrorMemory(*map_address + nro_size, bss_addr, bss_size, |             ASSERT(vm_manager | ||||||
|                                          Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); |                        .MirrorMemory(*map_address + nro_size, bss_addr, bss_size, | ||||||
|             ASSERT(process->UnmapMemory(bss_addr, 0, bss_size) == RESULT_SUCCESS); |                                      Kernel::MemoryState::ModuleCodeStatic) | ||||||
|  |                        .IsSuccess()); | ||||||
|  |             ASSERT(vm_manager.UnmapRange(bss_addr, bss_size).IsSuccess()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         vm_manager.ReprotectRange(*map_address, header.text_size, |         vm_manager.ReprotectRange(*map_address, header.text_size, | ||||||
| @@ -380,13 +384,14 @@ public: | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         auto* process = Core::CurrentProcess(); |         auto& vm_manager = Core::CurrentProcess()->VMManager(); | ||||||
|         auto& vm_manager = process->VMManager(); |  | ||||||
|         const auto& nro_size = iter->second.size; |         const auto& nro_size = iter->second.size; | ||||||
|  |  | ||||||
|         ASSERT(process->MirrorMemory(heap_addr, mapped_addr, nro_size, |         ASSERT(vm_manager | ||||||
|                                      Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); |                    .MirrorMemory(heap_addr, mapped_addr, nro_size, | ||||||
|         ASSERT(process->UnmapMemory(mapped_addr, 0, nro_size) == RESULT_SUCCESS); |                                  Kernel::MemoryState::ModuleCodeStatic) | ||||||
|  |                    .IsSuccess()); | ||||||
|  |         ASSERT(vm_manager.UnmapRange(mapped_addr, nro_size).IsSuccess()); | ||||||
|  |  | ||||||
|         Core::System::GetInstance().InvalidateCpuInstructionCaches(); |         Core::System::GetInstance().InvalidateCpuInstructionCaches(); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei