diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/function_wrappers.h | 12 | ||||
| -rw-r--r-- | src/core/hle/svc.cpp | 22 | 
2 files changed, 28 insertions, 6 deletions
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h index 1ac6032a6..9294789ec 100644 --- a/src/core/hle/function_wrappers.h +++ b/src/core/hle/function_wrappers.h @@ -99,6 +99,18 @@ template<ResultCode func(MemoryInfo*, PageInfo*, u32)> void Wrap() {      FuncReturn(retval);  } +template<ResultCode func(MemoryInfo*, PageInfo*, Handle, u32)> void Wrap() { +    MemoryInfo memory_info = {}; +    PageInfo page_info = {}; +    u32 retval = func(&memory_info, &page_info, PARAM(2), PARAM(3)).raw; +    Core::g_app_core->SetReg(1, memory_info.base_address); +    Core::g_app_core->SetReg(2, memory_info.size); +    Core::g_app_core->SetReg(3, memory_info.permission); +    Core::g_app_core->SetReg(4, memory_info.state); +    Core::g_app_core->SetReg(5, page_info.flags); +    FuncReturn(retval); +} +  template<ResultCode func(s32*, u32)> void Wrap(){      s32 param_1 = 0;      u32 retval = func(¶m_1, PARAM(1)).raw; diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 9d441ccfc..802ecc52a 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp @@ -530,11 +530,16 @@ static ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count)      return RESULT_SUCCESS;  } -/// Query memory -static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32 addr) { -    auto vma = Kernel::g_current_process->address_space->FindVMA(addr); +/// Query process memory +static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* page_info, Handle process_handle, u32 addr) { +    using Kernel::Process; +    Kernel::SharedPtr<Process> process = Kernel::g_handle_table.Get<Process>(process_handle); +    if (process == nullptr) +        return ERR_INVALID_HANDLE; + +    auto vma = process->address_space->FindVMA(addr); -    if (vma == Kernel::g_current_process->address_space->vma_map.end()) +    if (vma == process->address_space->vma_map.end())          return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::OS, ErrorSummary::InvalidArgument, ErrorLevel::Usage);      memory_info->base_address = vma->second.base; @@ -543,10 +548,15 @@ static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32      memory_info->state = static_cast<u32>(vma->second.meminfo_state);      page_info->flags = 0; -    LOG_TRACE(Kernel_SVC, "called addr=0x%08X", addr); +    LOG_TRACE(Kernel_SVC, "called process=0x%08X addr=0x%08X", process_handle, addr);      return RESULT_SUCCESS;  } +/// Query memory +static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32 addr) { +    return QueryProcessMemory(memory_info, page_info, Kernel::CurrentProcess, addr); +} +  /// Create an event  static ResultCode CreateEvent(Handle* out_handle, u32 reset_type) {      using Kernel::Event; @@ -818,7 +828,7 @@ static const FunctionDef SVC_Table[] = {      {0x7A, nullptr,                         "AddCodeSegment"},      {0x7B, nullptr,                         "Backdoor"},      {0x7C, nullptr,                         "KernelSetState"}, -    {0x7D, nullptr,                         "QueryProcessMemory"}, +    {0x7D, HLE::Wrap<QueryProcessMemory>,   "QueryProcessMemory"},  };  Common::Profiling::TimingCategory profiler_svc("SVC Calls");  | 
