KernelTransfer.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Ryujinx.HLE.HOS.Kernel.Process;
  2. using ARMeilleure.Memory;
  3. namespace Ryujinx.HLE.HOS.Kernel.Common
  4. {
  5. static class KernelTransfer
  6. {
  7. public static bool UserToKernelInt32(Horizon system, ulong address, out int value)
  8. {
  9. KProcess currentProcess = system.Scheduler.GetCurrentProcess();
  10. if (currentProcess.CpuMemory.IsMapped((long)address) &&
  11. currentProcess.CpuMemory.IsMapped((long)address + 3))
  12. {
  13. value = currentProcess.CpuMemory.ReadInt32((long)address);
  14. return true;
  15. }
  16. value = 0;
  17. return false;
  18. }
  19. public static bool UserToKernelInt32Array(Horizon system, ulong address, int[] values)
  20. {
  21. KProcess currentProcess = system.Scheduler.GetCurrentProcess();
  22. for (int index = 0; index < values.Length; index++, address += 4)
  23. {
  24. if (currentProcess.CpuMemory.IsMapped((long)address) &&
  25. currentProcess.CpuMemory.IsMapped((long)address + 3))
  26. {
  27. values[index]= currentProcess.CpuMemory.ReadInt32((long)address);
  28. }
  29. else
  30. {
  31. return false;
  32. }
  33. }
  34. return true;
  35. }
  36. public static bool UserToKernelString(Horizon system, ulong address, int size, out string value)
  37. {
  38. KProcess currentProcess = system.Scheduler.GetCurrentProcess();
  39. if (currentProcess.CpuMemory.IsMapped((long)address) &&
  40. currentProcess.CpuMemory.IsMapped((long)address + size - 1))
  41. {
  42. value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, (long)address, size);
  43. return true;
  44. }
  45. value = null;
  46. return false;
  47. }
  48. public static bool KernelToUserInt32(Horizon system, ulong address, int value)
  49. {
  50. KProcess currentProcess = system.Scheduler.GetCurrentProcess();
  51. if (currentProcess.CpuMemory.IsMapped((long)address) &&
  52. currentProcess.CpuMemory.IsMapped((long)address + 3))
  53. {
  54. currentProcess.CpuMemory.WriteInt32((long)address, value);
  55. return true;
  56. }
  57. return false;
  58. }
  59. public static bool KernelToUserInt64(Horizon system, ulong address, long value)
  60. {
  61. KProcess currentProcess = system.Scheduler.GetCurrentProcess();
  62. if (currentProcess.CpuMemory.IsMapped((long)address) &&
  63. currentProcess.CpuMemory.IsMapped((long)address + 7))
  64. {
  65. currentProcess.CpuMemory.WriteInt64((long)address, value);
  66. return true;
  67. }
  68. return false;
  69. }
  70. }
  71. }