svc_wrap.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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.h"
  9. #include "core/hle/result.h"
  10. #include "core/memory.h"
  11. namespace Kernel {
  12. static inline u64 Param(int n) {
  13. return Core::CurrentArmInterface().GetReg(n);
  14. }
  15. /**
  16. * HLE a function return from the current ARM userland process
  17. * @param res Result to return
  18. */
  19. static inline void FuncReturn(u64 res) {
  20. Core::CurrentArmInterface().SetReg(0, res);
  21. }
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////
  23. // Function wrappers that return type ResultCode
  24. template <ResultCode func(u64)>
  25. void SvcWrap() {
  26. FuncReturn(func(Param(0)).raw);
  27. }
  28. template <ResultCode func(u32)>
  29. void SvcWrap() {
  30. FuncReturn(func(static_cast<u32>(Param(0))).raw);
  31. }
  32. template <ResultCode func(u32, u32)>
  33. void SvcWrap() {
  34. FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1))).raw);
  35. }
  36. template <ResultCode func(u32*, u32)>
  37. void SvcWrap() {
  38. u32 param_1 = 0;
  39. u32 retval = func(&param_1, static_cast<u32>(Param(1))).raw;
  40. Core::CurrentArmInterface().SetReg(1, param_1);
  41. FuncReturn(retval);
  42. }
  43. template <ResultCode func(u32*, u64)>
  44. void SvcWrap() {
  45. u32 param_1 = 0;
  46. u32 retval = func(&param_1, Param(1)).raw;
  47. Core::CurrentArmInterface().SetReg(1, param_1);
  48. FuncReturn(retval);
  49. }
  50. template <ResultCode func(u64, s32)>
  51. void SvcWrap() {
  52. FuncReturn(func(Param(0), static_cast<s32>(Param(1))).raw);
  53. }
  54. template <ResultCode func(u64, u32)>
  55. void SvcWrap() {
  56. FuncReturn(func(Param(0), static_cast<u32>(Param(1))).raw);
  57. }
  58. template <ResultCode func(u64*, u64)>
  59. void SvcWrap() {
  60. u64 param_1 = 0;
  61. u32 retval = func(&param_1, Param(1)).raw;
  62. Core::CurrentArmInterface().SetReg(1, param_1);
  63. FuncReturn(retval);
  64. }
  65. template <ResultCode func(u64*, u32, u32)>
  66. void SvcWrap() {
  67. u64 param_1 = 0;
  68. u32 retval = func(&param_1, static_cast<u32>(Param(1)), static_cast<u32>(Param(2))).raw;
  69. Core::CurrentArmInterface().SetReg(1, param_1);
  70. FuncReturn(retval);
  71. }
  72. template <ResultCode func(u32, u64)>
  73. void SvcWrap() {
  74. FuncReturn(func(static_cast<u32>(Param(0)), Param(1)).raw);
  75. }
  76. template <ResultCode func(u32, u32, u64)>
  77. void SvcWrap() {
  78. FuncReturn(func(static_cast<u32>(Param(0)), static_cast<u32>(Param(1)), Param(2)).raw);
  79. }
  80. template <ResultCode func(u32, u32*, u64*)>
  81. void SvcWrap() {
  82. u32 param_1 = 0;
  83. u64 param_2 = 0;
  84. ResultCode retval = func(static_cast<u32>(Param(2)), &param_1, &param_2);
  85. Core::CurrentArmInterface().SetReg(1, param_1);
  86. Core::CurrentArmInterface().SetReg(2, param_2);
  87. FuncReturn(retval.raw);
  88. }
  89. template <ResultCode func(u64, u64, u32, u32)>
  90. void SvcWrap() {
  91. FuncReturn(
  92. func(Param(0), Param(1), static_cast<u32>(Param(3)), static_cast<u32>(Param(3))).raw);
  93. }
  94. template <ResultCode func(u32, u64, u32)>
  95. void SvcWrap() {
  96. FuncReturn(func(static_cast<u32>(Param(0)), Param(1), static_cast<u32>(Param(2))).raw);
  97. }
  98. template <ResultCode func(u64, u64, u64)>
  99. void SvcWrap() {
  100. FuncReturn(func(Param(0), Param(1), Param(2)).raw);
  101. }
  102. template <ResultCode func(u64, u64, u32)>
  103. void SvcWrap() {
  104. FuncReturn(func(Param(0), Param(1), static_cast<u32>(Param(2))).raw);
  105. }
  106. template <ResultCode func(u32, u64, u64, u32)>
  107. void SvcWrap() {
  108. FuncReturn(
  109. func(static_cast<u32>(Param(0)), Param(1), Param(2), static_cast<u32>(Param(3))).raw);
  110. }
  111. template <ResultCode func(u32, u64, u64)>
  112. void SvcWrap() {
  113. FuncReturn(func(static_cast<u32>(Param(0)), Param(1), Param(2)).raw);
  114. }
  115. template <ResultCode func(u32*, u64, u64, s64)>
  116. void SvcWrap() {
  117. u32 param_1 = 0;
  118. ResultCode retval =
  119. func(&param_1, Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3)));
  120. Core::CurrentArmInterface().SetReg(1, param_1);
  121. FuncReturn(retval.raw);
  122. }
  123. template <ResultCode func(u64, u64, u32, s64)>
  124. void SvcWrap() {
  125. FuncReturn(
  126. func(Param(0), Param(1), static_cast<u32>(Param(2)), static_cast<s64>(Param(3))).raw);
  127. }
  128. template <ResultCode func(u64*, u64, u64, u64)>
  129. void SvcWrap() {
  130. u64 param_1 = 0;
  131. u32 retval = func(&param_1, Param(1), Param(2), Param(3)).raw;
  132. Core::CurrentArmInterface().SetReg(1, param_1);
  133. FuncReturn(retval);
  134. }
  135. template <ResultCode func(u32*, u64, u64, u64, u32, s32)>
  136. void SvcWrap() {
  137. u32 param_1 = 0;
  138. u32 retval = func(&param_1, Param(1), Param(2), Param(3), static_cast<u32>(Param(4)),
  139. static_cast<s32>(Param(5)))
  140. .raw;
  141. Core::CurrentArmInterface().SetReg(1, param_1);
  142. FuncReturn(retval);
  143. }
  144. template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
  145. void SvcWrap() {
  146. MemoryInfo memory_info = {};
  147. PageInfo page_info = {};
  148. u32 retval = func(&memory_info, &page_info, Param(2)).raw;
  149. Memory::Write64(Param(0), memory_info.base_address);
  150. Memory::Write64(Param(0) + 8, memory_info.size);
  151. Memory::Write32(Param(0) + 16, memory_info.type);
  152. Memory::Write32(Param(0) + 20, memory_info.attributes);
  153. Memory::Write32(Param(0) + 24, memory_info.permission);
  154. FuncReturn(retval);
  155. }
  156. template <ResultCode func(u32*, u64, u64, u32)>
  157. void SvcWrap() {
  158. u32 param_1 = 0;
  159. u32 retval = func(&param_1, Param(1), Param(2), static_cast<u32>(Param(3))).raw;
  160. Core::CurrentArmInterface().SetReg(1, param_1);
  161. FuncReturn(retval);
  162. }
  163. template <ResultCode func(Handle*, u64, u32, u32)>
  164. void SvcWrap() {
  165. u32 param_1 = 0;
  166. u32 retval =
  167. func(&param_1, Param(1), static_cast<u32>(Param(2)), static_cast<u32>(Param(3))).raw;
  168. Core::CurrentArmInterface().SetReg(1, param_1);
  169. FuncReturn(retval);
  170. }
  171. template <ResultCode func(u64, u32, s32, s64)>
  172. void SvcWrap() {
  173. FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
  174. static_cast<s64>(Param(3)))
  175. .raw);
  176. }
  177. template <ResultCode func(u64, u32, s32, s32)>
  178. void SvcWrap() {
  179. FuncReturn(func(Param(0), static_cast<u32>(Param(1)), static_cast<s32>(Param(2)),
  180. static_cast<s32>(Param(3)))
  181. .raw);
  182. }
  183. ////////////////////////////////////////////////////////////////////////////////////////////////////
  184. // Function wrappers that return type u32
  185. template <u32 func()>
  186. void SvcWrap() {
  187. FuncReturn(func());
  188. }
  189. ////////////////////////////////////////////////////////////////////////////////////////////////////
  190. // Function wrappers that return type u64
  191. template <u64 func()>
  192. void SvcWrap() {
  193. FuncReturn(func());
  194. }
  195. ////////////////////////////////////////////////////////////////////////////////////////////////////
  196. /// Function wrappers that return type void
  197. template <void func()>
  198. void SvcWrap() {
  199. func();
  200. }
  201. template <void func(s64)>
  202. void SvcWrap() {
  203. func(static_cast<s64>(Param(0)));
  204. }
  205. template <void func(u64, u64 len)>
  206. void SvcWrap() {
  207. func(Param(0), Param(1));
  208. }
  209. template <void func(u64, u64, u64)>
  210. void SvcWrap() {
  211. func(Param(0), Param(1), Param(2));
  212. }
  213. template <void func(u32, u64, u64)>
  214. void SvcWrap() {
  215. func(static_cast<u32>(Param(0)), Param(1), Param(2));
  216. }
  217. } // namespace Kernel