diff options
| author | 2017-06-09 05:23:13 -0700 | |
|---|---|---|
| committer | 2017-06-11 13:10:21 -0700 | |
| commit | 8cb65fe65a48988d40dd3ca2c4f673629a275b4b (patch) | |
| tree | ca8b48aa3ec080602cb69efb9726bfc25e02a9ea /src/core/hle/service/service.cpp | |
| parent | Service/sm: Convert srv: to use IPC helpers (diff) | |
| download | yuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.tar.gz yuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.tar.xz yuzu-8cb65fe65a48988d40dd3ca2c4f673629a275b4b.zip | |
Kernel: Basic support for IPC translation for HLE services
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 35582b0ff..791a65c19 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include "common/string_util.h" | 9 | #include "common/string_util.h" |
| 10 | #include "core/hle/ipc.h" | 10 | #include "core/hle/ipc.h" |
| 11 | #include "core/hle/kernel/client_port.h" | 11 | #include "core/hle/kernel/client_port.h" |
| 12 | #include "core/hle/kernel/process.h" | ||
| 12 | #include "core/hle/kernel/server_port.h" | 13 | #include "core/hle/kernel/server_port.h" |
| 13 | #include "core/hle/kernel/server_session.h" | 14 | #include "core/hle/kernel/server_session.h" |
| 14 | #include "core/hle/service/ac/ac.h" | 15 | #include "core/hle/service/ac/ac.h" |
| @@ -172,24 +173,16 @@ void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_ses | |||
| 172 | 173 | ||
| 173 | // TODO(yuriks): The kernel should be the one handling this as part of translation after | 174 | // TODO(yuriks): The kernel should be the one handling this as part of translation after |
| 174 | // everything else is migrated | 175 | // everything else is migrated |
| 175 | IPC::Header request_header{cmd_buf[0]}; | ||
| 176 | size_t request_size = | ||
| 177 | 1 + request_header.normal_params_size + request_header.translate_params_size; | ||
| 178 | ASSERT(request_size <= IPC::COMMAND_BUFFER_LENGTH); // TODO(yuriks): Return error | ||
| 179 | |||
| 180 | Kernel::HLERequestContext context; | 176 | Kernel::HLERequestContext context; |
| 181 | std::copy_n(cmd_buf, request_size, context.cmd_buf.begin()); | ||
| 182 | context.session = std::move(server_session); | 177 | context.session = std::move(server_session); |
| 178 | context.PopulateFromIncomingCommandBuffer(cmd_buf, *Kernel::g_current_process, | ||
| 179 | Kernel::g_handle_table); | ||
| 183 | 180 | ||
| 184 | LOG_TRACE(Service, "%s", | 181 | LOG_TRACE(Service, "%s", |
| 185 | MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str()); | 182 | MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str()); |
| 186 | handler_invoker(this, info->handler_callback, context); | 183 | handler_invoker(this, info->handler_callback, context); |
| 187 | 184 | context.WriteToOutgoingCommandBuffer(cmd_buf, *Kernel::g_current_process, | |
| 188 | IPC::Header response_header{context.cmd_buf[0]}; | 185 | Kernel::g_handle_table); |
| 189 | size_t response_size = | ||
| 190 | 1 + response_header.normal_params_size + response_header.translate_params_size; | ||
| 191 | ASSERT(response_size <= IPC::COMMAND_BUFFER_LENGTH); | ||
| 192 | std::copy_n(context.cmd_buf.begin(), response_size, cmd_buf); | ||
| 193 | } | 186 | } |
| 194 | 187 | ||
| 195 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 188 | //////////////////////////////////////////////////////////////////////////////////////////////////// |