svc_wrap.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  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. static inline u32 Param32(const Core::System& system, int n) {
  14. return static_cast<u32>(system.CurrentArmInterface().GetReg(n));
  15. }
  16. /**
  17. * HLE a function return from the current ARM userland process
  18. * @param system System context
  19. * @param result Result to return
  20. */
  21. static inline void FuncReturn(Core::System& system, u64 result) {
  22. system.CurrentArmInterface().SetReg(0, result);
  23. }
  24. static inline void FuncReturn32(Core::System& system, u32 result) {
  25. system.CurrentArmInterface().SetReg(0, (u64)result);
  26. }
  27. ////////////////////////////////////////////////////////////////////////////////////////////////////
  28. // Function wrappers that return type ResultCode
  29. template <ResultCode func(Core::System&, u64)>
  30. void SvcWrap64(Core::System& system) {
  31. FuncReturn(system, func(system, Param(system, 0)).raw);
  32. }
  33. template <ResultCode func(Core::System&, u64, u64)>
  34. void SvcWrap64(Core::System& system) {
  35. FuncReturn(system, func(system, Param(system, 0), Param(system, 1)).raw);
  36. }
  37. template <ResultCode func(Core::System&, u32)>
  38. void SvcWrap64(Core::System& system) {
  39. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  40. }
  41. template <ResultCode func(Core::System&, u32, u32)>
  42. void SvcWrap64(Core::System& system) {
  43. FuncReturn(
  44. system,
  45. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw);
  46. }
  47. template <ResultCode func(Core::System&, u32, u64, u64, u64)>
  48. void SvcWrap64(Core::System& system) {
  49. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  50. Param(system, 2), Param(system, 3))
  51. .raw);
  52. }
  53. template <ResultCode func(Core::System&, u32*)>
  54. void SvcWrap64(Core::System& system) {
  55. u32 param = 0;
  56. const u32 retval = func(system, &param).raw;
  57. system.CurrentArmInterface().SetReg(1, param);
  58. FuncReturn(system, retval);
  59. }
  60. template <ResultCode func(Core::System&, u32*, u32)>
  61. void SvcWrap64(Core::System& system) {
  62. u32 param_1 = 0;
  63. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  64. system.CurrentArmInterface().SetReg(1, param_1);
  65. FuncReturn(system, retval);
  66. }
  67. template <ResultCode func(Core::System&, u32*, u32*)>
  68. void SvcWrap64(Core::System& system) {
  69. u32 param_1 = 0;
  70. u32 param_2 = 0;
  71. const u32 retval = func(system, &param_1, &param_2).raw;
  72. auto& arm_interface = system.CurrentArmInterface();
  73. arm_interface.SetReg(1, param_1);
  74. arm_interface.SetReg(2, param_2);
  75. FuncReturn(system, retval);
  76. }
  77. template <ResultCode func(Core::System&, u32*, u64)>
  78. void SvcWrap64(Core::System& system) {
  79. u32 param_1 = 0;
  80. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  81. system.CurrentArmInterface().SetReg(1, param_1);
  82. FuncReturn(system, retval);
  83. }
  84. template <ResultCode func(Core::System&, u32*, u64, u32)>
  85. void SvcWrap64(Core::System& system) {
  86. u32 param_1 = 0;
  87. const u32 retval =
  88. func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2))).raw;
  89. system.CurrentArmInterface().SetReg(1, param_1);
  90. FuncReturn(system, retval);
  91. }
  92. template <ResultCode func(Core::System&, u64*, u32)>
  93. void SvcWrap64(Core::System& system) {
  94. u64 param_1 = 0;
  95. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  96. system.CurrentArmInterface().SetReg(1, param_1);
  97. FuncReturn(system, retval);
  98. }
  99. template <ResultCode func(Core::System&, u64, u32)>
  100. void SvcWrap64(Core::System& system) {
  101. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1))).raw);
  102. }
  103. template <ResultCode func(Core::System&, u64*, u64)>
  104. void SvcWrap64(Core::System& system) {
  105. u64 param_1 = 0;
  106. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  107. system.CurrentArmInterface().SetReg(1, param_1);
  108. FuncReturn(system, retval);
  109. }
  110. template <ResultCode func(Core::System&, u64*, u32, u32)>
  111. void SvcWrap64(Core::System& system) {
  112. u64 param_1 = 0;
  113. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1)),
  114. static_cast<u32>(Param(system, 2)))
  115. .raw;
  116. system.CurrentArmInterface().SetReg(1, param_1);
  117. FuncReturn(system, retval);
  118. }
  119. template <ResultCode func(Core::System&, u32, u64)>
  120. void SvcWrap64(Core::System& system) {
  121. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1)).raw);
  122. }
  123. template <ResultCode func(Core::System&, u32, u32, u64)>
  124. void SvcWrap64(Core::System& system) {
  125. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
  126. static_cast<u32>(Param(system, 1)), Param(system, 2))
  127. .raw);
  128. }
  129. template <ResultCode func(Core::System&, u32, u32*, u64*)>
  130. void SvcWrap64(Core::System& system) {
  131. u32 param_1 = 0;
  132. u64 param_2 = 0;
  133. const ResultCode retval = func(system, static_cast<u32>(Param(system, 2)), &param_1, &param_2);
  134. system.CurrentArmInterface().SetReg(1, param_1);
  135. system.CurrentArmInterface().SetReg(2, param_2);
  136. FuncReturn(system, retval.raw);
  137. }
  138. template <ResultCode func(Core::System&, u64, u64, u32, u32)>
  139. void SvcWrap64(Core::System& system) {
  140. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  141. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  142. .raw);
  143. }
  144. template <ResultCode func(Core::System&, u64, u64, u32, u64)>
  145. void SvcWrap64(Core::System& system) {
  146. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  147. static_cast<u32>(Param(system, 2)), Param(system, 3))
  148. .raw);
  149. }
  150. template <ResultCode func(Core::System&, u32, u64, u32)>
  151. void SvcWrap64(Core::System& system) {
  152. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  153. static_cast<u32>(Param(system, 2)))
  154. .raw);
  155. }
  156. template <ResultCode func(Core::System&, u64, u64, u64)>
  157. void SvcWrap64(Core::System& system) {
  158. FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw);
  159. }
  160. template <ResultCode func(Core::System&, u64, u64, u32)>
  161. void SvcWrap64(Core::System& system) {
  162. FuncReturn(
  163. system,
  164. func(system, Param(system, 0), Param(system, 1), static_cast<u32>(Param(system, 2))).raw);
  165. }
  166. template <ResultCode func(Core::System&, u32, u64, u64, u32)>
  167. void SvcWrap64(Core::System& system) {
  168. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  169. Param(system, 2), static_cast<u32>(Param(system, 3)))
  170. .raw);
  171. }
  172. template <ResultCode func(Core::System&, u32, u64, u64)>
  173. void SvcWrap64(Core::System& system) {
  174. FuncReturn(
  175. system,
  176. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2)).raw);
  177. }
  178. template <ResultCode func(Core::System&, u32*, u64, u64, s64)>
  179. void SvcWrap64(Core::System& system) {
  180. u32 param_1 = 0;
  181. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  182. static_cast<s64>(Param(system, 3)))
  183. .raw;
  184. system.CurrentArmInterface().SetReg(1, param_1);
  185. FuncReturn(system, retval);
  186. }
  187. template <ResultCode func(Core::System&, u64, u64, u32, s64)>
  188. void SvcWrap64(Core::System& system) {
  189. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  190. static_cast<u32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  191. .raw);
  192. }
  193. template <ResultCode func(Core::System&, u64*, u64, u64, u64)>
  194. void SvcWrap64(Core::System& system) {
  195. u64 param_1 = 0;
  196. const u32 retval =
  197. func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3)).raw;
  198. system.CurrentArmInterface().SetReg(1, param_1);
  199. FuncReturn(system, retval);
  200. }
  201. template <ResultCode func(Core::System&, u32*, u64, u64, u64, u32, s32)>
  202. void SvcWrap64(Core::System& system) {
  203. u32 param_1 = 0;
  204. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3),
  205. static_cast<u32>(Param(system, 4)), static_cast<s32>(Param(system, 5)))
  206. .raw;
  207. system.CurrentArmInterface().SetReg(1, param_1);
  208. FuncReturn(system, retval);
  209. }
  210. template <ResultCode func(Core::System&, u32*, u64, u64, u32)>
  211. void SvcWrap64(Core::System& system) {
  212. u32 param_1 = 0;
  213. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2),
  214. static_cast<u32>(Param(system, 3)))
  215. .raw;
  216. system.CurrentArmInterface().SetReg(1, param_1);
  217. FuncReturn(system, retval);
  218. }
  219. template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
  220. void SvcWrap64(Core::System& system) {
  221. u32 param_1 = 0;
  222. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  223. static_cast<u32>(Param(system, 3)))
  224. .raw;
  225. system.CurrentArmInterface().SetReg(1, param_1);
  226. FuncReturn(system, retval);
  227. }
  228. template <ResultCode func(Core::System&, u64, u32, s32, s64)>
  229. void SvcWrap64(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<s64>(Param(system, 3)))
  232. .raw);
  233. }
  234. template <ResultCode func(Core::System&, u64, u32, s32, s32)>
  235. void SvcWrap64(Core::System& system) {
  236. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  237. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  238. .raw);
  239. }
  240. ////////////////////////////////////////////////////////////////////////////////////////////////////
  241. // Function wrappers that return type u32
  242. template <u32 func(Core::System&)>
  243. void SvcWrap64(Core::System& system) {
  244. FuncReturn(system, func(system));
  245. }
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////
  247. // Function wrappers that return type u64
  248. template <u64 func(Core::System&)>
  249. void SvcWrap64(Core::System& system) {
  250. FuncReturn(system, func(system));
  251. }
  252. ////////////////////////////////////////////////////////////////////////////////////////////////////
  253. /// Function wrappers that return type void
  254. template <void func(Core::System&)>
  255. void SvcWrap64(Core::System& system) {
  256. func(system);
  257. }
  258. template <void func(Core::System&, u32)>
  259. void SvcWrap64(Core::System& system) {
  260. func(system, static_cast<u32>(Param(system, 0)));
  261. }
  262. template <void func(Core::System&, u32, u64, u64, u64)>
  263. void SvcWrap64(Core::System& system) {
  264. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2),
  265. Param(system, 3));
  266. }
  267. template <void func(Core::System&, s64)>
  268. void SvcWrap64(Core::System& system) {
  269. func(system, static_cast<s64>(Param(system, 0)));
  270. }
  271. template <void func(Core::System&, u64, s32)>
  272. void SvcWrap64(Core::System& system) {
  273. func(system, Param(system, 0), static_cast<s32>(Param(system, 1)));
  274. }
  275. template <void func(Core::System&, u64, u64)>
  276. void SvcWrap64(Core::System& system) {
  277. func(system, Param(system, 0), Param(system, 1));
  278. }
  279. template <void func(Core::System&, u64, u64, u64)>
  280. void SvcWrap64(Core::System& system) {
  281. func(system, Param(system, 0), Param(system, 1), Param(system, 2));
  282. }
  283. template <void func(Core::System&, u32, u64, u64)>
  284. void SvcWrap64(Core::System& system) {
  285. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
  286. }
  287. // Used by QueryMemory32, ArbitrateLock32
  288. template <ResultCode func(Core::System&, u32, u32, u32)>
  289. void SvcWrap32(Core::System& system) {
  290. FuncReturn32(system,
  291. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2)).raw);
  292. }
  293. // Used by Break32
  294. template <void func(Core::System&, u32, u32, u32)>
  295. void SvcWrap32(Core::System& system) {
  296. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2));
  297. }
  298. // Used by ExitProcess32, ExitThread32
  299. template <void func(Core::System&)>
  300. void SvcWrap32(Core::System& system) {
  301. func(system);
  302. }
  303. // Used by GetCurrentProcessorNumber32
  304. template <u32 func(Core::System&)>
  305. void SvcWrap32(Core::System& system) {
  306. FuncReturn32(system, func(system));
  307. }
  308. // Used by SleepThread32
  309. template <void func(Core::System&, u32, u32)>
  310. void SvcWrap32(Core::System& system) {
  311. func(system, Param32(system, 0), Param32(system, 1));
  312. }
  313. // Used by CreateThread32
  314. template <ResultCode func(Core::System&, Handle*, u32, u32, u32, u32, s32)>
  315. void SvcWrap32(Core::System& system) {
  316. Handle param_1 = 0;
  317. const u32 retval = func(system, &param_1, Param32(system, 0), Param32(system, 1),
  318. Param32(system, 2), Param32(system, 3), Param32(system, 4))
  319. .raw;
  320. system.CurrentArmInterface().SetReg(1, param_1);
  321. FuncReturn(system, retval);
  322. }
  323. // Used by GetInfo32
  324. template <ResultCode func(Core::System&, u32*, u32*, u32, u32, u32, u32)>
  325. void SvcWrap32(Core::System& system) {
  326. u32 param_1 = 0;
  327. u32 param_2 = 0;
  328. const u32 retval = func(system, &param_1, &param_2, Param32(system, 0), Param32(system, 1),
  329. Param32(system, 2), Param32(system, 3))
  330. .raw;
  331. system.CurrentArmInterface().SetReg(1, param_1);
  332. system.CurrentArmInterface().SetReg(2, param_2);
  333. FuncReturn(system, retval);
  334. }
  335. // Used by GetThreadPriority32, ConnectToNamedPort32
  336. template <ResultCode func(Core::System&, u32*, u32)>
  337. void SvcWrap32(Core::System& system) {
  338. u32 param_1 = 0;
  339. const u32 retval = func(system, &param_1, Param32(system, 1)).raw;
  340. system.CurrentArmInterface().SetReg(1, param_1);
  341. FuncReturn(system, retval);
  342. }
  343. // Used by GetThreadId32
  344. template <ResultCode func(Core::System&, u32*, u32*, u32)>
  345. void SvcWrap32(Core::System& system) {
  346. u32 param_1 = 0;
  347. u32 param_2 = 0;
  348. const u32 retval = func(system, &param_1, &param_2, Param32(system, 1)).raw;
  349. system.CurrentArmInterface().SetReg(1, param_1);
  350. system.CurrentArmInterface().SetReg(2, param_2);
  351. FuncReturn(system, retval);
  352. }
  353. // Used by GetSystemTick32
  354. template <void func(Core::System&, u32*, u32*)>
  355. void SvcWrap32(Core::System& system) {
  356. u32 param_1 = 0;
  357. u32 param_2 = 0;
  358. func(system, &param_1, &param_2);
  359. system.CurrentArmInterface().SetReg(0, param_1);
  360. system.CurrentArmInterface().SetReg(1, param_2);
  361. }
  362. // Used by CreateEvent32
  363. template <ResultCode func(Core::System&, Handle*, Handle*)>
  364. void SvcWrap32(Core::System& system) {
  365. Handle param_1 = 0;
  366. Handle param_2 = 0;
  367. const u32 retval = func(system, &param_1, &param_2).raw;
  368. system.CurrentArmInterface().SetReg(1, param_1);
  369. system.CurrentArmInterface().SetReg(2, param_2);
  370. FuncReturn(system, retval);
  371. }
  372. // Used by GetThreadId32
  373. template <ResultCode func(Core::System&, Handle, u32*, u32*, u32*)>
  374. void SvcWrap32(Core::System& system) {
  375. u32 param_1 = 0;
  376. u32 param_2 = 0;
  377. u32 param_3 = 0;
  378. const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
  379. system.CurrentArmInterface().SetReg(1, param_1);
  380. system.CurrentArmInterface().SetReg(2, param_2);
  381. system.CurrentArmInterface().SetReg(3, param_3);
  382. FuncReturn(system, retval);
  383. }
  384. // Used by SignalProcessWideKey32
  385. template <void func(Core::System&, u32, s32)>
  386. void SvcWrap32(Core::System& system) {
  387. func(system, static_cast<u32>(Param(system, 0)), static_cast<s32>(Param(system, 1)));
  388. }
  389. // Used by SetThreadPriority32
  390. template <ResultCode func(Core::System&, Handle, u32)>
  391. void SvcWrap32(Core::System& system) {
  392. const u32 retval =
  393. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw;
  394. FuncReturn(system, retval);
  395. }
  396. // Used by SetThreadCoreMask32
  397. template <ResultCode func(Core::System&, Handle, u32, u32, u32)>
  398. void SvcWrap32(Core::System& system) {
  399. const u32 retval =
  400. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  401. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  402. .raw;
  403. FuncReturn(system, retval);
  404. }
  405. // Used by WaitProcessWideKeyAtomic32
  406. template <ResultCode func(Core::System&, u32, u32, Handle, u32, u32)>
  407. void SvcWrap32(Core::System& system) {
  408. const u32 retval =
  409. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  410. static_cast<Handle>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
  411. static_cast<u32>(Param(system, 4)))
  412. .raw;
  413. FuncReturn(system, retval);
  414. }
  415. // Used by WaitForAddress32
  416. template <ResultCode func(Core::System&, u32, u32, s32, u32, u32)>
  417. void SvcWrap32(Core::System& system) {
  418. const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
  419. static_cast<u32>(Param(system, 1)), static_cast<s32>(Param(system, 2)),
  420. static_cast<u32>(Param(system, 3)), static_cast<u32>(Param(system, 4)))
  421. .raw;
  422. FuncReturn(system, retval);
  423. }
  424. // Used by SignalToAddress32
  425. template <ResultCode func(Core::System&, u32, u32, s32, s32)>
  426. void SvcWrap32(Core::System& system) {
  427. const u32 retval =
  428. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  429. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  430. .raw;
  431. FuncReturn(system, retval);
  432. }
  433. // Used by SendSyncRequest32, ArbitrateUnlock32
  434. template <ResultCode func(Core::System&, u32)>
  435. void SvcWrap32(Core::System& system) {
  436. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  437. }
  438. // Used by CreateTransferMemory32
  439. template <ResultCode func(Core::System&, Handle*, u32, u32, u32)>
  440. void SvcWrap32(Core::System& system) {
  441. Handle handle = 0;
  442. const u32 retval =
  443. func(system, &handle, Param32(system, 1), Param32(system, 2), Param32(system, 3)).raw;
  444. system.CurrentArmInterface().SetReg(1, handle);
  445. FuncReturn(system, retval);
  446. }
  447. // Used by WaitSynchronization32
  448. template <ResultCode func(Core::System&, u32, u32, s32, u32, Handle*)>
  449. void SvcWrap32(Core::System& system) {
  450. u32 param_1 = 0;
  451. const u32 retval = func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2),
  452. Param32(system, 3), &param_1)
  453. .raw;
  454. system.CurrentArmInterface().SetReg(1, param_1);
  455. FuncReturn(system, retval);
  456. }
  457. } // namespace Kernel