diff options
| author | 2017-10-09 23:56:20 -0400 | |
|---|---|---|
| committer | 2017-10-09 23:56:20 -0400 | |
| commit | b1d5db1cf60344b6b081c9d03cb6ccc3264326cd (patch) | |
| tree | fde377c4ba3c0f92c032e6f5ec8627aae37270ef /src/core/hle/function_wrappers.h | |
| parent | loader: Various improvements for NSO/NRO loaders. (diff) | |
| parent | Merge pull request #2996 from MerryMage/split-travis (diff) | |
| download | yuzu-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.h | 108 |
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 | */ | ||
| 32 | static 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 | ||
| 30 | template <ResultCode func(u64)> | ||
| 31 | void Wrap() { | ||
| 32 | FuncReturn(func(PARAM(0)).raw); | ||
| 33 | } | ||
| 34 | |||
| 35 | template <ResultCode func(u32, u64, u32)> | ||
| 36 | void Wrap() { | ||
| 37 | FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); | ||
| 38 | } | ||
| 39 | |||
| 40 | template <ResultCode func(u64, u32)> | ||
| 41 | void Wrap() { | ||
| 42 | FuncReturn(func(PARAM(0), PARAM(1)).raw); | ||
| 43 | } | ||
| 44 | |||
| 45 | template <ResultCode func(u64, u64, u64)> | ||
| 46 | void Wrap() { | ||
| 47 | FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw); | ||
| 48 | } | ||
| 49 | |||
| 50 | template <ResultCode func(u64*, u64, u64, u64)> | ||
| 51 | void Wrap() { | ||
| 52 | u64 param_1 = 0; | ||
| 53 | u32 retval = func(¶m_1, PARAM(1), PARAM(2), PARAM(3)).raw; | ||
| 54 | Core::CPU().SetReg(1, param_1); | ||
| 55 | FuncReturn(retval); | ||
| 56 | } | ||
| 57 | |||
| 40 | template <ResultCode func(u32, u32, u32, u32)> | 58 | template <ResultCode func(u32, u32, u32, u32)> |
| 41 | void Wrap() { | 59 | void 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 | ||
| 61 | template <ResultCode func(s32*, u32*, s32, bool, s64)> | 79 | template <ResultCode func(s32*, VAddr, s32, bool, s64)> |
| 62 | void Wrap() { | 80 | void Wrap() { |
| 63 | s32 param_1 = 0; | 81 | s32 param_1 = 0; |
| 64 | s32 retval = func(¶m_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(¶m_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 | ||
| 72 | template <ResultCode func(s32*, u32*, s32, u32)> | 90 | template <ResultCode func(s32*, VAddr, s32, u32)> |
| 73 | void Wrap() { | 91 | void Wrap() { |
| 74 | s32 param_1 = 0; | 92 | s32 param_1 = 0; |
| 75 | u32 retval = | 93 | u32 retval = func(¶m_1, PARAM(1), (s32)PARAM(2), PARAM(3)).raw; |
| 76 | func(¶m_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 | ||
| 105 | template <ResultCode func(u32, u64*)> | ||
| 106 | void Wrap() { | ||
| 107 | u64 param_1 = 0; | ||
| 108 | u32 retval = func(PARAM(0), ¶m_1).raw; | ||
| 109 | Core::CPU().SetReg(1, param_1); | ||
| 110 | FuncReturn(retval); | ||
| 111 | } | ||
| 112 | |||
| 88 | template <ResultCode func(u32*)> | 113 | template <ResultCode func(u32*)> |
| 89 | void Wrap() { | 114 | void 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 | ||
| 103 | template <ResultCode func(MemoryInfo*, PageInfo*, u32)> | 128 | template <ResultCode func(MemoryInfo*, PageInfo*, u64)> |
| 104 | void Wrap() { | 129 | void 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 | ||
| 142 | template <ResultCode func(u32*, u32)> | 168 | template <ResultCode func(u32*, u64)> |
| 143 | void Wrap() { | 169 | void Wrap() { |
| 144 | u32 param_1 = 0; | 170 | u32 param_1 = 0; |
| 145 | u32 retval = func(¶m_1, PARAM(1)).raw; | 171 | u32 retval = func(¶m_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 | ||
| 155 | template <ResultCode func(s64*, u32, u32*, u32)> | ||
| 156 | void Wrap() { | ||
| 157 | FuncReturn(func((s64*)Memory::GetPointer(PARAM(0)), PARAM(1), | ||
| 158 | (u32*)Memory::GetPointer(PARAM(2)), (s32)PARAM(3)) | ||
| 159 | .raw); | ||
| 160 | } | ||
| 161 | |||
| 162 | template <ResultCode func(u32*, const char*)> | ||
| 163 | void Wrap() { | ||
| 164 | u32 param_1 = 0; | ||
| 165 | u32 retval = func(¶m_1, (char*)Memory::GetPointer(PARAM(1))).raw; | ||
| 166 | Core::CPU().SetReg(1, param_1); | ||
| 167 | FuncReturn(retval); | ||
| 168 | } | ||
| 169 | |||
| 170 | template <ResultCode func(u32*, s32, s32)> | 181 | template <ResultCode func(u32*, s32, s32)> |
| 171 | void Wrap() { | 182 | void 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 | ||
| 225 | template <ResultCode func(Kernel::Handle*, Kernel::Handle*, const char*, u32)> | 236 | template <ResultCode func(Kernel::Handle*, Kernel::Handle*, VAddr, u32)> |
| 226 | void Wrap() { | 237 | void 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(¶m_1, ¶m_2, | 240 | u32 retval = func(¶m_1, ¶m_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 | ||
| 256 | template <ResultCode func(u32, u32, u32)> | ||
| 257 | void 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 | ||
| 271 | template <void func(const char*, int len)> | 285 | template <void func(VAddr, int len)> |
| 272 | void Wrap() { | 286 | void Wrap() { |
| 273 | func((char*)Memory::GetPointer(PARAM(0)), PARAM(1)); | 287 | func(PARAM(0), PARAM(1)); |
| 274 | } | 288 | } |
| 275 | 289 | ||
| 276 | template <void func(u8)> | 290 | template <void func(u64, u64, u64)> |
| 277 | void Wrap() { | 291 | void Wrap() { |
| 278 | func((u8)PARAM(0)); | 292 | func(PARAM(0), PARAM(1), PARAM(2)); |
| 279 | } | 293 | } |
| 280 | 294 | ||
| 281 | #undef PARAM | 295 | #undef PARAM |