diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-07-17 01:19:07 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-17 14:19:07 +1000 |
| commit | 9f6b24edfddf871320290463437b3f3cb7e29006 (patch) | |
| tree | 4b8b45db5fe931ac37f843778c58a2d676fe3fba /Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs | |
| parent | 46f8cef6a9e4a305803f1356446e25ce54909130 (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.cs | 34 |
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(); |
