summaryrefslogtreecommitdiff
path: root/src/core/hle/function_wrappers.h
diff options
context:
space:
mode:
authorGravatar bunnei2017-10-09 23:56:20 -0400
committerGravatar bunnei2017-10-09 23:56:20 -0400
commitb1d5db1cf60344b6b081c9d03cb6ccc3264326cd (patch)
treefde377c4ba3c0f92c032e6f5ec8627aae37270ef /src/core/hle/function_wrappers.h
parentloader: Various improvements for NSO/NRO loaders. (diff)
parentMerge pull request #2996 from MerryMage/split-travis (diff)
downloadyuzu-b1d5db1cf60344b6b081c9d03cb6ccc3264326cd.tar.gz
yuzu-b1d5db1cf60344b6b081c9d03cb6ccc3264326cd.tar.xz
yuzu-b1d5db1cf60344b6b081c9d03cb6ccc3264326cd.zip
Merge remote-tracking branch 'upstream/master' into nx
# Conflicts: # src/core/CMakeLists.txt # src/core/arm/dynarmic/arm_dynarmic.cpp # src/core/arm/dyncom/arm_dyncom.cpp # src/core/hle/kernel/process.cpp # src/core/hle/kernel/thread.cpp # src/core/hle/kernel/thread.h # src/core/hle/kernel/vm_manager.cpp # src/core/loader/3dsx.cpp # src/core/loader/elf.cpp # src/core/loader/ncch.cpp # src/core/memory.cpp # src/core/memory.h # src/core/memory_setup.h
Diffstat (limited to 'src/core/hle/function_wrappers.h')
-rw-r--r--src/core/hle/function_wrappers.h108
1 files changed, 61 insertions, 47 deletions
diff --git a/src/core/hle/function_wrappers.h b/src/core/hle/function_wrappers.h
index bc81c06b4..31fda6db3 100644
--- a/src/core/hle/function_wrappers.h
+++ b/src/core/hle/function_wrappers.h
@@ -24,19 +24,37 @@ static inline void FuncReturn(u64 res) {
24 Core::CPU().SetReg(0, res); 24 Core::CPU().SetReg(0, res);
25} 25}
26 26
27/**
28 * HLE a function return (64-bit) from the current ARM11 userland process
29 * @param res Result to return (64-bit)
30 * @todo Verify that this function is correct
31 */
32static inline void FuncReturn64(u64 res) {
33 Core::CPU().SetReg(0, (u32)(res & 0xFFFFFFFF));
34 Core::CPU().SetReg(1, (u32)((res >> 32) & 0xFFFFFFFF));
35}
36
37//////////////////////////////////////////////////////////////////////////////////////////////////// 27////////////////////////////////////////////////////////////////////////////////////////////////////
38// Function wrappers that return type ResultCode 28// Function wrappers that return type ResultCode
39 29
30template <ResultCode func(u64)>
31void Wrap() {
32 FuncReturn(func(PARAM(0)).raw);
33}
34
35template <ResultCode func(u32, u64, 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() {
47 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
48}
49
50template <ResultCode func(u64*, u64, u64, u64)>
51void Wrap() {
52 u64 param_1 = 0;
53 u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
54 Core::CPU().SetReg(1, param_1);
55 FuncReturn(retval);
56}
57
40template <ResultCode func(u32, u32, u32, u32)> 58template <ResultCode func(u32, u32, u32, u32)>
41void Wrap() { 59void Wrap() {
42 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw); 60 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2), PARAM(3)).raw);
@@ -58,22 +76,21 @@ void Wrap() {
58 FuncReturn(retval); 76 FuncReturn(retval);
59} 77}
60 78
61template <ResultCode func(s32*, u32*, s32, bool, s64)> 79template <ResultCode func(s32*, VAddr, s32, bool, s64)>
62void Wrap() { 80void Wrap() {
63 s32 param_1 = 0; 81 s32 param_1 = 0;
64 s32 retval = func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), 82 s32 retval =
65 (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0))) 83 func(&param_1, PARAM(1), (s32)PARAM(2), (PARAM(3) != 0), (((s64)PARAM(4) << 32) | PARAM(0)))
66 .raw; 84 .raw;
67 85
68 Core::CPU().SetReg(1, (u32)param_1); 86 Core::CPU().SetReg(1, (u32)param_1);
69 FuncReturn(retval); 87 FuncReturn(retval);
70} 88}
71 89
72template <ResultCode func(s32*, u32*, s32, u32)> 90template <ResultCode func(s32*, VAddr, s32, u32)>
73void Wrap() { 91void Wrap() {
74 s32 param_1 = 0; 92 s32 param_1 = 0;
75 u32 retval = 93 u32 retval = func(&param_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw;
76 func(&param_1, (Kernel::Handle*)Memory::GetPointer(PARAM(1)), (s32)PARAM(2), PARAM(3)).raw;
77 94
78 Core::CPU().SetReg(1, (u32)param_1); 95 Core::CPU().SetReg(1, (u32)param_1);
79 FuncReturn(retval); 96 FuncReturn(retval);
@@ -85,6 +102,14 @@ void Wrap() {
85 func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw); 102 func(PARAM(0), PARAM(1), PARAM(2), PARAM(3), (((s64)PARAM(5) << 32) | PARAM(4))).raw);
86} 103}
87 104
105template <ResultCode func(u32, u64*)>
106void Wrap() {
107 u64 param_1 = 0;
108 u32 retval = func(PARAM(0), &param_1).raw;
109 Core::CPU().SetReg(1, param_1);
110 FuncReturn(retval);
111}
112
88template <ResultCode func(u32*)> 113template <ResultCode func(u32*)>
89void Wrap() { 114void Wrap() {
90 u32 param_1 = 0; 115 u32 param_1 = 0;
@@ -100,16 +125,17 @@ void Wrap() {
100 FuncReturn(retval); 125 FuncReturn(retval);
101} 126}
102 127
103template <ResultCode func(MemoryInfo*, PageInfo*, u32)> 128template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
104void Wrap() { 129void Wrap() {
105 MemoryInfo memory_info = {}; 130 MemoryInfo memory_info = {};
106 PageInfo page_info = {}; 131 PageInfo page_info = {};
107 u32 retval = func(&memory_info, &page_info, PARAM(2)).raw; 132 u32 retval = func(&memory_info, &page_info, PARAM(2)).raw;
108 Core::CPU().SetReg(1, memory_info.base_address); 133
109 Core::CPU().SetReg(2, memory_info.size); 134 Memory::Write64(PARAM(0), memory_info.base_address);
110 Core::CPU().SetReg(3, memory_info.permission); 135 Memory::Write64(PARAM(0) + 8, memory_info.size);
111 Core::CPU().SetReg(4, memory_info.state); 136 Memory::Write64(PARAM(0) + 16, memory_info.permission);
112 Core::CPU().SetReg(5, page_info.flags); 137 Memory::Write64(PARAM(0) + 24, memory_info.state);
138
113 FuncReturn(retval); 139 FuncReturn(retval);
114} 140}
115 141
@@ -139,7 +165,7 @@ void Wrap() {
139 FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw); 165 FuncReturn(func(PARAM(0), (s32)PARAM(1)).raw);
140} 166}
141 167
142template <ResultCode func(u32*, u32)> 168template <ResultCode func(u32*, u64)>
143void Wrap() { 169void Wrap() {
144 u32 param_1 = 0; 170 u32 param_1 = 0;
145 u32 retval = func(&param_1, PARAM(1)).raw; 171 u32 retval = func(&param_1, PARAM(1)).raw;
@@ -152,21 +178,6 @@ void Wrap() {
152 FuncReturn(func(PARAM(0)).raw); 178 FuncReturn(func(PARAM(0)).raw);
153} 179}
154 180
155template <ResultCode func(s64*, u32, u32*, u32)>
156void Wrap() {
157 FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1),
158 (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3))
159 .raw);
160}
161
162template <ResultCode func(u32*, const char*)>
163void Wrap() {
164 u32 param_1 = 0;
165 u32 retval = func(&param_1, (char*)Memory::GetPointer(PARAM(1))).raw;
166 Core::CPU().SetReg(1, param_1);
167 FuncReturn(retval);
168}
169
170template <ResultCode func(u32*, s32, s32)> 181template <ResultCode func(u32*, s32, s32)>
171void Wrap() { 182void Wrap() {
172 u32 param_1 = 0; 183 u32 param_1 = 0;
@@ -222,13 +233,11 @@ void Wrap() {
222 FuncReturn(func(PARAM(0), PARAM(1)).raw); 233 FuncReturn(func(PARAM(0), PARAM(1)).raw);
223} 234}
224 235
225template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)> 236template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)>
226void Wrap() { 237void Wrap() {
227 Kernel::Handle param_1 = 0; 238 Kernel::Handle param_1 = 0;
228 Kernel::Handle param_2 = 0; 239 Kernel::Handle param_2 = 0;
229 u32 retval = func(&param_1, &param_2, 240 u32 retval = func(&param_1, &param_2, PARAM(2), PARAM(3)).raw;
230 reinterpret_cast<const char*>(Memory::GetPointer(PARAM(2))), PARAM(3))
231 .raw;
232 Core::CPU().SetReg(1, param_1); 241 Core::CPU().SetReg(1, param_1);
233 Core::CPU().SetReg(2, param_2); 242 Core::CPU().SetReg(2, param_2);
234 FuncReturn(retval); 243 FuncReturn(retval);
@@ -244,6 +253,11 @@ void Wrap() {
244 FuncReturn(retval); 253 FuncReturn(retval);
245} 254}
246 255
256template <ResultCode func(u32, u32, u32)>
257void Wrap() {
258 FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
259}
260
247//////////////////////////////////////////////////////////////////////////////////////////////////// 261////////////////////////////////////////////////////////////////////////////////////////////////////
248// Function wrappers that return type u32 262// Function wrappers that return type u32
249 263
@@ -268,14 +282,14 @@ void Wrap() {
268 func(((s64)PARAM(1) << 32) | PARAM(0)); 282 func(((s64)PARAM(1) << 32) | PARAM(0));
269} 283}
270 284
271template <void func(const char*, int len)> 285template <void func(VAddr, int len)>
272void Wrap() { 286void Wrap() {
273 func((char*)Memory::GetPointer(PARAM(0)), PARAM(1)); 287 func(PARAM(0), PARAM(1));
274} 288}
275 289
276template <void func(u8)> 290template <void func(u64, u64, u64)>
277void Wrap() { 291void Wrap() {
278 func((u8)PARAM(0)); 292 func(PARAM(0), PARAM(1), PARAM(2));
279} 293}
280 294
281#undef PARAM 295#undef PARAM