diff options
Diffstat (limited to 'Ryujinx.HLE')
75 files changed, 919 insertions, 830 deletions
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index 288c308a..a8b5be33 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -36,6 +36,7 @@ using Ryujinx.HLE.HOS.Services.SurfaceFlinger; using Ryujinx.HLE.HOS.Services.Time.Clock; using Ryujinx.HLE.HOS.SystemState; using Ryujinx.HLE.Loaders.Executables; +using Ryujinx.Horizon; using System; using System.Collections.Generic; using System.IO; @@ -319,6 +320,42 @@ namespace Ryujinx.HLE.HOS ViServer = new ServerBase(KernelContext, "ViServerU"); ViServerM = new ServerBase(KernelContext, "ViServerM"); ViServerS = new ServerBase(KernelContext, "ViServerS"); + + StartNewServices(); + } + + private void StartNewServices() + { + var services = ServiceTable.GetServices(new HorizonOptions(Device.Configuration.IgnoreMissingServices)); + + foreach (var service in services) + { + const ProcessCreationFlags flags = + ProcessCreationFlags.EnableAslr | + ProcessCreationFlags.AddressSpace64Bit | + ProcessCreationFlags.Is64Bit | + ProcessCreationFlags.PoolPartitionSystem; + + ProcessCreationInfo creationInfo = new ProcessCreationInfo("Service", 1, 0, 0x8000000, 1, flags, 0, 0); + + int[] defaultCapabilities = new int[] + { + 0x030363F7, + 0x1FFFFFCF, + 0x207FFFEF, + 0x47E0060F, + 0x0048BFFF, + 0x01007FFF + }; + + // TODO: + // - Pass enough information (capabilities, process creation info, etc) on ServiceEntry for proper initialization. + // - Have the ThreadStart function take the syscall, address space and thread context parameters instead of passing them here. + KernelStatic.StartInitialProcess(KernelContext, creationInfo, defaultCapabilities, 44, () => + { + service.Start(KernelContext.Syscall, KernelStatic.GetCurrentProcess().CpuMemory, KernelStatic.GetCurrentThread().ThreadContext); + }); + } } public void LoadKip(string kipPath) diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KAutoObject.cs b/Ryujinx.HLE/HOS/Kernel/Common/KAutoObject.cs index a94b280f..424bf788 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KAutoObject.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KAutoObject.cs @@ -1,3 +1,4 @@ +using Ryujinx.Horizon.Common; using System.Diagnostics; using System.Threading; @@ -16,24 +17,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Common _referenceCount = 1; } - public virtual KernelResult SetName(string name) + public virtual Result SetName(string name) { if (!KernelContext.AutoObjectNames.TryAdd(name, this)) { return KernelResult.InvalidState; } - return KernelResult.Success; + return Result.Success; } - public static KernelResult RemoveName(KernelContext context, string name) + public static Result RemoveName(KernelContext context, string name) { if (!context.AutoObjectNames.TryRemove(name, out _)) { return KernelResult.NotFound; } - return KernelResult.Success; + return Result.Success; } public static KAutoObject FindNamedObject(KernelContext context, string name) diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs b/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs index 7caff21a..b1a602f1 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KResourceLimit.cs @@ -1,5 +1,6 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Kernel.Common @@ -159,7 +160,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common } } - public KernelResult SetLimitValue(LimitableResource resource, long limit) + public Result SetLimitValue(LimitableResource resource, long limit) { int index = GetIndex(resource); @@ -170,7 +171,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common _limit[index] = limit; _peak[index] = _current[index]; - return KernelResult.Success; + return Result.Success; } else { diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs b/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs index 9829ae03..efa2a480 100644 --- a/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs +++ b/Ryujinx.HLE/HOS/Kernel/Common/KernelInit.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Kernel.Common @@ -21,9 +22,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Common public static void InitializeResourceLimit(KResourceLimit resourceLimit, MemorySize size) { - void EnsureSuccess(KernelResult result) + void EnsureSuccess(Result result) { - if (result != KernelResult.Success) + if (result != Result.Success) { throw new InvalidOperationException($"Unexpected result \"{result}\"."); } diff --git a/Ryujinx.HLE/HOS/Kernel/Common/KernelResult.cs b/Ryujinx.HLE/HOS/Kernel/Common/KernelResult.cs deleted file mode 100644 index 357b01ea..00000000 --- a/Ryujinx.HLE/HOS/Kernel/Common/KernelResult.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Ryujinx.HLE.HOS.Kernel.Common -{ - enum KernelResult - { - Success = 0, - SessionCountExceeded = 0xe01, - InvalidCapability = 0x1c01, - ThreadNotStarted = 0x7201, - ThreadTerminating = 0x7601, - InvalidSize = 0xca01, - InvalidAddress = 0xcc01, - OutOfResource = 0xce01, - OutOfMemory = 0xd001, - HandleTableFull = 0xd201, - InvalidMemState = 0xd401, - InvalidPermission = 0xd801, - InvalidMemRange = 0xdc01, - InvalidPriority = 0xe001, - InvalidCpuCore = 0xe201, - InvalidHandle = 0xe401, - UserCopyFailed = 0xe601, - InvalidCombination = 0xe801, - TimedOut = 0xea01, - Cancelled = 0xec01, - MaximumExceeded = 0xee01, - InvalidEnumValue = 0xf001, - NotFound = 0xf201, - InvalidThread = 0xf401, - PortRemoteClosed = 0xf601, - InvalidState = 0xfa01, - ReservedValue = 0xfc01, - PortClosed = 0x10601, - ResLimitExceeded = 0x10801, - OutOfVaSpace = 0x20601, - CmdBufferTooSmall = 0x20801 - } -}
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Common/OnScopeExit.cs b/Ryujinx.HLE/HOS/Kernel/Common/OnScopeExit.cs deleted file mode 100644 index d805a4e1..00000000 --- a/Ryujinx.HLE/HOS/Kernel/Common/OnScopeExit.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Ryujinx.HLE.HOS.Kernel.Common -{ - readonly struct OnScopeExit : IDisposable - { - private readonly Action _action; - public OnScopeExit(Action action) => _action = action; - public void Dispose() => _action(); - } -} diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs index 5726299b..593d2c9d 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KBufferDescriptorTable.cs @@ -1,6 +1,6 @@ using Ryujinx.Common; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.Horizon.Common; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -20,38 +20,38 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _exchangeBufferDescriptors = new List<KBufferDescriptor>(MaxInternalBuffersCount); } - public KernelResult AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddSendBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_sendBufferDescriptors, src, dst, size, state); } - public KernelResult AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddReceiveBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_receiveBufferDescriptors, src, dst, size, state); } - public KernelResult AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state) + public Result AddExchangeBuffer(ulong src, ulong dst, ulong size, MemoryState state) { return Add(_exchangeBufferDescriptors, src, dst, size, state); } - private KernelResult Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state) + private Result Add(List<KBufferDescriptor> list, ulong src, ulong dst, ulong size, MemoryState state) { if (list.Count < MaxInternalBuffersCount) { list.Add(new KBufferDescriptor(src, dst, size, state)); - return KernelResult.Success; + return Result.Success; } return KernelResult.OutOfMemory; } - public KernelResult CopyBuffersToClient(KPageTableBase memoryManager) + public Result CopyBuffersToClient(KPageTableBase memoryManager) { - KernelResult result = CopyToClient(memoryManager, _receiveBufferDescriptors); + Result result = CopyToClient(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return CopyToClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result CopyToClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor desc in list) { @@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc copySize = desc.Size; } - KernelResult result = memoryManager.CopyDataFromCurrentProcess( + Result result = memoryManager.CopyDataFromCurrentProcess( desc.ClientAddress, copySize, stateMask, @@ -104,7 +104,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, desc.ServerAddress); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (clientEndAddrTruncated < clientEndAddrRounded && (clientAddrTruncated == clientAddrRounded || clientAddrTruncated < clientEndAddrTruncated)) { - KernelResult result = memoryManager.CopyDataFromCurrentProcess( + Result result = memoryManager.CopyDataFromCurrentProcess( clientEndAddrTruncated, clientEndAddr - clientEndAddrTruncated, stateMask, @@ -130,28 +130,28 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, serverEndAddrTruncated); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } } - return KernelResult.Success; + return Result.Success; } - public KernelResult UnmapServerBuffers(KPageTableBase memoryManager) + public Result UnmapServerBuffers(KPageTableBase memoryManager) { - KernelResult result = UnmapServer(memoryManager, _sendBufferDescriptors); + Result result = UnmapServer(memoryManager, _sendBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = UnmapServer(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -159,36 +159,36 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return UnmapServer(memoryManager, _exchangeBufferDescriptors); } - private KernelResult UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result UnmapServer(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { - KernelResult result = memoryManager.UnmapNoAttributeIfStateEquals( + Result result = memoryManager.UnmapNoAttributeIfStateEquals( descriptor.ServerAddress, descriptor.Size, descriptor.State); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } - return KernelResult.Success; + return Result.Success; } - public KernelResult RestoreClientBuffers(KPageTableBase memoryManager) + public Result RestoreClientBuffers(KPageTableBase memoryManager) { - KernelResult result = RestoreClient(memoryManager, _sendBufferDescriptors); + Result result = RestoreClient(memoryManager, _sendBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = RestoreClient(memoryManager, _receiveBufferDescriptors); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -196,22 +196,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return RestoreClient(memoryManager, _exchangeBufferDescriptors); } - private KernelResult RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) + private Result RestoreClient(KPageTableBase memoryManager, List<KBufferDescriptor> list) { foreach (KBufferDescriptor descriptor in list) { - KernelResult result = memoryManager.UnmapIpcRestorePermission( + Result result = memoryManager.UnmapIpcRestorePermission( descriptor.ClientAddress, descriptor.Size, descriptor.State); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } - return KernelResult.Success; + return Result.Success; } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs index 6e935077..eb7c5a41 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientPort.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -19,7 +20,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _parent = parent; } - public KernelResult Connect(out KClientSession clientSession) + public Result Connect(out KClientSession clientSession) { clientSession = null; @@ -40,9 +41,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KSession session = new KSession(KernelContext, this); - KernelResult result = _parent.EnqueueIncomingSession(session.ServerSession); + Result result = _parent.EnqueueIncomingSession(session.ServerSession); - if (result != KernelResult.Success) + if (result != Result.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); @@ -55,7 +56,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult ConnectLight(out KLightClientSession clientSession) + public Result ConnectLight(out KLightClientSession clientSession) { clientSession = null; @@ -76,9 +77,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KLightSession session = new KLightSession(KernelContext); - KernelResult result = _parent.EnqueueIncomingLightSession(session.ServerSession); + Result result = _parent.EnqueueIncomingLightSession(session.ServerSession); - if (result != KernelResult.Success) + if (result != Result.Success) { session.ClientSession.DecrementReferenceCount(); session.ServerSession.DecrementReferenceCount(); @@ -128,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - public new static KernelResult RemoveName(KernelContext context, string name) + public new static Result RemoveName(KernelContext context, string name) { KAutoObject foundObj = FindNamedObject(context, name); diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs index 7bbc3ba2..a24bcc31 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KClientSession.cs @@ -1,6 +1,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Ipc { @@ -27,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc CreatorProcess.IncrementReferenceCount(); } - public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -36,13 +37,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Enter(); currentThread.SignaledObj = null; - currentThread.ObjSyncResult = KernelResult.Success; + currentThread.ObjSyncResult = Result.Success; - KernelResult result = _parent.ServerSession.EnqueueRequest(request); + Result result = _parent.ServerSession.EnqueueRequest(request); KernelContext.CriticalSection.Leave(); - if (result == KernelResult.Success) + if (result == Result.Success) { result = currentThread.ObjSyncResult; } @@ -50,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result SendAsyncRequest(KWritableEvent asyncEvent, ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -58,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc KernelContext.CriticalSection.Enter(); - KernelResult result = _parent.ServerSession.EnqueueRequest(request); + Result result = _parent.ServerSession.EnqueueRequest(request); KernelContext.CriticalSection.Leave(); diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs index 2f67aeae..93f0f34c 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KPort.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Ipc { @@ -7,26 +8,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc public KServerPort ServerPort { get; } public KClientPort ClientPort { get; } - private long _nameAddress; + private string _name; private ChannelState _state; public bool IsLight { get; private set; } - public KPort(KernelContext context, int maxSessions, bool isLight, long nameAddress) : base(context) + public KPort(KernelContext context, int maxSessions, bool isLight, string name) : base(context) { ServerPort = new KServerPort(context, this); ClientPort = new KClientPort(context, this, maxSessions); - IsLight = isLight; - _nameAddress = nameAddress; + IsLight = isLight; + _name = name; _state = ChannelState.Open; } - public KernelResult EnqueueIncomingSession(KServerSession session) + public Result EnqueueIncomingSession(KServerSession session) { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -34,7 +35,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ServerPort.EnqueueIncomingSession(session); - result = KernelResult.Success; + result = Result.Success; } else { @@ -46,9 +47,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return result; } - public KernelResult EnqueueIncomingLightSession(KLightServerSession session) + public Result EnqueueIncomingLightSession(KLightServerSession session) { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -56,7 +57,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc { ServerPort.EnqueueIncomingLightSession(session); - result = KernelResult.Success; + result = Result.Success; } else { diff --git a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs index 199e78dc..9c2184d9 100644 --- a/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs +++ b/Ryujinx.HLE/HOS/Kernel/Ipc/KServerSession.cs @@ -3,6 +3,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System.Collections.Generic; namespace Ryujinx.HLE.HOS.Kernel.Ipc @@ -178,7 +179,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc _requests = new LinkedList<KSessionRequest>(); } - public KernelResult EnqueueRequest(KSessionRequest request) + public Result EnqueueRequest(KSessionRequest request) { if (_parent.ClientSession.State != ChannelState.Open) { @@ -203,10 +204,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc Signal(); } - return KernelResult.Success; + return Result.Success; } - public KernelResult Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; @@ -249,12 +250,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); - KernelResult serverResult = KernelResult.NotFound; - KernelResult clientResult = KernelResult.Success; + Result serverResult = KernelResult.NotFound; + Result clientResult = Result.Success; void CleanUpForError() { - if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == KernelResult.Success) + if (request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager) == Result.Success) { request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager); } @@ -348,7 +349,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc int newHandle = 0; int handle = clientProcess.CpuMemory.Read<int>(clientMsg.Address + offset * 4); - if (clientResult == KernelResult.Success && handle != 0) + if (clientResult == Result.Success && handle != 0) { clientResult = GetCopyObjectHandle(clientThread, serverProcess, handle, out newHandle); } @@ -365,7 +366,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (handle != 0) { - if (clientResult == KernelResult.Success) + if (clientResult == Result.Success) { clientResult = GetMoveObjectHandle(clientProcess, serverProcess, handle, out newHandle); } @@ -380,7 +381,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc offset++; } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -412,7 +413,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ref recvListDstOffset, out ulong recvListBufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -429,7 +430,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.Uncached, MemoryAttribute.None); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -498,7 +499,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc notReceiveDesc, out dstAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -518,7 +519,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc clientResult = request.BufferDescriptorTable.AddExchangeBuffer(bufferAddress, dstAddress, bufferSize, state); } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -573,7 +574,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc serverProcess.CpuMemory.Write(copyDst, clientProcess.CpuMemory.GetSpan(copySrc, (int)copySize)); } - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -581,10 +582,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - return KernelResult.Success; + return Result.Success; } - public KernelResult Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) + public Result Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0) { KThread serverThread = KernelStatic.GetCurrentThread(); KProcess serverProcess = serverThread.Owner; @@ -618,8 +619,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MessageHeader clientHeader = GetClientMessageHeader(clientProcess, clientMsg); MessageHeader serverHeader = GetServerMessageHeader(serverMsg); - KernelResult clientResult = KernelResult.Success; - KernelResult serverResult = KernelResult.Success; + Result clientResult = Result.Success; + Result serverResult = Result.Success; void CleanUpForError() { @@ -683,7 +684,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc // Copy receive and exchange buffers. clientResult = request.BufferDescriptorTable.CopyBuffersToClient(clientProcess.MemoryManager); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -734,7 +735,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (handle != 0) { - if (clientResult == KernelResult.Success) + if (clientResult == Result.Success) { clientResult = GetMoveObjectHandle(serverProcess, clientProcess, handle, out newHandle); } @@ -776,7 +777,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc ref recvListDstOffset, out recvListBufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -793,7 +794,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc MemoryAttribute.None, descriptor.BufferAddress); - if (clientResult != KernelResult.Success) + if (clientResult != Result.Success) { CleanUpForError(); @@ -888,7 +889,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return new MessageHeader(word0, word1, word2); } - private KernelResult GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) + private Result GetCopyObjectHandle(KThread srcThread, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -919,7 +920,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private KernelResult GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) + private Result GetMoveObjectHandle(KProcess srcProcess, KProcess dstProcess, int srcHandle, out int dstHandle) { dstHandle = 0; @@ -927,7 +928,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc if (obj != null) { - KernelResult result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle); + Result result = dstProcess.HandleTable.GenerateHandle(obj, out dstHandle); srcProcess.HandleTable.CloseHandle(srcHandle); @@ -964,7 +965,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return receiveList; } - private KernelResult GetReceiveListAddress( + private Result GetReceiveListAddress( PointerBufferDesc descriptor, Message message, uint recvListType, @@ -1038,7 +1039,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc address = recvListBufferAddress; - return KernelResult.Success; + return Result.Success; } private void CloseAllHandles(Message message, MessageHeader header, KProcess process) @@ -1166,19 +1167,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc return hasRequest; } - private void FinishRequest(KSessionRequest request, KernelResult result) + private void FinishRequest(KSessionRequest request, Result result) { KProcess clientProcess = request.ClientThread.Owner; KProcess serverProcess = request.ServerProcess; - KernelResult unmapResult = KernelResult.Success; + Result unmapResult = Result.Success; if (serverProcess != null) { unmapResult = request.BufferDescriptorTable.UnmapServerBuffers(serverProcess.MemoryManager); } - if (unmapResult == KernelResult.Success) + if (unmapResult == Result.Success) { request.BufferDescriptorTable.RestoreClientBuffers(clientProcess.MemoryManager); } @@ -1186,7 +1187,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc WakeClientThread(request, result); } - private void WakeClientThread(KSessionRequest request, KernelResult result) + private void WakeClientThread(KSessionRequest request, Result result) { // Wait client thread waiting for a response for the given request. if (request.AsyncEvent != null) @@ -1203,16 +1204,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc } } - private void SendResultToAsyncRequestClient(KSessionRequest request, KernelResult result) + private void SendResultToAsyncRequestClient(KSessionRequest request, Result result) { KProcess clientProcess = request.ClientThread.Owner; - if (result != KernelResult.Success) + if (result != Result.Success) { ulong address = request.CustomCmdBuffAddr; clientProcess.CpuMemory.Write<ulong>(address, 0); - clientProcess.CpuMemory.Write(address + 8, (int)result); + clientProcess.CpuMemory.Write(address + 8, result.ErrorCode); } clientProcess.MemoryManager.UnborrowIpcBuffer(request.CustomCmdBuffAddr, request.CustomCmdBuffSize); @@ -1220,24 +1221,24 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc request.AsyncEvent.Signal(); } - private void WakeServerThreads(KernelResult result) + private void WakeServerThreads(Result result) { // Wake all server threads waiting for requests. KernelContext.CriticalSection.Enter(); foreach (KThread thread in WaitingThreads) { - WakeAndSetResult(thread, result); + WakeAndSetResult(thread, result, this); } KernelContext.CriticalSection.Leave(); } - private void WakeAndSetResult(KThread thread, KernelResult result) + private void WakeAndSetResult(KThread thread, Result result, KSynchronizationObject signaledObj = null) { if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused) { - thread.SignaledObj = null; + thread.SignaledObj = signaledObj; thread.ObjSyncResult = result; thread.Reschedule(ThreadSchedState.Running); diff --git a/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs b/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs index 625a007d..18cf212a 100644 --- a/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs +++ b/Ryujinx.HLE/HOS/Kernel/KernelStatic.cs @@ -2,6 +2,7 @@ using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Threading; @@ -15,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Kernel [ThreadStatic] private static KThread CurrentThread; - public static KernelResult StartInitialProcess( + public static Result StartInitialProcess( KernelContext context, ProcessCreationInfo creationInfo, ReadOnlySpan<int> capabilities, @@ -24,7 +25,7 @@ namespace Ryujinx.HLE.HOS.Kernel { KProcess process = new KProcess(context); - KernelResult result = process.Initialize( + Result result = process.Initialize( creationInfo, capabilities, context.ResourceLimit, @@ -32,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Kernel null, customThreadStart); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs index 05cf4a4f..11474e49 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KCodeMemory.cs @@ -1,6 +1,7 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System; using System.Diagnostics; @@ -21,13 +22,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _lock = new object(); } - public KernelResult Initialize(ulong address, ulong size) + public Result Initialize(ulong address, ulong size) { Owner = KernelStatic.GetCurrentProcess(); - KernelResult result = Owner.MemoryManager.BorrowCodeMemory(_pageList, address, size); + Result result = Owner.MemoryManager.BorrowCodeMemory(_pageList, address, size); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -39,10 +40,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isMapped = false; _isOwnerMapped = false; - return KernelResult.Success; + return Result.Success; } - public KernelResult Map(ulong address, ulong size, KMemoryPermission perm) + public Result Map(ulong address, ulong size, KMemoryPermission perm) { if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, (ulong)KPageTableBase.PageSize)) { @@ -58,9 +59,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KProcess process = KernelStatic.GetCurrentProcess(); - KernelResult result = process.MemoryManager.MapPages(address, _pageList, MemoryState.CodeWritable, KMemoryPermission.ReadAndWrite); + Result result = process.MemoryManager.MapPages(address, _pageList, MemoryState.CodeWritable, KMemoryPermission.ReadAndWrite); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -68,10 +69,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isMapped = true; } - return KernelResult.Success; + return Result.Success; } - public KernelResult MapToOwner(ulong address, ulong size, KMemoryPermission permission) + public Result MapToOwner(ulong address, ulong size, KMemoryPermission permission) { if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, (ulong)KPageTableBase.PageSize)) { @@ -87,9 +88,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Debug.Assert(permission == KMemoryPermission.Read || permission == KMemoryPermission.ReadAndExecute); - KernelResult result = Owner.MemoryManager.MapPages(address, _pageList, MemoryState.CodeReadOnly, permission); + Result result = Owner.MemoryManager.MapPages(address, _pageList, MemoryState.CodeReadOnly, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -97,10 +98,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isOwnerMapped = true; } - return KernelResult.Success; + return Result.Success; } - public KernelResult Unmap(ulong address, ulong size) + public Result Unmap(ulong address, ulong size) { if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, (ulong)KPageTableBase.PageSize)) { @@ -111,9 +112,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { KProcess process = KernelStatic.GetCurrentProcess(); - KernelResult result = process.MemoryManager.UnmapPages(address, _pageList, MemoryState.CodeWritable); + Result result = process.MemoryManager.UnmapPages(address, _pageList, MemoryState.CodeWritable); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -123,10 +124,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isMapped = false; } - return KernelResult.Success; + return Result.Success; } - public KernelResult UnmapFromOwner(ulong address, ulong size) + public Result UnmapFromOwner(ulong address, ulong size) { if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize)) { @@ -135,9 +136,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory lock (_lock) { - KernelResult result = Owner.MemoryManager.UnmapPages(address, _pageList, MemoryState.CodeReadOnly); + Result result = Owner.MemoryManager.UnmapPages(address, _pageList, MemoryState.CodeReadOnly); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -147,7 +148,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isOwnerMapped = false; } - return KernelResult.Success; + return Result.Success; } protected override void Destroy() @@ -156,7 +157,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { ulong size = _pageList.GetPagesCount() * KPageTableBase.PageSize; - if (Owner.MemoryManager.UnborrowCodeMemory(_address, size, _pageList) != KernelResult.Success) + if (Owner.MemoryManager.UnborrowCodeMemory(_address, size, _pageList) != Result.Success) { throw new InvalidOperationException("Unexpected failure restoring transfer memory attributes."); } diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryBlockManager.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryBlockManager.cs index 9cfdfda3..e9146aeb 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryBlockManager.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryBlockManager.cs @@ -1,5 +1,5 @@ using Ryujinx.Common.Collections; -using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; using System.Diagnostics; namespace Ryujinx.HLE.HOS.Kernel.Memory @@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockTree = new IntrusiveRedBlackTree<KMemoryBlock>(); } - public KernelResult Initialize(ulong addrSpaceStart, ulong addrSpaceEnd, KMemoryBlockSlabManager slabManager) + public Result Initialize(ulong addrSpaceStart, ulong addrSpaceEnd, KMemoryBlockSlabManager slabManager) { _slabManager = slabManager; _addrSpaceStart = addrSpaceStart; @@ -43,7 +43,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KMemoryPermission.None, MemoryAttribute.None)); - return KernelResult.Success; + return Result.Success; } public void InsertBlock( diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs index 43d48946..5e6273b8 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KMemoryRegionManager.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; using System.Diagnostics; namespace Ryujinx.HLE.HOS.Kernel.Memory @@ -25,20 +25,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _pageHeap.UpdateUsedSize(); } - public KernelResult AllocatePages(out KPageList pageList, ulong pagesCount) + public Result AllocatePages(out KPageList pageList, ulong pagesCount) { if (pagesCount == 0) { pageList = new KPageList(); - return KernelResult.Success; + return Result.Success; } lock (_pageHeap) { - KernelResult result = AllocatePagesImpl(out pageList, pagesCount, false); + Result result = AllocatePagesImpl(out pageList, pagesCount, false); - if (result == KernelResult.Success) + if (result == Result.Success) { foreach (var node in pageList) { @@ -71,7 +71,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - private KernelResult AllocatePagesImpl(out KPageList pageList, ulong pagesCount, bool random) + private Result AllocatePagesImpl(out KPageList pageList, ulong pagesCount, bool random) { pageList = new KPageList(); @@ -95,9 +95,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory break; } - KernelResult result = pageList.AddRange(allocatedBlock, pagesPerAlloc); + Result result = pageList.AddRange(allocatedBlock, pagesPerAlloc); - if (result != KernelResult.Success) + if (result != Result.Success) { FreePages(pageList); _pageHeap.Free(allocatedBlock, pagesPerAlloc); @@ -116,7 +116,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfMemory; } - return KernelResult.Success; + return Result.Success; } private ulong AllocatePagesContiguousImpl(ulong pagesCount, ulong alignPages, bool random) diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs index 7f2f1ba6..3149faa9 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageList.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; using System.Collections; using System.Collections.Generic; @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Nodes = new LinkedList<KPageNode>(); } - public KernelResult AddRange(ulong address, ulong pagesCount) + public Result AddRange(ulong address, ulong pagesCount) { if (pagesCount != 0) { @@ -33,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Nodes.AddLast(new KPageNode(address, pagesCount)); } - return KernelResult.Success; + return Result.Success; } public ulong GetPagesCount() diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs index 9d521231..9b7c99ba 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTable.cs @@ -1,4 +1,4 @@ -using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Diagnostics; @@ -31,31 +31,31 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } /// <inheritdoc/> - protected override KernelResult MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission) + protected override Result MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission) { KPageList pageList = new KPageList(); GetPhysicalRegions(src, pagesCount * PageSize, pageList); - KernelResult result = Reprotect(src, pagesCount, KMemoryPermission.None); + Result result = Reprotect(src, pagesCount, KMemoryPermission.None); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = MapPages(dst, pageList, newDstPermission, false, 0); - if (result != KernelResult.Success) + if (result != Result.Success) { - KernelResult reprotectResult = Reprotect(src, pagesCount, oldSrcPermission); - Debug.Assert(reprotectResult == KernelResult.Success); + Result reprotectResult = Reprotect(src, pagesCount, oldSrcPermission); + Debug.Assert(reprotectResult == Result.Success); } return result; } /// <inheritdoc/> - protected override KernelResult UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission) + protected override Result UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission) { ulong size = pagesCount * PageSize; @@ -70,26 +70,26 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.InvalidMemRange; } - KernelResult result = Unmap(dst, pagesCount); + Result result = Unmap(dst, pagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = Reprotect(src, pagesCount, newSrcPermission); - if (result != KernelResult.Success) + if (result != Result.Success) { - KernelResult mapResult = MapPages(dst, dstPageList, oldDstPermission, false, 0); - Debug.Assert(mapResult == KernelResult.Success); + Result mapResult = MapPages(dst, dstPageList, oldDstPermission, false, 0); + Debug.Assert(mapResult == Result.Success); } return result; } /// <inheritdoc/> - protected override KernelResult MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages, byte fillValue) + protected override Result MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages, byte fillValue) { ulong size = pagesCount * PageSize; @@ -107,11 +107,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _cpuMemory.Fill(dstVa, size, fillValue); } - return KernelResult.Success; + return Result.Success; } /// <inheritdoc/> - protected override KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages, byte fillValue) + protected override Result MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages, byte fillValue) { using var scopedPageList = new KScopedPageList(Context.MemoryManager, pageList); @@ -136,11 +136,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory scopedPageList.SignalSuccess(); - return KernelResult.Success; + return Result.Success; } /// <inheritdoc/> - protected override KernelResult Unmap(ulong address, ulong pagesCount) + protected override Result Unmap(ulong address, ulong pagesCount) { KPageList pagesToClose = new KPageList(); @@ -159,21 +159,21 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory pagesToClose.DecrementPagesReferenceCount(Context.MemoryManager); - return KernelResult.Success; + return Result.Success; } /// <inheritdoc/> - protected override KernelResult Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission) + protected override Result Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission) { // TODO. - return KernelResult.Success; + return Result.Success; } /// <inheritdoc/> - protected override KernelResult ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission) + protected override Result ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission) { // TODO. - return KernelResult.Success; + return Result.Success; } /// <inheritdoc/> diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs index 2c94cba2..e19e22c8 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KPageTableBase.cs @@ -1,6 +1,7 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; using System.Diagnostics; @@ -88,7 +89,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory private static readonly int[] AddrSpaceSizes = new int[] { 32, 36, 32, 39 }; - public KernelResult InitializeForProcess( + public Result InitializeForProcess( AddressSpaceType addrSpaceType, bool aslrEnabled, bool aslrDisabled, @@ -107,7 +108,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong addrSpaceBase = 0; ulong addrSpaceSize = 1UL << AddrSpaceSizes[(int)addrSpaceType]; - KernelResult result = CreateUserAddressSpace( + Result result = CreateUserAddressSpace( addrSpaceType, aslrEnabled, aslrDisabled, @@ -118,7 +119,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory size, slabManager); - if (result != KernelResult.Success) + if (result != Result.Success) { Context.ContextIdManager.PutId(_contextId); } @@ -134,7 +135,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory public ulong AslrOffset; } - private KernelResult CreateUserAddressSpace( + private Result CreateUserAddressSpace( AddressSpaceType addrSpaceType, bool aslrEnabled, bool aslrDisabled, @@ -342,7 +343,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult MapPages(ulong address, KPageList pageList, MemoryState state, KMemoryPermission permission) + public Result MapPages(ulong address, KPageList pageList, MemoryState state, KMemoryPermission permission) { ulong pagesCount = pageList.GetPagesCount(); @@ -365,9 +366,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfResource; } - KernelResult result = MapPages(address, pageList, permission); + Result result = MapPages(address, pageList, permission); - if (result == KernelResult.Success) + if (result == Result.Success) { _blockManager.InsertBlock(address, pagesCount, state, permission); } @@ -376,7 +377,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected) + public Result UnmapPages(ulong address, KPageList pageList, MemoryState stateExpected) { ulong pagesCount = pageList.GetPagesCount(); ulong size = pagesCount * PageSize; @@ -430,9 +431,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfResource; } - KernelResult result = Unmap(address, pagesCount); + Result result = Unmap(address, pagesCount); - if (result == KernelResult.Success) + if (result == Result.Success) { _blockManager.InsertBlock(address, pagesCount, MemoryState.Unmapped); } @@ -446,19 +447,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult MapNormalMemory(long address, long size, KMemoryPermission permission) + public Result MapNormalMemory(long address, long size, KMemoryPermission permission) { // TODO. - return KernelResult.Success; + return Result.Success; } - public KernelResult MapIoMemory(long address, long size, KMemoryPermission permission) + public Result MapIoMemory(long address, long size, KMemoryPermission permission) { // TODO. - return KernelResult.Success; + return Result.Success; } - public KernelResult MapPages( + public Result MapPages( ulong pagesCount, int alignment, ulong srcPa, @@ -497,7 +498,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfResource; } - KernelResult result; + Result result; if (paIsValid) { @@ -508,7 +509,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory result = AllocateAndMapPages(address, pagesCount, permission); } - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -516,10 +517,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, state, permission); } - return KernelResult.Success; + return Result.Success; } - public KernelResult MapPages(ulong address, ulong pagesCount, MemoryState state, KMemoryPermission permission) + public Result MapPages(ulong address, ulong pagesCount, MemoryState state, KMemoryPermission permission) { ulong size = pagesCount * PageSize; @@ -540,9 +541,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfResource; } - KernelResult result = AllocateAndMapPages(address, pagesCount, permission); + Result result = AllocateAndMapPages(address, pagesCount, permission); - if (result == KernelResult.Success) + if (result == Result.Success) { _blockManager.InsertBlock(address, pagesCount, state, permission); } @@ -551,13 +552,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - private KernelResult AllocateAndMapPages(ulong address, ulong pagesCount, KMemoryPermission permission) + private Result AllocateAndMapPages(ulong address, ulong pagesCount, KMemoryPermission permission) { KMemoryRegionManager region = GetMemoryRegionManager(); - KernelResult result = region.AllocatePages(out KPageList pageList, pagesCount); + Result result = region.AllocatePages(out KPageList pageList, pagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -567,7 +568,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return MapPages(address, pageList, permission); } - public KernelResult MapProcessCodeMemory(ulong dst, ulong src, ulong size) + public Result MapProcessCodeMemory(ulong dst, ulong src, ulong size) { lock (_blockManager) { @@ -596,12 +597,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result = MapMemory(src, dst, pagesCount, permission, KMemoryPermission.None); + Result result = MapMemory(src, dst, pagesCount, permission, KMemoryPermission.None); _blockManager.InsertBlock(src, pagesCount, state, KMemoryPermission.None, MemoryAttribute.Borrowed); _blockManager.InsertBlock(dst, pagesCount, MemoryState.ModCodeStatic); - return KernelResult.Success; + return Result.Success; } else { @@ -610,7 +611,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnmapProcessCodeMemory(ulong dst, ulong src, ulong size) + public Result UnmapProcessCodeMemory(ulong dst, ulong src, ulong size) { lock (_blockManager) { @@ -656,9 +657,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { ulong pagesCount = size / PageSize; - KernelResult result = Unmap(dst, pagesCount); + Result result = Unmap(dst, pagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -673,7 +674,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped); _blockManager.InsertBlock(src, pagesCount, MemoryState.Heap, KMemoryPermission.ReadAndWrite); - return KernelResult.Success; + return Result.Success; } else { @@ -682,7 +683,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult SetHeapSize(ulong size, out ulong address) + public Result SetHeapSize(ulong size, out ulong address) { address = 0; @@ -712,7 +713,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KMemoryRegionManager region = GetMemoryRegionManager(); - KernelResult result = region.AllocatePages(out KPageList pageList, pagesCount); + Result result = region.AllocatePages(out KPageList pageList, pagesCount); using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); @@ -724,7 +725,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -747,7 +748,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory result = MapPages(_currentHeapAddr, pageList, KMemoryPermission.ReadAndWrite, true, (byte)_heapFillValue); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -786,9 +787,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = sizeDelta / PageSize; - KernelResult result = Unmap(freeAddr, pagesCount); + Result result = Unmap(freeAddr, pagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -803,10 +804,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory address = HeapRegionStart; - return KernelResult.Success; + return Result.Success; } - public KernelResult SetMemoryPermission(ulong address, ulong size, KMemoryPermission permission) + public Result SetMemoryPermission(ulong address, ulong size, KMemoryPermission permission) { lock (_blockManager) { @@ -833,9 +834,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result = Reprotect(address, pagesCount, permission); + Result result = Reprotect(address, pagesCount, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -843,7 +844,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, oldState, permission); } - return KernelResult.Success; + return Result.Success; } else { @@ -865,17 +866,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return _currentHeapAddr - HeapRegionStart; } - public KernelResult SetHeapCapacity(ulong capacity) + public Result SetHeapCapacity(ulong capacity) { lock (_blockManager) { _heapCapacity = capacity; } - return KernelResult.Success; + return Result.Success; } - public KernelResult SetMemoryAttribute( + public Result SetMemoryAttribute( ulong address, ulong size, MemoryAttribute attributeMask, @@ -909,7 +910,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, state, permission, attribute); - return KernelResult.Success; + return Result.Success; } else { @@ -942,7 +943,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult Map(ulong dst, ulong src, ulong size) + public Result Map(ulong dst, ulong src, ulong size) { bool success; @@ -973,9 +974,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result = MapMemory(src, dst, pagesCount, KMemoryPermission.ReadAndWrite, KMemoryPermission.ReadAndWrite); + Result result = MapMemory(src, dst, pagesCount, KMemoryPermission.ReadAndWrite, KMemoryPermission.ReadAndWrite); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -983,7 +984,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(src, pagesCount, srcState, KMemoryPermission.None, MemoryAttribute.Borrowed); _blockManager.InsertBlock(dst, pagesCount, MemoryState.Stack, KMemoryPermission.ReadAndWrite); - return KernelResult.Success; + return Result.Success; } else { @@ -992,7 +993,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnmapForKernel(ulong address, ulong pagesCount, MemoryState stateExpected) + public Result UnmapForKernel(ulong address, ulong pagesCount, MemoryState stateExpected) { ulong size = pagesCount * PageSize; @@ -1017,14 +1018,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return KernelResult.OutOfResource; } - KernelResult result = Unmap(address, pagesCount); + Result result = Unmap(address, pagesCount); - if (result == KernelResult.Success) + if (result == Result.Success) { _blockManager.InsertBlock(address, pagesCount, MemoryState.Unmapped); } - return KernelResult.Success; + return Result.Success; } else { @@ -1033,7 +1034,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult Unmap(ulong dst, ulong src, ulong size) + public Result Unmap(ulong dst, ulong src, ulong size) { bool success; @@ -1076,9 +1077,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result = UnmapMemory(dst, src, pagesCount, dstPermission, KMemoryPermission.ReadAndWrite); + Result result = UnmapMemory(dst, src, pagesCount, dstPermission, KMemoryPermission.ReadAndWrite); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -1086,7 +1087,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(src, pagesCount, srcState, KMemoryPermission.ReadAndWrite); _blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped); - return KernelResult.Success; + return Result.Success; } else { @@ -1095,7 +1096,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnmapProcessMemory(ulong dst, ulong size, KPageTableBase srcPageTable, ulong src) + public Result UnmapProcessMemory(ulong dst, ulong size, KPageTableBase srcPageTable, ulong src) { lock (_blockManager) { @@ -1153,20 +1154,20 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result = Unmap(dst, pagesCount); + Result result = Unmap(dst, pagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } _blockManager.InsertBlock(dst, pagesCount, MemoryState.Unmapped); - return KernelResult.Success; + return Result.Success; } } - public KernelResult SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission) + public Result SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission) { lock (_blockManager) { @@ -1213,7 +1214,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = size / PageSize; - KernelResult result; + Result result; if ((oldPermission & KMemoryPermission.Execute) != 0) { @@ -1224,7 +1225,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory result = Reprotect(address, pagesCount, permission); } - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -1232,7 +1233,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, newState, permission); } - return KernelResult.Success; + return Result.Success; } else { @@ -1241,7 +1242,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult MapPhysicalMemory(ulong address, ulong size) + public Result MapPhysicalMemory(ulong address, ulong size) { ulong endAddr = address + size; @@ -1259,7 +1260,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (mappedSize == size) { - return KernelResult.Success; + return Result.Success; } ulong remainingSize = size - mappedSize; @@ -1276,7 +1277,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KMemoryRegionManager region = GetMemoryRegionManager(); - KernelResult result = region.AllocatePages(out KPageList pageList, remainingPages); + Result result = region.AllocatePages(out KPageList pageList, remainingPages); using var _ = new OnScopeExit(() => pageList.DecrementPagesReferenceCount(Context.MemoryManager)); @@ -1285,7 +1286,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory currentProcess.ResourceLimit?.Release(LimitableResource.Memory, remainingSize); } - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1357,10 +1358,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory MemoryAttribute.None); } - return KernelResult.Success; + return Result.Success; } - public KernelResult UnmapPhysicalMemory(ulong address, ulong size) + public Result UnmapPhysicalMemory(ulong address, ulong size) { ulong endAddr = address + size; @@ -1391,7 +1392,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (heapMappedSize == 0) { - return KernelResult.Success; + return Result.Success; } if (!_slabManager.CanAllocate(MaxBlocksNeededForInsertion)) @@ -1400,7 +1401,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } // Try to unmap all the heap mapped memory inside range. - KernelResult result = KernelResult.Success; + Result result = Result.Success; foreach (KMemoryInfo info in IterateOverRange(address, endAddr)) { @@ -1416,11 +1417,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory // The kernel would attempt to remap if this fails, but we don't because: // - The implementation may not support remapping if memory aliasing is not supported on the platform. // - Unmap can't ever fail here anyway. - Debug.Assert(result == KernelResult.Success); + Debug.Assert(result == Result.Success); } } - if (result == KernelResult.Success) + if (result == Result.Success) { PhysicalMemoryUsage -= heapMappedSize; @@ -1437,7 +1438,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult CopyDataToCurrentProcess( + public Result CopyDataToCurrentProcess( ulong dst, ulong size, ulong src, @@ -1460,7 +1461,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory toServer: true); } - public KernelResult CopyDataFromCurrentProcess( + public Result CopyDataFromCurrentProcess( ulong dst, ulong size, MemoryState stateMask, @@ -1483,7 +1484,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory toServer: false); } - private KernelResult CopyDataFromOrToCurrentProcess( + private Result CopyDataFromOrToCurrentProcess( ulong size, ulong clientAddress, ulong serverAddress, @@ -1543,7 +1544,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory size -= copySize; } - return KernelResult.Success; + return Result.Success; } else { @@ -1552,7 +1553,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult MapBufferFromClientProcess( + public Result MapBufferFromClientProcess( ulong size, ulong src, KPageTableBase srcPageTable, @@ -1567,14 +1568,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { lock (_blockManager) { - KernelResult result = srcPageTable.ReprotectClientProcess( + Result result = srcPageTable.ReprotectClientProcess( src, size, permission, state, out int blocksNeeded); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -1590,7 +1591,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory result = MapPagesFromClientProcess(size, src, permission, state, srcPageTable, send, out ulong va); - if (result != KernelResult.Success) + if (result != Result.Success) { if (srcMapEndAddr > srcMapAddress) { @@ -1613,10 +1614,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - return KernelResult.Success; + return Result.Success; } - private KernelResult ReprotectClientProcess( + private Result ReprotectClientProcess( ulong address, ulong size, KMemoryPermission permission, @@ -1689,8 +1690,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong blockPagesCount = blockSize / PageSize; - KernelResult reprotectResult = Reprotect(blockAddress, blockPagesCount, info.Permission); - Debug.Assert(reprotectResult == KernelResult.Success); + Result reprotectResult = Reprotect(blockAddress, blockPagesCount, info.Permission); + Debug.Assert(reprotectResult == Result.Success); } } } @@ -1699,7 +1700,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory SignalMemoryTracking(addressTruncated, endAddrRounded - addressTruncated, false); // Reprotect the aligned pages range on the client to make them inaccessible from the client process. - KernelResult result; + Result result; if (addressRounded < endAddrTruncated) { @@ -1736,7 +1737,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { result = Reprotect(blockAddress, blockPagesCount, permissionMask); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1748,10 +1749,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - return KernelResult.Success; + return Result.Success; } - private KernelResult MapPagesFromClientProcess( + private Result MapPagesFromClientProcess( ulong size, ulong address, KMemoryPermission permission, @@ -1877,9 +1878,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Context.Memory.Fill(GetDramAddressFromPa(firstPageFillAddress), unusedSizeAfter, (byte)_ipcFillValue); } - KernelResult result = MapPages(currentVa, 1, dstFirstPagePa, permission); + Result result = MapPages(currentVa, 1, dstFirstPagePa, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1896,9 +1897,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory KPageList pageList = new KPageList(); srcPageTable.GetPhysicalRegions(addressRounded, alignedSize, pageList); - KernelResult result = MapPages(currentVa, pageList, permission); + Result result = MapPages(currentVa, pageList, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1931,9 +1932,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory Context.Memory.Fill(GetDramAddressFromPa(lastPageFillAddr), unusedSizeAfter, (byte)_ipcFillValue); - KernelResult result = MapPages(currentVa, 1, dstLastPagePa, permission); + Result result = MapPages(currentVa, 1, dstLastPagePa, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1945,10 +1946,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory dst = va + (address - addressTruncated); - return KernelResult.Success; + return Result.Success; } - public KernelResult UnmapNoAttributeIfStateEquals(ulong address, ulong size, MemoryState state) + public Result UnmapNoAttributeIfStateEquals(ulong address, ulong size, MemoryState state) { if (AddrSpaceStart > address) { @@ -1990,9 +1991,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong pagesCount = (endAddrRounded - addressTruncated) / PageSize; - KernelResult result = Unmap(addressTruncated, pagesCount); + Result result = Unmap(addressTruncated, pagesCount); - if (result == KernelResult.Success) + if (result == Result.Success) { _blockManager.InsertBlock(addressTruncated, pagesCount, MemoryState.Unmapped); } @@ -2006,7 +2007,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnmapIpcRestorePermission(ulong address, ulong size, MemoryState state) + public Result UnmapIpcRestorePermission(ulong address, ulong size, MemoryState state) { ulong endAddr = address + size; @@ -2019,7 +2020,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (pagesCount == 0) { - return KernelResult.Success; + return Result.Success; } MemoryState stateMask; @@ -2069,9 +2070,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory ulong blockPagesCount = blockSize / PageSize; - KernelResult result = Reprotect(blockAddress, blockPagesCount, info.SourcePermission); + Result result = Reprotect(blockAddress, blockPagesCount, info.SourcePermission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -2080,7 +2081,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(addressRounded, pagesCount, RestoreIpcMappingPermissions); - return KernelResult.Success; + return Result.Success; } } @@ -2094,7 +2095,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory block.RestoreIpcMappingPermission(); } - public KernelResult GetPagesIfStateEquals( + public Result GetPagesIfStateEquals( ulong address, ulong size, MemoryState stateMask, @@ -2128,7 +2129,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { GetPhysicalRegions(address, size, pageList); - return KernelResult.Success; + return Result.Success; } else { @@ -2137,7 +2138,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult BorrowIpcBuffer(ulong address, ulong size) + public Result BorrowIpcBuffer(ulong address, ulong size) { return SetAttributesAndChangePermission( address, @@ -2152,7 +2153,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory MemoryAttribute.Borrowed); } - public KernelResult BorrowTransferMemory(KPageList pageList, ulong address, ulong size, KMemoryPermission permission) + public Result BorrowTransferMemory(KPageList pageList, ulong address, ulong size, KMemoryPermission permission) { return SetAttributesAndChangePermission( address, @@ -2168,7 +2169,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory pageList); } - public KernelResult BorrowCodeMemory(KPageList pageList, ulong address, ulong size) + public Result BorrowCodeMemory(KPageList pageList, ulong address, ulong size) { return SetAttributesAndChangePermission( address, @@ -2184,7 +2185,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory pageList); } - private KernelResult SetAttributesAndChangePermission( + private Result SetAttributesAndChangePermission( ulong address, ulong size, MemoryState stateMask, @@ -2237,9 +2238,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (newPermission != oldPermission) { - KernelResult result = Reprotect(address, pagesCount, newPermission); + Result result = Reprotect(address, pagesCount, newPermission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -2249,7 +2250,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, oldState, newPermission, newAttribute); - return KernelResult.Success; + return Result.Success; } else { @@ -2258,7 +2259,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory } } - public KernelResult UnborrowIpcBuffer(ulong address, ulong size) + public Result UnborrowIpcBuffer(ulong address, ulong size) { return ClearAttributesAndChangePermission( address, @@ -2273,7 +2274,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory MemoryAttribute.Borrowed); } - public KernelResult UnborrowTransferMemory(ulong address, ulong size, KPageList pageList) + public Result UnborrowTransferMemory(ulong address, ulong size, KPageList pageList) { return ClearAttributesAndChangePermission( address, @@ -2289,7 +2290,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory pageList); } - public KernelResult UnborrowCodeMemory(ulong address, ulong size, KPageList pageList) + public Result UnborrowCodeMemory(ulong address, ulong size, KPageList pageList) { return ClearAttributesAndChangePermission( address, @@ -2305,7 +2306,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory pageList); } - private KernelResult ClearAttributesAndChangePermission( + private Result ClearAttributesAndChangePermission( ulong address, ulong size, MemoryState stateMask, @@ -2365,9 +2366,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory if (newPermission != oldPermission) { - KernelResult result = Reprotect(address, pagesCount, newPermission); + Result result = Reprotect(address, pagesCount, newPermission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -2377,7 +2378,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _blockManager.InsertBlock(address, pagesCount, oldState, newPermission, newAttribute); - return KernelResult.Success; + return Result.Success; } else { @@ -2915,7 +2916,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="oldSrcPermission">Current protection of the source memory region</param> /// <param name="newDstPermission">Desired protection for the destination memory region</param> /// <returns>Result of the mapping operation</returns> - protected abstract KernelResult MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission); + protected abstract Result MapMemory(ulong src, ulong dst, ulong pagesCount, KMemoryPermission oldSrcPermission, KMemoryPermission newDstPermission); /// <summary> /// Unmaps a region of memory that was previously mapped with <see cref="MapMemory"/>. @@ -2926,7 +2927,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="oldDstPermission">Current protection of the destination memory region</param> /// <param name="newSrcPermission">Desired protection of the source memory region</param> /// <returns>Result of the unmapping operation</returns> - protected abstract KernelResult UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission); + protected abstract Result UnmapMemory(ulong dst, ulong src, ulong pagesCount, KMemoryPermission oldDstPermission, KMemoryPermission newSrcPermission); /// <summary> /// Maps a region of memory into the specified physical memory region. @@ -2938,7 +2939,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="shouldFillPages">Indicate if the pages should be filled with the <paramref name="fillValue"/> value</param> /// <param name="fillValue">The value used to fill pages when <paramref name="shouldFillPages"/> is set to true</param> /// <returns>Result of the mapping operation</returns> - protected abstract KernelResult MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0); + protected abstract Result MapPages(ulong dstVa, ulong pagesCount, ulong srcPa, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0); /// <summary> /// Maps a region of memory into the specified physical memory region. @@ -2949,7 +2950,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="shouldFillPages">Indicate if the pages should be filled with the <paramref name="fillValue"/> value</param> /// <param name="fillValue">The value used to fill pages when <paramref name="shouldFillPages"/> is set to true</param> /// <returns>Result of the mapping operation</returns> - protected abstract KernelResult MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0); + protected abstract Result MapPages(ulong address, KPageList pageList, KMemoryPermission permission, bool shouldFillPages = false, byte fillValue = 0); /// <summary> /// Unmaps a region of memory that was previously mapped with one of the page mapping methods. @@ -2957,7 +2958,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="address">Virtual address of the region to unmap</param> /// <param name="pagesCount">Number of pages to unmap</param> /// <returns>Result of the unmapping operation</returns> - protected abstract KernelResult Unmap(ulong address, ulong pagesCount); + protected abstract Result Unmap(ulong address, ulong pagesCount); /// <summary> /// Changes the permissions of a given virtual memory region. @@ -2966,7 +2967,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="pagesCount">Number of pages to have their permissions changed</param> /// <param name="permission">New permission</param> /// <returns>Result of the permission change operation</returns> - protected abstract KernelResult Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission); + protected abstract Result Reprotect(ulong address, ulong pagesCount, KMemoryPermission permission); /// <summary> /// Changes the permissions of a given virtual memory region. @@ -2975,7 +2976,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory /// <param name="pagesCount">Number of pages to have their permissions changed</param> /// <param name="permission">New permission</param> /// <returns>Result of the permission change operation</returns> - protected abstract KernelResult ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission); + protected abstract Result ReprotectWithAttributes(ulong address, ulong pagesCount, KMemoryPermission permission); /// <summary> /// Alerts the memory tracking that a given region has been read from or written to. diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs index 3af62750..2dbaf3cd 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KSharedMemory.cs @@ -1,6 +1,7 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Memory { @@ -26,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _userPermission = userPermission; } - public KernelResult MapIntoProcess( + public Result MapIntoProcess( KPageTableBase memoryManager, ulong address, ulong size, @@ -50,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return memoryManager.MapPages(address, _pageList, MemoryState.SharedMemory, permission); } - public KernelResult UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process) + public Result UnmapFromProcess(KPageTableBase memoryManager, ulong address, ulong size, KProcess process) { if (_pageList.GetPagesCount() != BitUtils.DivRoundUp<ulong>(size, KPageTableBase.PageSize)) { diff --git a/Ryujinx.HLE/HOS/Kernel/Memory/KTransferMemory.cs b/Ryujinx.HLE/HOS/Kernel/Memory/KTransferMemory.cs index 2888efb8..b2449598 100644 --- a/Ryujinx.HLE/HOS/Kernel/Memory/KTransferMemory.cs +++ b/Ryujinx.HLE/HOS/Kernel/Memory/KTransferMemory.cs @@ -1,6 +1,7 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Kernel.Memory @@ -36,15 +37,15 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory _isMapped = false; } - public KernelResult Initialize(ulong address, ulong size, KMemoryPermission permission) + public Result Initialize(ulong address, ulong size, KMemoryPermission permission) { KProcess creator = KernelStatic.GetCurrentProcess(); _creator = creator; - KernelResult result = creator.MemoryManager.BorrowTransferMemory(_pageList, address, size, permission); + Result result = creator.MemoryManager.BorrowTransferMemory(_pageList, address, size, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -60,7 +61,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return result; } - public KernelResult MapIntoProcess( + public Result MapIntoProcess( KPageTableBase memoryManager, ulong address, ulong size, @@ -79,9 +80,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory; - KernelResult result = memoryManager.MapPages(address, _pageList, state, KMemoryPermission.ReadAndWrite); + Result result = memoryManager.MapPages(address, _pageList, state, KMemoryPermission.ReadAndWrite); - if (result == KernelResult.Success) + if (result == Result.Success) { _isMapped = true; } @@ -89,7 +90,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory return result; } - public KernelResult UnmapFromProcess( + public Result UnmapFromProcess( KPageTableBase memoryManager, ulong address, ulong size, @@ -102,9 +103,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory MemoryState state = Permission == KMemoryPermission.None ? MemoryState.TransferMemoryIsolated : MemoryState.TransferMemory; - KernelResult result = memoryManager.UnmapPages(address, _pageList, state); + Result result = memoryManager.UnmapPages(address, _pageList, state); - if (result == KernelResult.Success) + if (result == Result.Success) { _isMapped = false; } @@ -116,7 +117,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory { if (_hasBeenInitialized) { - if (!_isMapped && _creator.MemoryManager.UnborrowTransferMemory(Address, Size, _pageList) != KernelResult.Success) + if (!_isMapped && _creator.MemoryManager.UnborrowTransferMemory(Address, Size, _pageList) != Result.Success) { throw new InvalidOperationException("Unexpected failure restoring transfer memory attributes."); } diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KHandleTable.cs b/Ryujinx.HLE/HOS/Kernel/Process/KHandleTable.cs index bcbb3b03..c15ebef5 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KHandleTable.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KHandleTable.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Kernel.Process @@ -27,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process _context = context; } - public KernelResult Initialize(int size) + public Result Initialize(int size) { if ((uint)size > 1024) { @@ -62,10 +63,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process _nextFreeEntry = _tableHead; - return KernelResult.Success; + return Result.Success; } - public KernelResult GenerateHandle(KAutoObject obj, out int handle) + public Result GenerateHandle(KAutoObject obj, out int handle) { handle = 0; @@ -99,10 +100,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - return KernelResult.Success; + return Result.Success; } - public KernelResult ReserveHandle(out int handle) + public Result ReserveHandle(out int handle) { handle = 0; @@ -131,7 +132,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - return KernelResult.Success; + return Result.Success; } public void CancelHandleReservation(int handle) diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index 6a2d45ea..8d9cd242 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -5,6 +5,7 @@ using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Collections.Generic; @@ -116,7 +117,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process Debugger = new HleProcessDebugger(this); } - public KernelResult InitializeKip( + public Result InitializeKip( ProcessCreationInfo creationInfo, ReadOnlySpan<int> capabilities, KPageList pageList, @@ -151,7 +152,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ? KernelContext.LargeMemoryBlockSlabManager : KernelContext.SmallMemoryBlockSlabManager; - KernelResult result = MemoryManager.InitializeForProcess( + Result result = MemoryManager.InitializeForProcess( addrSpaceType, aslrEnabled, !aslrEnabled, @@ -160,7 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process codeSize, slabManager); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -172,14 +173,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = MemoryManager.MapPages(codeAddress, pageList, MemoryState.CodeStatic, KMemoryPermission.None); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = Capabilities.InitializeForKernel(capabilities, MemoryManager); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -187,7 +188,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return ParseProcessInfo(creationInfo); } - public KernelResult Initialize( + public Result Initialize( ProcessCreationInfo creationInfo, ReadOnlySpan<int> capabilities, KResourceLimit resourceLimit, @@ -255,7 +256,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ulong codeSize = codePagesCount * KPageTableBase.PageSize; - KernelResult result = MemoryManager.InitializeForProcess( + Result result = MemoryManager.InitializeForProcess( addrSpaceType, aslrEnabled, !aslrEnabled, @@ -264,7 +265,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process codeSize, slabManager); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -284,7 +285,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process MemoryState.CodeStatic, KMemoryPermission.None); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -293,7 +294,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = Capabilities.InitializeForUser(capabilities, MemoryManager); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -302,7 +303,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = ParseProcessInfo(creationInfo); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); } @@ -310,7 +311,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - private KernelResult ParseProcessInfo(ProcessCreationInfo creationInfo) + private Result ParseProcessInfo(ProcessCreationInfo creationInfo) { // Ensure that the current kernel version is equal or above to the minimum required. uint requiredKernelVersionMajor = (uint)Capabilities.KernelReleaseVersion >> 19; @@ -334,9 +335,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - KernelResult result = AllocateThreadLocalStorage(out ulong userExceptionContextAddress); + Result result = AllocateThreadLocalStorage(out ulong userExceptionContextAddress); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -378,14 +379,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process GenerateRandomEntropy(); - return KernelResult.Success; + return Result.Success; } - public KernelResult AllocateThreadLocalStorage(out ulong address) + public Result AllocateThreadLocalStorage(out ulong address) { KernelContext.CriticalSection.Enter(); - KernelResult result; + Result result; if (_freeTlsPages.Count > 0) { @@ -404,14 +405,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process _fullTlsPages.Add(pageInfo.PageVirtualAddress, pageInfo); } - result = KernelResult.Success; + result = Result.Success; } else { // Otherwise, we need to create a new one. result = AllocateTlsPage(out KTlsPageInfo pageInfo); - if (result == KernelResult.Success) + if (result == Result.Success) { if (!pageInfo.TryGetFreePage(out address)) { @@ -431,7 +432,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - private KernelResult AllocateTlsPage(out KTlsPageInfo pageInfo) + private Result AllocateTlsPage(out KTlsPageInfo pageInfo) { pageInfo = default; @@ -445,7 +446,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ulong regionPagesCount = regionSize / KPageTableBase.PageSize; - KernelResult result = MemoryManager.MapPages( + Result result = MemoryManager.MapPages( 1, KPageTableBase.PageSize, tlsPagePa, @@ -456,7 +457,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KMemoryPermission.ReadAndWrite, out ulong tlsPageVa); - if (result != KernelResult.Success) + if (result != Result.Success) { KernelContext.UserSlabHeapPages.Free(tlsPagePa); } @@ -470,13 +471,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - public KernelResult FreeThreadLocalStorage(ulong tlsSlotAddr) + public Result FreeThreadLocalStorage(ulong tlsSlotAddr) { ulong tlsPageAddr = BitUtils.AlignDown<ulong>(tlsSlotAddr, KPageTableBase.PageSize); KernelContext.CriticalSection.Enter(); - KernelResult result = KernelResult.Success; + Result result = Result.Success; KTlsPageInfo pageInfo; @@ -506,7 +507,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process FreeTlsPage(pageInfo); - return KernelResult.Success; + return Result.Success; } } @@ -515,11 +516,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return result; } - private KernelResult FreeTlsPage(KTlsPageInfo pageInfo) + private Result FreeTlsPage(KTlsPageInfo pageInfo) { - KernelResult result = MemoryManager.UnmapForKernel(pageInfo.PageVirtualAddress, 1, MemoryState.ThreadLocal); + Result result = MemoryManager.UnmapForKernel(pageInfo.PageVirtualAddress, 1, MemoryState.ThreadLocal); - if (result == KernelResult.Success) + if (result == Result.Success) { KernelContext.UserSlabHeapPages.Free(pageInfo.PagePhysicalAddress); } @@ -532,7 +533,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process // TODO. } - public KernelResult Start(int mainThreadPriority, ulong stackSize) + public Result Start(int mainThreadPriority, ulong stackSize) { lock (_processLock) { @@ -580,7 +581,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - KernelResult result; + Result result; KThread mainThread = null; @@ -627,7 +628,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KMemoryPermission.ReadAndWrite, out ulong stackBottom); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -643,7 +644,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = MemoryManager.SetHeapCapacity(heapCapacity); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -654,7 +655,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = HandleTable.Initialize(Capabilities.HandleTableSize); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -673,7 +674,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ThreadType.User, _customThreadStart); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -682,7 +683,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = HandleTable.GenerateHandle(mainThread, out int mainThreadHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -700,14 +701,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = mainThread.Start(); - if (result != KernelResult.Success) + if (result != Result.Success) { SetState(oldState); CleanUpForError(); } - if (result == KernelResult.Success) + if (result == Result.Success) { mainThread.IncrementReferenceCount(); } @@ -729,7 +730,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } } - public KernelResult InitializeThread( + public Result InitializeThread( KThread thread, ulong entrypoint, ulong argsPtr, @@ -888,9 +889,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return _signaled; } - public KernelResult Terminate() + public Result Terminate() { - KernelResult result; + Result result; bool shallTerminate = false; @@ -910,7 +911,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process shallTerminate = true; } - result = KernelResult.Success; + result = Result.Success; } else { @@ -1044,9 +1045,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KernelContext.CriticalSection.Leave(); } - public KernelResult ClearIfNotExited() + public Result ClearIfNotExited() { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -1056,7 +1057,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { _signaled = false; - result = KernelResult.Success; + result = Result.Success; } else { @@ -1107,7 +1108,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process protected override void Destroy() => Context.Dispose(); - public KernelResult SetActivity(bool pause) + public Result SetActivity(bool pause) { KernelContext.CriticalSection.Enter(); @@ -1154,7 +1155,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process KernelContext.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } KernelContext.CriticalSection.Leave(); diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs index a08c4b26..ef55a165 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcessCapabilities.cs @@ -1,6 +1,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Numerics; @@ -25,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process IrqAccessMask = new byte[0x80]; } - public KernelResult InitializeForKernel(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) + public Result InitializeForKernel(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) { AllowedCpuCoresMask = 0xf; AllowedThreadPriosMask = ulong.MaxValue; @@ -35,12 +36,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process return Parse(capabilities, memoryManager); } - public KernelResult InitializeForUser(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) + public Result InitializeForUser(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) { return Parse(capabilities, memoryManager); } - private KernelResult Parse(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) + private Result Parse(ReadOnlySpan<int> capabilities, KPageTableBase memoryManager) { int mask0 = 0; int mask1 = 0; @@ -51,9 +52,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process if (((cap + 1) & ~cap) != 0x40) { - KernelResult result = ParseCapability(cap, ref mask0, ref mask1, memoryManager); + Result result = ParseCapability(cap, ref mask0, ref mask1, memoryManager); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -96,7 +97,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ? KMemoryPermission.Read : KMemoryPermission.ReadAndWrite; - KernelResult result; + Result result; if ((cap >> 31) != 0) { @@ -107,17 +108,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Process result = memoryManager.MapIoMemory(address, size, perm); } - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } } } - return KernelResult.Success; + return Result.Success; } - private KernelResult ParseCapability(int cap, ref int mask0, ref int mask1, KPageTableBase memoryManager) + private Result ParseCapability(int cap, ref int mask0, ref int mask1, KPageTableBase memoryManager) { int code = (cap + 1) & ~cap; @@ -127,7 +128,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process } else if (code == 0) { - return KernelResult.Success; + return Result.Success; } int codeMask = 1 << (32 - BitOperations.LeadingZeroCount((uint)code + 1)); @@ -300,7 +301,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process default: return KernelResult.InvalidCapability; } - return KernelResult.Success; + return Result.Success; } private static ulong GetMaskFromMinMax(int min, int max) diff --git a/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs b/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs index a0841252..77fcdf33 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/ProcessExecutionContext.cs @@ -7,23 +7,25 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { public ulong Pc => 0UL; - public ulong CntfrqEl0 { get => 0; set { } } + public ulong CntfrqEl0 { get; set; } public ulong CntpctEl0 => 0UL; - public long TpidrEl0 { get => 0; set { } } - public long TpidrroEl0 { get => 0; set { } } + public long TpidrEl0 { get; set; } + public long TpidrroEl0 { get; set; } - public uint Pstate { get => 0; set { } } + public uint Pstate { get; set; } - public uint Fpcr { get => 0; set { } } - public uint Fpsr { get => 0; set { } } + public uint Fpcr { get; set; } + public uint Fpsr { get; set; } public bool IsAarch32 { get => false; set { } } public bool Running { get; private set; } = true; - public ulong GetX(int index) => 0UL; - public void SetX(int index, ulong value) { } + private readonly ulong[] _x = new ulong[32]; + + public ulong GetX(int index) => _x[index]; + public void SetX(int index, ulong value) => _x[index] = value; public V128 GetV(int index) => default; public void SetV(int index, V128 value) { } diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs index c3fb8b8a..e23274eb 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/Syscall.cs @@ -7,13 +7,14 @@ using Ryujinx.HLE.HOS.Kernel.Ipc; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { [SvcImpl] - class Syscall + class Syscall : ISyscallApi { private readonly KernelContext _context; @@ -25,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // Process [Svc(0x24)] - public KernelResult GetProcessId(out ulong pid, int handle) + public Result GetProcessId(out ulong pid, int handle) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -46,11 +47,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall pid = process?.Pid ?? 0; return process != null - ? KernelResult.Success + ? Result.Success : KernelResult.InvalidHandle; } - public KernelResult CreateProcess( + public Result CreateProcess( out int handle, ProcessCreationInfo info, ReadOnlySpan<int> capabilities, @@ -118,7 +119,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall _ => MemoryRegion.NvServices }; - KernelResult result = process.Initialize( + Result result = process.Initialize( info, capabilities, resourceLimit, @@ -126,7 +127,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall contextFactory, customThreadStart); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -136,7 +137,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return handleTable.GenerateHandle(process, out handle); } - public KernelResult StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize) + public Result StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize) { KProcess process = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KProcess>(handle); @@ -157,30 +158,30 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall process.DefaultCpuCore = cpuCore; - KernelResult result = process.Start(priority, mainThreadStackSize); + Result result = process.Start(priority, mainThreadStackSize); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } process.IncrementReferenceCount(); - return KernelResult.Success; + return Result.Success; } [Svc(0x5f)] - public KernelResult FlushProcessDataCache(int processHandle, ulong address, ulong size) + public Result FlushProcessDataCache(int processHandle, ulong address, ulong size) { // FIXME: This needs to be implemented as ARMv7 doesn't have any way to do cache maintenance operations on EL0. // As we don't support (and don't actually need) to flush the cache, this is stubbed. - return KernelResult.Success; + return Result.Success; } // IPC [Svc(0x1f)] - public KernelResult ConnectToNamedPort(out int handle, [PointerSized] ulong namePtr) + public Result ConnectToNamedPort(out int handle, [PointerSized] ulong namePtr) { handle = 0; @@ -192,7 +193,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return ConnectToNamedPort(out handle, name); } - public KernelResult ConnectToNamedPort(out int handle, string name) + public Result ConnectToNamedPort(out int handle, string name) { handle = 0; @@ -210,16 +211,16 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess currentProcess = KernelStatic.GetCurrentProcess(); - KernelResult result = currentProcess.HandleTable.ReserveHandle(out handle); + Result result = currentProcess.HandleTable.ReserveHandle(out handle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = clientPort.Connect(out KClientSession clientSession); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CancelHandleReservation(handle); @@ -234,7 +235,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x21)] - public KernelResult SendSyncRequest(int handle) + public Result SendSyncRequest(int handle) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -249,7 +250,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x22)] - public KernelResult SendSyncRequestWithUserBuffer( + public Result SendSyncRequestWithUserBuffer( [PointerSized] ulong messagePtr, [PointerSized] ulong messageSize, int handle) @@ -271,9 +272,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess currentProcess = KernelStatic.GetCurrentProcess(); - KernelResult result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); + Result result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -289,9 +290,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall result = session.SendSyncRequest(messagePtr, messageSize); } - KernelResult result2 = currentProcess.MemoryManager.UnborrowIpcBuffer(messagePtr, messageSize); + Result result2 = currentProcess.MemoryManager.UnborrowIpcBuffer(messagePtr, messageSize); - if (result == KernelResult.Success) + if (result == Result.Success) { result = result2; } @@ -300,7 +301,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x23)] - public KernelResult SendAsyncRequestWithUserBuffer( + public Result SendAsyncRequestWithUserBuffer( out int doneEventHandle, [PointerSized] ulong messagePtr, [PointerSized] ulong messageSize, @@ -325,9 +326,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess currentProcess = KernelStatic.GetCurrentProcess(); - KernelResult result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); + Result result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -353,18 +354,18 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall result = currentProcess.HandleTable.GenerateHandle(doneEvent.ReadableEvent, out doneEventHandle); - if (result == KernelResult.Success) + if (result == Result.Success) { result = session.SendAsyncRequest(doneEvent.WritableEvent, messagePtr, messageSize); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CloseHandle(doneEventHandle); } } } - if (result != KernelResult.Success) + if (result != Result.Success) { resourceLimit?.Release(LimitableResource.Event, 1); @@ -375,12 +376,21 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x40)] - public KernelResult CreateSession( + public Result CreateSession( out int serverSessionHandle, out int clientSessionHandle, bool isLight, [PointerSized] ulong namePtr) { + return CreateSession(out serverSessionHandle, out clientSessionHandle, isLight, null); + } + + public Result CreateSession( + out int serverSessionHandle, + out int clientSessionHandle, + bool isLight, + string name) + { serverSessionHandle = 0; clientSessionHandle = 0; @@ -393,7 +403,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.ResLimitExceeded; } - KernelResult result; + Result result; if (isLight) { @@ -401,11 +411,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall result = currentProcess.HandleTable.GenerateHandle(session.ServerSession, out serverSessionHandle); - if (result == KernelResult.Success) + if (result == Result.Success) { result = currentProcess.HandleTable.GenerateHandle(session.ClientSession, out clientSessionHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CloseHandle(serverSessionHandle); @@ -422,11 +432,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall result = currentProcess.HandleTable.GenerateHandle(session.ServerSession, out serverSessionHandle); - if (result == KernelResult.Success) + if (result == Result.Success) { result = currentProcess.HandleTable.GenerateHandle(session.ClientSession, out clientSessionHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CloseHandle(serverSessionHandle); @@ -442,7 +452,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x41)] - public KernelResult AcceptSession(out int sessionHandle, int portHandle) + public Result AcceptSession(out int sessionHandle, int portHandle) { sessionHandle = 0; @@ -455,9 +465,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidHandle; } - KernelResult result = currentProcess.HandleTable.ReserveHandle(out int handle); + Result result = currentProcess.HandleTable.ReserveHandle(out int handle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -481,7 +491,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall sessionHandle = handle; - result = KernelResult.Success; + result = Result.Success; } else { @@ -494,7 +504,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x43)] - public KernelResult ReplyAndReceive( + public Result ReplyAndReceive( out int handleIndex, [PointerSized] ulong handlesPtr, int handlesCount, @@ -537,7 +547,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return ReplyAndReceive(out handleIndex, handles, replyTargetHandle, timeout); } - public KernelResult ReplyAndReceive(out int handleIndex, ReadOnlySpan<int> handles, int replyTargetHandle, long timeout) + public Result ReplyAndReceive(out int handleIndex, ReadOnlySpan<int> handles, int replyTargetHandle, long timeout) { handleIndex = 0; @@ -557,7 +567,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall syncObjs[index] = obj; } - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (replyTargetHandle != 0) { @@ -573,14 +583,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } } - if (result == KernelResult.Success) + if (result == Result.Success) { if (timeout > 0) { timeout += KTimeManager.DefaultTimeIncrementNanoseconds; } - while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == KernelResult.Success) + while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == Result.Success) { KServerSession session = currentProcess.HandleTable.GetObject<KServerSession>(handles[handleIndex]); @@ -600,7 +610,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x44)] - public KernelResult ReplyAndReceiveWithUserBuffer( + public Result ReplyAndReceiveWithUserBuffer( out int handleIndex, [PointerSized] ulong messagePtr, [PointerSized] ulong messageSize, @@ -630,9 +640,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.UserCopyFailed; } - KernelResult result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); + Result result = currentProcess.MemoryManager.BorrowIpcBuffer(messagePtr, messageSize); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -676,14 +686,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } } - if (result == KernelResult.Success) + if (result == Result.Success) { if (timeout > 0) { timeout += KTimeManager.DefaultTimeIncrementNanoseconds; } - while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == KernelResult.Success) + while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == Result.Success) { KServerSession session = currentProcess.HandleTable.GetObject<KServerSession>(handles[handleIndex]); @@ -705,13 +715,24 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x70)] - public KernelResult CreatePort( + public Result CreatePort( out int serverPortHandle, out int clientPortHandle, int maxSessions, bool isLight, [PointerSized] ulong namePtr) { + // The kernel doesn't use the name pointer, so we can just pass null as the name. + return CreatePort(out serverPortHandle, out clientPortHandle, maxSessions, isLight, null); + } + + public Result CreatePort( + out int serverPortHandle, + out int clientPortHandle, + int maxSessions, + bool isLight, + string name) + { serverPortHandle = clientPortHandle = 0; if (maxSessions < 1) @@ -719,20 +740,20 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.MaximumExceeded; } - KPort port = new KPort(_context, maxSessions, isLight, (long)namePtr); + KPort port = new KPort(_context, maxSessions, isLight, name); KProcess currentProcess = KernelStatic.GetCurrentProcess(); - KernelResult result = currentProcess.HandleTable.GenerateHandle(port.ClientPort, out clientPortHandle); + Result result = currentProcess.HandleTable.GenerateHandle(port.ClientPort, out clientPortHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = currentProcess.HandleTable.GenerateHandle(port.ServerPort, out serverPortHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CloseHandle(clientPortHandle); } @@ -741,7 +762,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x71)] - public KernelResult ManageNamedPort(out int handle, [PointerSized] ulong namePtr, int maxSessions) + public Result ManageNamedPort(out int handle, [PointerSized] ulong namePtr, int maxSessions) { handle = 0; @@ -758,7 +779,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return ManageNamedPort(out handle, name, maxSessions); } - public KernelResult ManageNamedPort(out int handle, string name, int maxSessions) + public Result ManageNamedPort(out int handle, string name, int maxSessions) { handle = 0; @@ -772,20 +793,20 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KAutoObject.RemoveName(_context, name); } - KPort port = new KPort(_context, maxSessions, false, 0); + KPort port = new KPort(_context, maxSessions, false, null); KProcess currentProcess = KernelStatic.GetCurrentProcess(); - KernelResult result = currentProcess.HandleTable.GenerateHandle(port.ServerPort, out handle); + Result result = currentProcess.HandleTable.GenerateHandle(port.ServerPort, out handle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = port.ClientPort.SetName(name); - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CloseHandle(handle); } @@ -794,7 +815,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x72)] - public KernelResult ConnectToPort(out int clientSessionHandle, int clientPortHandle) + public Result ConnectToPort(out int clientSessionHandle, int clientPortHandle) { clientSessionHandle = 0; @@ -807,9 +828,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidHandle; } - KernelResult result = currentProcess.HandleTable.ReserveHandle(out int handle); + Result result = currentProcess.HandleTable.ReserveHandle(out int handle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -829,7 +850,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall session = clientSession; } - if (result != KernelResult.Success) + if (result != Result.Success) { currentProcess.HandleTable.CancelHandleReservation(handle); @@ -848,7 +869,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // Memory [Svc(1)] - public KernelResult SetHeapSize([PointerSized] out ulong address, [PointerSized] ulong size) + public Result SetHeapSize([PointerSized] out ulong address, [PointerSized] ulong size) { if ((size & 0xfffffffe001fffff) != 0) { @@ -863,7 +884,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(2)] - public KernelResult SetMemoryPermission([PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) + public Result SetMemoryPermission([PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) { if (!PageAligned(address)) { @@ -896,7 +917,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(3)] - public KernelResult SetMemoryAttribute( + public Result SetMemoryAttribute( [PointerSized] ulong address, [PointerSized] ulong size, MemoryAttribute attributeMask, @@ -927,7 +948,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemState; } - KernelResult result = process.MemoryManager.SetMemoryAttribute( + Result result = process.MemoryManager.SetMemoryAttribute( address, size, attributeMask, @@ -937,7 +958,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(4)] - public KernelResult MapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size) + public Result MapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size) { if (!PageAligned(src | dst)) { @@ -974,7 +995,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(5)] - public KernelResult UnmapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size) + public Result UnmapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size) { if (!PageAligned(src | dst)) { @@ -1011,21 +1032,21 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(6)] - public KernelResult QueryMemory([PointerSized] ulong infoPtr, [PointerSized] out ulong pageInfo, [PointerSized] ulong address) + public Result QueryMemory([PointerSized] ulong infoPtr, [PointerSized] out ulong pageInfo, [PointerSized] ulong address) { - KernelResult result = QueryMemory(out MemoryInfo info, out pageInfo, address); + Result result = QueryMemory(out MemoryInfo info, out pageInfo, address); - if (result == KernelResult.Success) + if (result == Result.Success) { return KernelTransfer.KernelToUser(infoPtr, info) - ? KernelResult.Success + ? Result.Success : KernelResult.InvalidMemState; } return result; } - public KernelResult QueryMemory(out MemoryInfo info, out ulong pageInfo, ulong address) + public Result QueryMemory(out MemoryInfo info, out ulong pageInfo, ulong address) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -1042,11 +1063,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall pageInfo = 0; - return KernelResult.Success; + return Result.Success; } [Svc(0x13)] - public KernelResult MapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) + public Result MapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) { if (!PageAligned(address)) { @@ -1093,7 +1114,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x14)] - public KernelResult UnmapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size) + public Result UnmapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size) { if (!PageAligned(address)) { @@ -1134,7 +1155,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x15)] - public KernelResult CreateTransferMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) + public Result CreateTransferMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) { handle = 0; @@ -1181,9 +1202,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KTransferMemory transferMemory = new KTransferMemory(_context); - KernelResult result = transferMemory.Initialize(address, size, permission); + Result result = transferMemory.Initialize(address, size, permission); - if (result != KernelResult.Success) + if (result != Result.Success) { CleanUpForError(); @@ -1198,7 +1219,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x51)] - public KernelResult MapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) + public Result MapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission) { if (!PageAligned(address)) { @@ -1245,7 +1266,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x52)] - public KernelResult UnmapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size) + public Result UnmapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size) { if (!PageAligned(address)) { @@ -1286,7 +1307,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x2c)] - public KernelResult MapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size) + public Result MapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size) { if (!PageAligned(address)) { @@ -1322,7 +1343,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x2d)] - public KernelResult UnmapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size) + public Result UnmapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size) { if (!PageAligned(address)) { @@ -1358,7 +1379,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x4b)] - public KernelResult CreateCodeMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size) + public Result CreateCodeMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size) { handle = 0; @@ -1388,9 +1409,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemState; } - KernelResult result = codeMemory.Initialize(address, size); + Result result = codeMemory.Initialize(address, size); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -1399,7 +1420,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x4c)] - public KernelResult ControlCodeMemory( + public Result ControlCodeMemory( int handle, CodeMemoryOperation op, ulong address, @@ -1477,7 +1498,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x73)] - public KernelResult SetProcessMemoryPermission( + public Result SetProcessMemoryPermission( int handle, [PointerSized] ulong src, [PointerSized] ulong size, @@ -1519,7 +1540,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x74)] - public KernelResult MapProcessMemory( + public Result MapProcessMemory( [PointerSized] ulong dst, int handle, ulong src, @@ -1556,7 +1577,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KPageList pageList = new KPageList(); - KernelResult result = srcProcess.MemoryManager.GetPagesIfStateEquals( + Result result = srcProcess.MemoryManager.GetPagesIfStateEquals( src, size, MemoryState.MapProcessAllowed, @@ -1567,7 +1588,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall MemoryAttribute.None, pageList); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -1576,7 +1597,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x75)] - public KernelResult UnmapProcessMemory( + public Result UnmapProcessMemory( [PointerSized] ulong dst, int handle, ulong src, @@ -1611,18 +1632,18 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidMemRange; } - KernelResult result = dstProcess.MemoryManager.UnmapProcessMemory(dst, size, srcProcess.MemoryManager, src); + Result result = dstProcess.MemoryManager.UnmapProcessMemory(dst, size, srcProcess.MemoryManager, src); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } - return KernelResult.Success; + return Result.Success; } [Svc(0x77)] - public KernelResult MapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) + public Result MapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) { if (!PageAligned(dst) || !PageAligned(src)) { @@ -1660,7 +1681,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x78)] - public KernelResult UnmapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) + public Result UnmapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size) { if (!PageAligned(dst) || !PageAligned(src)) { @@ -1705,19 +1726,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // System [Svc(0x7b)] - public KernelResult TerminateProcess(int handle) + public Result TerminateProcess(int handle) { KProcess process = KernelStatic.GetCurrentProcess(); process = process.HandleTable.GetObject<KProcess>(handle); - KernelResult result; + Result result; if (process != null) { if (process == KernelStatic.GetCurrentProcess()) { - result = KernelResult.Success; + result = Result.Success; process.DecrementToZeroWhileTerminatingCurrent(); } else @@ -1741,19 +1762,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x11)] - public KernelResult SignalEvent(int handle) + public Result SignalEvent(int handle) { KProcess process = KernelStatic.GetCurrentProcess(); KWritableEvent writableEvent = process.HandleTable.GetObject<KWritableEvent>(handle); - KernelResult result; + Result result; if (writableEvent != null) { writableEvent.Signal(); - result = KernelResult.Success; + result = Result.Success; } else { @@ -1764,9 +1785,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x12)] - public KernelResult ClearEvent(int handle) + public Result ClearEvent(int handle) { - KernelResult result; + Result result; KProcess process = KernelStatic.GetCurrentProcess(); @@ -1787,21 +1808,21 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x16)] - public KernelResult CloseHandle(int handle) + public Result CloseHandle(int handle) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); - return currentProcess.HandleTable.CloseHandle(handle) ? KernelResult.Success : KernelResult.InvalidHandle; + return currentProcess.HandleTable.CloseHandle(handle) ? Result.Success : KernelResult.InvalidHandle; } [Svc(0x17)] - public KernelResult ResetSignal(int handle) + public Result ResetSignal(int handle) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); KReadableEvent readableEvent = currentProcess.HandleTable.GetObject<KReadableEvent>(handle); - KernelResult result; + Result result; if (readableEvent != null) { @@ -1868,7 +1889,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x29)] - public KernelResult GetInfo(out ulong value, InfoType id, int handle, long subId) + public Result GetInfo(out ulong value, InfoType id, int handle, long subId) { value = 0; @@ -2010,9 +2031,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KHandleTable handleTable = currentProcess.HandleTable; KResourceLimit resourceLimit = currentProcess.ResourceLimit; - KernelResult result = handleTable.GenerateHandle(resourceLimit, out int resLimHandle); + Result result = handleTable.GenerateHandle(resourceLimit, out int resLimHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -2081,7 +2102,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall if (subId != -1 && subId != currentCore) { - return KernelResult.Success; + return Result.Success; } KScheduler scheduler = _context.Schedulers[currentCore]; @@ -2122,12 +2143,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KProcess currentProcess = KernelStatic.GetCurrentProcess(); KHandleTable handleTable = currentProcess.HandleTable; - KernelResult result = handleTable.GenerateHandle(currentProcess, out int outHandle); + Result result = handleTable.GenerateHandle(currentProcess, out int outHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; - } + } value = (ulong)outHandle; @@ -2137,23 +2158,23 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall default: return KernelResult.InvalidEnumValue; } - return KernelResult.Success; + return Result.Success; } [Svc(0x45)] - public KernelResult CreateEvent(out int wEventHandle, out int rEventHandle) + public Result CreateEvent(out int wEventHandle, out int rEventHandle) { KEvent Event = new KEvent(_context); KProcess process = KernelStatic.GetCurrentProcess(); - KernelResult result = process.HandleTable.GenerateHandle(Event.WritableEvent, out wEventHandle); + Result result = process.HandleTable.GenerateHandle(Event.WritableEvent, out wEventHandle); - if (result == KernelResult.Success) + if (result == Result.Success) { result = process.HandleTable.GenerateHandle(Event.ReadableEvent, out rEventHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { process.HandleTable.CloseHandle(wEventHandle); } @@ -2167,7 +2188,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x65)] - public KernelResult GetProcessList(out int count, [PointerSized] ulong address, int maxCount) + public Result GetProcessList(out int count, [PointerSized] ulong address, int maxCount) { count = 0; @@ -2213,11 +2234,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall count = copyCount; - return KernelResult.Success; + return Result.Success; } [Svc(0x6f)] - public KernelResult GetSystemInfo(out long value, uint id, int handle, long subId) + public Result GetSystemInfo(out long value, uint id, int handle, long subId) { value = 0; @@ -2270,11 +2291,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } } - return KernelResult.Success; + return Result.Success; } [Svc(0x30)] - public KernelResult GetResourceLimitLimitValue(out long limitValue, int handle, LimitableResource resource) + public Result GetResourceLimitLimitValue(out long limitValue, int handle, LimitableResource resource) { limitValue = 0; @@ -2292,11 +2313,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall limitValue = resourceLimit.GetLimitValue(resource); - return KernelResult.Success; + return Result.Success; } [Svc(0x31)] - public KernelResult GetResourceLimitCurrentValue(out long limitValue, int handle, LimitableResource resource) + public Result GetResourceLimitCurrentValue(out long limitValue, int handle, LimitableResource resource) { limitValue = 0; @@ -2314,11 +2335,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall limitValue = resourceLimit.GetCurrentValue(resource); - return KernelResult.Success; + return Result.Success; } [Svc(0x37)] - public KernelResult GetResourceLimitPeakValue(out long peak, int handle, LimitableResource resource) + public Result GetResourceLimitPeakValue(out long peak, int handle, LimitableResource resource) { peak = 0; @@ -2336,11 +2357,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall peak = resourceLimit.GetPeakValue(resource); - return KernelResult.Success; + return Result.Success; } [Svc(0x7d)] - public KernelResult CreateResourceLimit(out int handle) + public Result CreateResourceLimit(out int handle) { KResourceLimit limit = new KResourceLimit(_context); @@ -2350,7 +2371,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x7e)] - public KernelResult SetResourceLimitLimitValue(int handle, LimitableResource resource, long limitValue) + public Result SetResourceLimitLimitValue(int handle, LimitableResource resource, long limitValue) { if (resource >= LimitableResource.Count) { @@ -2370,7 +2391,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // Thread [Svc(8)] - public KernelResult CreateThread( + public Result CreateThread( out int handle, [PointerSized] ulong entrypoint, [PointerSized] ulong argsPtr, @@ -2381,7 +2402,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return CreateThread(out handle, entrypoint, argsPtr, stackTop, priority, cpuCore, null); } - public KernelResult CreateThread( + public Result CreateThread( out int handle, ulong entrypoint, ulong argsPtr, @@ -2419,7 +2440,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KThread thread = new KThread(_context); - KernelResult result = currentProcess.InitializeThread( + Result result = currentProcess.InitializeThread( thread, entrypoint, argsPtr, @@ -2428,7 +2449,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall cpuCore, customThreadStart); - if (result == KernelResult.Success) + if (result == Result.Success) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2445,7 +2466,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(9)] - public KernelResult StartThread(int handle) + public Result StartThread(int handle) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2455,9 +2476,9 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { thread.IncrementReferenceCount(); - KernelResult result = thread.Start(); + Result result = thread.Start(); - if (result == KernelResult.Success) + if (result == Result.Success) { thread.IncrementReferenceCount(); } @@ -2499,7 +2520,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0xc)] - public KernelResult GetThreadPriority(out int priority, int handle) + public Result GetThreadPriority(out int priority, int handle) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2509,7 +2530,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { priority = thread.DynamicPriority; - return KernelResult.Success; + return Result.Success; } else { @@ -2520,7 +2541,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0xd)] - public KernelResult SetThreadPriority(int handle, int priority) + public Result SetThreadPriority(int handle, int priority) { // TODO: NPDM check. @@ -2535,11 +2556,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall thread.SetPriority(priority); - return KernelResult.Success; + return Result.Success; } [Svc(0xe)] - public KernelResult GetThreadCoreMask(out int preferredCore, out ulong affinityMask, int handle) + public Result GetThreadCoreMask(out int preferredCore, out ulong affinityMask, int handle) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2550,7 +2571,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall preferredCore = thread.PreferredCore; affinityMask = thread.AffinityMask; - return KernelResult.Success; + return Result.Success; } else { @@ -2562,7 +2583,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0xf)] - public KernelResult SetThreadCoreMask(int handle, int preferredCore, ulong affinityMask) + public Result SetThreadCoreMask(int handle, int preferredCore, ulong affinityMask) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -2617,7 +2638,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x25)] - public KernelResult GetThreadId(out ulong threadUid, int handle) + public Result GetThreadId(out ulong threadUid, int handle) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2627,7 +2648,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall { threadUid = thread.ThreadUid; - return KernelResult.Success; + return Result.Success; } else { @@ -2638,7 +2659,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x32)] - public KernelResult SetThreadActivity(int handle, bool pause) + public Result SetThreadActivity(int handle, bool pause) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2663,7 +2684,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x33)] - public KernelResult GetThreadContext3([PointerSized] ulong address, int handle) + public Result GetThreadContext3([PointerSized] ulong address, int handle) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); KThread currentThread = KernelStatic.GetCurrentThread(); @@ -2685,12 +2706,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.InvalidThread; } - KernelResult result = thread.GetThreadContext3(out ThreadContext context); + Result result = thread.GetThreadContext3(out ThreadContext context); - if (result == KernelResult.Success) + if (result == Result.Success) { return KernelTransfer.KernelToUser(address, context) - ? KernelResult.Success + ? Result.Success : KernelResult.InvalidMemState; } @@ -2700,7 +2721,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall // Thread synchronization [Svc(0x18)] - public KernelResult WaitSynchronization(out int handleIndex, [PointerSized] ulong handlesPtr, int handlesCount, long timeout) + public Result WaitSynchronization(out int handleIndex, [PointerSized] ulong handlesPtr, int handlesCount, long timeout) { handleIndex = 0; @@ -2711,8 +2732,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall KThread currentThread = KernelStatic.GetCurrentThread(); - var syncObjs = new Span<KSynchronizationObject>(currentThread.WaitSyncObjects).Slice(0, handlesCount); - if (handlesCount != 0) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -2741,9 +2760,32 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall return KernelResult.UserCopyFailed; } + return WaitSynchronization(out handleIndex, handles, timeout); + } + + return WaitSynchronization(out handleIndex, ReadOnlySpan<int>.Empty, timeout); + } + + public Result WaitSynchronization(out int handleIndex, ReadOnlySpan<int> handles, long timeout) + { + handleIndex = 0; + + if ((uint)handles.Length > KThread.MaxWaitSyncObjects) + { + return KernelResult.MaximumExceeded; + } + + KThread currentThread = KernelStatic.GetCurrentThread(); + + var syncObjs = new Span<KSynchronizationObject>(currentThread.WaitSyncObjects).Slice(0, handles.Length); + + if (handles.Length != 0) + { + KProcess currentProcess = KernelStatic.GetCurrentProcess(); + int processedHandles = 0; - for (; processedHandles < handlesCount; processedHandles++) + for (; processedHandles < handles.Length; processedHandles++) { KSynchronizationObject syncObj = currentProcess.HandleTable.GetObject<KSynchronizationObject>(handles[processedHandles]); @@ -2757,7 +2799,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall syncObj.IncrementReferenceCount(); } - if (processedHandles != handlesCount) + if (processedHandles != handles.Length) { // One or more handles are invalid. for (int index = 0; index < processedHandles; index++) @@ -2774,14 +2816,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall timeout += KTimeManager.DefaultTimeIncrementNanoseconds; } - KernelResult result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex); + Result result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex); if (result == KernelResult.PortRemoteClosed) { - result = KernelResult.Success; + result = Result.Success; } - for (int index = 0; index < handlesCount; index++) + for (int index = 0; index < handles.Length; index++) { currentThread.WaitSyncObjects[index].DecrementReferenceCount(); } @@ -2790,7 +2832,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x19)] - public KernelResult CancelSynchronization(int handle) + public Result CancelSynchronization(int handle) { KProcess process = KernelStatic.GetCurrentProcess(); @@ -2803,11 +2845,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall thread.CancelSynchronization(); - return KernelResult.Success; + return Result.Success; } [Svc(0x1a)] - public KernelResult ArbitrateLock(int ownerHandle, [PointerSized] ulong mutexAddress, int requesterHandle) + public Result ArbitrateLock(int ownerHandle, [PointerSized] ulong mutexAddress, int requesterHandle) { if (IsPointingInsideKernel(mutexAddress)) { @@ -2825,7 +2867,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x1b)] - public KernelResult ArbitrateUnlock([PointerSized] ulong mutexAddress) + public Result ArbitrateUnlock([PointerSized] ulong mutexAddress) { if (IsPointingInsideKernel(mutexAddress)) { @@ -2843,7 +2885,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x1c)] - public KernelResult WaitProcessWideKeyAtomic( + public Result WaitProcessWideKeyAtomic( [PointerSized] ulong mutexAddress, [PointerSized] ulong condVarAddress, int handle, @@ -2874,17 +2916,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x1d)] - public KernelResult SignalProcessWideKey([PointerSized] ulong address, int count) + public Result SignalProcessWideKey([PointerSized] ulong address, int count) { KProcess currentProcess = KernelStatic.GetCurrentProcess(); currentProcess.AddressArbiter.SignalProcessWideKey(address, count); - return KernelResult.Success; + return Result.Success; } [Svc(0x34)] - public KernelResult WaitForAddress([PointerSized] ulong address, ArbitrationType type, int value, long timeout) + public Result WaitForAddress([PointerSized] ulong address, ArbitrationType type, int value, long timeout) { if (IsPointingInsideKernel(address)) { @@ -2916,7 +2958,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x35)] - public KernelResult SignalToAddress([PointerSized] ulong address, SignalType type, int value, int count) + public Result SignalToAddress([PointerSized] ulong address, SignalType type, int value, int count) { if (IsPointingInsideKernel(address)) { @@ -2943,11 +2985,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall } [Svc(0x36)] - public KernelResult SynchronizePreemptionState() + public Result SynchronizePreemptionState() { KernelStatic.GetCurrentThread().SynchronizePreemptionState(); - return KernelResult.Success; + return Result.Success; } private static bool IsPointingInsideKernel(ulong address) diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs index f53b43b3..a5f9df5e 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KAddressArbiter.cs @@ -1,5 +1,6 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; using System.Linq; @@ -24,14 +25,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _arbiterThreads = new List<KThread>(); } - public KernelResult ArbitrateLock(int ownerHandle, ulong mutexAddress, int requesterHandle) + public Result ArbitrateLock(int ownerHandle, ulong mutexAddress, int requesterHandle) { KThread currentThread = KernelStatic.GetCurrentThread(); _context.CriticalSection.Enter(); currentThread.SignaledObj = null; - currentThread.ObjSyncResult = KernelResult.Success; + currentThread.ObjSyncResult = Result.Success; KProcess currentProcess = KernelStatic.GetCurrentProcess(); @@ -46,7 +47,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { _context.CriticalSection.Leave(); - return 0; + return Result.Success; } KThread mutexOwner = currentProcess.HandleTable.GetObject<KThread>(ownerHandle); @@ -78,7 +79,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return currentThread.ObjSyncResult; } - public KernelResult ArbitrateUnlock(ulong mutexAddress) + public Result ArbitrateUnlock(ulong mutexAddress) { _context.CriticalSection.Enter(); @@ -86,14 +87,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading (int mutexValue, KThread newOwnerThread) = MutexUnlock(currentThread, mutexAddress); - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (!KernelTransfer.KernelToUser(mutexAddress, mutexValue)) { result = KernelResult.InvalidMemState; } - if (result != KernelResult.Success && newOwnerThread != null) + if (result != Result.Success && newOwnerThread != null) { newOwnerThread.SignaledObj = null; newOwnerThread.ObjSyncResult = result; @@ -104,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return result; } - public KernelResult WaitProcessWideKeyAtomic(ulong mutexAddress, ulong condVarAddress, int threadHandle, long timeout) + public Result WaitProcessWideKeyAtomic(ulong mutexAddress, ulong condVarAddress, int threadHandle, long timeout) { _context.CriticalSection.Enter(); @@ -185,7 +186,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } newOwnerThread.SignaledObj = null; - newOwnerThread.ObjSyncResult = KernelResult.Success; + newOwnerThread.ObjSyncResult = Result.Success; newOwnerThread.ReleaseAndResume(); } @@ -247,7 +248,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { // We now own the mutex. requester.SignaledObj = null; - requester.ObjSyncResult = KernelResult.Success; + requester.ObjSyncResult = Result.Success; requester.ReleaseAndResume(); @@ -273,7 +274,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - public KernelResult WaitForAddressIfEqual(ulong address, int value, long timeout) + public Result WaitForAddressIfEqual(ulong address, int value, long timeout) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -344,7 +345,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return KernelResult.InvalidState; } - public KernelResult WaitForAddressIfLessThan(ulong address, int value, bool shouldDecrement, long timeout) + public Result WaitForAddressIfLessThan(ulong address, int value, bool shouldDecrement, long timeout) { KThread currentThread = KernelStatic.GetCurrentThread(); @@ -422,7 +423,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return KernelResult.InvalidState; } - public KernelResult Signal(ulong address, int count) + public Result Signal(ulong address, int count) { _context.CriticalSection.Enter(); @@ -430,10 +431,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _context.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } - public KernelResult SignalAndIncrementIfEqual(ulong address, int value, int count) + public Result SignalAndIncrementIfEqual(ulong address, int value, int count) { _context.CriticalSection.Enter(); @@ -467,10 +468,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _context.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } - public KernelResult SignalAndModifyIfEqual(ulong address, int value, int count) + public Result SignalAndModifyIfEqual(ulong address, int value, int count) { _context.CriticalSection.Enter(); @@ -539,7 +540,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _context.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } private void WakeArbiterThreads(ulong address, int count) @@ -547,7 +548,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading static void RemoveArbiterThread(KThread thread) { thread.SignaledObj = null; - thread.ObjSyncResult = KernelResult.Success; + thread.ObjSyncResult = Result.Success; thread.ReleaseAndResume(); diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs index d378b81e..d9e7befa 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KReadableEvent.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Threading { @@ -27,16 +28,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); } - public KernelResult Clear() + public Result Clear() { _signaled = false; - return KernelResult.Success; + return Result.Success; } - public KernelResult ClearIfSignaled() + public Result ClearIfSignaled() { - KernelResult result; + Result result; KernelContext.CriticalSection.Enter(); @@ -44,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { _signaled = false; - result = KernelResult.Success; + result = Result.Success; } else { diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs index 419f1536..01b65f55 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KSynchronization.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; @@ -13,11 +14,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _context = context; } - public KernelResult WaitFor(Span<KSynchronizationObject> syncObjs, long timeout, out int handleIndex) + public Result WaitFor(Span<KSynchronizationObject> syncObjs, long timeout, out int handleIndex) { handleIndex = 0; - KernelResult result = KernelResult.TimedOut; + Result result = KernelResult.TimedOut; _context.CriticalSection.Enter(); @@ -33,7 +34,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _context.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } if (timeout == 0) @@ -122,7 +123,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if ((thread.SchedFlags & ThreadSchedState.LowMask) == ThreadSchedState.Paused) { thread.SignaledObj = syncObj; - thread.ObjSyncResult = KernelResult.Success; + thread.ObjSyncResult = Result.Success; thread.Reschedule(ThreadSchedState.Running); } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index b9dd91ef..6fd49605 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -3,6 +3,7 @@ using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.SupervisorCall; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; using System.Numerics; @@ -79,7 +80,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading private ThreadSchedState _forcePauseFlags; private ThreadSchedState _forcePausePermissionFlags; - public KernelResult ObjSyncResult { get; set; } + public Result ObjSyncResult { get; set; } public int BasePriority { get; set; } public int PreferredCore { get; set; } @@ -130,7 +131,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _activityOperationLock = new object(); } - public KernelResult Initialize( + public Result Initialize( ulong entrypoint, ulong argsPtr, ulong stackTop, @@ -145,8 +146,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading throw new ArgumentException($"Invalid thread type \"{type}\"."); } - ThreadContext = new KThreadContext(); - PreferredCore = cpuCore; AffinityMask |= 1UL << cpuCore; @@ -166,7 +165,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (type == ThreadType.User) { - if (owner.AllocateThreadLocalStorage(out _tlsAddress) != KernelResult.Success) + if (owner.AllocateThreadLocalStorage(out _tlsAddress) != Result.Success) { return KernelResult.OutOfMemory; } @@ -194,6 +193,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading Context = owner?.CreateExecutionContext() ?? new ProcessExecutionContext(); + ThreadContext = new KThreadContext(Context); + Context.IsAarch32 = !is64Bits; Context.SetX(0, argsPtr); @@ -230,7 +231,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { KernelContext.CriticalSection.Leave(); - return KernelResult.Success; + return Result.Success; } _forcePauseFlags |= ThreadSchedState.ProcessPauseFlag; @@ -241,10 +242,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - return KernelResult.Success; + return Result.Success; } - public KernelResult Start() + public Result Start() { if (!KernelContext.KernelInitialized) { @@ -260,7 +261,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); } - KernelResult result = KernelResult.ThreadTerminating; + Result result = KernelResult.ThreadTerminating; KernelContext.CriticalSection.Enter(); @@ -287,7 +288,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading StartHostThread(); - result = KernelResult.Success; + result = Result.Success; break; } else @@ -465,7 +466,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading return -1; } - public KernelResult Sleep(long timeout) + public Result Sleep(long timeout) { KernelContext.CriticalSection.Enter(); @@ -490,7 +491,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.TimeManager.UnscheduleFutureInvocation(this); } - return 0; + return Result.Success; } public void SetPriority(int priority) @@ -534,11 +535,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - public KernelResult SetActivity(bool pause) + public Result SetActivity(bool pause) { lock (_activityOperationLock) { - KernelResult result = KernelResult.Success; + Result result = Result.Success; KernelContext.CriticalSection.Enter(); @@ -581,7 +582,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); - if (result == KernelResult.Success && pause) + if (result == Result.Success && pause) { bool isThreadRunning = true; @@ -628,7 +629,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading } } - public KernelResult GetThreadContext3(out ThreadContext context) + public Result GetThreadContext3(out ThreadContext context) { context = default; @@ -651,7 +652,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); } - return KernelResult.Success; + return Result.Success; } private static uint GetPsr(IExecutionContext context) @@ -739,7 +740,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); } - public KernelResult SetCoreAndAffinityMask(int newCore, ulong newAffinityMask) + public Result SetCoreAndAffinityMask(int newCore, ulong newAffinityMask) { lock (_activityOperationLock) { @@ -838,7 +839,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading KernelContext.CriticalSection.Leave(); } - return KernelResult.Success; + return Result.Success; } } @@ -1259,6 +1260,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading if (_customThreadStart != null) { _customThreadStart(); + + // Ensure that anything trying to join the HLE thread is unblocked. + Exit(); + HandlePostSyscall(); } else { @@ -1304,7 +1309,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading { Owner?.RemoveThread(this); - if (_tlsAddress != 0 && Owner.FreeThreadLocalStorage(_tlsAddress) != KernelResult.Success) + if (_tlsAddress != 0 && Owner.FreeThreadLocalStorage(_tlsAddress) != Result.Success) { throw new InvalidOperationException("Unexpected failure freeing thread local storage."); } diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KThreadContext.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KThreadContext.cs index a7e9c4b3..e8ad53c2 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KThreadContext.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KThreadContext.cs @@ -1,11 +1,25 @@ -using System.Threading; +using Ryujinx.Cpu; +using Ryujinx.Horizon.Common; +using System.Threading; namespace Ryujinx.HLE.HOS.Kernel.Threading { - class KThreadContext + class KThreadContext : IThreadContext { + private readonly IExecutionContext _context; + + public bool Running => _context.Running; + public ulong TlsAddress => (ulong)_context.TpidrroEl0; + + public ulong GetX(int index) => _context.GetX(index); + private int _locked; + public KThreadContext(IExecutionContext context) + { + _context = context; + } + public bool Lock() { return Interlocked.Exchange(ref _locked, 1) == 0; diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs index 7aee0b57..b46122be 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KWritableEvent.cs @@ -1,4 +1,5 @@ using Ryujinx.HLE.HOS.Kernel.Common; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Kernel.Threading { @@ -16,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading _parent.ReadableEvent.Signal(); } - public KernelResult Clear() + public Result Clear() { return _parent.ReadableEvent.Clear(); } diff --git a/Ryujinx.HLE/HOS/ProgramLoader.cs b/Ryujinx.HLE/HOS/ProgramLoader.cs index beeb5ad6..b422fef7 100644 --- a/Ryujinx.HLE/HOS/ProgramLoader.cs +++ b/Ryujinx.HLE/HOS/ProgramLoader.cs @@ -9,6 +9,7 @@ using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.Loaders.Executables; +using Ryujinx.Horizon.Common; using System; using System.Linq; using System.Runtime.InteropServices; @@ -90,9 +91,9 @@ namespace Ryujinx.HLE.HOS KMemoryRegionManager region = context.MemoryManager.MemoryRegions[(int)memoryRegion]; - KernelResult result = region.AllocatePages(out KPageList pageList, (ulong)codePagesCount); + Result result = region.AllocatePages(out KPageList pageList, (ulong)codePagesCount); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -111,7 +112,7 @@ namespace Ryujinx.HLE.HOS memoryRegion, processContextFactory); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -120,7 +121,7 @@ namespace Ryujinx.HLE.HOS result = LoadIntoMemory(process, kip, codeBaseAddress); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -131,7 +132,7 @@ namespace Ryujinx.HLE.HOS result = process.Start(kip.Priority, (ulong)kip.StackSize); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process start returned error \"{result}\"."); @@ -230,19 +231,35 @@ namespace Ryujinx.HLE.HOS context.Device.System.LibHacHorizonManager.InitializeApplicationClient(new ProgramId(programInfo.ProgramId), in npdm); - KernelResult result; + Result result; KResourceLimit resourceLimit = new KResourceLimit(context); long applicationRgSize = (long)context.MemoryManager.MemoryRegions[(int)MemoryRegion.Application].Size; - result = resourceLimit.SetLimitValue(LimitableResource.Memory, applicationRgSize); - result |= resourceLimit.SetLimitValue(LimitableResource.Thread, 608); - result |= resourceLimit.SetLimitValue(LimitableResource.Event, 700); - result |= resourceLimit.SetLimitValue(LimitableResource.TransferMemory, 128); - result |= resourceLimit.SetLimitValue(LimitableResource.Session, 894); + result = resourceLimit.SetLimitValue(LimitableResource.Memory, applicationRgSize); - if (result != KernelResult.Success) + if (result.IsSuccess) + { + result = resourceLimit.SetLimitValue(LimitableResource.Thread, 608); + } + + if (result.IsSuccess) + { + result = resourceLimit.SetLimitValue(LimitableResource.Event, 700); + } + + if (result.IsSuccess) + { + result = resourceLimit.SetLimitValue(LimitableResource.TransferMemory, 128); + } + + if (result.IsSuccess) + { + result = resourceLimit.SetLimitValue(LimitableResource.Session, 894); + } + + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization failed setting resource limit values."); @@ -273,7 +290,7 @@ namespace Ryujinx.HLE.HOS memoryRegion, processContextFactory); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -288,7 +305,7 @@ namespace Ryujinx.HLE.HOS result = LoadIntoMemory(process, executables[index], nsoBase[index]); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process initialization returned error \"{result}\"."); @@ -302,7 +319,7 @@ namespace Ryujinx.HLE.HOS result = process.Start(meta.MainThreadPriority, meta.MainThreadStackSize); - if (result != KernelResult.Success) + if (result != Result.Success) { Logger.Error?.Print(LogClass.Loader, $"Process start returned error \"{result}\"."); @@ -322,18 +339,18 @@ namespace Ryujinx.HLE.HOS return true; } - private static KernelResult LoadIntoMemory(KProcess process, IExecutable image, ulong baseAddress) + private static Result LoadIntoMemory(KProcess process, IExecutable image, ulong baseAddress) { - ulong textStart = baseAddress + (ulong)image.TextOffset; - ulong roStart = baseAddress + (ulong)image.RoOffset; - ulong dataStart = baseAddress + (ulong)image.DataOffset; - ulong bssStart = baseAddress + (ulong)image.BssOffset; + ulong textStart = baseAddress + image.TextOffset; + ulong roStart = baseAddress + image.RoOffset; + ulong dataStart = baseAddress + image.DataOffset; + ulong bssStart = baseAddress + image.BssOffset; ulong end = dataStart + (ulong)image.Data.Length; if (image.BssSize != 0) { - end = bssStart + (ulong)image.BssSize; + end = bssStart + image.BssSize; } process.CpuMemory.Write(textStart, image.Text); @@ -342,11 +359,11 @@ namespace Ryujinx.HLE.HOS process.CpuMemory.Fill(bssStart, image.BssSize, 0); - KernelResult SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission) + Result SetProcessMemoryPermission(ulong address, ulong size, KMemoryPermission permission) { if (size == 0) { - return KernelResult.Success; + return Result.Success; } size = BitUtils.AlignUp<ulong>(size, KPageTableBase.PageSize); @@ -354,16 +371,16 @@ namespace Ryujinx.HLE.HOS return process.MemoryManager.SetProcessMemoryPermission(address, size, permission); } - KernelResult result = SetProcessMemoryPermission(textStart, (ulong)image.Text.Length, KMemoryPermission.ReadAndExecute); + Result result = SetProcessMemoryPermission(textStart, (ulong)image.Text.Length, KMemoryPermission.ReadAndExecute); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = SetProcessMemoryPermission(roStart, (ulong)image.Ro.Length, KMemoryPermission.Read); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } diff --git a/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs index b49a44e7..9a12e701 100644 --- a/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs +++ b/Ryujinx.HLE/HOS/Services/Account/Acc/IAsyncContext.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Account.Acc.AsyncContext; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Account.Acc @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc // GetSystemEvent() -> handle<copy> public ResultCode GetSystemEvent(ServiceCtx context) { - if (context.Process.HandleTable.GenerateHandle(AsyncExecution.SystemEvent.ReadableEvent, out int _systemEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(AsyncExecution.SystemEvent.ReadableEvent, out int _systemEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryAppletAccessor.cs b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryAppletAccessor.cs index 405806c4..134566d9 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryAppletAccessor.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/LibraryAppletCreator/ILibraryAppletAccessor.cs @@ -2,8 +2,8 @@ using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.LibraryAppletCreator @@ -68,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Lib { if (_stateChangedEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_stateChangedEvent.ReadableEvent, out _stateChangedEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_stateChangedEvent.ReadableEvent, out _stateChangedEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -178,7 +178,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Lib { if (_normalOutDataEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_normalOutDataEvent.ReadableEvent, out _normalOutDataEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_normalOutDataEvent.ReadableEvent, out _normalOutDataEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -195,7 +195,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Lib { if (_interactiveOutDataEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_interactiveOutDataEvent.ReadableEvent, out _interactiveOutDataEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_interactiveOutDataEvent.ReadableEvent, out _interactiveOutDataEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs index cb298fd4..b145a65d 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ICommonStateGetter.cs @@ -1,10 +1,10 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Settings.Types; using Ryujinx.HLE.HOS.Services.Vi.RootService.ApplicationDisplayService; using Ryujinx.HLE.HOS.SystemState; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy @@ -38,7 +38,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys if (_messageEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(messageEvent.ReadableEvent, out _messageEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(messageEvent.ReadableEvent, out _messageEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -211,7 +211,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys // NOTE: Original service calls IOperationModeManager::GetDefaultDisplayResolutionChangeEvent of omm service. if (_displayResolutionChangedEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.DisplayResolutionChangeEvent.ReadableEvent, out _displayResolutionChangedEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.DisplayResolutionChangeEvent.ReadableEvent, out _displayResolutionChangedEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs index d7816de9..7c03fc27 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IDisplayController.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy @@ -66,7 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys return ResultCode.BufferAlreadyAcquired; } - if (context.Process.HandleTable.GenerateHandle(_transferMem, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_transferMem, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -89,7 +89,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys return ResultCode.BufferAlreadyAcquired; } - if (context.Process.HandleTable.GenerateHandle(_transferMem, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_transferMem, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs index 5c53c66f..2a9848dd 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/IHomeMenuFunctions.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy @@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys { if (_channelEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_channelEvent.ReadableEvent, out _channelEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_channelEvent.ReadableEvent, out _channelEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs index 567bc264..39be7577 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletAE/AllSystemAppletProxiesService/SystemAppletProxy/ISelfController.cs @@ -1,8 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy.Types; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.SystemAppletProxy @@ -111,7 +111,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys if (_libraryAppletLaunchableEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_libraryAppletLaunchableEvent.ReadableEvent, out _libraryAppletLaunchableEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_libraryAppletLaunchableEvent.ReadableEvent, out _libraryAppletLaunchableEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -378,7 +378,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE.AllSystemAppletProxiesService.Sys _accumulatedSuspendedTickChangedEvent.ReadableEvent.Signal(); - if (context.Process.HandleTable.GenerateHandle(_accumulatedSuspendedTickChangedEvent.ReadableEvent, out _accumulatedSuspendedTickChangedEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_accumulatedSuspendedTickChangedEvent.ReadableEvent, out _accumulatedSuspendedTickChangedEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs b/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs index 74068ad6..49331e21 100644 --- a/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs +++ b/Ryujinx.HLE/HOS/Services/Am/AppletOE/ApplicationProxyService/ApplicationProxy/IApplicationFunctions.cs @@ -1,4 +1,3 @@ -using LibHac; using LibHac.Account; using LibHac.Common; using LibHac.Fs; @@ -9,13 +8,13 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Am.AppletAE.Storage; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; using Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService; using Ryujinx.HLE.HOS.SystemState; +using Ryujinx.Horizon.Common; using System; using System.Numerics; using System.Threading; @@ -43,7 +42,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati private int _jitLoaded; - private HorizonClient _horizon; + private LibHac.HorizonClient _horizon; public IApplicationFunctions(Horizon system) { @@ -136,8 +135,8 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati "No control file was found for this game. Using a dummy one instead. This may cause inaccuracies in some games."); } - HorizonClient hos = context.Device.System.LibHacHorizonManager.AmClient; - Result result = hos.Fs.EnsureApplicationSaveData(out long requiredSize, applicationId, in control, in userId); + LibHac.HorizonClient hos = context.Device.System.LibHacHorizonManager.AmClient; + LibHac.Result result = hos.Fs.EnsureApplicationSaveData(out long requiredSize, applicationId, in control, in userId); context.ResponseData.Write(requiredSize); @@ -185,7 +184,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati // SetTerminateResult(u32) public ResultCode SetTerminateResult(ServiceCtx context) { - Result result = new Result(context.RequestData.ReadUInt32()); + LibHac.Result result = new LibHac.Result(context.RequestData.ReadUInt32()); Logger.Info?.Print(LogClass.ServiceAm, $"Result = 0x{result.Value:x8} ({result.ToStringWithName()})."); @@ -256,7 +255,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati BlitStruct<ApplicationControlProperty> controlHolder = context.Device.Application.ControlData; - Result result = _horizon.Fs.CreateApplicationCacheStorage(out long requiredSize, + LibHac.Result result = _horizon.Fs.CreateApplicationCacheStorage(out long requiredSize, out CacheStorageTargetMedia storageTarget, applicationId, in controlHolder.Value, index, saveSize, journalSize); @@ -584,7 +583,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati { if (_gpuErrorDetectedSystemEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_gpuErrorDetectedSystemEvent.ReadableEvent, out _gpuErrorDetectedSystemEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_gpuErrorDetectedSystemEvent.ReadableEvent, out _gpuErrorDetectedSystemEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -605,7 +604,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati { if (_friendInvitationStorageChannelEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_friendInvitationStorageChannelEvent.ReadableEvent, out _friendInvitationStorageChannelEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_friendInvitationStorageChannelEvent.ReadableEvent, out _friendInvitationStorageChannelEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -636,7 +635,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati { if (_notificationStorageChannelEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_notificationStorageChannelEvent.ReadableEvent, out _notificationStorageChannelEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_notificationStorageChannelEvent.ReadableEvent, out _notificationStorageChannelEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -653,7 +652,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati { if (_healthWarningDisappearedSystemEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_healthWarningDisappearedSystemEvent.ReadableEvent, out _healthWarningDisappearedSystemEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_healthWarningDisappearedSystemEvent.ReadableEvent, out _healthWarningDisappearedSystemEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioIn/AudioInServer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioIn/AudioInServer.cs index f9a9447f..4911b7f0 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/AudioIn/AudioInServer.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/AudioIn/AudioInServer.cs @@ -1,8 +1,8 @@ using Ryujinx.Audio.Common; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Runtime.InteropServices; @@ -60,7 +60,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn { KEvent bufferEvent = _impl.RegisterBufferEvent(); - if (context.Process.HandleTable.GenerateHandle(bufferEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(bufferEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioOut/AudioOutServer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioOut/AudioOutServer.cs index aff08811..2d6908e3 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/AudioOut/AudioOutServer.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/AudioOut/AudioOutServer.cs @@ -1,8 +1,8 @@ using Ryujinx.Audio.Common; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Runtime.InteropServices; @@ -60,7 +60,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioOut { KEvent bufferEvent = _impl.RegisterBufferEvent(); - if (context.Process.HandleTable.GenerateHandle(bufferEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(bufferEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs index 1ef97ecc..e868ad5a 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioDeviceServer.cs @@ -1,8 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Text; @@ -115,7 +115,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer { KEvent deviceSystemEvent = _impl.QueryAudioDeviceSystemEvent(); - if (context.Process.HandleTable.GenerateHandle(deviceSystemEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(deviceSystemEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -230,7 +230,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer { KEvent deviceInputEvent = _impl.QueryAudioDeviceInputEvent(); - if (context.Process.HandleTable.GenerateHandle(deviceInputEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(deviceInputEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -248,7 +248,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer { KEvent deviceOutputEvent = _impl.QueryAudioDeviceOutputEvent(); - if (context.Process.HandleTable.GenerateHandle(deviceOutputEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(deviceOutputEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRendererServer.cs b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRendererServer.cs index b2ddb697..3843b408 100644 --- a/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRendererServer.cs +++ b/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRendererServer.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Buffers; @@ -111,7 +111,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer if (result == ResultCode.Success) { - if (context.Process.HandleTable.GenerateHandle(systemEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(systemEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheProgressService.cs b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheProgressService.cs index 3e516d83..b176195d 100644 --- a/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheProgressService.cs +++ b/Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheProgressService.cs @@ -1,9 +1,9 @@ using Ryujinx.Common.Logging; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator.Types; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator @@ -24,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator { if (_eventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out _eventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out _eventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Bluetooth/IBluetoothDriver.cs b/Ryujinx.HLE/HOS/Services/Bluetooth/IBluetoothDriver.cs index 5ce43495..65535ea1 100644 --- a/Ryujinx.HLE/HOS/Services/Bluetooth/IBluetoothDriver.cs +++ b/Ryujinx.HLE/HOS/Services/Bluetooth/IBluetoothDriver.cs @@ -1,8 +1,8 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Bluetooth.BluetoothDriver; using Ryujinx.HLE.HOS.Services.Settings; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Bluetooth @@ -30,7 +30,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.InitializeBleDebugEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.InitializeBleDebugEvent.ReadableEvent, out BluetoothEventManager.InitializeBleDebugEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.InitializeBleDebugEvent.ReadableEvent, out BluetoothEventManager.InitializeBleDebugEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.UnknownBleDebugEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.UnknownBleDebugEvent.ReadableEvent, out BluetoothEventManager.UnknownBleDebugEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.UnknownBleDebugEvent.ReadableEvent, out BluetoothEventManager.UnknownBleDebugEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.RegisterBleDebugEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.RegisterBleDebugEvent.ReadableEvent, out BluetoothEventManager.RegisterBleDebugEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.RegisterBleDebugEvent.ReadableEvent, out BluetoothEventManager.RegisterBleDebugEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -66,7 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.InitializeBleEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.InitializeBleEvent.ReadableEvent, out BluetoothEventManager.InitializeBleEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.InitializeBleEvent.ReadableEvent, out BluetoothEventManager.InitializeBleEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -76,7 +76,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.UnknownBleEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.UnknownBleEvent.ReadableEvent, out BluetoothEventManager.UnknownBleEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.UnknownBleEvent.ReadableEvent, out BluetoothEventManager.UnknownBleEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -86,7 +86,7 @@ namespace Ryujinx.HLE.HOS.Services.Bluetooth { BluetoothEventManager.RegisterBleEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.RegisterBleEvent.ReadableEvent, out BluetoothEventManager.RegisterBleEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(BluetoothEventManager.RegisterBleEvent.ReadableEvent, out BluetoothEventManager.RegisterBleEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/BluetoothManager/BtmUser/IBtmUserCore.cs b/Ryujinx.HLE/HOS/Services/BluetoothManager/BtmUser/IBtmUserCore.cs index 8f138652..026b5bf1 100644 --- a/Ryujinx.HLE/HOS/Services/BluetoothManager/BtmUser/IBtmUserCore.cs +++ b/Ryujinx.HLE/HOS/Services/BluetoothManager/BtmUser/IBtmUserCore.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser { @@ -25,7 +25,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser // AcquireBleScanEvent() -> (byte<1>, handle<copy>) public ResultCode AcquireBleScanEvent(ServiceCtx context) { - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (_bleScanEventHandle == 0) { @@ -33,7 +33,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser result = context.Process.HandleTable.GenerateHandle(_bleScanEvent.ReadableEvent, out _bleScanEventHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { // NOTE: We use a Logging instead of an exception because the call return a boolean if succeed or not. Logger.Error?.Print(LogClass.ServiceBsd, "Out of handles!"); @@ -42,7 +42,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_bleScanEventHandle); - context.ResponseData.Write(result == KernelResult.Success ? 1 : 0); + context.ResponseData.Write(result == Result.Success ? 1 : 0); return ResultCode.Success; } @@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser // AcquireBleConnectionEvent() -> (byte<1>, handle<copy>) public ResultCode AcquireBleConnectionEvent(ServiceCtx context) { - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (_bleConnectionEventHandle == 0) { @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser result = context.Process.HandleTable.GenerateHandle(_bleConnectionEvent.ReadableEvent, out _bleConnectionEventHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { // NOTE: We use a Logging instead of an exception because the call return a boolean if succeed or not. Logger.Error?.Print(LogClass.ServiceBsd, "Out of handles!"); @@ -68,7 +68,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_bleConnectionEventHandle); - context.ResponseData.Write(result == KernelResult.Success ? 1 : 0); + context.ResponseData.Write(result == Result.Success ? 1 : 0); return ResultCode.Success; } @@ -77,7 +77,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser // AcquireBleServiceDiscoveryEvent() -> (byte<1>, handle<copy>) public ResultCode AcquireBleServiceDiscoveryEvent(ServiceCtx context) { - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (_bleServiceDiscoveryEventHandle == 0) { @@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser result = context.Process.HandleTable.GenerateHandle(_bleServiceDiscoveryEvent.ReadableEvent, out _bleServiceDiscoveryEventHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { // NOTE: We use a Logging instead of an exception because the call return a boolean if succeed or not. Logger.Error?.Print(LogClass.ServiceBsd, "Out of handles!"); @@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_bleServiceDiscoveryEventHandle); - context.ResponseData.Write(result == KernelResult.Success ? 1 : 0); + context.ResponseData.Write(result == Result.Success ? 1 : 0); return ResultCode.Success; } @@ -103,7 +103,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser // AcquireBleMtuConfigEvent() -> (byte<1>, handle<copy>) public ResultCode AcquireBleMtuConfigEvent(ServiceCtx context) { - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (_bleMtuConfigEventHandle == 0) { @@ -111,7 +111,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser result = context.Process.HandleTable.GenerateHandle(_bleMtuConfigEvent.ReadableEvent, out _bleMtuConfigEventHandle); - if (result != KernelResult.Success) + if (result != Result.Success) { // NOTE: We use a Logging instead of an exception because the call return a boolean if succeed or not. Logger.Error?.Print(LogClass.ServiceBsd, "Out of handles!"); @@ -120,7 +120,7 @@ namespace Ryujinx.HLE.HOS.Services.BluetoothManager.BtmUser context.Response.HandleDesc = IpcHandleDesc.MakeCopy(_bleMtuConfigEventHandle); - context.ResponseData.Write(result == KernelResult.Success ? 1 : 0); + context.ResponseData.Write(result == Result.Success ? 1 : 0); return ResultCode.Success; } diff --git a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs index 8159d091..17a33b79 100644 --- a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs +++ b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs @@ -4,12 +4,11 @@ using Ryujinx.Common.Logging; using Ryujinx.Common.Memory; using Ryujinx.Common.Utilities; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Friend.ServiceCreator.FriendService; +using Ryujinx.Horizon.Common; using System; -using System.IO; using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator @@ -33,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator _completionEvent = new KEvent(context.Device.System.KernelContext); } - if (context.Process.HandleTable.GenerateHandle(_completionEvent.ReadableEvent, out int completionEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_completionEvent.ReadableEvent, out int completionEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/INotificationService.cs b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/INotificationService.cs index f5614ddd..65cbd38e 100644 --- a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/INotificationService.cs +++ b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/INotificationService.cs @@ -1,9 +1,9 @@ using Ryujinx.Common; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Account.Acc; using Ryujinx.HLE.HOS.Services.Friend.ServiceCreator.NotificationService; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; @@ -43,7 +43,7 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator { if (_notificationEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_notificationEvent.ReadableEvent, out _notificationEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_notificationEvent.ReadableEvent, out _notificationEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Hid/HidServer/IAppletResource.cs b/Ryujinx.HLE/HOS/Services/Hid/HidServer/IAppletResource.cs index b38b25c3..29ee1706 100644 --- a/Ryujinx.HLE/HOS/Services/Hid/HidServer/IAppletResource.cs +++ b/Ryujinx.HLE/HOS/Services/Hid/HidServer/IAppletResource.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Hid.HidServer @@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.HidServer { if (_hidSharedMemHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_hidSharedMem, out _hidSharedMemHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_hidSharedMem, out _hidSharedMemHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs index 957cd553..d347a3bd 100644 --- a/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs +++ b/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs @@ -1,11 +1,11 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Hid.Types; using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.Npad; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; using System.Runtime.InteropServices; @@ -55,7 +55,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid // TODO: signal event at right place _xpadIdEvent.ReadableEvent.Signal(); - + _vibrationPermitted = true; } @@ -170,7 +170,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid { long xpadId = context.RequestData.ReadInt64(); - if (context.Process.HandleTable.GenerateHandle(_xpadIdEvent.ReadableEvent, out _xpadIdEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_xpadIdEvent.ReadableEvent, out _xpadIdEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -761,7 +761,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid long npadStyleSet = context.RequestData.ReadInt64(); KEvent evnt = context.Device.Hid.Npads.GetStyleSetUpdateEvent(npadId); - if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -1597,7 +1597,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid { int palmaConnectionHandle = context.RequestData.ReadInt32(); - if (context.Process.HandleTable.GenerateHandle(_palmaOperationCompleteEvent.ReadableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_palmaOperationCompleteEvent.ReadableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs b/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs index a0bd6375..7af06431 100644 --- a/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs +++ b/Ryujinx.HLE/HOS/Services/Hid/Irs/IIrSensorServer.cs @@ -1,9 +1,9 @@ using Ryujinx.Common; using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Hid.Irs.Types; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Hid.Irs @@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs if (_irsensorSharedMemoryHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _irsensorSharedMemoryHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _irsensorSharedMemoryHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -172,8 +172,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs { NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32(); - if (npadIdType > NpadIdType.Player8 && - npadIdType != NpadIdType.Unknown && + if (npadIdType > NpadIdType.Player8 && + npadIdType != NpadIdType.Unknown && npadIdType != NpadIdType.Handheld) { return ResultCode.NpadIdOutOfRange; @@ -183,7 +183,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid.Irs context.ResponseData.Write((int)irCameraHandle); - // NOTE: If the irCameraHandle pointer is null this error is returned, Doesn't occur in our case. + // NOTE: If the irCameraHandle pointer is null this error is returned, Doesn't occur in our case. // return ResultCode.HandlePointerIsNull; return ResultCode.Success; diff --git a/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs b/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs index dd3dad59..0c223c06 100644 --- a/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs +++ b/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/IUserLocalCommunicationService.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Ldn.Types; +using Ryujinx.Horizon.Common; using System; using System.Net; @@ -47,7 +47,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator { if (_stateChangeEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_networkInterface.StateChangeEvent.ReadableEvent, out _stateChangeEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_networkInterface.StateChangeEvent.ReadableEvent, out _stateChangeEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs b/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs index f4ad0366..a7f2dbb8 100644 --- a/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs +++ b/Ryujinx.HLE/HOS/Services/Nfc/Nfp/NfpManager/INfp.cs @@ -2,11 +2,11 @@ using Ryujinx.Cpu; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager; +using Ryujinx.Horizon.Common; using System; using System.Buffers.Binary; using System.Globalization; @@ -851,7 +851,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { context.Device.System.NfpDevices[i].ActivateEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(context.Device.System.NfpDevices[i].ActivateEvent.ReadableEvent, out int activateEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.NfpDevices[i].ActivateEvent.ReadableEvent, out int activateEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -877,7 +877,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { context.Device.System.NfpDevices[i].DeactivateEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(context.Device.System.NfpDevices[i].DeactivateEvent.ReadableEvent, out int deactivateEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.NfpDevices[i].DeactivateEvent.ReadableEvent, out int deactivateEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -960,7 +960,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp { _availabilityChangeEvent = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(_availabilityChangeEvent.ReadableEvent, out int availabilityChangeEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_availabilityChangeEvent.ReadableEvent, out int availabilityChangeEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs index 7a3fdabd..88757bee 100644 --- a/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs +++ b/Ryujinx.HLE/HOS/Services/Nifm/StaticService/IRequest.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService @@ -66,7 +66,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService { if (_event0Handle == 0) { - if (context.Process.HandleTable.GenerateHandle(_event0.ReadableEvent, out _event0Handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_event0.ReadableEvent, out _event0Handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -74,7 +74,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService if (_event1Handle == 0) { - if (context.Process.HandleTable.GenerateHandle(_event1.ReadableEvent, out _event1Handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_event1.ReadableEvent, out _event1Handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs index 919639b6..d6843d12 100644 --- a/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs +++ b/Ryujinx.HLE/HOS/Services/Nim/IShopServiceAccessor.cs @@ -1,8 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer.ShopServiceAccessor; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServiceAccessServer @@ -26,7 +26,7 @@ namespace Ryujinx.HLE.HOS.Services.Nim.ShopServiceAccessServerInterface.ShopServ if (_eventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out _eventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_event.ReadableEvent, out _eventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nim/Ntc/StaticService/IEnsureNetworkClockAvailabilityService.cs b/Ryujinx.HLE/HOS/Services/Nim/Ntc/StaticService/IEnsureNetworkClockAvailabilityService.cs index fb31bd1f..3b533f0f 100644 --- a/Ryujinx.HLE/HOS/Services/Nim/Ntc/StaticService/IEnsureNetworkClockAvailabilityService.cs +++ b/Ryujinx.HLE/HOS/Services/Nim/Ntc/StaticService/IEnsureNetworkClockAvailabilityService.cs @@ -1,12 +1,12 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Nim.Ntc.StaticService { - class IEnsureNetworkClockAvailabilityService : IpcService + class IEnsureNetworkClockAvailabilityService : IpcService { private KEvent _finishNotificationEvent; private ResultCode _taskResultCode; @@ -43,7 +43,7 @@ namespace Ryujinx.HLE.HOS.Services.Nim.Ntc.StaticService // GetFinishNotificationEvent() -> handle<copy> public ResultCode GetFinishNotificationEvent(ServiceCtx context) { - if (context.Process.HandleTable.GenerateHandle(_finishNotificationEvent.ReadableEvent, out int finishNotificationEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_finishNotificationEvent.ReadableEvent, out int finishNotificationEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs b/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs index 53866a6b..0d552003 100644 --- a/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs +++ b/Ryujinx.HLE/HOS/Services/Ns/Aoc/IAddOnContentManager.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; @@ -129,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns.Aoc // TODO: Found where stored value is used. ResultCode resultCode = GetAddOnContentBaseIdFromTitleId(context, context.Device.Application.TitleId); - + if (resultCode != ResultCode.Success) { return resultCode; @@ -327,7 +327,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns.Aoc { if (_addOnContentListChangedEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_addOnContentListChangedEvent.ReadableEvent, out _addOnContentListChangedEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_addOnContentListChangedEvent.ReadableEvent, out _addOnContentListChangedEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Ns/Aoc/IPurchaseEventManager.cs b/Ryujinx.HLE/HOS/Services/Ns/Aoc/IPurchaseEventManager.cs index 9b65e0f9..5ec43a3f 100644 --- a/Ryujinx.HLE/HOS/Services/Ns/Aoc/IPurchaseEventManager.cs +++ b/Ryujinx.HLE/HOS/Services/Ns/Aoc/IPurchaseEventManager.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Ns.Aoc @@ -38,7 +38,7 @@ namespace Ryujinx.HLE.HOS.Services.Ns.Aoc // GetPurchasedEventReadableHandle() -> handle<copy, event> public ResultCode GetPurchasedEventReadableHandle(ServiceCtx context) { - if (context.Process.HandleTable.GenerateHandle(_purchasedEvent.ReadableEvent, out int purchasedEventReadableHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_purchasedEvent.ReadableEvent, out int purchasedEventReadableHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostGpuDeviceFile.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostGpuDeviceFile.cs index 5bc3e3bd..f33cc460 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostGpuDeviceFile.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostChannel/NvHostGpuDeviceFile.cs @@ -1,6 +1,6 @@ -using Ryujinx.HLE.HOS.Kernel.Common; -using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel.Types; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; @@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel { KEvent evnt = new KEvent(context.Device.System.KernelContext); - if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(evnt.ReadableEvent, out handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs index d332bb04..ac5512ed 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostEvent.cs @@ -2,9 +2,9 @@ using Ryujinx.Common.Logging; using Ryujinx.Graphics.Gpu; using Ryujinx.Graphics.Gpu.Synchronization; using Ryujinx.HLE.HOS.Kernel; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Nv.Types; +using Ryujinx.Horizon.Common; using System; using System.Threading; @@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl Event = new KEvent(system.KernelContext); - if (KernelStatic.GetCurrentProcess().HandleTable.GenerateHandle(Event.ReadableEvent, out EventHandle) != KernelResult.Success) + if (KernelStatic.GetCurrentProcess().HandleTable.GenerateHandle(Event.ReadableEvent, out EventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuDeviceFile.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuDeviceFile.cs index f1a6570b..d6a8e29f 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuDeviceFile.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrlGpu/NvHostCtrlGpuDeviceFile.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Diagnostics; @@ -99,7 +99,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu if (targetEvent != null) { - if (Context.Process.HandleTable.GenerateHandle(targetEvent.ReadableEvent, out eventHandle) != KernelResult.Success) + if (Context.Process.HandleTable.GenerateHandle(targetEvent.ReadableEvent, out eventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/IClkrstManager.cs b/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/IClkrstManager.cs index 8c96c4ad..94ab49ca 100644 --- a/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/IClkrstManager.cs +++ b/Ryujinx.HLE/HOS/Services/Pcv/Clkrst/IClkrstManager.cs @@ -1,7 +1,7 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Pcv.Clkrst.ClkrstManager; using Ryujinx.HLE.HOS.Services.Pcv.Types; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Pcv.Clkrst @@ -34,7 +34,7 @@ namespace Ryujinx.HLE.HOS.Services.Pcv.Clkrst { if (_moduleStateTableEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _moduleStateTableEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.IirsSharedMem, out _moduleStateTableEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Pm/IDebugMonitorInterface.cs b/Ryujinx.HLE/HOS/Services/Pm/IDebugMonitorInterface.cs index 4b0df9b7..c9c6354d 100644 --- a/Ryujinx.HLE/HOS/Services/Pm/IDebugMonitorInterface.cs +++ b/Ryujinx.HLE/HOS/Services/Pm/IDebugMonitorInterface.cs @@ -1,7 +1,7 @@ using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Services.Pm { @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Pm KProcess process = KernelStatic.GetProcessByPid(pid); - if (context.Process.HandleTable.GenerateHandle(process, out int processHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(process, out int processHandle) != Result.Success) { throw new System.Exception("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Ptm/Psm/IPsmSession.cs b/Ryujinx.HLE/HOS/Services/Ptm/Psm/IPsmSession.cs index 6015c6a4..9b4e996d 100644 --- a/Ryujinx.HLE/HOS/Services/Ptm/Psm/IPsmSession.cs +++ b/Ryujinx.HLE/HOS/Services/Ptm/Psm/IPsmSession.cs @@ -1,7 +1,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Services.Ptm.Psm { @@ -22,11 +22,11 @@ namespace Ryujinx.HLE.HOS.Services.Ptm.Psm { if (_stateChangeEventHandle == -1) { - KernelResult resultCode = context.Process.HandleTable.GenerateHandle(_stateChangeEvent.ReadableEvent, out _stateChangeEventHandle); + Result resultCode = context.Process.HandleTable.GenerateHandle(_stateChangeEvent.ReadableEvent, out _stateChangeEventHandle); - if (resultCode != KernelResult.Success) + if (resultCode != Result.Success) { - return (ResultCode)resultCode; + return (ResultCode)resultCode.ErrorCode; } } diff --git a/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs b/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs index 36e1078f..263e1c4c 100644 --- a/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs +++ b/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs @@ -1,10 +1,10 @@ using LibHac.Tools.FsSystem; using Ryujinx.Common; using Ryujinx.Cpu; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.Loaders.Executables; +using Ryujinx.Horizon.Common; using Ryujinx.Memory; using System; using System.Collections.Generic; @@ -217,7 +217,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro if (info.BssSize > 0) { - KernelResult bssMappingResult = memMgr.MapProcessCodeMemory(nroMappedAddress + info.NroSize, info.BssAddress, info.BssSize); + Result bssMappingResult = memMgr.MapProcessCodeMemory(nroMappedAddress + info.NroSize, info.BssAddress, info.BssSize); if (bssMappingResult == KernelResult.InvalidMemState) { @@ -226,12 +226,12 @@ namespace Ryujinx.HLE.HOS.Services.Ro continue; } - else if (bssMappingResult != KernelResult.Success) + else if (bssMappingResult != Result.Success) { memMgr.UnmapProcessCodeMemory(nroMappedAddress + info.NroSize, info.BssAddress, info.BssSize); memMgr.UnmapProcessCodeMemory(nroMappedAddress, info.NroAddress, info.NroSize); - return (ResultCode)bssMappingResult; + return (ResultCode)bssMappingResult.ErrorCode; } } @@ -286,15 +286,15 @@ namespace Ryujinx.HLE.HOS.Services.Ro } } - KernelResult result = memMgr.MapProcessCodeMemory(targetAddress, baseAddress, size); + Result result = memMgr.MapProcessCodeMemory(targetAddress, baseAddress, size); if (result == KernelResult.InvalidMemState) { continue; } - else if (result != KernelResult.Success) + else if (result != Result.Success) { - return (ResultCode)result; + return (ResultCode)result.ErrorCode; } if (!CanAddGuardRegionsInProcess(process, targetAddress, size)) @@ -313,11 +313,11 @@ namespace Ryujinx.HLE.HOS.Services.Ro return ResultCode.Success; } - private KernelResult SetNroMemoryPermissions(KProcess process, IExecutable relocatableObject, ulong baseAddress) + private Result SetNroMemoryPermissions(KProcess process, IExecutable relocatableObject, ulong baseAddress) { - ulong textStart = baseAddress + (ulong)relocatableObject.TextOffset; - ulong roStart = baseAddress + (ulong)relocatableObject.RoOffset; - ulong dataStart = baseAddress + (ulong)relocatableObject.DataOffset; + ulong textStart = baseAddress + relocatableObject.TextOffset; + ulong roStart = baseAddress + relocatableObject.RoOffset; + ulong dataStart = baseAddress + relocatableObject.DataOffset; ulong bssStart = dataStart + (ulong)relocatableObject.Data.Length; @@ -329,18 +329,18 @@ namespace Ryujinx.HLE.HOS.Services.Ro MemoryHelper.FillWithZeros(process.CpuMemory, bssStart, (int)(bssEnd - bssStart)); - KernelResult result; + Result result; result = process.MemoryManager.SetProcessMemoryPermission(textStart, roStart - textStart, KMemoryPermission.ReadAndExecute); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } result = process.MemoryManager.SetProcessMemoryPermission(roStart, dataStart - roStart, KMemoryPermission.Read); - if (result != KernelResult.Success) + if (result != Result.Success) { return result; } @@ -385,7 +385,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro ulong dataSize = (ulong)info.Executable.Data.Length; ulong bssSize = (ulong)info.Executable.BssSize; - KernelResult result = KernelResult.Success; + Result result = Result.Success; if (info.Executable.BssSize != 0) { @@ -395,14 +395,14 @@ namespace Ryujinx.HLE.HOS.Services.Ro bssSize); } - if (result == KernelResult.Success) + if (result == Result.Success) { result = _owner.MemoryManager.UnmapProcessCodeMemory( info.NroMappedAddress + textSize + roSize, info.Executable.SourceAddress + textSize + roSize, dataSize); - if (result == KernelResult.Success) + if (result == Result.Success) { result = _owner.MemoryManager.UnmapProcessCodeMemory( info.NroMappedAddress, @@ -411,7 +411,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro } } - return (ResultCode)result; + return (ResultCode)result.ErrorCode; } private ResultCode IsInitialized(ulong pid) @@ -452,7 +452,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro if (result == ResultCode.Success) { - result = (ResultCode)SetNroMemoryPermissions(_owner, info.Executable, nroMappedAddress); + result = (ResultCode)SetNroMemoryPermissions(_owner, info.Executable, nroMappedAddress).ErrorCode; if (result == ResultCode.Success) { diff --git a/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs b/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs index 82e246b7..f95c1d1f 100644 --- a/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs +++ b/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Sdb.Pl.Types; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Sdb.Pl @@ -67,7 +67,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl if (_fontSharedMemHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.FontSharedMem, out _fontSharedMemHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.FontSharedMem, out _fontSharedMemHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl // GetSharedFontInOrderOfPriorityForSystem(bytes<8, 1>) -> (u8, u32, buffer<unknown, 6>, buffer<unknown, 6>, buffer<unknown, 6>) public ResultCode GetSharedFontInOrderOfPriorityForSystem(ServiceCtx context) { - // TODO: Check the differencies with GetSharedFontInOrderOfPriority. + // TODO: Check the differencies with GetSharedFontInOrderOfPriority. return GetSharedFontInOrderOfPriority(context); } diff --git a/Ryujinx.HLE/HOS/Services/ServerBase.cs b/Ryujinx.HLE/HOS/Services/ServerBase.cs index 3c53abec..50f6c99e 100644 --- a/Ryujinx.HLE/HOS/Services/ServerBase.cs +++ b/Ryujinx.HLE/HOS/Services/ServerBase.cs @@ -1,9 +1,9 @@ using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Ipc; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; using System.Buffers.Binary; using System.Collections.Generic; @@ -129,7 +129,7 @@ namespace Ryujinx.HLE.HOS.Services replyTargetHandle = 0; - if (rc == KernelResult.Success && signaledIndex >= portHandles.Length) + if (rc == Result.Success && signaledIndex >= portHandles.Length) { // We got a IPC request, process it, pass to the appropriate service if needed. int signaledHandle = handles[signaledIndex]; @@ -141,10 +141,10 @@ namespace Ryujinx.HLE.HOS.Services } else { - if (rc == KernelResult.Success) + if (rc == Result.Success) { // We got a new connection, accept the session to allow servicing future requests. - if (_context.Syscall.AcceptSession(out int serverSessionHandle, handles[signaledIndex]) == KernelResult.Success) + if (_context.Syscall.AcceptSession(out int serverSessionHandle, handles[signaledIndex]) == Result.Success) { IpcService obj = _ports[handles[signaledIndex]].Invoke(); diff --git a/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs b/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs index 8e66b28d..86031a70 100644 --- a/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs +++ b/Ryujinx.HLE/HOS/Services/Sm/IUserInterface.cs @@ -1,8 +1,8 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Kernel; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Ipc; +using Ryujinx.Horizon.Common; using System; using System.Collections.Generic; using System.IO; @@ -72,14 +72,14 @@ namespace Ryujinx.HLE.HOS.Services.Sm if (_registry.TryGetService(name, out KPort port)) { - KernelResult result = port.EnqueueIncomingSession(session.ServerSession); + Result result = port.EnqueueIncomingSession(session.ServerSession); - if (result != KernelResult.Success) + if (result != Result.Success) { throw new InvalidOperationException($"Session enqueue on port returned error \"{result}\"."); } - if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -113,7 +113,7 @@ namespace Ryujinx.HLE.HOS.Services.Sm } } - if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(session.ClientSession, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } @@ -182,14 +182,14 @@ namespace Ryujinx.HLE.HOS.Services.Sm Logger.Info?.Print(LogClass.ServiceSm, $"Register \"{name}\"."); - KPort port = new KPort(context.Device.System.KernelContext, maxSessions, isLight, 0); + KPort port = new KPort(context.Device.System.KernelContext, maxSessions, isLight, null); if (!_registry.TryRegister(name, port)) { return ResultCode.AlreadyRegistered; } - if (context.Process.HandleTable.GenerateHandle(port.ServerPort, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(port.ServerPort, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs b/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs index c3dcbee7..d641f7f0 100644 --- a/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs +++ b/Ryujinx.HLE/HOS/Services/SurfaceFlinger/IHOSBinderDriver.cs @@ -1,6 +1,6 @@ using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger @@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger GetNativeHandle(binderId, typeId, out KReadableEvent readableEvent); - if (context.Process.HandleTable.GenerateHandle(readableEvent, out int handle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(readableEvent, out int handle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs b/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs index 4f351812..abb5bb40 100644 --- a/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs +++ b/Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs @@ -1,10 +1,10 @@ using Ryujinx.Common; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Time.Clock; using Ryujinx.HLE.HOS.Services.Time.StaticService; using Ryujinx.HLE.HOS.Services.Time.TimeZone; +using Ryujinx.Horizon.Common; using System; using System.Diagnostics; using System.IO; @@ -102,7 +102,7 @@ namespace Ryujinx.HLE.HOS.Services.Time { if (_timeSharedMemoryNativeHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(_timeManager.SharedMemory.GetSharedMemory(), out _timeSharedMemoryNativeHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_timeManager.SharedMemory.GetSharedMemory(), out _timeSharedMemoryNativeHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Time/ITimeServiceManager.cs b/Ryujinx.HLE/HOS/Services/Time/ITimeServiceManager.cs index 1ff5b2d6..aae9aaaf 100644 --- a/Ryujinx.HLE/HOS/Services/Time/ITimeServiceManager.cs +++ b/Ryujinx.HLE/HOS/Services/Time/ITimeServiceManager.cs @@ -2,9 +2,9 @@ using Ryujinx.Cpu; using Ryujinx.HLE.Exceptions; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Services.Time.Clock; using Ryujinx.HLE.Utilities; +using Ryujinx.Horizon.Common; using System; using System.IO; @@ -180,7 +180,7 @@ namespace Ryujinx.HLE.HOS.Services.Time { if (_automaticCorrectionEvent == 0) { - if (context.Process.HandleTable.GenerateHandle(_timeManager.StandardUserSystemClock.GetAutomaticCorrectionReadableEvent(), out _automaticCorrectionEvent) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(_timeManager.StandardUserSystemClock.GetAutomaticCorrectionReadableEvent(), out _automaticCorrectionEvent) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Time/StaticService/ISystemClock.cs b/Ryujinx.HLE/HOS/Services/Time/StaticService/ISystemClock.cs index 085cc71d..c43c1582 100644 --- a/Ryujinx.HLE/HOS/Services/Time/StaticService/ISystemClock.cs +++ b/Ryujinx.HLE/HOS/Services/Time/StaticService/ISystemClock.cs @@ -1,9 +1,9 @@ using Ryujinx.Common; using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Ipc; -using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Services.Time.Clock; +using Ryujinx.Horizon.Common; using System; namespace Ryujinx.HLE.HOS.Services.Time.StaticService @@ -117,7 +117,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService _clockCore.RegisterOperationEvent(kEvent.WritableEvent); - if (context.Process.HandleTable.GenerateHandle(kEvent.ReadableEvent, out _operationEventReadableHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(kEvent.ReadableEvent, out _operationEventReadableHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs b/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs index 885a4cd7..d6feb33f 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/RootService/IApplicationDisplayService.cs @@ -14,6 +14,7 @@ using System.Diagnostics; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Text; +using Ryujinx.Horizon.Common; namespace Ryujinx.HLE.HOS.Services.Vi.RootService { @@ -471,7 +472,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService if (_vsyncEventHandle == 0) { - if (context.Process.HandleTable.GenerateHandle(context.Device.System.VsyncEvent.ReadableEvent, out _vsyncEventHandle) != KernelResult.Success) + if (context.Process.HandleTable.GenerateHandle(context.Device.System.VsyncEvent.ReadableEvent, out _vsyncEventHandle) != Result.Success) { throw new InvalidOperationException("Out of handles!"); } diff --git a/Ryujinx.HLE/Ryujinx.HLE.csproj b/Ryujinx.HLE/Ryujinx.HLE.csproj index f1f295a2..5e3aa0ea 100644 --- a/Ryujinx.HLE/Ryujinx.HLE.csproj +++ b/Ryujinx.HLE/Ryujinx.HLE.csproj @@ -11,7 +11,9 @@ <ProjectReference Include="..\Ryujinx.Graphics.Host1x\Ryujinx.Graphics.Host1x.csproj" /> <ProjectReference Include="..\Ryujinx.Graphics.Nvdec\Ryujinx.Graphics.Nvdec.csproj" /> <ProjectReference Include="..\Ryujinx.Graphics.Vic\Ryujinx.Graphics.Vic.csproj" /> - <ProjectReference Include="..\Ryujinx.Horizon.Generators\Ryujinx.Horizon.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" /> + <ProjectReference Include="..\Ryujinx.Horizon.Common\Ryujinx.Horizon.Common.csproj" /> + <ProjectReference Include="..\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" /> + <ProjectReference Include="..\Ryujinx.Horizon\Ryujinx.Horizon.csproj" /> <ProjectReference Include="..\Ryujinx.Memory\Ryujinx.Memory.csproj" /> <ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" /> <ProjectReference Include="..\Ryujinx.Graphics.Gpu\Ryujinx.Graphics.Gpu.csproj" /> diff --git a/Ryujinx.HLE/Switch.cs b/Ryujinx.HLE/Switch.cs index 46af68f4..61e5e572 100644 --- a/Ryujinx.HLE/Switch.cs +++ b/Ryujinx.HLE/Switch.cs @@ -19,7 +19,7 @@ namespace Ryujinx.HLE public MemoryBlock Memory { get; } public GpuContext Gpu { get; } public VirtualFileSystem FileSystem { get; } - public Horizon System { get; } + public HOS.Horizon System { get; } public ApplicationLoader Application { get; } public PerformanceStatistics Statistics { get; } public Hid Hid { get; } @@ -47,7 +47,7 @@ namespace Ryujinx.HLE AudioDeviceDriver = new CompatLayerHardwareDeviceDriver(Configuration.AudioDeviceDriver); Memory = new MemoryBlock(Configuration.MemoryConfiguration.ToDramSize(), memoryAllocationFlags); Gpu = new GpuContext(Configuration.GpuRenderer); - System = new Horizon(this); + System = new HOS.Horizon(this); Statistics = new PerformanceStatistics(); Hid = new Hid(this, System.HidStorage); Application = new ApplicationLoader(this); |