svc_wrap.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  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_types.h"
  9. #include "core/hle/result.h"
  10. namespace Kernel {
  11. static inline u64 Param(const Core::System& system, int n) {
  12. return system.CurrentArmInterface().GetReg(n);
  13. }
  14. static inline u32 Param32(const Core::System& system, int n) {
  15. return static_cast<u32>(system.CurrentArmInterface().GetReg(n));
  16. }
  17. /**
  18. * HLE a function return from the current ARM userland process
  19. * @param system System context
  20. * @param result Result to return
  21. */
  22. static inline void FuncReturn(Core::System& system, u64 result) {
  23. system.CurrentArmInterface().SetReg(0, result);
  24. }
  25. static inline void FuncReturn32(Core::System& system, u32 result) {
  26. system.CurrentArmInterface().SetReg(0, (u64)result);
  27. }
  28. ////////////////////////////////////////////////////////////////////////////////////////////////////
  29. // Function wrappers that return type ResultCode
  30. template <ResultCode func(Core::System&, u64)>
  31. void SvcWrap64(Core::System& system) {
  32. FuncReturn(system, func(system, Param(system, 0)).raw);
  33. }
  34. template <ResultCode func(Core::System&, u64, u64)>
  35. void SvcWrap64(Core::System& system) {
  36. FuncReturn(system, func(system, Param(system, 0), Param(system, 1)).raw);
  37. }
  38. template <ResultCode func(Core::System&, u32)>
  39. void SvcWrap64(Core::System& system) {
  40. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  41. }
  42. template <ResultCode func(Core::System&, u32, u32)>
  43. void SvcWrap64(Core::System& system) {
  44. FuncReturn(
  45. system,
  46. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw);
  47. }
  48. // Used by SetThreadActivity
  49. template <ResultCode func(Core::System&, Handle, Svc::ThreadActivity)>
  50. void SvcWrap64(Core::System& system) {
  51. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
  52. static_cast<Svc::ThreadActivity>(Param(system, 1)))
  53. .raw);
  54. }
  55. template <ResultCode func(Core::System&, u32, u64, u64, u64)>
  56. void SvcWrap64(Core::System& system) {
  57. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  58. Param(system, 2), Param(system, 3))
  59. .raw);
  60. }
  61. // Used by MapProcessMemory and UnmapProcessMemory
  62. template <ResultCode func(Core::System&, u64, u32, u64, u64)>
  63. void SvcWrap64(Core::System& system) {
  64. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1)),
  65. Param(system, 2), Param(system, 3))
  66. .raw);
  67. }
  68. // Used by ControlCodeMemory
  69. template <ResultCode func(Core::System&, Handle, u32, u64, u64, Svc::MemoryPermission)>
  70. void SvcWrap64(Core::System& system) {
  71. FuncReturn(system, func(system, static_cast<Handle>(Param(system, 0)),
  72. static_cast<u32>(Param(system, 1)), Param(system, 2), Param(system, 3),
  73. static_cast<Svc::MemoryPermission>(Param(system, 4)))
  74. .raw);
  75. }
  76. template <ResultCode func(Core::System&, u32*)>
  77. void SvcWrap64(Core::System& system) {
  78. u32 param = 0;
  79. const u32 retval = func(system, &param).raw;
  80. system.CurrentArmInterface().SetReg(1, param);
  81. FuncReturn(system, retval);
  82. }
  83. template <ResultCode func(Core::System&, u32*, u32)>
  84. void SvcWrap64(Core::System& system) {
  85. u32 param_1 = 0;
  86. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  87. system.CurrentArmInterface().SetReg(1, param_1);
  88. FuncReturn(system, retval);
  89. }
  90. template <ResultCode func(Core::System&, u32*, u32*)>
  91. void SvcWrap64(Core::System& system) {
  92. u32 param_1 = 0;
  93. u32 param_2 = 0;
  94. const u32 retval = func(system, &param_1, &param_2).raw;
  95. auto& arm_interface = system.CurrentArmInterface();
  96. arm_interface.SetReg(1, param_1);
  97. arm_interface.SetReg(2, param_2);
  98. FuncReturn(system, retval);
  99. }
  100. template <ResultCode func(Core::System&, u32*, u64)>
  101. void SvcWrap64(Core::System& system) {
  102. u32 param_1 = 0;
  103. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  104. system.CurrentArmInterface().SetReg(1, param_1);
  105. FuncReturn(system, retval);
  106. }
  107. template <ResultCode func(Core::System&, u32*, u64, u32)>
  108. void SvcWrap64(Core::System& system) {
  109. u32 param_1 = 0;
  110. const u32 retval =
  111. func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2))).raw;
  112. system.CurrentArmInterface().SetReg(1, param_1);
  113. FuncReturn(system, retval);
  114. }
  115. template <ResultCode func(Core::System&, u64*, u32)>
  116. void SvcWrap64(Core::System& system) {
  117. u64 param_1 = 0;
  118. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1))).raw;
  119. system.CurrentArmInterface().SetReg(1, param_1);
  120. FuncReturn(system, retval);
  121. }
  122. template <ResultCode func(Core::System&, u64, u32)>
  123. void SvcWrap64(Core::System& system) {
  124. FuncReturn(system, func(system, Param(system, 0), static_cast<u32>(Param(system, 1))).raw);
  125. }
  126. template <ResultCode func(Core::System&, u64*, u64)>
  127. void SvcWrap64(Core::System& system) {
  128. u64 param_1 = 0;
  129. const u32 retval = func(system, &param_1, Param(system, 1)).raw;
  130. system.CurrentArmInterface().SetReg(1, param_1);
  131. FuncReturn(system, retval);
  132. }
  133. template <ResultCode func(Core::System&, u64*, u32, u32)>
  134. void SvcWrap64(Core::System& system) {
  135. u64 param_1 = 0;
  136. const u32 retval = func(system, &param_1, static_cast<u32>(Param(system, 1)),
  137. static_cast<u32>(Param(system, 2)))
  138. .raw;
  139. system.CurrentArmInterface().SetReg(1, param_1);
  140. FuncReturn(system, retval);
  141. }
  142. // Used by GetResourceLimitLimitValue.
  143. template <ResultCode func(Core::System&, u64*, Handle, LimitableResource)>
  144. void SvcWrap64(Core::System& system) {
  145. u64 param_1 = 0;
  146. const u32 retval = func(system, &param_1, static_cast<Handle>(Param(system, 1)),
  147. static_cast<LimitableResource>(Param(system, 2)))
  148. .raw;
  149. system.CurrentArmInterface().SetReg(1, param_1);
  150. FuncReturn(system, retval);
  151. }
  152. template <ResultCode func(Core::System&, u32, u64)>
  153. void SvcWrap64(Core::System& system) {
  154. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1)).raw);
  155. }
  156. // Used by SetResourceLimitLimitValue
  157. template <ResultCode func(Core::System&, Handle, LimitableResource, u64)>
  158. void SvcWrap64(Core::System& system) {
  159. FuncReturn(system, func(system, static_cast<Handle>(Param(system, 0)),
  160. static_cast<LimitableResource>(Param(system, 1)), Param(system, 2))
  161. .raw);
  162. }
  163. // Used by SetThreadCoreMask
  164. template <ResultCode func(Core::System&, Handle, s32, u64)>
  165. void SvcWrap64(Core::System& system) {
  166. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)),
  167. static_cast<s32>(Param(system, 1)), Param(system, 2))
  168. .raw);
  169. }
  170. // Used by GetThreadCoreMask
  171. template <ResultCode func(Core::System&, Handle, s32*, u64*)>
  172. void SvcWrap64(Core::System& system) {
  173. s32 param_1 = 0;
  174. u64 param_2 = 0;
  175. const ResultCode retval = func(system, static_cast<u32>(Param(system, 2)), &param_1, &param_2);
  176. system.CurrentArmInterface().SetReg(1, param_1);
  177. system.CurrentArmInterface().SetReg(2, param_2);
  178. FuncReturn(system, retval.raw);
  179. }
  180. template <ResultCode func(Core::System&, u64, u64, u32, u32)>
  181. void SvcWrap64(Core::System& system) {
  182. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  183. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  184. .raw);
  185. }
  186. template <ResultCode func(Core::System&, u64, u64, u32, u64)>
  187. void SvcWrap64(Core::System& system) {
  188. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  189. static_cast<u32>(Param(system, 2)), Param(system, 3))
  190. .raw);
  191. }
  192. template <ResultCode func(Core::System&, u32, u64, u32)>
  193. void SvcWrap64(Core::System& system) {
  194. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0)), Param(system, 1),
  195. static_cast<u32>(Param(system, 2)))
  196. .raw);
  197. }
  198. template <ResultCode func(Core::System&, u64, u64, u64)>
  199. void SvcWrap64(Core::System& system) {
  200. FuncReturn(system, func(system, Param(system, 0), Param(system, 1), Param(system, 2)).raw);
  201. }
  202. template <ResultCode func(Core::System&, u64, u64, u32)>
  203. void SvcWrap64(Core::System& system) {
  204. FuncReturn(
  205. system,
  206. func(system, Param(system, 0), Param(system, 1), static_cast<u32>(Param(system, 2))).raw);
  207. }
  208. // Used by SetMemoryPermission
  209. template <ResultCode func(Core::System&, u64, u64, Svc::MemoryPermission)>
  210. void SvcWrap64(Core::System& system) {
  211. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  212. static_cast<Svc::MemoryPermission>(Param(system, 2)))
  213. .raw);
  214. }
  215. // Used by MapSharedMemory
  216. template <ResultCode func(Core::System&, Handle, u64, u64, Svc::MemoryPermission)>
  217. void SvcWrap64(Core::System& system) {
  218. FuncReturn(system, func(system, static_cast<Handle>(Param(system, 0)), Param(system, 1),
  219. Param(system, 2), static_cast<Svc::MemoryPermission>(Param(system, 3)))
  220. .raw);
  221. }
  222. template <ResultCode func(Core::System&, u32, u64, u64)>
  223. void SvcWrap64(Core::System& system) {
  224. FuncReturn(
  225. system,
  226. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2)).raw);
  227. }
  228. // Used by WaitSynchronization
  229. template <ResultCode func(Core::System&, s32*, u64, s32, s64)>
  230. void SvcWrap64(Core::System& system) {
  231. s32 param_1 = 0;
  232. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<s32>(Param(system, 2)),
  233. static_cast<s64>(Param(system, 3)))
  234. .raw;
  235. system.CurrentArmInterface().SetReg(1, param_1);
  236. FuncReturn(system, retval);
  237. }
  238. template <ResultCode func(Core::System&, u64, u64, u32, s64)>
  239. void SvcWrap64(Core::System& system) {
  240. FuncReturn(system, func(system, Param(system, 0), Param(system, 1),
  241. static_cast<u32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  242. .raw);
  243. }
  244. // Used by GetInfo
  245. template <ResultCode func(Core::System&, u64*, u64, Handle, u64)>
  246. void SvcWrap64(Core::System& system) {
  247. u64 param_1 = 0;
  248. const u32 retval = func(system, &param_1, Param(system, 1),
  249. static_cast<Handle>(Param(system, 2)), Param(system, 3))
  250. .raw;
  251. system.CurrentArmInterface().SetReg(1, param_1);
  252. FuncReturn(system, retval);
  253. }
  254. template <ResultCode func(Core::System&, u32*, u64, u64, u64, u32, s32)>
  255. void SvcWrap64(Core::System& system) {
  256. u32 param_1 = 0;
  257. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2), Param(system, 3),
  258. static_cast<u32>(Param(system, 4)), static_cast<s32>(Param(system, 5)))
  259. .raw;
  260. system.CurrentArmInterface().SetReg(1, param_1);
  261. FuncReturn(system, retval);
  262. }
  263. // Used by CreateTransferMemory
  264. template <ResultCode func(Core::System&, Handle*, u64, u64, Svc::MemoryPermission)>
  265. void SvcWrap64(Core::System& system) {
  266. u32 param_1 = 0;
  267. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2),
  268. static_cast<Svc::MemoryPermission>(Param(system, 3)))
  269. .raw;
  270. system.CurrentArmInterface().SetReg(1, param_1);
  271. FuncReturn(system, retval);
  272. }
  273. // Used by CreateCodeMemory
  274. template <ResultCode func(Core::System&, Handle*, u64, u64)>
  275. void SvcWrap64(Core::System& system) {
  276. u32 param_1 = 0;
  277. const u32 retval = func(system, &param_1, Param(system, 1), Param(system, 2)).raw;
  278. system.CurrentArmInterface().SetReg(1, param_1);
  279. FuncReturn(system, retval);
  280. }
  281. template <ResultCode func(Core::System&, Handle*, u64, u32, u32)>
  282. void SvcWrap64(Core::System& system) {
  283. u32 param_1 = 0;
  284. const u32 retval = func(system, &param_1, Param(system, 1), static_cast<u32>(Param(system, 2)),
  285. static_cast<u32>(Param(system, 3)))
  286. .raw;
  287. system.CurrentArmInterface().SetReg(1, param_1);
  288. FuncReturn(system, retval);
  289. }
  290. // Used by WaitForAddress
  291. template <ResultCode func(Core::System&, u64, Svc::ArbitrationType, s32, s64)>
  292. void SvcWrap64(Core::System& system) {
  293. FuncReturn(system,
  294. func(system, Param(system, 0), static_cast<Svc::ArbitrationType>(Param(system, 1)),
  295. static_cast<s32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  296. .raw);
  297. }
  298. // Used by SignalToAddress
  299. template <ResultCode func(Core::System&, u64, Svc::SignalType, s32, s32)>
  300. void SvcWrap64(Core::System& system) {
  301. FuncReturn(system,
  302. func(system, Param(system, 0), static_cast<Svc::SignalType>(Param(system, 1)),
  303. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  304. .raw);
  305. }
  306. ////////////////////////////////////////////////////////////////////////////////////////////////////
  307. // Function wrappers that return type u32
  308. template <u32 func(Core::System&)>
  309. void SvcWrap64(Core::System& system) {
  310. FuncReturn(system, func(system));
  311. }
  312. ////////////////////////////////////////////////////////////////////////////////////////////////////
  313. // Function wrappers that return type u64
  314. template <u64 func(Core::System&)>
  315. void SvcWrap64(Core::System& system) {
  316. FuncReturn(system, func(system));
  317. }
  318. ////////////////////////////////////////////////////////////////////////////////////////////////////
  319. /// Function wrappers that return type void
  320. template <void func(Core::System&)>
  321. void SvcWrap64(Core::System& system) {
  322. func(system);
  323. }
  324. template <void func(Core::System&, u32)>
  325. void SvcWrap64(Core::System& system) {
  326. func(system, static_cast<u32>(Param(system, 0)));
  327. }
  328. template <void func(Core::System&, u32, u64, u64, u64)>
  329. void SvcWrap64(Core::System& system) {
  330. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2),
  331. Param(system, 3));
  332. }
  333. template <void func(Core::System&, s64)>
  334. void SvcWrap64(Core::System& system) {
  335. func(system, static_cast<s64>(Param(system, 0)));
  336. }
  337. template <void func(Core::System&, u64, s32)>
  338. void SvcWrap64(Core::System& system) {
  339. func(system, Param(system, 0), static_cast<s32>(Param(system, 1)));
  340. }
  341. template <void func(Core::System&, u64, u64)>
  342. void SvcWrap64(Core::System& system) {
  343. func(system, Param(system, 0), Param(system, 1));
  344. }
  345. template <void func(Core::System&, u64, u64, u64)>
  346. void SvcWrap64(Core::System& system) {
  347. func(system, Param(system, 0), Param(system, 1), Param(system, 2));
  348. }
  349. template <void func(Core::System&, u32, u64, u64)>
  350. void SvcWrap64(Core::System& system) {
  351. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
  352. }
  353. // Used by QueryMemory32, ArbitrateLock32
  354. template <ResultCode func(Core::System&, u32, u32, u32)>
  355. void SvcWrap32(Core::System& system) {
  356. FuncReturn32(system,
  357. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2)).raw);
  358. }
  359. // Used by Break32
  360. template <void func(Core::System&, u32, u32, u32)>
  361. void SvcWrap32(Core::System& system) {
  362. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2));
  363. }
  364. // Used by ExitProcess32, ExitThread32
  365. template <void func(Core::System&)>
  366. void SvcWrap32(Core::System& system) {
  367. func(system);
  368. }
  369. // Used by GetCurrentProcessorNumber32
  370. template <u32 func(Core::System&)>
  371. void SvcWrap32(Core::System& system) {
  372. FuncReturn32(system, func(system));
  373. }
  374. // Used by SleepThread32
  375. template <void func(Core::System&, u32, u32)>
  376. void SvcWrap32(Core::System& system) {
  377. func(system, Param32(system, 0), Param32(system, 1));
  378. }
  379. // Used by CreateThread32
  380. template <ResultCode func(Core::System&, Handle*, u32, u32, u32, u32, s32)>
  381. void SvcWrap32(Core::System& system) {
  382. Handle param_1 = 0;
  383. const u32 retval = func(system, &param_1, Param32(system, 0), Param32(system, 1),
  384. Param32(system, 2), Param32(system, 3), Param32(system, 4))
  385. .raw;
  386. system.CurrentArmInterface().SetReg(1, param_1);
  387. FuncReturn(system, retval);
  388. }
  389. // Used by GetInfo32
  390. template <ResultCode func(Core::System&, u32*, u32*, u32, u32, u32, u32)>
  391. void SvcWrap32(Core::System& system) {
  392. u32 param_1 = 0;
  393. u32 param_2 = 0;
  394. const u32 retval = func(system, &param_1, &param_2, Param32(system, 0), Param32(system, 1),
  395. Param32(system, 2), Param32(system, 3))
  396. .raw;
  397. system.CurrentArmInterface().SetReg(1, param_1);
  398. system.CurrentArmInterface().SetReg(2, param_2);
  399. FuncReturn(system, retval);
  400. }
  401. // Used by GetThreadPriority32, ConnectToNamedPort32
  402. template <ResultCode func(Core::System&, u32*, u32)>
  403. void SvcWrap32(Core::System& system) {
  404. u32 param_1 = 0;
  405. const u32 retval = func(system, &param_1, Param32(system, 1)).raw;
  406. system.CurrentArmInterface().SetReg(1, param_1);
  407. FuncReturn(system, retval);
  408. }
  409. // Used by GetThreadId32
  410. template <ResultCode func(Core::System&, u32*, u32*, u32)>
  411. void SvcWrap32(Core::System& system) {
  412. u32 param_1 = 0;
  413. u32 param_2 = 0;
  414. const u32 retval = func(system, &param_1, &param_2, Param32(system, 1)).raw;
  415. system.CurrentArmInterface().SetReg(1, param_1);
  416. system.CurrentArmInterface().SetReg(2, param_2);
  417. FuncReturn(system, retval);
  418. }
  419. // Used by GetSystemTick32
  420. template <void func(Core::System&, u32*, u32*)>
  421. void SvcWrap32(Core::System& system) {
  422. u32 param_1 = 0;
  423. u32 param_2 = 0;
  424. func(system, &param_1, &param_2);
  425. system.CurrentArmInterface().SetReg(0, param_1);
  426. system.CurrentArmInterface().SetReg(1, param_2);
  427. }
  428. // Used by CreateEvent32
  429. template <ResultCode func(Core::System&, Handle*, Handle*)>
  430. void SvcWrap32(Core::System& system) {
  431. Handle param_1 = 0;
  432. Handle param_2 = 0;
  433. const u32 retval = func(system, &param_1, &param_2).raw;
  434. system.CurrentArmInterface().SetReg(1, param_1);
  435. system.CurrentArmInterface().SetReg(2, param_2);
  436. FuncReturn(system, retval);
  437. }
  438. // Used by GetThreadId32
  439. template <ResultCode func(Core::System&, Handle, u32*, u32*, u32*)>
  440. void SvcWrap32(Core::System& system) {
  441. u32 param_1 = 0;
  442. u32 param_2 = 0;
  443. u32 param_3 = 0;
  444. const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
  445. system.CurrentArmInterface().SetReg(1, param_1);
  446. system.CurrentArmInterface().SetReg(2, param_2);
  447. system.CurrentArmInterface().SetReg(3, param_3);
  448. FuncReturn(system, retval);
  449. }
  450. // Used by GetThreadCoreMask32
  451. template <ResultCode func(Core::System&, Handle, s32*, u32*, u32*)>
  452. void SvcWrap32(Core::System& system) {
  453. s32 param_1 = 0;
  454. u32 param_2 = 0;
  455. u32 param_3 = 0;
  456. const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
  457. system.CurrentArmInterface().SetReg(1, param_1);
  458. system.CurrentArmInterface().SetReg(2, param_2);
  459. system.CurrentArmInterface().SetReg(3, param_3);
  460. FuncReturn(system, retval);
  461. }
  462. // Used by SignalProcessWideKey32
  463. template <void func(Core::System&, u32, s32)>
  464. void SvcWrap32(Core::System& system) {
  465. func(system, static_cast<u32>(Param(system, 0)), static_cast<s32>(Param(system, 1)));
  466. }
  467. // Used by SetThreadActivity32
  468. template <ResultCode func(Core::System&, Handle, Svc::ThreadActivity)>
  469. void SvcWrap32(Core::System& system) {
  470. const u32 retval = func(system, static_cast<Handle>(Param(system, 0)),
  471. static_cast<Svc::ThreadActivity>(Param(system, 1)))
  472. .raw;
  473. FuncReturn(system, retval);
  474. }
  475. // Used by SetThreadPriority32
  476. template <ResultCode func(Core::System&, Handle, u32)>
  477. void SvcWrap32(Core::System& system) {
  478. const u32 retval =
  479. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw;
  480. FuncReturn(system, retval);
  481. }
  482. // Used by SetMemoryAttribute32
  483. template <ResultCode func(Core::System&, Handle, u32, u32, u32)>
  484. void SvcWrap32(Core::System& system) {
  485. const u32 retval =
  486. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  487. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  488. .raw;
  489. FuncReturn(system, retval);
  490. }
  491. // Used by MapSharedMemory32
  492. template <ResultCode func(Core::System&, Handle, u32, u32, Svc::MemoryPermission)>
  493. void SvcWrap32(Core::System& system) {
  494. const u32 retval = func(system, static_cast<Handle>(Param(system, 0)),
  495. static_cast<u32>(Param(system, 1)), static_cast<u32>(Param(system, 2)),
  496. static_cast<Svc::MemoryPermission>(Param(system, 3)))
  497. .raw;
  498. FuncReturn(system, retval);
  499. }
  500. // Used by SetThreadCoreMask32
  501. template <ResultCode func(Core::System&, Handle, s32, u32, u32)>
  502. void SvcWrap32(Core::System& system) {
  503. const u32 retval =
  504. func(system, static_cast<Handle>(Param(system, 0)), static_cast<s32>(Param(system, 1)),
  505. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  506. .raw;
  507. FuncReturn(system, retval);
  508. }
  509. // Used by WaitProcessWideKeyAtomic32
  510. template <ResultCode func(Core::System&, u32, u32, Handle, u32, u32)>
  511. void SvcWrap32(Core::System& system) {
  512. const u32 retval =
  513. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  514. static_cast<Handle>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
  515. static_cast<u32>(Param(system, 4)))
  516. .raw;
  517. FuncReturn(system, retval);
  518. }
  519. // Used by WaitForAddress32
  520. template <ResultCode func(Core::System&, u32, Svc::ArbitrationType, s32, u32, u32)>
  521. void SvcWrap32(Core::System& system) {
  522. const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
  523. static_cast<Svc::ArbitrationType>(Param(system, 1)),
  524. static_cast<s32>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
  525. static_cast<u32>(Param(system, 4)))
  526. .raw;
  527. FuncReturn(system, retval);
  528. }
  529. // Used by SignalToAddress32
  530. template <ResultCode func(Core::System&, u32, Svc::SignalType, s32, s32)>
  531. void SvcWrap32(Core::System& system) {
  532. const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
  533. static_cast<Svc::SignalType>(Param(system, 1)),
  534. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  535. .raw;
  536. FuncReturn(system, retval);
  537. }
  538. // Used by SendSyncRequest32, ArbitrateUnlock32
  539. template <ResultCode func(Core::System&, u32)>
  540. void SvcWrap32(Core::System& system) {
  541. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  542. }
  543. // Used by CreateTransferMemory32
  544. template <ResultCode func(Core::System&, Handle*, u32, u32, Svc::MemoryPermission)>
  545. void SvcWrap32(Core::System& system) {
  546. Handle handle = 0;
  547. const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2),
  548. static_cast<Svc::MemoryPermission>(Param32(system, 3)))
  549. .raw;
  550. system.CurrentArmInterface().SetReg(1, handle);
  551. FuncReturn(system, retval);
  552. }
  553. // Used by WaitSynchronization32
  554. template <ResultCode func(Core::System&, u32, u32, s32, u32, s32*)>
  555. void SvcWrap32(Core::System& system) {
  556. s32 param_1 = 0;
  557. const u32 retval = func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2),
  558. Param32(system, 3), &param_1)
  559. .raw;
  560. system.CurrentArmInterface().SetReg(1, param_1);
  561. FuncReturn(system, retval);
  562. }
  563. // Used by CreateCodeMemory32
  564. template <ResultCode func(Core::System&, Handle*, u32, u32)>
  565. void SvcWrap32(Core::System& system) {
  566. Handle handle = 0;
  567. const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2)).raw;
  568. system.CurrentArmInterface().SetReg(1, handle);
  569. FuncReturn(system, retval);
  570. }
  571. // Used by ControlCodeMemory32
  572. template <ResultCode func(Core::System&, Handle, u32, u64, u64, Svc::MemoryPermission)>
  573. void SvcWrap32(Core::System& system) {
  574. const u32 retval =
  575. func(system, Param32(system, 0), Param32(system, 1), Param(system, 2), Param(system, 4),
  576. static_cast<Svc::MemoryPermission>(Param32(system, 6)))
  577. .raw;
  578. FuncReturn(system, retval);
  579. }
  580. } // namespace Kernel