diff options
| author | 2017-06-11 21:39:49 -0700 | |
|---|---|---|
| committer | 2017-06-11 21:39:49 -0700 | |
| commit | 4325a7c82d6dc750b17f257ec33309aca4ddf9db (patch) | |
| tree | ad8099c69fedf1144a7851f2878009f5c2e1a8cb /src/core/hle/service/service.cpp | |
| parent | Merge pull request #2727 from wwylele/spot-light (diff) | |
| parent | Kernel/IPC: Use boost::small_vector for HLE context objects (diff) | |
| download | yuzu-4325a7c82d6dc750b17f257ec33309aca4ddf9db.tar.gz yuzu-4325a7c82d6dc750b17f257ec33309aca4ddf9db.tar.xz yuzu-4325a7c82d6dc750b17f257ec33309aca4ddf9db.zip | |
Merge pull request #2774 from yuriks/hle-handles
Add 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 | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index d34968428..791a65c19 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -2,10 +2,14 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <algorithm> | ||
| 5 | #include <fmt/format.h> | 6 | #include <fmt/format.h> |
| 7 | #include "common/assert.h" | ||
| 6 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 7 | #include "common/string_util.h" | 9 | #include "common/string_util.h" |
| 10 | #include "core/hle/ipc.h" | ||
| 8 | #include "core/hle/kernel/client_port.h" | 11 | #include "core/hle/kernel/client_port.h" |
| 12 | #include "core/hle/kernel/process.h" | ||
| 9 | #include "core/hle/kernel/server_port.h" | 13 | #include "core/hle/kernel/server_port.h" |
| 10 | #include "core/hle/kernel/server_session.h" | 14 | #include "core/hle/kernel/server_session.h" |
| 11 | #include "core/hle/service/ac/ac.h" | 15 | #include "core/hle/service/ac/ac.h" |
| @@ -160,12 +164,6 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(u32* cmd_buf, const Funct | |||
| 160 | void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_session) { | 164 | void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_session) { |
| 161 | u32* cmd_buf = Kernel::GetCommandBuffer(); | 165 | u32* cmd_buf = Kernel::GetCommandBuffer(); |
| 162 | 166 | ||
| 163 | // TODO(yuriks): The kernel should be the one handling this as part of translation after | ||
| 164 | // everything else is migrated | ||
| 165 | Kernel::HLERequestContext context; | ||
| 166 | context.cmd_buf = cmd_buf; | ||
| 167 | context.session = std::move(server_session); | ||
| 168 | |||
| 169 | u32 header_code = cmd_buf[0]; | 167 | u32 header_code = cmd_buf[0]; |
| 170 | auto itr = handlers.find(header_code); | 168 | auto itr = handlers.find(header_code); |
| 171 | const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; | 169 | const FunctionInfoBase* info = itr == handlers.end() ? nullptr : &itr->second; |
| @@ -173,9 +171,18 @@ void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_ses | |||
| 173 | return ReportUnimplementedFunction(cmd_buf, info); | 171 | return ReportUnimplementedFunction(cmd_buf, info); |
| 174 | } | 172 | } |
| 175 | 173 | ||
| 174 | // TODO(yuriks): The kernel should be the one handling this as part of translation after | ||
| 175 | // everything else is migrated | ||
| 176 | Kernel::HLERequestContext context; | ||
| 177 | context.session = std::move(server_session); | ||
| 178 | context.PopulateFromIncomingCommandBuffer(cmd_buf, *Kernel::g_current_process, | ||
| 179 | Kernel::g_handle_table); | ||
| 180 | |||
| 176 | LOG_TRACE(Service, "%s", | 181 | LOG_TRACE(Service, "%s", |
| 177 | MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str()); | 182 | MakeFunctionString(info->name, GetServiceName().c_str(), cmd_buf).c_str()); |
| 178 | handler_invoker(this, info->handler_callback, context); | 183 | handler_invoker(this, info->handler_callback, context); |
| 184 | context.WriteToOutgoingCommandBuffer(cmd_buf, *Kernel::g_current_process, | ||
| 185 | Kernel::g_handle_table); | ||
| 179 | } | 186 | } |
| 180 | 187 | ||
| 181 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 188 | //////////////////////////////////////////////////////////////////////////////////////////////////// |