aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-12-18 03:33:36 -0200
committerGitHub <noreply@github.com>2018-12-18 03:33:36 -0200
commit0039bb639493b2d1e2764cae380311ba8e87704b (patch)
tree63a912a95c8261775c2acb8a5b9ca0f10ad4ae33 /Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs
parent2534a7f10c627810e6e0272b4cc9758e90f733c1 (diff)
Refactor SVC handler (#540)
* Refactor SVC handler * Get rid of KernelErr * Split kernel code files into multiple folders
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs70
1 files changed, 70 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs
new file mode 100644
index 00000000..f2a05bda
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs
@@ -0,0 +1,70 @@
+using Ryujinx.Common;
+using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Kernel.Process;
+
+namespace Ryujinx.HLE.HOS.Kernel.Memory
+{
+ class KSharedMemory
+ {
+ private KPageList _pageList;
+
+ private long _ownerPid;
+
+ private MemoryPermission _ownerPermission;
+ private MemoryPermission _userPermission;
+
+ public KSharedMemory(
+ KPageList pageList,
+ long ownerPid,
+ MemoryPermission ownerPermission,
+ MemoryPermission userPermission)
+ {
+ _pageList = pageList;
+ _ownerPid = ownerPid;
+ _ownerPermission = ownerPermission;
+ _userPermission = userPermission;
+ }
+
+ public KernelResult MapIntoProcess(
+ KMemoryManager memoryManager,
+ ulong address,
+ ulong size,
+ KProcess process,
+ MemoryPermission permission)
+ {
+ ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
+
+ if (_pageList.GetPagesCount() != pagesCountRounded)
+ {
+ return KernelResult.InvalidSize;
+ }
+
+ MemoryPermission expectedPermission = process.Pid == _ownerPid
+ ? _ownerPermission
+ : _userPermission;
+
+ if (permission != expectedPermission)
+ {
+ return KernelResult.InvalidPermission;
+ }
+
+ return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission);
+ }
+
+ public KernelResult UnmapFromProcess(
+ KMemoryManager memoryManager,
+ ulong address,
+ ulong size,
+ KProcess process)
+ {
+ ulong pagesCountRounded = BitUtils.DivRoundUp(size, KMemoryManager.PageSize);
+
+ if (_pageList.GetPagesCount() != pagesCountRounded)
+ {
+ return KernelResult.InvalidSize;
+ }
+
+ return memoryManager.UnmapPages(address, _pageList, MemoryState.SharedMemory);
+ }
+ }
+} \ No newline at end of file