diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 32 | ||||
| -rw-r--r-- | src/core/hle/service/ldr/ldr.cpp | 27 | 
4 files changed, 35 insertions, 49 deletions
| diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 4f209a979..06a673b9b 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -198,22 +198,6 @@ void Process::LoadModule(CodeSet module_, VAddr base_addr) {      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() {} diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 2c0b20f9e..ac6956266 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -242,7 +242,7 @@ public:      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.      VAddr MarkNextAvailableTLSSlotAsUsed(Thread& thread); @@ -250,13 +250,6 @@ public:      // Frees a used TLS slot identified by the given 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:      explicit Process(KernelCore& kernel);      ~Process() override; diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 2e80b48c2..b955f9839 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -190,10 +190,16 @@ static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) {          return ERR_INVALID_SIZE;      } -    auto& process = *Core::CurrentProcess(); -    const VAddr heap_base = process.VMManager().GetHeapRegionBaseAddress(); -    CASCADE_RESULT(*heap_addr, -                   process.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite)); +    auto& vm_manager = Core::CurrentProcess()->VMManager(); +    const VAddr heap_base = vm_manager.GetHeapRegionBaseAddress(); +    const auto alloc_result = +        vm_manager.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite); + +    if (alloc_result.Failed()) { +        return alloc_result.Code(); +    } + +    *heap_addr = *alloc_result;      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,                src_addr, size); -    auto* const current_process = Core::CurrentProcess(); -    const auto& vm_manager = current_process->VMManager(); - +    auto& vm_manager = Core::CurrentProcess()->VMManager();      const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); -    if (result != RESULT_SUCCESS) { + +    if (result.IsError()) {          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 @@ -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,                src_addr, size); -    auto* const current_process = Core::CurrentProcess(); -    const auto& vm_manager = current_process->VMManager(); - +    auto& vm_manager = Core::CurrentProcess()->VMManager();      const auto result = MapUnmapMemorySanityChecks(vm_manager, dst_addr, src_addr, size); -    if (result != RESULT_SUCCESS) { + +    if (result.IsError()) {          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 diff --git a/src/core/hle/service/ldr/ldr.cpp b/src/core/hle/service/ldr/ldr.cpp index 13bcefe07..9df7ac50f 100644 --- a/src/core/hle/service/ldr/ldr.cpp +++ b/src/core/hle/service/ldr/ldr.cpp @@ -318,14 +318,18 @@ public:              return;          } -        ASSERT(process->MirrorMemory(*map_address, nro_addr, nro_size, -                                     Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); -        ASSERT(process->UnmapMemory(nro_addr, 0, nro_size) == RESULT_SUCCESS); +        ASSERT(vm_manager +                   .MirrorMemory(*map_address, nro_addr, nro_size, +                                 Kernel::MemoryState::ModuleCodeStatic) +                   .IsSuccess()); +        ASSERT(vm_manager.UnmapRange(nro_addr, nro_size).IsSuccess());          if (bss_size > 0) { -            ASSERT(process->MirrorMemory(*map_address + nro_size, bss_addr, bss_size, -                                         Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); -            ASSERT(process->UnmapMemory(bss_addr, 0, bss_size) == RESULT_SUCCESS); +            ASSERT(vm_manager +                       .MirrorMemory(*map_address + nro_size, bss_addr, bss_size, +                                     Kernel::MemoryState::ModuleCodeStatic) +                       .IsSuccess()); +            ASSERT(vm_manager.UnmapRange(bss_addr, bss_size).IsSuccess());          }          vm_manager.ReprotectRange(*map_address, header.text_size, @@ -380,13 +384,14 @@ public:              return;          } -        auto* process = Core::CurrentProcess(); -        auto& vm_manager = process->VMManager(); +        auto& vm_manager = Core::CurrentProcess()->VMManager();          const auto& nro_size = iter->second.size; -        ASSERT(process->MirrorMemory(heap_addr, mapped_addr, nro_size, -                                     Kernel::MemoryState::ModuleCodeStatic) == RESULT_SUCCESS); -        ASSERT(process->UnmapMemory(mapped_addr, 0, nro_size) == RESULT_SUCCESS); +        ASSERT(vm_manager +                   .MirrorMemory(heap_addr, mapped_addr, nro_size, +                                 Kernel::MemoryState::ModuleCodeStatic) +                   .IsSuccess()); +        ASSERT(vm_manager.UnmapRange(mapped_addr, nro_size).IsSuccess());          Core::System::GetInstance().InvalidateCpuInstructionCaches(); | 
