svc_wrap.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright 2018 Citra Emulator Project
  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. #define PARAM(n) Core::CPU().GetReg(n)
  13. /**
  14. * HLE a function return from the current ARM userland process
  15. * @param res Result to return
  16. */
  17. static inline void FuncReturn(u64 res) {
  18. Core::CPU().SetReg(0, res);
  19. }
  20. ////////////////////////////////////////////////////////////////////////////////////////////////////
  21. // Function wrappers that return type ResultCode
  22. template <ResultCode func(u64)>
  23. void SvcWrap() {
  24. FuncReturn(func(PARAM(0)).raw);
  25. }
  26. template <ResultCode func(u32)>
  27. void SvcWrap() {
  28. FuncReturn(func((u32)PARAM(0)).raw);
  29. }
  30. template <ResultCode func(u32, u32)>
  31. void SvcWrap() {
  32. FuncReturn(func((u32)PARAM(0), (u32)PARAM(1)).raw);
  33. }
  34. template <ResultCode func(u32*, u32)>
  35. void SvcWrap() {
  36. u32 param_1 = 0;
  37. u32 retval = func(&param_1, (u32)PARAM(1)).raw;
  38. Core::CPU().SetReg(1, param_1);
  39. FuncReturn(retval);
  40. }
  41. template <ResultCode func(u32*, u64)>
  42. void SvcWrap() {
  43. u32 param_1 = 0;
  44. u32 retval = func(&param_1, PARAM(1)).raw;
  45. Core::CPU().SetReg(1, param_1);
  46. FuncReturn(retval);
  47. }
  48. template <ResultCode func(u64, u32)>
  49. void SvcWrap() {
  50. FuncReturn(func(PARAM(0), (u32)PARAM(1)).raw);
  51. }
  52. template <ResultCode func(u64*, u64)>
  53. void SvcWrap() {
  54. u64 param_1 = 0;
  55. u32 retval = func(&param_1, PARAM(1)).raw;
  56. Core::CPU().SetReg(1, param_1);
  57. FuncReturn(retval);
  58. }
  59. template <ResultCode func(u32, u64, u32)>
  60. void SvcWrap() {
  61. FuncReturn(func((u32)PARAM(0), PARAM(1), (u32)PARAM(2)).raw);
  62. }
  63. template <ResultCode func(u64, u64, u64)>
  64. void SvcWrap() {
  65. FuncReturn(func(PARAM(0), PARAM(1), PARAM(2)).raw);
  66. }
  67. template <ResultCode func(u64, u64, s64)>
  68. void SvcWrap() {
  69. FuncReturn(func(PARAM(1), PARAM(2), (s64)PARAM(3)).raw);
  70. }
  71. template <ResultCode func(u64*, u64, u64, u64)>
  72. void SvcWrap() {
  73. u64 param_1 = 0;
  74. u32 retval = func(&param_1, PARAM(1), PARAM(2), PARAM(3)).raw;
  75. Core::CPU().SetReg(1, param_1);
  76. FuncReturn(retval);
  77. }
  78. template <ResultCode func(u32*, u64, u64, u64, u32, s32)>
  79. void SvcWrap() {
  80. u32 param_1 = 0;
  81. u32 retval =
  82. func(&param_1, PARAM(1), PARAM(2), PARAM(3), (u32)PARAM(4), (s32)(PARAM(5) & 0xFFFFFFFF))
  83. .raw;
  84. Core::CPU().SetReg(1, param_1);
  85. FuncReturn(retval);
  86. }
  87. template <ResultCode func(MemoryInfo*, PageInfo*, u64)>
  88. void SvcWrap() {
  89. MemoryInfo memory_info = {};
  90. PageInfo page_info = {};
  91. u32 retval = func(&memory_info, &page_info, PARAM(2)).raw;
  92. Memory::Write64(PARAM(0), memory_info.base_address);
  93. Memory::Write64(PARAM(0) + 8, memory_info.size);
  94. Memory::Write32(PARAM(0) + 16, memory_info.type);
  95. Memory::Write32(PARAM(0) + 20, memory_info.attributes);
  96. Memory::Write32(PARAM(0) + 24, memory_info.permission);
  97. FuncReturn(retval);
  98. }
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////
  100. // Function wrappers that return type u32
  101. template <u32 func()>
  102. void SvcWrap() {
  103. FuncReturn(func());
  104. }
  105. ////////////////////////////////////////////////////////////////////////////////////////////////////
  106. /// Function wrappers that return type void
  107. template <void func()>
  108. void SvcWrap() {
  109. func();
  110. }
  111. template <void func(s64)>
  112. void SvcWrap() {
  113. func((s64)PARAM(0));
  114. }
  115. template <void func(u64, s32 len)>
  116. void SvcWrap() {
  117. func(PARAM(0), (s32)(PARAM(1) & 0xFFFFFFFF));
  118. }
  119. template <void func(u64, u64, u64)>
  120. void SvcWrap() {
  121. func(PARAM(0), PARAM(1), PARAM(2));
  122. }
  123. #undef PARAM
  124. #undef FuncReturn
  125. } // namespace Kernel