summaryrefslogtreecommitdiff
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-11 21:39:49 -0700
committerGravatar GitHub2017-06-11 21:39:49 -0700
commit4325a7c82d6dc750b17f257ec33309aca4ddf9db (patch)
treead8099c69fedf1144a7851f2878009f5c2e1a8cb /src/core/hle/service/service.cpp
parentMerge pull request #2727 from wwylele/spot-light (diff)
parentKernel/IPC: Use boost::small_vector for HLE context objects (diff)
downloadyuzu-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.cpp19
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
160void ServiceFrameworkBase::HandleSyncRequest(SharedPtr<ServerSession> server_session) { 164void 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////////////////////////////////////////////////////////////////////////////////////////////////////