aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-07-17 01:19:07 -0300
committerGitHub <noreply@github.com>2020-07-17 14:19:07 +1000
commit9f6b24edfddf871320290463437b3f3cb7e29006 (patch)
tree4b8b45db5fe931ac37f843778c58a2d676fe3fba /Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
parent46f8cef6a9e4a305803f1356446e25ce54909130 (diff)
Improve kernel IPC related syscalls (#1379)
* Implement session count decrement when the handle is closed * Remove unused field * Implement SendSyncRequestWithUserBuffer, SendAsyncRequestWithUserBuffer and ReplyAndReceiveWithUserBuffer syscalls * Nits * Fix swapped copy dst/src * Add missing pointer buffer descriptor write on reply * Fix IPC unaligned buffer copy and restoring client attributes on reply * Oops * Fix SetIpcMappingPermission * Fix unaligned copy bugs * Free memory used for temporary IPC buffers
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs')
-rw-r--r--Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs34
1 files changed, 31 insertions, 3 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
index b99dd1cb..262058d9 100644
--- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
+++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs
@@ -13,18 +13,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
public ChannelState State { get; set; }
+ public KClientPort ParentPort { get; }
+
// TODO: Remove that, we need it for now to allow HLE
// services implementation to work with the new IPC system.
public IpcService Service { get; set; }
- public KClientSession(KernelContext context, KSession parent) : base(context)
+ public KClientSession(KernelContext context, KSession parent, KClientPort parentPort) : base(context)
{
- _parent = parent;
+ _parent = parent;
+ ParentPort = parentPort;
+
+ parentPort?.IncrementReferenceCount();
State = ChannelState.Open;
CreatorProcess = context.Scheduler.GetCurrentProcess();
-
CreatorProcess.IncrementReferenceCount();
}
@@ -51,6 +55,30 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
return result;
}
+ public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
+ {
+ KThread currentThread = KernelContext.Scheduler.GetCurrentThread();
+
+ KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize, asyncEvent);
+
+ KernelContext.CriticalSection.Enter();
+
+ KernelResult result = _parent.ServerSession.EnqueueRequest(request);
+
+ KernelContext.CriticalSection.Leave();
+
+ return result;
+ }
+
+ public void DisconnectFromPort()
+ {
+ if (ParentPort != null)
+ {
+ ParentPort.Disconnect();
+ ParentPort.DecrementReferenceCount();
+ }
+ }
+
protected override void Destroy()
{
_parent.DisconnectClient();