IPC refactor part 3+4: New server HIPC message processor (#4188)
* IPC refactor part 3 + 4: New server HIPC message processor with source generator based serialization * Make types match on calls to AlignUp/AlignDown * Formatting * Address some PR feedback * Move BitfieldExtensions to Ryujinx.Common.Utilities and consolidate implementations * Rename Reader/Writer to SpanReader/SpanWriter and move to Ryujinx.Common.Memory * Implement EventType * Address more PR feedback * Log request processing errors since they are not normal * Rename waitable to multiwait and add missing lock * PR feedback * Ac_K PR feedback
This commit is contained in:
parent
c6a139a6e7
commit
08831eecf7
213 changed files with 9762 additions and 1010 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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}\".");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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/>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) { }
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue