summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/function_wrappers.h222
1 files changed, 35 insertions, 187 deletions
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index 5d6d0eb56..df2c3e843 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -1,4 +1,4 @@
1// Copyright 2014 Citra Emulator Project 1// Copyright 2017 Citra Emulator Project
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
@@ -7,7 +7,6 @@
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "core/arm/arm_interface.h" 8#include "core/arm/arm_interface.h"
9#include "core/core.h" 9#include "core/core.h"
10#include "core/hle/kernel/kernel.h"
11#include "core/hle/result.h" 10#include "core/hle/result.h"
12#include "core/hle/svc.h" 11#include "core/hle/svc.h"
13#include "core/memory.h" 12#include "core/memory.h"
@@ -17,7 +16,7 @@ namespace HLE {
17#define PARAM(n) Core::CPU().GetReg(n) 16#define PARAM(n) Core::CPU().GetReg(n)
18 17
19/** 18/**
20 * HLE a function return from the current ARM11 userland process 19 * HLE a function return from the current ARM userland process
21 * @param res Result to return 20 * @param res Result to return
22 */ 21 */
23static inline void FuncReturn(u64 res) { 22static inline void FuncReturn(u64 res) {
@@ -32,112 +31,78 @@ void Wrap() {
32 FuncReturn(func(PARAM(0)).raw); 31 FuncReturn(func(PARAM(0)).raw);
33} 32}
34 33
35template <ResultCode func(u32, u64, u32)> 34template <ResultCode func(u32)>
36void Wrap() {
37 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
38}
39
40template <ResultCode func(u64, u32)>
41void Wrap() {
42 FuncReturn(func(PARAM(0), PARAM(1)).raw);
43}
44
45template <ResultCode func(u64, u64, u64)>
46void Wrap() { 35void Wrap() {
47 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); 36 FuncReturn(func((u32)PARAM(0)).raw);
48} 37}
49 38
50template <ResultCode func(u64, u64, s64)> 39template <ResultCode func(u32, u32)>
51void Wrap() { 40void Wrap() {
52 FuncReturn(func(PARAM(1), PARAM(2), (s64)PARAM(3)).raw); 41 FuncReturn(func((u32)PARAM(0), (u32)PARAM(1)).raw);
53} 42}
54 43
55template <ResultCode func(u64*, u64)> 44template <ResultCode func(u32*, u32)>
56void Wrap() { 45void Wrap() {
57 u64 param_1 = 0; 46 u32 param_1 = 0;
58 u32 retval = func(&param_1, PARAM(1)).raw; 47 u32 retval = func(&param_1, (u32)PARAM(1)).raw;
59 Core::CPU().SetReg(1, param_1); 48 Core::CPU().SetReg(1, param_1);
60 FuncReturn(retval); 49 FuncReturn(retval);
61} 50}
62 51
63template <ResultCode func(u64*, u64, u64, u64)> 52template <ResultCode func(u32*, u64)>
64void Wrap() { 53void Wrap() {
65 u64 param_1 = 0; 54 u32 param_1 = 0;
66 u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw; 55 u32 retval = func(&param_1, PARAM(1)).raw;
67 Core::CPU().SetReg(1, param_1); 56 Core::CPU().SetReg(1, param_1);
68 FuncReturn(retval); 57 FuncReturn(retval);
69} 58}
70 59
71template <ResultCode func(u32, u32, u32, u32)> 60template <ResultCode func(u64, u32)>
72void Wrap() {
73 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw);
74}
75
76template <ResultCode func(u32*, u32, u32, u32, u32, u32)>
77void Wrap() { 61void Wrap() {
78 u32 param_1 = 0; 62 FuncReturn(func(PARAM(0), (u32)PARAM(1)).raw);
79 u32 retval = func(&param_1, PARAM(0), PARAM(1), PARAM(2), PARAM(3), PARAM(4)).raw;
80 Core::CPU().SetReg(1, param_1);
81 FuncReturn(retval);
82} 63}
83 64
84template <ResultCode func(u32*, u32, u32, u32, u32, s32)> 65template <ResultCode func(u64*, u64)>
85void Wrap() { 66void Wrap() {
86 u32 param_1 = 0; 67 u64 param_1 = 0;
87 u32 retval = func(&param_1, PARAM(0), PARAM(1), PARAM(2), PARAM(3), PARAM(4)).raw; 68 u32 retval = func(&param_1, PARAM(1)).raw;
88 Core::CPU().SetReg(1, param_1); 69 Core::CPU().SetReg(1, param_1);
89 FuncReturn(retval); 70 FuncReturn(retval);
90} 71}
91 72
92template <ResultCode func(s32*, VAddr, s32, bool, s64)> 73template <ResultCode func(u32, u64, u32)>
93void Wrap() { 74void Wrap() {
94 s32 param_1 = 0; 75 FuncReturn(func((u32)PARAM(0), PARAM(1), (u32)PARAM(2)).raw);
95 s32 retval =
96 func(&param_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
97 .raw;
98
99 Core::CPU().SetReg(1, (u32)param_1);
100 FuncReturn(retval);
101} 76}
102 77
103template <ResultCode func(s32*, VAddr, s32, u32)> 78template <ResultCode func(u64, u64, u64)>
104void Wrap() { 79void Wrap() {
105 s32 param_1 = 0; 80 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
106 u32 retval = func(&param_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
107
108 Core::CPU().SetReg(1, (u32)param_1);
109 FuncReturn(retval);
110} 81}
111 82
112template <ResultCode func(u32, u32, u32, u32, s64)> 83template <ResultCode func(u64, u64, s64)>
113void Wrap() { 84void Wrap() {
114 FuncReturn( 85 FuncReturn(func(PARAM(1), PARAM(2), (s64)PARAM(3)).raw);
115 func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw);
116} 86}
117 87
118template <ResultCode func(u32, u64*)> 88template <ResultCode func(u64*, u64, u64, u64)>
119void Wrap() { 89void Wrap() {
120 u64 param_1 = 0; 90 u64 param_1 = 0;
121 u32 retval = func(PARAM(0), &param_1).raw; 91 u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
122 Core::CPU().SetReg(1, param_1); 92 Core::CPU().SetReg(1, param_1);
123 FuncReturn(retval); 93 FuncReturn(retval);
124} 94}
125 95
126template <ResultCode func(u32*)> 96template <ResultCode func(u32*, u64, u64, u64, u32, s32)>
127void Wrap() { 97void Wrap() {
128 u32 param_1 = 0; 98 u32 param_1 = 0;
129 u32 retval = func(&param_1).raw; 99 u32 retval =
100 func(&param_1, PARAM(1), PARAM(2), PARAM(3), (u32)PARAM(4), (s32)(PARAM(5) & 0xFFFFFFFF))
101 .raw;
130 Core::CPU().SetReg(1, param_1); 102 Core::CPU().SetReg(1, param_1);
131 FuncReturn(retval); 103 FuncReturn(retval);
132} 104}
133 105
134template <ResultCode func(u32, s64)>
135void Wrap() {
136 s32 retval = func(PARAM(0), (((s64)PARAM(3) << 32) | PARAM(2))).raw;
137
138 FuncReturn(retval);
139}
140
141template <ResultCode func(MemoryInfo*, PageInfo*, u64)> 106template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
142void Wrap() { 107void Wrap() {
143 MemoryInfo memory_info = {}; 108 MemoryInfo memory_info = {};
@@ -153,120 +118,6 @@ void Wrap() {
153 FuncReturn(retval); 118 FuncReturn(retval);
154} 119}
155 120
156template <ResultCode func(s32*, u32)>
157void Wrap() {
158 s32 param_1 = 0;
159 u32 retval = func(&param_1, PARAM(1)).raw;
160 Core::CPU().SetReg(1, param_1);
161 FuncReturn(retval);
162}
163
164template <ResultCode func(u32, s32)>
165void Wrap() {
166 FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
167}
168
169template <ResultCode func(u32*, u64)>
170void Wrap() {
171 u32 param_1 = 0;
172 u32 retval = func(&param_1, PARAM(1)).raw;
173 Core::CPU().SetReg(1, param_1);
174 FuncReturn(retval);
175}
176
177template <ResultCode func(u32*, Kernel::Handle)>
178void Wrap() {
179 u32 param_1 = 0;
180 u32 retval = func(&param_1, PARAM(1)).raw;
181 Core::CPU().SetReg(1, param_1);
182 FuncReturn(retval);
183}
184
185template <ResultCode func(u32)>
186void Wrap() {
187 FuncReturn(func(PARAM(0)).raw);
188}
189
190template <ResultCode func(u32*, s32, s32)>
191void Wrap() {
192 u32 param_1 = 0;
193 u32 retval = func(&param_1, PARAM(1), PARAM(2)).raw;
194 Core::CPU().SetReg(1, param_1);
195 FuncReturn(retval);
196}
197
198template <ResultCode func(s32*, u32, s32)>
199void Wrap() {
200 s32 param_1 = 0;
201 u32 retval = func(&param_1, PARAM(1), PARAM(2)).raw;
202 Core::CPU().SetReg(1, param_1);
203 FuncReturn(retval);
204}
205
206template <ResultCode func(s64*, u32, s32)>
207void Wrap() {
208 s64 param_1 = 0;
209 u32 retval = func(&param_1, PARAM(1), PARAM(2)).raw;
210 Core::CPU().SetReg(1, (u32)param_1);
211 Core::CPU().SetReg(2, (u32)(param_1 >> 32));
212 FuncReturn(retval);
213}
214
215template <ResultCode func(u32*, u32, u32, u32, u32)>
216void Wrap() {
217 u32 param_1 = 0;
218 // The last parameter is passed in R0 instead of R4
219 u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3), PARAM(0)).raw;
220 Core::CPU().SetReg(1, param_1);
221 FuncReturn(retval);
222}
223
224template <ResultCode func(u32, s64, s64)>
225void Wrap() {
226 s64 param1 = ((u64)PARAM(3) << 32) | PARAM(2);
227 s64 param2 = ((u64)PARAM(4) << 32) | PARAM(1);
228 FuncReturn(func(PARAM(0), param1, param2).raw);
229}
230
231template <ResultCode func(s64*, Kernel::Handle, u32)>
232void Wrap() {
233 s64 param_1 = 0;
234 u32 retval = func(&param_1, PARAM(1), PARAM(2)).raw;
235 Core::CPU().SetReg(1, (u32)param_1);
236 Core::CPU().SetReg(2, (u32)(param_1 >> 32));
237 FuncReturn(retval);
238}
239
240template <ResultCode func(Kernel::Handle, u32)>
241void Wrap() {
242 FuncReturn(func(PARAM(0), PARAM(1)).raw);
243}
244
245template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
246void Wrap() {
247 Kernel::Handle param_1 = 0;
248 Kernel::Handle param_2 = 0;
249 u32 retval = func(&param_1, &param_2, PARAM(2), PARAM(3)).raw;
250 Core::CPU().SetReg(1, param_1);
251 Core::CPU().SetReg(2, param_2);
252 FuncReturn(retval);
253}
254
255template <ResultCode func(Kernel::Handle*, Kernel::Handle*)>
256void Wrap() {
257 Kernel::Handle param_1 = 0;
258 Kernel::Handle param_2 = 0;
259 u32 retval = func(&param_1, &param_2).raw;
260 Core::CPU().SetReg(1, param_1);
261 Core::CPU().SetReg(2, param_2);
262 FuncReturn(retval);
263}
264
265template <ResultCode func(u32, u32, u32)>
266void Wrap() {
267 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
268}
269
270//////////////////////////////////////////////////////////////////////////////////////////////////// 121////////////////////////////////////////////////////////////////////////////////////////////////////
271// Function wrappers that return type u32 122// Function wrappers that return type u32
272 123
@@ -276,24 +127,21 @@ void Wrap() {
276} 127}
277 128
278//////////////////////////////////////////////////////////////////////////////////////////////////// 129////////////////////////////////////////////////////////////////////////////////////////////////////
279// Function wrappers that return type s64 130/// Function wrappers that return type void
280 131
281template <s64 func()> 132template <void func()>
282void Wrap() { 133void Wrap() {
283 FuncReturn64(func()); 134 func();
284} 135}
285 136
286////////////////////////////////////////////////////////////////////////////////////////////////////
287/// Function wrappers that return type void
288
289template <void func(s64)> 137template <void func(s64)>
290void Wrap() { 138void Wrap() {
291 func(((s64)PARAM(1) << 32) | PARAM(0)); 139 func((s64)PARAM(0));
292} 140}
293 141
294template <void func(VAddr, int len)> 142template <void func(u64, s32 len)>
295void Wrap() { 143void Wrap() {
296 func(PARAM(0), PARAM(1)); 144 func(PARAM(0), (s32)(PARAM(1) & 0xFFFFFFFF));
297} 145}
298 146
299template <void func(u64, u64, u64)> 147template <void func(u64, u64, u64)>