svc_wrap.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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, s32)>
  94. void SvcWrap(Core::System& system) {
  95. FuncReturn(system, func(system, Param(system, 0), static_cast<s32>(Param(system, 1))).raw);
  96. }
  97. template <ResultCode func(Core::System&, u64, u32)>
  98. void SvcWrap(Core::System& system) {
  99. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1))).raw);
  100. }
  101. template <ResultCode func(Core::System&, u64*, u64)>
  102. void SvcWrap(Core::System& system) {
  103. u64 param_1 = 0;
  104. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  105. system.CurrentArmInterface().SetReg(1, param_1);
  106. FuncReturn(system, retval);
  107. }
  108. template <ResultCode func(Core::System&, u64*, u32, u32)>
  109. void SvcWrap(Core::System& system) {
  110. u64 param_1 = 0;
  111. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1)),
  112. static_cast<u32>(Param(system, 2)))
  113. .raw;
  114. system.CurrentArmInterface().SetReg(1, param_1);
  115. FuncReturn(system, retval);
  116. }
  117. template <ResultCode func(Core::System&, u32, u64)>
  118. void SvcWrap(Core::System& system) {
  119. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1)).raw);
  120. }
  121. template <ResultCode func(Core::System&, u32, u32, u64)>
  122. void SvcWrap(Core::System& system) {
  123. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
  124. static_cast<u32>(Param(system, 1)), Param(system, 2))
  125. .raw);
  126. }
  127. template <ResultCode func(Core::System&, u32, u32*, u64*)>
  128. void SvcWrap(Core::System& system) {
  129. u32 param_1 = 0;
  130. u64 param_2 = 0;
  131. const ResultCode retval = func(system, static_cast<u32>(Param(system, 2)), &param_1, &param_2);
  132. system.CurrentArmInterface().SetReg(1, param_1);
  133. system.CurrentArmInterface().SetReg(2, param_2);
  134. FuncReturn(system, retval.raw);
  135. }
  136. template <ResultCode func(Core::System&, u64, u64, u32, u32)>
  137. void SvcWrap(Core::System& system) {
  138. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  139. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  140. .raw);
  141. }
  142. template <ResultCode func(Core::System&, u64, u64, u32, u64)>
  143. void SvcWrap(Core::System& system) {
  144. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  145. static_cast<u32>(Param(system, 2)), Param(system, 3))
  146. .raw);
  147. }
  148. template <ResultCode func(Core::System&, u32, u64, u32)>
  149. void SvcWrap(Core::System& system) {
  150. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  151. static_cast<u32>(Param(system, 2)))
  152. .raw);
  153. }
  154. template <ResultCode func(Core::System&, u64, u64, u64)>
  155. void SvcWrap(Core::System& system) {
  156. FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw);
  157. }
  158. template <ResultCode func(Core::System&, u64, u64, u32)>
  159. void SvcWrap(Core::System& system) {
  160. FuncReturn(
  161. system,
  162. func(system, Param(system, 0), Param(system, 1), static_cast<u32>(Param(system, 2))).raw);
  163. }
  164. template <ResultCode func(Core::System&, u32, u64, u64, u32)>
  165. void SvcWrap(Core::System& system) {
  166. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  167. Param(system, 2), static_cast<u32>(Param(system, 3)))
  168. .raw);
  169. }
  170. template <ResultCode func(Core::System&, u32, u64, u64)>
  171. void SvcWrap(Core::System& system) {
  172. FuncReturn(
  173. system,
  174. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2)).raw);
  175. }
  176. template <ResultCode func(Core::System&, u32*, u64, u64, s64)>
  177. void SvcWrap(Core::System& system) {
  178. u32 param_1 = 0;
  179. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  180. static_cast<s64>(Param(system, 3)))
  181. .raw;
  182. system.CurrentArmInterface().SetReg(1, param_1);
  183. FuncReturn(system, retval);
  184. }
  185. template <ResultCode func(Core::System&, u64, u64, u32, s64)>
  186. void SvcWrap(Core::System& system) {
  187. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  188. static_cast<u32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  189. .raw);
  190. }
  191. template <ResultCode func(Core::System&, u64*, u64, u64, u64)>
  192. void SvcWrap(Core::System& system) {
  193. u64 param_1 = 0;
  194. const u32 retval =
  195. func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3)).raw;
  196. system.CurrentArmInterface().SetReg(1, param_1);
  197. FuncReturn(system, retval);
  198. }
  199. template <ResultCode func(Core::System&, u32*, u64, u64, u64, u32, s32)>
  200. void SvcWrap(Core::System& system) {
  201. u32 param_1 = 0;
  202. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3),
  203. static_cast<u32>(Param(system, 4)), static_cast<s32>(Param(system, 5)))
  204. .raw;
  205. system.CurrentArmInterface().SetReg(1, param_1);
  206. FuncReturn(system, retval);
  207. }
  208. template <ResultCode func(Core::System&, u32*, u64, u64, u32)>
  209. void SvcWrap(Core::System& system) {
  210. u32 param_1 = 0;
  211. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2),
  212. static_cast<u32>(Param(system, 3)))
  213. .raw;
  214. system.CurrentArmInterface().SetReg(1, param_1);
  215. FuncReturn(system, retval);
  216. }
  217. template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
  218. void SvcWrap(Core::System& system) {
  219. u32 param_1 = 0;
  220. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  221. static_cast<u32>(Param(system, 3)))
  222. .raw;
  223. system.CurrentArmInterface().SetReg(1, param_1);
  224. FuncReturn(system, retval);
  225. }
  226. template <ResultCode func(Core::System&, u64, u32, s32, s64)>
  227. void SvcWrap(Core::System& system) {
  228. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  229. static_cast<s32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  230. .raw);
  231. }
  232. template <ResultCode func(Core::System&, u64, u32, s32, s32)>
  233. void SvcWrap(Core::System& system) {
  234. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  235. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  236. .raw);
  237. }
  238. ////////////////////////////////////////////////////////////////////////////////////////////////////
  239. // Function wrappers that return type u32
  240. template <u32 func(Core::System&)>
  241. void SvcWrap(Core::System& system) {
  242. FuncReturn(system, func(system));
  243. }
  244. ////////////////////////////////////////////////////////////////////////////////////////////////////
  245. // Function wrappers that return type u64
  246. template <u64 func(Core::System&)>
  247. void SvcWrap(Core::System& system) {
  248. FuncReturn(system, func(system));
  249. }
  250. ////////////////////////////////////////////////////////////////////////////////////////////////////
  251. /// Function wrappers that return type void
  252. template <void func(Core::System&)>
  253. void SvcWrap(Core::System& system) {
  254. func(system);
  255. }
  256. template <void func(Core::System&, s64)>
  257. void SvcWrap(Core::System& system) {
  258. func(system, static_cast<s64>(Param(system, 0)));
  259. }
  260. template <void func(Core::System&, u64, u64)>
  261. void SvcWrap(Core::System& system) {
  262. func(system, Param(system, 0), Param(system, 1));
  263. }
  264. template <void func(Core::System&, u64, u64, u64)>
  265. void SvcWrap(Core::System& system) {
  266. func(system, Param(system, 0), Param(system, 1), Param(system, 2));
  267. }
  268. template <void func(Core::System&, u32, u64, u64)>
  269. void SvcWrap(Core::System& system) {
  270. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
  271. }
  272. } // namespace Kernel