1 // Copyright 2018 yuzu emulator team
2 // Licensed under GPLv2 or any later version
3 // Refer to the license.txt file included.
4 
5 #pragma once
6 
7 #include "common/common_types.h"
8 #include "core/arm/arm_interface.h"
9 #include "core/core.h"
10 #include "core/hle/result.h"
11 
12 namespace Kernel {
13 
Param(const Core::System & system,int n)14 static inline u64 Param(const Core::System& system, int n) {
15     return system.CurrentArmInterface().GetReg(n);
16 }
17 
Param32(const Core::System & system,int n)18 static inline u32 Param32(const Core::System& system, int n) {
19     return static_cast<u32>(system.CurrentArmInterface().GetReg(n));
20 }
21 
22 /**
23  * HLE a function return from the current ARM userland process
24  * @param system System context
25  * @param result Result to return
26  */
FuncReturn(Core::System & system,u64 result)27 static inline void FuncReturn(Core::System& system, u64 result) {
28     system.CurrentArmInterface().SetReg(0, result);
29 }
30 
FuncReturn32(Core::System & system,u32 result)31 static inline void FuncReturn32(Core::System& system, u32 result) {
32     system.CurrentArmInterface().SetReg(0, (u64)result);
33 }
34 
35 ////////////////////////////////////////////////////////////////////////////////////////////////////
36 // Function wrappers that return type ResultCode
37 
38 template <ResultCode func(Core::System&, u64)>
SvcWrap64(Core::System & system)39 void SvcWrap64(Core::System& system) {
40     FuncReturn(system, func(system, Param(system, 0)).raw);
41 }
42 
43 template <ResultCode func(Core::System&, u64, u64)>
SvcWrap64(Core::System & system)44 void SvcWrap64(Core::System& system) {
45     FuncReturn(system, func(system, Param(system, 0), Param(system, 1)).raw);
46 }
47 
48 template <ResultCode func(Core::System&, u32)>
SvcWrap64(Core::System & system)49 void SvcWrap64(Core::System& system) {
50     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
51 }
52 
53 template <ResultCode func(Core::System&, u32, u32)>
SvcWrap64(Core::System & system)54 void SvcWrap64(Core::System& system) {
55     FuncReturn(
56         system,
57         func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw);
58 }
59 
60 template <ResultCode func(Core::System&, u32, u64, u64, u64)>
SvcWrap64(Core::System & system)61 void SvcWrap64(Core::System& system) {
62     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
63                             Param(system, 2), Param(system, 3))
64                            .raw);
65 }
66 
67 template <ResultCode func(Core::System&, u32*)>
SvcWrap64(Core::System & system)68 void SvcWrap64(Core::System& system) {
69     u32 param = 0;
70     const u32 retval = func(system, &param).raw;
71     system.CurrentArmInterface().SetReg(1, param);
72     FuncReturn(system, retval);
73 }
74 
75 template <ResultCode func(Core::System&, u32*, u32)>
SvcWrap64(Core::System & system)76 void SvcWrap64(Core::System& system) {
77     u32 param_1 = 0;
78     const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
79     system.CurrentArmInterface().SetReg(1, param_1);
80     FuncReturn(system, retval);
81 }
82 
83 template <ResultCode func(Core::System&, u32*, u32*)>
SvcWrap64(Core::System & system)84 void SvcWrap64(Core::System& system) {
85     u32 param_1 = 0;
86     u32 param_2 = 0;
87     const u32 retval = func(system, &param_1, &param_2).raw;
88 
89     auto& arm_interface = system.CurrentArmInterface();
90     arm_interface.SetReg(1, param_1);
91     arm_interface.SetReg(2, param_2);
92 
93     FuncReturn(system, retval);
94 }
95 
96 template <ResultCode func(Core::System&, u32*, u64)>
SvcWrap64(Core::System & system)97 void SvcWrap64(Core::System& system) {
98     u32 param_1 = 0;
99     const u32 retval = func(system, &param_1, Param(system, 1)).raw;
100     system.CurrentArmInterface().SetReg(1, param_1);
101     FuncReturn(system, retval);
102 }
103 
104 template <ResultCode func(Core::System&, u32*, u64, u32)>
SvcWrap64(Core::System & system)105 void SvcWrap64(Core::System& system) {
106     u32 param_1 = 0;
107     const u32 retval =
108         func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2))).raw;
109 
110     system.CurrentArmInterface().SetReg(1, param_1);
111     FuncReturn(system, retval);
112 }
113 
114 template <ResultCode func(Core::System&, u64*, u32)>
SvcWrap64(Core::System & system)115 void SvcWrap64(Core::System& system) {
116     u64 param_1 = 0;
117     const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
118 
119     system.CurrentArmInterface().SetReg(1, param_1);
120     FuncReturn(system, retval);
121 }
122 
123 template <ResultCode func(Core::System&, u64, u32)>
SvcWrap64(Core::System & system)124 void SvcWrap64(Core::System& system) {
125     FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1))).raw);
126 }
127 
128 template <ResultCode func(Core::System&, u64*, u64)>
SvcWrap64(Core::System & system)129 void SvcWrap64(Core::System& system) {
130     u64 param_1 = 0;
131     const u32 retval = func(system, &param_1, Param(system, 1)).raw;
132 
133     system.CurrentArmInterface().SetReg(1, param_1);
134     FuncReturn(system, retval);
135 }
136 
137 template <ResultCode func(Core::System&, u64*, u32, u32)>
SvcWrap64(Core::System & system)138 void SvcWrap64(Core::System& system) {
139     u64 param_1 = 0;
140     const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1)),
141                             static_cast<u32>(Param(system, 2)))
142                            .raw;
143 
144     system.CurrentArmInterface().SetReg(1, param_1);
145     FuncReturn(system, retval);
146 }
147 
148 template <ResultCode func(Core::System&, u32, u64)>
SvcWrap64(Core::System & system)149 void SvcWrap64(Core::System& system) {
150     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1)).raw);
151 }
152 
153 template <ResultCode func(Core::System&, u32, u32, u64)>
SvcWrap64(Core::System & system)154 void SvcWrap64(Core::System& system) {
155     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
156                             static_cast<u32>(Param(system, 1)), Param(system, 2))
157                            .raw);
158 }
159 
160 template <ResultCode func(Core::System&, u32, u32*, u64*)>
SvcWrap64(Core::System & system)161 void SvcWrap64(Core::System& system) {
162     u32 param_1 = 0;
163     u64 param_2 = 0;
164     const ResultCode retval = func(system, static_cast<u32>(Param(system, 2)), &param_1, &param_2);
165 
166     system.CurrentArmInterface().SetReg(1, param_1);
167     system.CurrentArmInterface().SetReg(2, param_2);
168     FuncReturn(system, retval.raw);
169 }
170 
171 template <ResultCode func(Core::System&, u64, u64, u32, u32)>
SvcWrap64(Core::System & system)172 void SvcWrap64(Core::System& system) {
173     FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
174                             static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
175                            .raw);
176 }
177 
178 template <ResultCode func(Core::System&, u64, u64, u32, u64)>
SvcWrap64(Core::System & system)179 void SvcWrap64(Core::System& system) {
180     FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
181                             static_cast<u32>(Param(system, 2)), Param(system, 3))
182                            .raw);
183 }
184 
185 template <ResultCode func(Core::System&, u32, u64, u32)>
SvcWrap64(Core::System & system)186 void SvcWrap64(Core::System& system) {
187     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
188                             static_cast<u32>(Param(system, 2)))
189                            .raw);
190 }
191 
192 template <ResultCode func(Core::System&, u64, u64, u64)>
SvcWrap64(Core::System & system)193 void SvcWrap64(Core::System& system) {
194     FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw);
195 }
196 
197 template <ResultCode func(Core::System&, u64, u64, u32)>
SvcWrap64(Core::System & system)198 void SvcWrap64(Core::System& system) {
199     FuncReturn(
200         system,
201         func(system, Param(system, 0), Param(system, 1), static_cast<u32>(Param(system, 2))).raw);
202 }
203 
204 template <ResultCode func(Core::System&, u32, u64, u64, u32)>
SvcWrap64(Core::System & system)205 void SvcWrap64(Core::System& system) {
206     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
207                             Param(system, 2), static_cast<u32>(Param(system, 3)))
208                            .raw);
209 }
210 
211 template <ResultCode func(Core::System&, u32, u64, u64)>
SvcWrap64(Core::System & system)212 void SvcWrap64(Core::System& system) {
213     FuncReturn(
214         system,
215         func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2)).raw);
216 }
217 
218 template <ResultCode func(Core::System&, u32*, u64, u64, s64)>
SvcWrap64(Core::System & system)219 void SvcWrap64(Core::System& system) {
220     u32 param_1 = 0;
221     const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
222                             static_cast<s64>(Param(system, 3)))
223                            .raw;
224 
225     system.CurrentArmInterface().SetReg(1, param_1);
226     FuncReturn(system, retval);
227 }
228 
229 template <ResultCode func(Core::System&, u64, u64, u32, s64)>
SvcWrap64(Core::System & system)230 void SvcWrap64(Core::System& system) {
231     FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
232                             static_cast<u32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
233                            .raw);
234 }
235 
236 template <ResultCode func(Core::System&, u64*, u64, u64, u64)>
SvcWrap64(Core::System & system)237 void SvcWrap64(Core::System& system) {
238     u64 param_1 = 0;
239     const u32 retval =
240         func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3)).raw;
241 
242     system.CurrentArmInterface().SetReg(1, param_1);
243     FuncReturn(system, retval);
244 }
245 
246 template <ResultCode func(Core::System&, u32*, u64, u64, u64, u32, s32)>
SvcWrap64(Core::System & system)247 void SvcWrap64(Core::System& system) {
248     u32 param_1 = 0;
249     const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3),
250                             static_cast<u32>(Param(system, 4)), static_cast<s32>(Param(system, 5)))
251                            .raw;
252 
253     system.CurrentArmInterface().SetReg(1, param_1);
254     FuncReturn(system, retval);
255 }
256 
257 template <ResultCode func(Core::System&, u32*, u64, u64, u32)>
SvcWrap64(Core::System & system)258 void SvcWrap64(Core::System& system) {
259     u32 param_1 = 0;
260     const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2),
261                             static_cast<u32>(Param(system, 3)))
262                            .raw;
263 
264     system.CurrentArmInterface().SetReg(1, param_1);
265     FuncReturn(system, retval);
266 }
267 
268 template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
SvcWrap64(Core::System & system)269 void SvcWrap64(Core::System& system) {
270     u32 param_1 = 0;
271     const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
272                             static_cast<u32>(Param(system, 3)))
273                            .raw;
274 
275     system.CurrentArmInterface().SetReg(1, param_1);
276     FuncReturn(system, retval);
277 }
278 
279 template <ResultCode func(Core::System&, u64, u32, s32, s64)>
SvcWrap64(Core::System & system)280 void SvcWrap64(Core::System& system) {
281     FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
282                             static_cast<s32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
283                            .raw);
284 }
285 
286 template <ResultCode func(Core::System&, u64, u32, s32, s32)>
SvcWrap64(Core::System & system)287 void SvcWrap64(Core::System& system) {
288     FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
289                             static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
290                            .raw);
291 }
292 
293 ////////////////////////////////////////////////////////////////////////////////////////////////////
294 // Function wrappers that return type u32
295 
296 template <u32 func(Core::System&)>
SvcWrap64(Core::System & system)297 void SvcWrap64(Core::System& system) {
298     FuncReturn(system, func(system));
299 }
300 
301 ////////////////////////////////////////////////////////////////////////////////////////////////////
302 // Function wrappers that return type u64
303 
304 template <u64 func(Core::System&)>
SvcWrap64(Core::System & system)305 void SvcWrap64(Core::System& system) {
306     FuncReturn(system, func(system));
307 }
308 
309 ////////////////////////////////////////////////////////////////////////////////////////////////////
310 /// Function wrappers that return type void
311 
312 template <void func(Core::System&)>
SvcWrap64(Core::System & system)313 void SvcWrap64(Core::System& system) {
314     func(system);
315 }
316 
317 template <void func(Core::System&, u32)>
SvcWrap64(Core::System & system)318 void SvcWrap64(Core::System& system) {
319     func(system, static_cast<u32>(Param(system, 0)));
320 }
321 
322 template <void func(Core::System&, u32, u64, u64, u64)>
SvcWrap64(Core::System & system)323 void SvcWrap64(Core::System& system) {
324     func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2),
325          Param(system, 3));
326 }
327 
328 template <void func(Core::System&, s64)>
SvcWrap64(Core::System & system)329 void SvcWrap64(Core::System& system) {
330     func(system, static_cast<s64>(Param(system, 0)));
331 }
332 
333 template <void func(Core::System&, u64, s32)>
SvcWrap64(Core::System & system)334 void SvcWrap64(Core::System& system) {
335     func(system, Param(system, 0), static_cast<s32>(Param(system, 1)));
336 }
337 
338 template <void func(Core::System&, u64, u64)>
SvcWrap64(Core::System & system)339 void SvcWrap64(Core::System& system) {
340     func(system, Param(system, 0), Param(system, 1));
341 }
342 
343 template <void func(Core::System&, u64, u64, u64)>
SvcWrap64(Core::System & system)344 void SvcWrap64(Core::System& system) {
345     func(system, Param(system, 0), Param(system, 1), Param(system, 2));
346 }
347 
348 template <void func(Core::System&, u32, u64, u64)>
SvcWrap64(Core::System & system)349 void SvcWrap64(Core::System& system) {
350     func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
351 }
352 
353 // Used by QueryMemory32, ArbitrateLock32
354 template <ResultCode func(Core::System&, u32, u32, u32)>
SvcWrap32(Core::System & system)355 void SvcWrap32(Core::System& system) {
356     FuncReturn32(system,
357                  func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2)).raw);
358 }
359 
360 // Used by Break32
361 template <void func(Core::System&, u32, u32, u32)>
SvcWrap32(Core::System & system)362 void SvcWrap32(Core::System& system) {
363     func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2));
364 }
365 
366 // Used by ExitProcess32, ExitThread32
367 template <void func(Core::System&)>
SvcWrap32(Core::System & system)368 void SvcWrap32(Core::System& system) {
369     func(system);
370 }
371 
372 // Used by GetCurrentProcessorNumber32
373 template <u32 func(Core::System&)>
SvcWrap32(Core::System & system)374 void SvcWrap32(Core::System& system) {
375     FuncReturn32(system, func(system));
376 }
377 
378 // Used by SleepThread32
379 template <void func(Core::System&, u32, u32)>
SvcWrap32(Core::System & system)380 void SvcWrap32(Core::System& system) {
381     func(system, Param32(system, 0), Param32(system, 1));
382 }
383 
384 // Used by CreateThread32
385 template <ResultCode func(Core::System&, Handle*, u32, u32, u32, u32, s32)>
SvcWrap32(Core::System & system)386 void SvcWrap32(Core::System& system) {
387     Handle param_1 = 0;
388 
389     const u32 retval = func(system, &param_1, Param32(system, 0), Param32(system, 1),
390                             Param32(system, 2), Param32(system, 3), Param32(system, 4))
391                            .raw;
392 
393     system.CurrentArmInterface().SetReg(1, param_1);
394     FuncReturn(system, retval);
395 }
396 
397 // Used by GetInfo32
398 template <ResultCode func(Core::System&, u32*, u32*, u32, u32, u32, u32)>
SvcWrap32(Core::System & system)399 void SvcWrap32(Core::System& system) {
400     u32 param_1 = 0;
401     u32 param_2 = 0;
402 
403     const u32 retval = func(system, &param_1, &param_2, Param32(system, 0), Param32(system, 1),
404                             Param32(system, 2), Param32(system, 3))
405                            .raw;
406 
407     system.CurrentArmInterface().SetReg(1, param_1);
408     system.CurrentArmInterface().SetReg(2, param_2);
409     FuncReturn(system, retval);
410 }
411 
412 // Used by GetThreadPriority32, ConnectToNamedPort32
413 template <ResultCode func(Core::System&, u32*, u32)>
SvcWrap32(Core::System & system)414 void SvcWrap32(Core::System& system) {
415     u32 param_1 = 0;
416     const u32 retval = func(system, &param_1, Param32(system, 1)).raw;
417     system.CurrentArmInterface().SetReg(1, param_1);
418     FuncReturn(system, retval);
419 }
420 
421 // Used by GetThreadId32
422 template <ResultCode func(Core::System&, u32*, u32*, u32)>
SvcWrap32(Core::System & system)423 void SvcWrap32(Core::System& system) {
424     u32 param_1 = 0;
425     u32 param_2 = 0;
426 
427     const u32 retval = func(system, &param_1, &param_2, Param32(system, 1)).raw;
428     system.CurrentArmInterface().SetReg(1, param_1);
429     system.CurrentArmInterface().SetReg(2, param_2);
430     FuncReturn(system, retval);
431 }
432 
433 // Used by GetSystemTick32
434 template <void func(Core::System&, u32*, u32*)>
SvcWrap32(Core::System & system)435 void SvcWrap32(Core::System& system) {
436     u32 param_1 = 0;
437     u32 param_2 = 0;
438 
439     func(system, &param_1, &param_2);
440     system.CurrentArmInterface().SetReg(0, param_1);
441     system.CurrentArmInterface().SetReg(1, param_2);
442 }
443 
444 // Used by CreateEvent32
445 template <ResultCode func(Core::System&, Handle*, Handle*)>
SvcWrap32(Core::System & system)446 void SvcWrap32(Core::System& system) {
447     Handle param_1 = 0;
448     Handle param_2 = 0;
449 
450     const u32 retval = func(system, &param_1, &param_2).raw;
451     system.CurrentArmInterface().SetReg(1, param_1);
452     system.CurrentArmInterface().SetReg(2, param_2);
453     FuncReturn(system, retval);
454 }
455 
456 // Used by GetThreadId32
457 template <ResultCode func(Core::System&, Handle, u32*, u32*, u32*)>
SvcWrap32(Core::System & system)458 void SvcWrap32(Core::System& system) {
459     u32 param_1 = 0;
460     u32 param_2 = 0;
461     u32 param_3 = 0;
462 
463     const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
464     system.CurrentArmInterface().SetReg(1, param_1);
465     system.CurrentArmInterface().SetReg(2, param_2);
466     system.CurrentArmInterface().SetReg(3, param_3);
467     FuncReturn(system, retval);
468 }
469 
470 // Used by SignalProcessWideKey32
471 template <void func(Core::System&, u32, s32)>
SvcWrap32(Core::System & system)472 void SvcWrap32(Core::System& system) {
473     func(system, static_cast<u32>(Param(system, 0)), static_cast<s32>(Param(system, 1)));
474 }
475 
476 // Used by SetThreadPriority32
477 template <ResultCode func(Core::System&, Handle, u32)>
SvcWrap32(Core::System & system)478 void SvcWrap32(Core::System& system) {
479     const u32 retval =
480         func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw;
481     FuncReturn(system, retval);
482 }
483 
484 // Used by SetThreadCoreMask32
485 template <ResultCode func(Core::System&, Handle, u32, u32, u32)>
SvcWrap32(Core::System & system)486 void SvcWrap32(Core::System& system) {
487     const u32 retval =
488         func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
489              static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
490             .raw;
491     FuncReturn(system, retval);
492 }
493 
494 // Used by WaitProcessWideKeyAtomic32
495 template <ResultCode func(Core::System&, u32, u32, Handle, u32, u32)>
SvcWrap32(Core::System & system)496 void SvcWrap32(Core::System& system) {
497     const u32 retval =
498         func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
499              static_cast<Handle>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
500              static_cast<u32>(Param(system, 4)))
501             .raw;
502     FuncReturn(system, retval);
503 }
504 
505 // Used by WaitForAddress32
506 template <ResultCode func(Core::System&, u32, u32, s32, u32, u32)>
SvcWrap32(Core::System & system)507 void SvcWrap32(Core::System& system) {
508     const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
509                             static_cast<u32>(Param(system, 1)), static_cast<s32>(Param(system, 2)),
510                             static_cast<u32>(Param(system, 3)), static_cast<u32>(Param(system, 4)))
511                            .raw;
512     FuncReturn(system, retval);
513 }
514 
515 // Used by SignalToAddress32
516 template <ResultCode func(Core::System&, u32, u32, s32, s32)>
SvcWrap32(Core::System & system)517 void SvcWrap32(Core::System& system) {
518     const u32 retval =
519         func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
520              static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
521             .raw;
522     FuncReturn(system, retval);
523 }
524 
525 // Used by SendSyncRequest32, ArbitrateUnlock32
526 template <ResultCode func(Core::System&, u32)>
SvcWrap32(Core::System & system)527 void SvcWrap32(Core::System& system) {
528     FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
529 }
530 
531 // Used by CreateTransferMemory32
532 template <ResultCode func(Core::System&, Handle*, u32, u32, u32)>
SvcWrap32(Core::System & system)533 void SvcWrap32(Core::System& system) {
534     Handle handle = 0;
535     const u32 retval =
536         func(system, &handle, Param32(system, 1), Param32(system, 2), Param32(system, 3)).raw;
537     system.CurrentArmInterface().SetReg(1, handle);
538     FuncReturn(system, retval);
539 }
540 
541 // Used by WaitSynchronization32
542 template <ResultCode func(Core::System&, u32, u32, s32, u32, Handle*)>
SvcWrap32(Core::System & system)543 void SvcWrap32(Core::System& system) {
544     u32 param_1 = 0;
545     const u32 retval = func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2),
546                             Param32(system, 3), &param_1)
547                            .raw;
548     system.CurrentArmInterface().SetReg(1, param_1);
549     FuncReturn(system, retval);
550 }
551 
552 } // namespace Kernel
553