Syscall64.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using Ryujinx.HLE.HOS.Kernel.Common;
  2. using Ryujinx.HLE.HOS.Kernel.Memory;
  3. using Ryujinx.HLE.HOS.Kernel.Threading;
  4. namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
  5. {
  6. class Syscall64
  7. {
  8. private readonly Syscall _syscall;
  9. public Syscall64(Syscall syscall)
  10. {
  11. _syscall = syscall;
  12. }
  13. // IPC
  14. public KernelResult ConnectToNamedPort64([R(1)] ulong namePtr, [R(1)] out int handle)
  15. {
  16. return _syscall.ConnectToNamedPort(namePtr, out handle);
  17. }
  18. public KernelResult SendSyncRequest64([R(0)] int handle)
  19. {
  20. return _syscall.SendSyncRequest(handle);
  21. }
  22. public KernelResult SendSyncRequestWithUserBuffer64([R(0)] ulong messagePtr, [R(1)] ulong size, [R(2)] int handle)
  23. {
  24. return _syscall.SendSyncRequestWithUserBuffer(messagePtr, size, handle);
  25. }
  26. public KernelResult CreateSession64(
  27. [R(2)] bool isLight,
  28. [R(3)] ulong namePtr,
  29. [R(1)] out int serverSessionHandle,
  30. [R(2)] out int clientSessionHandle)
  31. {
  32. return _syscall.CreateSession(isLight, namePtr, out serverSessionHandle, out clientSessionHandle);
  33. }
  34. public KernelResult AcceptSession64([R(1)] int portHandle, [R(1)] out int sessionHandle)
  35. {
  36. return _syscall.AcceptSession(portHandle, out sessionHandle);
  37. }
  38. public KernelResult ReplyAndReceive64(
  39. [R(1)] ulong handlesPtr,
  40. [R(2)] int handlesCount,
  41. [R(3)] int replyTargetHandle,
  42. [R(4)] long timeout,
  43. [R(1)] out int handleIndex)
  44. {
  45. return _syscall.ReplyAndReceive(handlesPtr, handlesCount, replyTargetHandle, timeout, out handleIndex);
  46. }
  47. public KernelResult CreatePort64(
  48. [R(2)] int maxSessions,
  49. [R(3)] bool isLight,
  50. [R(4)] ulong namePtr,
  51. [R(1)] out int serverPortHandle,
  52. [R(2)] out int clientPortHandle)
  53. {
  54. return _syscall.CreatePort(maxSessions, isLight, namePtr, out serverPortHandle, out clientPortHandle);
  55. }
  56. public KernelResult ManageNamedPort64([R(1)] ulong namePtr, [R(2)] int maxSessions, [R(1)] out int handle)
  57. {
  58. return _syscall.ManageNamedPort(namePtr, maxSessions, out handle);
  59. }
  60. public KernelResult ConnectToPort64([R(1)] int clientPortHandle, [R(1)] out int clientSessionHandle)
  61. {
  62. return _syscall.ConnectToPort(clientPortHandle, out clientSessionHandle);
  63. }
  64. // Memory
  65. public KernelResult SetHeapSize64([R(1)] ulong size, [R(1)] out ulong position)
  66. {
  67. return _syscall.SetHeapSize(size, out position);
  68. }
  69. public KernelResult SetMemoryAttribute64(
  70. [R(0)] ulong position,
  71. [R(1)] ulong size,
  72. [R(2)] MemoryAttribute attributeMask,
  73. [R(3)] MemoryAttribute attributeValue)
  74. {
  75. return _syscall.SetMemoryAttribute(position, size, attributeMask, attributeValue);
  76. }
  77. public KernelResult MapMemory64([R(0)] ulong dst, [R(1)] ulong src, [R(2)] ulong size)
  78. {
  79. return _syscall.MapMemory(dst, src, size);
  80. }
  81. public KernelResult UnmapMemory64([R(0)] ulong dst, [R(1)] ulong src, [R(2)] ulong size)
  82. {
  83. return _syscall.UnmapMemory(dst, src, size);
  84. }
  85. public KernelResult QueryMemory64([R(0)] ulong infoPtr, [R(2)] ulong position, [R(1)] out ulong pageInfo)
  86. {
  87. return _syscall.QueryMemory(infoPtr, position, out pageInfo);
  88. }
  89. public KernelResult MapSharedMemory64([R(0)] int handle, [R(1)] ulong address, [R(2)] ulong size, [R(3)] MemoryPermission permission)
  90. {
  91. return _syscall.MapSharedMemory(handle, address, size, permission);
  92. }
  93. public KernelResult UnmapSharedMemory64([R(0)] int handle, [R(1)] ulong address, [R(2)] ulong size)
  94. {
  95. return _syscall.UnmapSharedMemory(handle, address, size);
  96. }
  97. public KernelResult CreateTransferMemory64(
  98. [R(1)] ulong address,
  99. [R(2)] ulong size,
  100. [R(3)] MemoryPermission permission,
  101. [R(1)] out int handle)
  102. {
  103. return _syscall.CreateTransferMemory(address, size, permission, out handle);
  104. }
  105. public KernelResult MapPhysicalMemory64([R(0)] ulong address, [R(1)] ulong size)
  106. {
  107. return _syscall.MapPhysicalMemory(address, size);
  108. }
  109. public KernelResult UnmapPhysicalMemory64([R(0)] ulong address, [R(1)] ulong size)
  110. {
  111. return _syscall.UnmapPhysicalMemory(address, size);
  112. }
  113. public KernelResult MapProcessCodeMemory64([R(0)] int handle, [R(1)] ulong dst, [R(2)] ulong src, [R(3)] ulong size)
  114. {
  115. return _syscall.MapProcessCodeMemory(handle, dst, src, size);
  116. }
  117. public KernelResult UnmapProcessCodeMemory64([R(0)] int handle, [R(1)] ulong dst, [R(2)] ulong src, [R(3)] ulong size)
  118. {
  119. return _syscall.UnmapProcessCodeMemory(handle, dst, src, size);
  120. }
  121. public KernelResult SetProcessMemoryPermission64([R(0)] int handle, [R(1)] ulong src, [R(2)] ulong size, [R(3)] MemoryPermission permission)
  122. {
  123. return _syscall.SetProcessMemoryPermission(handle, src, size, permission);
  124. }
  125. // System
  126. public void ExitProcess64()
  127. {
  128. _syscall.ExitProcess();
  129. }
  130. public KernelResult TerminateProcess64([R(0)] int handle)
  131. {
  132. return _syscall.TerminateProcess(handle);
  133. }
  134. public KernelResult SignalEvent64([R(0)] int handle)
  135. {
  136. return _syscall.SignalEvent(handle);
  137. }
  138. public KernelResult ClearEvent64([R(0)] int handle)
  139. {
  140. return _syscall.ClearEvent(handle);
  141. }
  142. public KernelResult CloseHandle64([R(0)] int handle)
  143. {
  144. return _syscall.CloseHandle(handle);
  145. }
  146. public KernelResult ResetSignal64([R(0)] int handle)
  147. {
  148. return _syscall.ResetSignal(handle);
  149. }
  150. public ulong GetSystemTick64()
  151. {
  152. return _syscall.GetSystemTick();
  153. }
  154. public KernelResult GetProcessId64([R(1)] int handle, [R(1)] out long pid)
  155. {
  156. return _syscall.GetProcessId(handle, out pid);
  157. }
  158. public void Break64([R(0)] ulong reason, [R(1)] ulong x1, [R(2)] ulong info)
  159. {
  160. _syscall.Break(reason);
  161. }
  162. public void OutputDebugString64([R(0)] ulong strPtr, [R(1)] ulong size)
  163. {
  164. _syscall.OutputDebugString(strPtr, size);
  165. }
  166. public KernelResult GetInfo64([R(1)] uint id, [R(2)] int handle, [R(3)] long subId, [R(1)] out long value)
  167. {
  168. return _syscall.GetInfo(id, handle, subId, out value);
  169. }
  170. public KernelResult CreateEvent64([R(1)] out int wEventHandle, [R(2)] out int rEventHandle)
  171. {
  172. return _syscall.CreateEvent(out wEventHandle, out rEventHandle);
  173. }
  174. public KernelResult GetProcessList64([R(1)] ulong address, [R(2)] int maxCount, [R(1)] out int count)
  175. {
  176. return _syscall.GetProcessList(address, maxCount, out count);
  177. }
  178. public KernelResult GetSystemInfo64([R(1)] uint id, [R(2)] int handle, [R(3)] long subId, [R(1)] out long value)
  179. {
  180. return _syscall.GetSystemInfo(id, handle, subId, out value);
  181. }
  182. // Thread
  183. public KernelResult CreateThread64(
  184. [R(1)] ulong entrypoint,
  185. [R(2)] ulong argsPtr,
  186. [R(3)] ulong stackTop,
  187. [R(4)] int priority,
  188. [R(5)] int cpuCore,
  189. [R(1)] out int handle)
  190. {
  191. return _syscall.CreateThread(entrypoint, argsPtr, stackTop, priority, cpuCore, out handle);
  192. }
  193. public KernelResult StartThread64([R(0)] int handle)
  194. {
  195. return _syscall.StartThread(handle);
  196. }
  197. public void ExitThread64()
  198. {
  199. _syscall.ExitThread();
  200. }
  201. public void SleepThread64([R(0)] long timeout)
  202. {
  203. _syscall.SleepThread(timeout);
  204. }
  205. public KernelResult GetThreadPriority64([R(1)] int handle, [R(1)] out int priority)
  206. {
  207. return _syscall.GetThreadPriority(handle, out priority);
  208. }
  209. public KernelResult SetThreadPriority64([R(0)] int handle, [R(1)] int priority)
  210. {
  211. return _syscall.SetThreadPriority(handle, priority);
  212. }
  213. public KernelResult GetThreadCoreMask64([R(2)] int handle, [R(1)] out int preferredCore, [R(2)] out long affinityMask)
  214. {
  215. return _syscall.GetThreadCoreMask(handle, out preferredCore, out affinityMask);
  216. }
  217. public KernelResult SetThreadCoreMask64([R(0)] int handle, [R(1)] int preferredCore, [R(2)] long affinityMask)
  218. {
  219. return _syscall.SetThreadCoreMask(handle, preferredCore, affinityMask);
  220. }
  221. public int GetCurrentProcessorNumber64()
  222. {
  223. return _syscall.GetCurrentProcessorNumber();
  224. }
  225. public KernelResult GetThreadId64([R(1)] int handle, [R(1)] out long threadUid)
  226. {
  227. return _syscall.GetThreadId(handle, out threadUid);
  228. }
  229. public KernelResult SetThreadActivity64([R(0)] int handle, [R(1)] bool pause)
  230. {
  231. return _syscall.SetThreadActivity(handle, pause);
  232. }
  233. public KernelResult GetThreadContext364([R(0)] ulong address, [R(1)] int handle)
  234. {
  235. return _syscall.GetThreadContext3(address, handle);
  236. }
  237. // Thread synchronization
  238. public KernelResult WaitSynchronization64([R(1)] ulong handlesPtr, [R(2)] int handlesCount, [R(3)] long timeout, [R(1)] out int handleIndex)
  239. {
  240. return _syscall.WaitSynchronization(handlesPtr, handlesCount, timeout, out handleIndex);
  241. }
  242. public KernelResult CancelSynchronization64([R(0)] int handle)
  243. {
  244. return _syscall.CancelSynchronization(handle);
  245. }
  246. public KernelResult ArbitrateLock64([R(0)] int ownerHandle, [R(1)] ulong mutexAddress, [R(2)] int requesterHandle)
  247. {
  248. return _syscall.ArbitrateLock(ownerHandle, mutexAddress, requesterHandle);
  249. }
  250. public KernelResult ArbitrateUnlock64([R(0)] ulong mutexAddress)
  251. {
  252. return _syscall.ArbitrateUnlock(mutexAddress);
  253. }
  254. public KernelResult WaitProcessWideKeyAtomic64(
  255. [R(0)] ulong mutexAddress,
  256. [R(1)] ulong condVarAddress,
  257. [R(2)] int handle,
  258. [R(3)] long timeout)
  259. {
  260. return _syscall.WaitProcessWideKeyAtomic(mutexAddress, condVarAddress, handle, timeout);
  261. }
  262. public KernelResult SignalProcessWideKey64([R(0)] ulong address, [R(1)] int count)
  263. {
  264. return _syscall.SignalProcessWideKey(address, count);
  265. }
  266. public KernelResult WaitForAddress64([R(0)] ulong address, [R(1)] ArbitrationType type, [R(2)] int value, [R(3)] long timeout)
  267. {
  268. return _syscall.WaitForAddress(address, type, value, timeout);
  269. }
  270. public KernelResult SignalToAddress64([R(0)] ulong address, [R(1)] SignalType type, [R(2)] int value, [R(3)] int count)
  271. {
  272. return _syscall.SignalToAddress(address, type, value, count);
  273. }
  274. }
  275. }