svc_wrap.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "common/common_types.h"
  6. #include "core/arm/arm_interface.h"
  7. #include "core/core.h"
  8. #include "core/hle/kernel/svc.h"
  9. #include "core/hle/result.h"
  10. #include "core/memory.h"
  11. namespace Kernel {
  12. static inline u64 Param(int n) {
  13. return Core::CurrentArmInterface().GetReg(n);
  14. }
  15. /**
  16. * HLE a function return from the current ARM userland process
  17. * @param res Result to return
  18. */
  19. static inline void FuncReturn(u64 res) {
  20. Core::CurrentArmInterface().SetReg(0, res);
  21. }
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////
  23. // Function wrappers that return type ResultCode
  24. template <ResultCode func(u64)>
  25. void SvcWrap() {
  26. FuncReturn(func(Param(0)).raw);
  27. }
  28. template <ResultCode func(u32)>
  29. void SvcWrap() {
  30. FuncReturn(func(static_cast<u32>(Param(0))).raw);
  31. }
  32. template <ResultCode func(u32, u32)>
  33. void SvcWrap() {
  34. FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1))).raw);
  35. }
  36. template <ResultCode func(u32*)>
  37. void SvcWrap() {
  38. u32 param = 0;
  39. const u32 retval = func(&param).raw;
  40. Core::CurrentArmInterface().SetReg(1, param);
  41. FuncReturn(retval);
  42. }
  43. template <ResultCode func(u32*, u32)>
  44. void SvcWrap() {
  45. u32 param_1 = 0;
  46. u32 retval = func(&param_1, static_cast<u32>(Param(1))).raw;
  47. Core::CurrentArmInterface().SetReg(1, param_1);
  48. FuncReturn(retval);
  49. }
  50. template <ResultCode func(u32*, u32*)>
  51. void SvcWrap() {
  52. u32 param_1 = 0;
  53. u32 param_2 = 0;
  54. const u32 retval = func(&param_1, &param_2).raw;
  55. auto& arm_interface = Core::CurrentArmInterface();
  56. arm_interface.SetReg(1, param_1);
  57. arm_interface.SetReg(2, param_2);
  58. FuncReturn(retval);
  59. }
  60. template <ResultCode func(u32*, u64)>
  61. void SvcWrap() {
  62. u32 param_1 = 0;
  63. u32 retval = func(&param_1, Param(1)).raw;
  64. Core::CurrentArmInterface().SetReg(1, param_1);
  65. FuncReturn(retval);
  66. }
  67. template <ResultCode func(u64, s32)>
  68. void SvcWrap() {
  69. FuncReturn(func(Param(0), static_cast<s32>(Param(1))).raw);
  70. }
  71. template <ResultCode func(u64, u32)>
  72. void SvcWrap() {
  73. FuncReturn(func(Param(0), static_cast<u32>(Param(1))).raw);
  74. }
  75. template <ResultCode func(u64*, u64)>
  76. void SvcWrap() {
  77. u64 param_1 = 0;
  78. u32 retval = func(&param_1, Param(1)).raw;
  79. Core::CurrentArmInterface().SetReg(1, param_1);
  80. FuncReturn(retval);
  81. }
  82. template <ResultCode func(u64*, u32, u32)>
  83. void SvcWrap() {
  84. u64 param_1 = 0;
  85. u32 retval = func(&param_1, static_cast<u32>(Param(1)), static_cast<u32>(Param(2))).raw;
  86. Core::CurrentArmInterface().SetReg(1, param_1);
  87. FuncReturn(retval);
  88. }
  89. template <ResultCode func(u32, u64)>
  90. void SvcWrap() {
  91. FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw);
  92. }
  93. template <ResultCode func(u32, u32, u64)>
  94. void SvcWrap() {
  95. FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1)), Param(2)).raw);
  96. }
  97. template <ResultCode func(u32, u32*, u64*)>
  98. void SvcWrap() {
  99. u32 param_1 = 0;
  100. u64 param_2 = 0;
  101. ResultCode retval = func(static_cast<u32>(Param(2)), &param_1, &param_2);
  102. Core::CurrentArmInterface().SetReg(1, param_1);
  103. Core::CurrentArmInterface().SetReg(2, param_2);
  104. FuncReturn(retval.raw);
  105. }
  106. template <ResultCode func(u64, u64, u32, u32)>
  107. void SvcWrap() {
  108. FuncReturn(
  109. func(Param(0), Param(1), static_cast<u32>(Param(2)), static_cast<u32>(Param(3))).raw);
  110. }
  111. template <ResultCode func(u32, u64, u32)>
  112. void SvcWrap() {
  113. FuncReturn(func(static_cast<u32>(Param(0)), Param(1), static_cast<u32>(Param(2))).raw);
  114. }
  115. template <ResultCode func(u64, u64, u64)>
  116. void SvcWrap() {
  117. FuncReturn(func(Param(0), Param(1), Param(2)).raw);
  118. }
  119. template <ResultCode func(u64, u64, u32)>
  120. void SvcWrap() {
  121. FuncReturn(func(Param(0), Param(1), static_cast<u32>(Param(2))).raw);
  122. }
  123. template <ResultCode func(u32, u64, u64, u32)>
  124. void SvcWrap() {
  125. FuncReturn(
  126. func(static_cast<u32>(Param(0)), Param(1), Param(2), static_cast<u32>(Param(3))).raw);
  127. }
  128. template <ResultCode func(u32, u64, u64)>
  129. void SvcWrap() {
  130. FuncReturn(func(static_cast<u32>(Param(0)), Param(1), Param(2)).raw);
  131. }
  132. template <ResultCode func(u32*, u64, u64, s64)>
  133. void SvcWrap() {
  134. u32 param_1 = 0;
  135. ResultCode retval =
  136. func(&param_1, Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3)));
  137. Core::CurrentArmInterface().SetReg(1, param_1);
  138. FuncReturn(retval.raw);
  139. }
  140. template <ResultCode func(u64, u64, u32, s64)>
  141. void SvcWrap() {
  142. FuncReturn(
  143. func(Param(0), Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3))).raw);
  144. }
  145. template <ResultCode func(u64*, u64, u64, u64)>
  146. void SvcWrap() {
  147. u64 param_1 = 0;
  148. u32 retval = func(&param_1, Param(1), Param(2), Param(3)).raw;
  149. Core::CurrentArmInterface().SetReg(1, param_1);
  150. FuncReturn(retval);
  151. }
  152. template <ResultCode func(u32*, u64, u64, u64, u32, s32)>
  153. void SvcWrap() {
  154. u32 param_1 = 0;
  155. u32 retval = func(&param_1, Param(1), Param(2), Param(3), static_cast<u32>(Param(4)),
  156. static_cast<s32>(Param(5)))
  157. .raw;
  158. Core::CurrentArmInterface().SetReg(1, param_1);
  159. FuncReturn(retval);
  160. }
  161. template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
  162. void SvcWrap() {
  163. MemoryInfo memory_info = {};
  164. PageInfo page_info = {};
  165. u32 retval = func(&memory_info, &page_info, Param(2)).raw;
  166. Memory::Write64(Param(0), memory_info.base_address);
  167. Memory::Write64(Param(0) + 8, memory_info.size);
  168. Memory::Write32(Param(0) + 16, memory_info.type);
  169. Memory::Write32(Param(0) + 20, memory_info.attributes);
  170. Memory::Write32(Param(0) + 24, memory_info.permission);
  171. FuncReturn(retval);
  172. }
  173. template <ResultCode func(u32*, u64, u64, u32)>
  174. void SvcWrap() {
  175. u32 param_1 = 0;
  176. u32 retval = func(&param_1, Param(1), Param(2), static_cast<u32>(Param(3))).raw;
  177. Core::CurrentArmInterface().SetReg(1, param_1);
  178. FuncReturn(retval);
  179. }
  180. template <ResultCode func(Handle*, u64, u32, u32)>
  181. void SvcWrap() {
  182. u32 param_1 = 0;
  183. u32 retval =
  184. func(&param_1, Param(1), static_cast<u32>(Param(2)), static_cast<u32>(Param(3))).raw;
  185. Core::CurrentArmInterface().SetReg(1, param_1);
  186. FuncReturn(retval);
  187. }
  188. template <ResultCode func(u64, u32, s32, s64)>
  189. void SvcWrap() {
  190. FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
  191. static_cast<s64>(Param(3)))
  192. .raw);
  193. }
  194. template <ResultCode func(u64, u32, s32, s32)>
  195. void SvcWrap() {
  196. FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
  197. static_cast<s32>(Param(3)))
  198. .raw);
  199. }
  200. ////////////////////////////////////////////////////////////////////////////////////////////////////
  201. // Function wrappers that return type u32
  202. template <u32 func()>
  203. void SvcWrap() {
  204. FuncReturn(func());
  205. }
  206. ////////////////////////////////////////////////////////////////////////////////////////////////////
  207. // Function wrappers that return type u64
  208. template <u64 func()>
  209. void SvcWrap() {
  210. FuncReturn(func());
  211. }
  212. ////////////////////////////////////////////////////////////////////////////////////////////////////
  213. /// Function wrappers that return type void
  214. template <void func()>
  215. void SvcWrap() {
  216. func();
  217. }
  218. template <void func(s64)>
  219. void SvcWrap() {
  220. func(static_cast<s64>(Param(0)));
  221. }
  222. template <void func(u64, u64 len)>
  223. void SvcWrap() {
  224. func(Param(0), Param(1));
  225. }
  226. template <void func(u64, u64, u64)>
  227. void SvcWrap() {
  228. func(Param(0), Param(1), Param(2));
  229. }
  230. template <void func(u32, u64, u64)>
  231. void SvcWrap() {
  232. func(static_cast<u32>(Param(0)), Param(1), Param(2));
  233. }
  234. } // namespace Kernel