svc_wrap.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/common_types.h"
  5. #include "core/arm/arm_interface.h"
  6. #include "core/core.h"
  7. #include "core/hle/kernel/svc_types.h"
  8. #include "core/hle/result.h"
  9. #include "core/memory.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 Result
  30. template <Result func(Core::System&, u64)>
  31. void SvcWrap64(Core::System& system) {
  32. FuncReturn(system, func(system, Param(system, 0)).raw);
  33. }
  34. template <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result func(Core::System&, Handle, u32, VAddr, size_t, 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result func(Core::System&, Handle, s32*, u64*)>
  172. void SvcWrap64(Core::System& system) {
  173. s32 param_1 = 0;
  174. u64 param_2 = 0;
  175. const Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result 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 <Result func(Core::System&, Handle*, VAddr, size_t)>
  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 <Result 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 CreateSession
  291. template <Result func(Core::System&, Handle*, Handle*, u32, u64)>
  292. void SvcWrap64(Core::System& system) {
  293. Handle param_1 = 0;
  294. Handle param_2 = 0;
  295. const u32 retval = func(system, &param_1, &param_2, static_cast<u32>(Param(system, 2)),
  296. static_cast<u32>(Param(system, 3)))
  297. .raw;
  298. system.CurrentArmInterface().SetReg(1, param_1);
  299. system.CurrentArmInterface().SetReg(2, param_2);
  300. FuncReturn(system, retval);
  301. }
  302. // Used by ReplyAndReceive
  303. template <Result func(Core::System&, s32*, Handle*, s32, Handle, s64)>
  304. void SvcWrap64(Core::System& system) {
  305. s32 param_1 = 0;
  306. s32 num_handles = static_cast<s32>(Param(system, 2));
  307. std::vector<Handle> handles(num_handles);
  308. system.Memory().ReadBlock(Param(system, 1), handles.data(), num_handles * sizeof(Handle));
  309. const u32 retval = func(system, &param_1, handles.data(), num_handles,
  310. static_cast<s32>(Param(system, 3)), static_cast<s64>(Param(system, 4)))
  311. .raw;
  312. system.CurrentArmInterface().SetReg(1, param_1);
  313. FuncReturn(system, retval);
  314. }
  315. // Used by WaitForAddress
  316. template <Result func(Core::System&, u64, Svc::ArbitrationType, s32, s64)>
  317. void SvcWrap64(Core::System& system) {
  318. FuncReturn(system,
  319. func(system, Param(system, 0), static_cast<Svc::ArbitrationType>(Param(system, 1)),
  320. static_cast<s32>(Param(system, 2)), static_cast<s64>(Param(system, 3)))
  321. .raw);
  322. }
  323. // Used by SignalToAddress
  324. template <Result func(Core::System&, u64, Svc::SignalType, s32, s32)>
  325. void SvcWrap64(Core::System& system) {
  326. FuncReturn(system,
  327. func(system, Param(system, 0), static_cast<Svc::SignalType>(Param(system, 1)),
  328. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  329. .raw);
  330. }
  331. ////////////////////////////////////////////////////////////////////////////////////////////////////
  332. // Function wrappers that return type u32
  333. template <u32 func(Core::System&)>
  334. void SvcWrap64(Core::System& system) {
  335. FuncReturn(system, func(system));
  336. }
  337. ////////////////////////////////////////////////////////////////////////////////////////////////////
  338. // Function wrappers that return type u64
  339. template <u64 func(Core::System&)>
  340. void SvcWrap64(Core::System& system) {
  341. FuncReturn(system, func(system));
  342. }
  343. ////////////////////////////////////////////////////////////////////////////////////////////////////
  344. /// Function wrappers that return type void
  345. template <void func(Core::System&)>
  346. void SvcWrap64(Core::System& system) {
  347. func(system);
  348. }
  349. template <void func(Core::System&, u32)>
  350. void SvcWrap64(Core::System& system) {
  351. func(system, static_cast<u32>(Param(system, 0)));
  352. }
  353. template <void func(Core::System&, u32, u64, u64, u64)>
  354. void SvcWrap64(Core::System& system) {
  355. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2),
  356. Param(system, 3));
  357. }
  358. template <void func(Core::System&, s64)>
  359. void SvcWrap64(Core::System& system) {
  360. func(system, static_cast<s64>(Param(system, 0)));
  361. }
  362. template <void func(Core::System&, u64, s32)>
  363. void SvcWrap64(Core::System& system) {
  364. func(system, Param(system, 0), static_cast<s32>(Param(system, 1)));
  365. }
  366. template <void func(Core::System&, u64, u64)>
  367. void SvcWrap64(Core::System& system) {
  368. func(system, Param(system, 0), Param(system, 1));
  369. }
  370. template <void func(Core::System&, u64, u64, u64)>
  371. void SvcWrap64(Core::System& system) {
  372. func(system, Param(system, 0), Param(system, 1), Param(system, 2));
  373. }
  374. template <void func(Core::System&, u32, u64, u64)>
  375. void SvcWrap64(Core::System& system) {
  376. func(system, static_cast<u32>(Param(system, 0)), Param(system, 1), Param(system, 2));
  377. }
  378. // Used by QueryMemory32, ArbitrateLock32
  379. template <Result func(Core::System&, u32, u32, u32)>
  380. void SvcWrap32(Core::System& system) {
  381. FuncReturn32(system,
  382. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2)).raw);
  383. }
  384. // Used by Break32
  385. template <void func(Core::System&, u32, u32, u32)>
  386. void SvcWrap32(Core::System& system) {
  387. func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2));
  388. }
  389. // Used by ExitProcess32, ExitThread32
  390. template <void func(Core::System&)>
  391. void SvcWrap32(Core::System& system) {
  392. func(system);
  393. }
  394. // Used by GetCurrentProcessorNumber32
  395. template <u32 func(Core::System&)>
  396. void SvcWrap32(Core::System& system) {
  397. FuncReturn32(system, func(system));
  398. }
  399. // Used by SleepThread32
  400. template <void func(Core::System&, u32, u32)>
  401. void SvcWrap32(Core::System& system) {
  402. func(system, Param32(system, 0), Param32(system, 1));
  403. }
  404. // Used by CreateThread32
  405. template <Result func(Core::System&, Handle*, u32, u32, u32, u32, s32)>
  406. void SvcWrap32(Core::System& system) {
  407. Handle param_1 = 0;
  408. const u32 retval = func(system, &param_1, Param32(system, 0), Param32(system, 1),
  409. Param32(system, 2), Param32(system, 3), Param32(system, 4))
  410. .raw;
  411. system.CurrentArmInterface().SetReg(1, param_1);
  412. FuncReturn(system, retval);
  413. }
  414. // Used by GetInfo32
  415. template <Result func(Core::System&, u32*, u32*, u32, u32, u32, u32)>
  416. void SvcWrap32(Core::System& system) {
  417. u32 param_1 = 0;
  418. u32 param_2 = 0;
  419. const u32 retval = func(system, &param_1, &param_2, Param32(system, 0), Param32(system, 1),
  420. Param32(system, 2), Param32(system, 3))
  421. .raw;
  422. system.CurrentArmInterface().SetReg(1, param_1);
  423. system.CurrentArmInterface().SetReg(2, param_2);
  424. FuncReturn(system, retval);
  425. }
  426. // Used by GetThreadPriority32, ConnectToNamedPort32
  427. template <Result func(Core::System&, u32*, u32)>
  428. void SvcWrap32(Core::System& system) {
  429. u32 param_1 = 0;
  430. const u32 retval = func(system, &param_1, Param32(system, 1)).raw;
  431. system.CurrentArmInterface().SetReg(1, param_1);
  432. FuncReturn(system, retval);
  433. }
  434. // Used by GetThreadId32
  435. template <Result func(Core::System&, u32*, u32*, u32)>
  436. void SvcWrap32(Core::System& system) {
  437. u32 param_1 = 0;
  438. u32 param_2 = 0;
  439. const u32 retval = func(system, &param_1, &param_2, Param32(system, 1)).raw;
  440. system.CurrentArmInterface().SetReg(1, param_1);
  441. system.CurrentArmInterface().SetReg(2, param_2);
  442. FuncReturn(system, retval);
  443. }
  444. // Used by GetSystemTick32
  445. template <void func(Core::System&, u32*, u32*)>
  446. void SvcWrap32(Core::System& system) {
  447. u32 param_1 = 0;
  448. u32 param_2 = 0;
  449. func(system, &param_1, &param_2);
  450. system.CurrentArmInterface().SetReg(0, param_1);
  451. system.CurrentArmInterface().SetReg(1, param_2);
  452. }
  453. // Used by CreateEvent32
  454. template <Result func(Core::System&, Handle*, Handle*)>
  455. void SvcWrap32(Core::System& system) {
  456. Handle param_1 = 0;
  457. Handle param_2 = 0;
  458. const u32 retval = func(system, &param_1, &param_2).raw;
  459. system.CurrentArmInterface().SetReg(1, param_1);
  460. system.CurrentArmInterface().SetReg(2, param_2);
  461. FuncReturn(system, retval);
  462. }
  463. // Used by GetThreadId32
  464. template <Result func(Core::System&, Handle, u32*, u32*, u32*)>
  465. void SvcWrap32(Core::System& system) {
  466. u32 param_1 = 0;
  467. u32 param_2 = 0;
  468. u32 param_3 = 0;
  469. const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
  470. system.CurrentArmInterface().SetReg(1, param_1);
  471. system.CurrentArmInterface().SetReg(2, param_2);
  472. system.CurrentArmInterface().SetReg(3, param_3);
  473. FuncReturn(system, retval);
  474. }
  475. // Used by GetThreadCoreMask32
  476. template <Result func(Core::System&, Handle, s32*, u32*, u32*)>
  477. void SvcWrap32(Core::System& system) {
  478. s32 param_1 = 0;
  479. u32 param_2 = 0;
  480. u32 param_3 = 0;
  481. const u32 retval = func(system, Param32(system, 2), &param_1, &param_2, &param_3).raw;
  482. system.CurrentArmInterface().SetReg(1, param_1);
  483. system.CurrentArmInterface().SetReg(2, param_2);
  484. system.CurrentArmInterface().SetReg(3, param_3);
  485. FuncReturn(system, retval);
  486. }
  487. // Used by SignalProcessWideKey32
  488. template <void func(Core::System&, u32, s32)>
  489. void SvcWrap32(Core::System& system) {
  490. func(system, static_cast<u32>(Param(system, 0)), static_cast<s32>(Param(system, 1)));
  491. }
  492. // Used by SetThreadActivity32
  493. template <Result func(Core::System&, Handle, Svc::ThreadActivity)>
  494. void SvcWrap32(Core::System& system) {
  495. const u32 retval = func(system, static_cast<Handle>(Param(system, 0)),
  496. static_cast<Svc::ThreadActivity>(Param(system, 1)))
  497. .raw;
  498. FuncReturn(system, retval);
  499. }
  500. // Used by SetThreadPriority32
  501. template <Result func(Core::System&, Handle, u32)>
  502. void SvcWrap32(Core::System& system) {
  503. const u32 retval =
  504. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1))).raw;
  505. FuncReturn(system, retval);
  506. }
  507. // Used by SetMemoryAttribute32
  508. template <Result func(Core::System&, Handle, u32, u32, u32)>
  509. void SvcWrap32(Core::System& system) {
  510. const u32 retval =
  511. func(system, static_cast<Handle>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  512. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  513. .raw;
  514. FuncReturn(system, retval);
  515. }
  516. // Used by MapSharedMemory32
  517. template <Result func(Core::System&, Handle, u32, u32, Svc::MemoryPermission)>
  518. void SvcWrap32(Core::System& system) {
  519. const u32 retval = func(system, static_cast<Handle>(Param(system, 0)),
  520. static_cast<u32>(Param(system, 1)), static_cast<u32>(Param(system, 2)),
  521. static_cast<Svc::MemoryPermission>(Param(system, 3)))
  522. .raw;
  523. FuncReturn(system, retval);
  524. }
  525. // Used by SetThreadCoreMask32
  526. template <Result func(Core::System&, Handle, s32, u32, u32)>
  527. void SvcWrap32(Core::System& system) {
  528. const u32 retval =
  529. func(system, static_cast<Handle>(Param(system, 0)), static_cast<s32>(Param(system, 1)),
  530. static_cast<u32>(Param(system, 2)), static_cast<u32>(Param(system, 3)))
  531. .raw;
  532. FuncReturn(system, retval);
  533. }
  534. // Used by WaitProcessWideKeyAtomic32
  535. template <Result func(Core::System&, u32, u32, Handle, u32, u32)>
  536. void SvcWrap32(Core::System& system) {
  537. const u32 retval =
  538. func(system, static_cast<u32>(Param(system, 0)), static_cast<u32>(Param(system, 1)),
  539. static_cast<Handle>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
  540. static_cast<u32>(Param(system, 4)))
  541. .raw;
  542. FuncReturn(system, retval);
  543. }
  544. // Used by WaitForAddress32
  545. template <Result func(Core::System&, u32, Svc::ArbitrationType, s32, u32, u32)>
  546. void SvcWrap32(Core::System& system) {
  547. const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
  548. static_cast<Svc::ArbitrationType>(Param(system, 1)),
  549. static_cast<s32>(Param(system, 2)), static_cast<u32>(Param(system, 3)),
  550. static_cast<u32>(Param(system, 4)))
  551. .raw;
  552. FuncReturn(system, retval);
  553. }
  554. // Used by SignalToAddress32
  555. template <Result func(Core::System&, u32, Svc::SignalType, s32, s32)>
  556. void SvcWrap32(Core::System& system) {
  557. const u32 retval = func(system, static_cast<u32>(Param(system, 0)),
  558. static_cast<Svc::SignalType>(Param(system, 1)),
  559. static_cast<s32>(Param(system, 2)), static_cast<s32>(Param(system, 3)))
  560. .raw;
  561. FuncReturn(system, retval);
  562. }
  563. // Used by SendSyncRequest32, ArbitrateUnlock32
  564. template <Result func(Core::System&, u32)>
  565. void SvcWrap32(Core::System& system) {
  566. FuncReturn(system, func(system, static_cast<u32>(Param(system, 0))).raw);
  567. }
  568. // Used by CreateTransferMemory32
  569. template <Result func(Core::System&, Handle*, u32, u32, Svc::MemoryPermission)>
  570. void SvcWrap32(Core::System& system) {
  571. Handle handle = 0;
  572. const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2),
  573. static_cast<Svc::MemoryPermission>(Param32(system, 3)))
  574. .raw;
  575. system.CurrentArmInterface().SetReg(1, handle);
  576. FuncReturn(system, retval);
  577. }
  578. // Used by WaitSynchronization32
  579. template <Result func(Core::System&, u32, u32, s32, u32, s32*)>
  580. void SvcWrap32(Core::System& system) {
  581. s32 param_1 = 0;
  582. const u32 retval = func(system, Param32(system, 0), Param32(system, 1), Param32(system, 2),
  583. Param32(system, 3), &param_1)
  584. .raw;
  585. system.CurrentArmInterface().SetReg(1, param_1);
  586. FuncReturn(system, retval);
  587. }
  588. // Used by CreateCodeMemory32
  589. template <Result func(Core::System&, Handle*, u32, u32)>
  590. void SvcWrap32(Core::System& system) {
  591. Handle handle = 0;
  592. const u32 retval = func(system, &handle, Param32(system, 1), Param32(system, 2)).raw;
  593. system.CurrentArmInterface().SetReg(1, handle);
  594. FuncReturn(system, retval);
  595. }
  596. // Used by ControlCodeMemory32
  597. template <Result func(Core::System&, Handle, u32, u64, u64, Svc::MemoryPermission)>
  598. void SvcWrap32(Core::System& system) {
  599. const u32 retval =
  600. func(system, Param32(system, 0), Param32(system, 1), Param(system, 2), Param(system, 4),
  601. static_cast<Svc::MemoryPermission>(Param32(system, 6)))
  602. .raw;
  603. FuncReturn(system, retval);
  604. }
  605. // Used by Invalidate/Store/FlushProcessDataCache32
  606. template <Result func(Core::System&, Handle, u64, u64)>
  607. void SvcWrap32(Core::System& system) {
  608. const u64 address = (Param(system, 3) << 32) | Param(system, 2);
  609. const u64 size = (Param(system, 4) << 32) | Param(system, 1);
  610. FuncReturn32(system, func(system, Param32(system, 0), address, size).raw);
  611. }
  612. } // namespace Kernel