svc_wrap.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  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/result.h"
  9. namespace Kernel {
  10. static inline u64 Param(const Core::System& system, int n) {
  11. return system.CurrentArmInterface().GetReg(n);
  12. }
  13. /**
  14. * HLE a function return from the current ARM userland process
  15. * @param system System context
  16. * @param result Result to return
  17. */
  18. static inline void FuncReturn(Core::System& system, u64 result) {
  19. system.CurrentArmInterface().SetReg(0, result);
  20. }
  21. ////////////////////////////////////////////////////////////////////////////////////////////////////
  22. // Function wrappers that return type ResultCode
  23. template <ResultCode func(Core::System&, u64)>
  24. void SvcWrap(Core::System& system) {
  25. FuncReturn(system, func(system, Param(system, 0)).raw);
  26. }
  27. template <ResultCode func(Core::System&, u64, u64)>
  28. void SvcWrap(Core::System& system) {
  29. FuncReturn(system, func(system, Param(system, 0), Param(system, 1)).raw);
  30. }
  31. template <ResultCode func(Core::System&, u32)>
  32. void SvcWrap(Core::System& system) {
  33. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  34. }
  35. template <ResultCode func(Core::System&, u32, u32)>
  36. void SvcWrap(Core::System& system) {
  37. FuncReturn(
  38. system,
  39. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw);
  40. }
  41. template <ResultCode func(Core::System&, u32, u64, u64, u64)>
  42. void SvcWrap(Core::System& system) {
  43. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  44. Param(system, 2), Param(system, 3))
  45. .raw);
  46. }
  47. template <ResultCode func(Core::System&, u32*)>
  48. void SvcWrap(Core::System& system) {
  49. u32 param = 0;
  50. const u32 retval = func(system, &param).raw;
  51. system.CurrentArmInterface().SetReg(1, param);
  52. FuncReturn(system, retval);
  53. }
  54. template <ResultCode func(Core::System&, u32*, u32)>
  55. void SvcWrap(Core::System& system) {
  56. u32 param_1 = 0;
  57. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  58. system.CurrentArmInterface().SetReg(1, param_1);
  59. FuncReturn(system, retval);
  60. }
  61. template <ResultCode func(Core::System&, u32*, u32*)>
  62. void SvcWrap(Core::System& system) {
  63. u32 param_1 = 0;
  64. u32 param_2 = 0;
  65. const u32 retval = func(system, &param_1, &param_2).raw;
  66. auto& arm_interface = system.CurrentArmInterface();
  67. arm_interface.SetReg(1, param_1);
  68. arm_interface.SetReg(2, param_2);
  69. FuncReturn(system, retval);
  70. }
  71. template <ResultCode func(Core::System&, u32*, u64)>
  72. void SvcWrap(Core::System& system) {
  73. u32 param_1 = 0;
  74. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  75. system.CurrentArmInterface().SetReg(1, param_1);
  76. FuncReturn(system, retval);
  77. }
  78. template <ResultCode func(Core::System&, u32*, u64, u32)>
  79. void SvcWrap(Core::System& system) {
  80. u32 param_1 = 0;
  81. const u32 retval =
  82. func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2))).raw;
  83. system.CurrentArmInterface().SetReg(1, param_1);
  84. FuncReturn(system, retval);
  85. }
  86. template <ResultCode func(Core::System&, u64*, u32)>
  87. void SvcWrap(Core::System& system) {
  88. u64 param_1 = 0;
  89. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  90. system.CurrentArmInterface().SetReg(1, param_1);
  91. FuncReturn(system, retval);
  92. }
  93. template <ResultCode func(Core::System&, u64, u32)>
  94. void SvcWrap(Core::System& system) {
  95. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1))).raw);
  96. }
  97. template <ResultCode func(Core::System&, u64*, u64)>
  98. void SvcWrap(Core::System& system) {
  99. u64 param_1 = 0;
  100. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  101. system.CurrentArmInterface().SetReg(1, param_1);
  102. FuncReturn(system, retval);
  103. }
  104. template <ResultCode func(Core::System&, u64*, u32, u32)>
  105. void SvcWrap(Core::System& system) {
  106. u64 param_1 = 0;
  107. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1)),
  108. static_cast<u32>(Param(system, 2)))
  109. .raw;
  110. system.CurrentArmInterface().SetReg(1, param_1);
  111. FuncReturn(system, retval);
  112. }
  113. template <ResultCode func(Core::System&, u32, u64)>
  114. void SvcWrap(Core::System& system) {
  115. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1)).raw);
  116. }
  117. template <ResultCode func(Core::System&, u32, u32, u64)>
  118. void SvcWrap(Core::System& system) {
  119. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
  120. static_cast<u32>(Param(system, 1)), Param(system, 2))
  121. .raw);
  122. }
  123. template <ResultCode func(Core::System&, u32, u32*, u64*)>
  124. void SvcWrap(Core::System& system) {
  125. u32 param_1 = 0;
  126. u64 param_2 = 0;
  127. const ResultCode retval = func(system, static_cast<u32>(Param(system, 2)), &param_1, &param_2);
  128. system.CurrentArmInterface().SetReg(1, param_1);
  129. system.CurrentArmInterface().SetReg(2, param_2);
  130. FuncReturn(system, retval.raw);
  131. }
  132. template <ResultCode func(Core::System&, u64, u64, u32, u32)>
  133. void SvcWrap(Core::System& system) {
  134. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  135. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  136. .raw);
  137. }
  138. template <ResultCode func(Core::System&, u64, u64, u32, u64)>
  139. void SvcWrap(Core::System& system) {
  140. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  141. static_cast<u32>(Param(system, 2)), Param(system, 3))
  142. .raw);
  143. }
  144. template <ResultCode func(Core::System&, u32, u64, u32)>
  145. void SvcWrap(Core::System& system) {
  146. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  147. static_cast<u32>(Param(system, 2)))
  148. .raw);
  149. }
  150. template <ResultCode func(Core::System&, u64, u64, u64)>
  151. void SvcWrap(Core::System& system) {
  152. FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw);
  153. }
  154. template <ResultCode func(Core::System&, u64, u64, u32)>
  155. void SvcWrap(Core::System& system) {
  156. FuncReturn(
  157. system,
  158. func(system, Param(system, 0), Param(system, 1), static_cast<u32>(Param(system, 2))).raw);
  159. }
  160. template <ResultCode func(Core::System&, u32, u64, u64, u32)>
  161. void SvcWrap(Core::System& system) {
  162. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  163. Param(system, 2), static_cast<u32>(Param(system, 3)))
  164. .raw);
  165. }
  166. template <ResultCode func(Core::System&, u32, u64, u64)>
  167. void SvcWrap(Core::System& system) {
  168. FuncReturn(
  169. system,
  170. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2)).raw);
  171. }
  172. template <ResultCode func(Core::System&, u32*, u64, u64, s64)>
  173. void SvcWrap(Core::System& system) {
  174. u32 param_1 = 0;
  175. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  176. static_cast<s64>(Param(system, 3)))
  177. .raw;
  178. system.CurrentArmInterface().SetReg(1, param_1);
  179. FuncReturn(system, retval);
  180. }
  181. template <ResultCode func(Core::System&, u64, u64, u32, s64)>
  182. void SvcWrap(Core::System& system) {
  183. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  184. static_cast<u32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  185. .raw);
  186. }
  187. template <ResultCode func(Core::System&, u64*, u64, u64, u64)>
  188. void SvcWrap(Core::System& system) {
  189. u64 param_1 = 0;
  190. const u32 retval =
  191. func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3)).raw;
  192. system.CurrentArmInterface().SetReg(1, param_1);
  193. FuncReturn(system, retval);
  194. }
  195. template <ResultCode func(Core::System&, u32*, u64, u64, u64, u32, s32)>
  196. void SvcWrap(Core::System& system) {
  197. u32 param_1 = 0;
  198. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3),
  199. static_cast<u32>(Param(system, 4)), static_cast<s32>(Param(system, 5)))
  200. .raw;
  201. system.CurrentArmInterface().SetReg(1, param_1);
  202. FuncReturn(system, retval);
  203. }
  204. template <ResultCode func(Core::System&, u32*, u64, u64, u32)>
  205. void SvcWrap(Core::System& system) {
  206. u32 param_1 = 0;
  207. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2),
  208. static_cast<u32>(Param(system, 3)))
  209. .raw;
  210. system.CurrentArmInterface().SetReg(1, param_1);
  211. FuncReturn(system, retval);
  212. }
  213. template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
  214. void SvcWrap(Core::System& system) {
  215. u32 param_1 = 0;
  216. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  217. static_cast<u32>(Param(system, 3)))
  218. .raw;
  219. system.CurrentArmInterface().SetReg(1, param_1);
  220. FuncReturn(system, retval);
  221. }
  222. template <ResultCode func(Core::System&, u64, u32, s32, s64)>
  223. void SvcWrap(Core::System& system) {
  224. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  225. static_cast<s32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  226. .raw);
  227. }
  228. template <ResultCode func(Core::System&, u64, u32, s32, s32)>
  229. void SvcWrap(Core::System& system) {
  230. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  231. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  232. .raw);
  233. }
  234. ////////////////////////////////////////////////////////////////////////////////////////////////////
  235. // Function wrappers that return type u32
  236. template <u32 func(Core::System&)>
  237. void SvcWrap(Core::System& system) {
  238. FuncReturn(system, func(system));
  239. }
  240. ////////////////////////////////////////////////////////////////////////////////////////////////////
  241. // Function wrappers that return type u64
  242. template <u64 func(Core::System&)>
  243. void SvcWrap(Core::System& system) {
  244. FuncReturn(system, func(system));
  245. }
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////
  247. /// Function wrappers that return type void
  248. template <void func(Core::System&)>
  249. void SvcWrap(Core::System& system) {
  250. func(system);
  251. }
  252. template <void func(Core::System&, u32)>
  253. void SvcWrap(Core::System& system) {
  254. func(system, static_cast<u32>(Param(system, 0)));
  255. }
  256. template <void func(Core::System&, u32, u64, u64, u64)>
  257. void SvcWrap(Core::System& system) {
  258. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2),
  259. Param(system, 3));
  260. }
  261. template <void func(Core::System&, s64)>
  262. void SvcWrap(Core::System& system) {
  263. func(system, static_cast<s64>(Param(system, 0)));
  264. }
  265. template <void func(Core::System&, u64, s32)>
  266. void SvcWrap(Core::System& system) {
  267. func(system, Param(system, 0), static_cast<s32>(Param(system, 1)));
  268. }
  269. template <void func(Core::System&, u64, u64)>
  270. void SvcWrap(Core::System& system) {
  271. func(system, Param(system, 0), Param(system, 1));
  272. }
  273. template <void func(Core::System&, u64, u64, u64)>
  274. void SvcWrap(Core::System& system) {
  275. func(system, Param(system, 0), Param(system, 1), Param(system, 2));
  276. }
  277. template <void func(Core::System&, u32, u64, u64)>
  278. void SvcWrap(Core::System& system) {
  279. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
  280. }
  281. } // namespace Kernel