summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/ipc_helpers.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h
index d7348c09d..a3abc102e 100644
--- a/src/core/hle/ipc_helpers.h
+++ b/src/core/hle/ipc_helpers.h
@@ -6,17 +6,22 @@
6 6
7#include "core/hle/ipc.h" 7#include "core/hle/ipc.h"
8#include "core/hle/kernel/handle_table.h" 8#include "core/hle/kernel/handle_table.h"
9#include "core/hle/kernel/hle_ipc.h"
9#include "core/hle/kernel/kernel.h" 10#include "core/hle/kernel/kernel.h"
10 11
11namespace IPC { 12namespace IPC {
12 13
13class RequestHelperBase { 14class RequestHelperBase {
14protected: 15protected:
16 Kernel::HLERequestContext* context = nullptr;
15 u32* cmdbuf; 17 u32* cmdbuf;
16 ptrdiff_t index = 1; 18 ptrdiff_t index = 1;
17 Header header; 19 Header header;
18 20
19public: 21public:
22 RequestHelperBase(Kernel::HLERequestContext& context, Header desired_header)
23 : context(&context), cmdbuf(context.CommandBuffer()), header(desired_header) {}
24
20 RequestHelperBase(u32* command_buffer, Header command_header) 25 RequestHelperBase(u32* command_buffer, Header command_header)
21 : cmdbuf(command_buffer), header(command_header) {} 26 : cmdbuf(command_buffer), header(command_header) {}
22 27
@@ -51,12 +56,24 @@ public:
51 56
52class RequestBuilder : public RequestHelperBase { 57class RequestBuilder : public RequestHelperBase {
53public: 58public:
59 RequestBuilder(Kernel::HLERequestContext& context, Header command_header)
60 : RequestHelperBase(context, command_header) {
61 cmdbuf[0] = header.raw;
62 }
63
64 RequestBuilder(Kernel::HLERequestContext& context, u16 command_id, unsigned normal_params_size,
65 unsigned translate_params_size)
66 : RequestBuilder(
67 context, Header{MakeHeader(command_id, normal_params_size, translate_params_size)}) {}
68
54 RequestBuilder(u32* command_buffer, Header command_header) 69 RequestBuilder(u32* command_buffer, Header command_header)
55 : RequestHelperBase(command_buffer, command_header) { 70 : RequestHelperBase(command_buffer, command_header) {
56 cmdbuf[0] = header.raw; 71 cmdbuf[0] = header.raw;
57 } 72 }
73
58 explicit RequestBuilder(u32* command_buffer, u32 command_header) 74 explicit RequestBuilder(u32* command_buffer, u32 command_header)
59 : RequestBuilder(command_buffer, Header{command_header}) {} 75 : RequestBuilder(command_buffer, Header{command_header}) {}
76
60 RequestBuilder(u32* command_buffer, u16 command_id, unsigned normal_params_size, 77 RequestBuilder(u32* command_buffer, u16 command_id, unsigned normal_params_size,
61 unsigned translate_params_size) 78 unsigned translate_params_size)
62 : RequestBuilder(command_buffer, 79 : RequestBuilder(command_buffer,
@@ -171,10 +188,21 @@ inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size,
171 188
172class RequestParser : public RequestHelperBase { 189class RequestParser : public RequestHelperBase {
173public: 190public:
191 RequestParser(Kernel::HLERequestContext& context, Header desired_header)
192 : RequestHelperBase(context, desired_header) {}
193
194 RequestParser(Kernel::HLERequestContext& context, u16 command_id, unsigned normal_params_size,
195 unsigned translate_params_size)
196 : RequestParser(context,
197 Header{MakeHeader(command_id, normal_params_size, translate_params_size)}) {
198 }
199
174 RequestParser(u32* command_buffer, Header command_header) 200 RequestParser(u32* command_buffer, Header command_header)
175 : RequestHelperBase(command_buffer, command_header) {} 201 : RequestHelperBase(command_buffer, command_header) {}
202
176 explicit RequestParser(u32* command_buffer, u32 command_header) 203 explicit RequestParser(u32* command_buffer, u32 command_header)
177 : RequestParser(command_buffer, Header{command_header}) {} 204 : RequestParser(command_buffer, Header{command_header}) {}
205
178 RequestParser(u32* command_buffer, u16 command_id, unsigned normal_params_size, 206 RequestParser(u32* command_buffer, u16 command_id, unsigned normal_params_size,
179 unsigned translate_params_size) 207 unsigned translate_params_size)
180 : RequestParser(command_buffer, 208 : RequestParser(command_buffer,
@@ -186,7 +214,10 @@ public:
186 ValidateHeader(); 214 ValidateHeader();
187 Header builderHeader{ 215 Header builderHeader{
188 MakeHeader(header.command_id, normal_params_size, translate_params_size)}; 216 MakeHeader(header.command_id, normal_params_size, translate_params_size)};
189 return {cmdbuf, builderHeader}; 217 if (context != nullptr)
218 return {*context, builderHeader};
219 else
220 return {cmdbuf, builderHeader};
190 } 221 }
191 222
192 template <typename T> 223 template <typename T>