Move kernel state out of the Horizon class (#1107)
* Move kernel state from Horizon to KernelContext * Merge syscalls partial classes, split 32 and 64-bit variants * Sort usings
This commit is contained in:
parent
cd48576f58
commit
15d1cc806b
68 changed files with 3678 additions and 3570 deletions
|
@ -8,19 +8,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
private int _sessionsCount;
|
||||
private int _currentCapacity;
|
||||
private int _maxSessions;
|
||||
private readonly int _maxSessions;
|
||||
|
||||
private KPort _parent;
|
||||
private readonly KPort _parent;
|
||||
|
||||
public bool IsLight => _parent.IsLight;
|
||||
|
||||
private object _countIncLock;
|
||||
private readonly object _countIncLock;
|
||||
|
||||
// TODO: Remove that, we need it for now to allow HLE
|
||||
// SM implementation to work with the new IPC system.
|
||||
public IpcService Service { get; set; }
|
||||
|
||||
public KClientPort(Horizon system, KPort parent, int maxSessions) : base(system)
|
||||
public KClientPort(KernelContext context, KPort parent, int maxSessions) : base(context)
|
||||
{
|
||||
_maxSessions = maxSessions;
|
||||
_parent = parent;
|
||||
|
@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
clientSession = null;
|
||||
|
||||
KProcess currentProcess = System.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelContext.Scheduler.GetCurrentProcess();
|
||||
|
||||
if (currentProcess.ResourceLimit != null &&
|
||||
!currentProcess.ResourceLimit.Reserve(LimitableResource.Session, 1))
|
||||
|
@ -59,7 +59,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
}
|
||||
}
|
||||
|
||||
KSession session = new KSession(System);
|
||||
KSession session = new KSession(KernelContext);
|
||||
|
||||
if (Service != null)
|
||||
{
|
||||
|
@ -85,7 +85,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
clientSession = null;
|
||||
|
||||
KProcess currentProcess = System.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelContext.Scheduler.GetCurrentProcess();
|
||||
|
||||
if (currentProcess.ResourceLimit != null &&
|
||||
!currentProcess.ResourceLimit.Reserve(LimitableResource.Session, 1))
|
||||
|
@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
}
|
||||
}
|
||||
|
||||
KLightSession session = new KLightSession(System);
|
||||
KLightSession session = new KLightSession(KernelContext);
|
||||
|
||||
KernelResult result = _parent.EnqueueIncomingLightSession(session.ServerSession);
|
||||
|
||||
|
@ -124,16 +124,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
return result;
|
||||
}
|
||||
|
||||
public new static KernelResult RemoveName(Horizon system, string name)
|
||||
public new static KernelResult RemoveName(KernelContext context, string name)
|
||||
{
|
||||
KAutoObject foundObj = FindNamedObject(system, name);
|
||||
KAutoObject foundObj = FindNamedObject(context, name);
|
||||
|
||||
if (!(foundObj is KClientPort))
|
||||
{
|
||||
return KernelResult.NotFound;
|
||||
}
|
||||
|
||||
return KAutoObject.RemoveName(system, name);
|
||||
return KAutoObject.RemoveName(context, name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -17,31 +17,31 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
// services implementation to work with the new IPC system.
|
||||
public IpcService Service { get; set; }
|
||||
|
||||
public KClientSession(Horizon system, KSession parent) : base(system)
|
||||
public KClientSession(KernelContext context, KSession parent) : base(context)
|
||||
{
|
||||
_parent = parent;
|
||||
|
||||
State = ChannelState.Open;
|
||||
|
||||
CreatorProcess = system.Scheduler.GetCurrentProcess();
|
||||
CreatorProcess = context.Scheduler.GetCurrentProcess();
|
||||
|
||||
CreatorProcess.IncrementReferenceCount();
|
||||
}
|
||||
|
||||
public KernelResult SendSyncRequest(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
|
||||
{
|
||||
KThread currentThread = System.Scheduler.GetCurrentThread();
|
||||
KThread currentThread = KernelContext.Scheduler.GetCurrentThread();
|
||||
|
||||
KSessionRequest request = new KSessionRequest(currentThread, customCmdBuffAddr, customCmdBuffSize);
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
currentThread.SignaledObj = null;
|
||||
currentThread.ObjSyncResult = KernelResult.Success;
|
||||
|
||||
KernelResult result = _parent.ServerSession.EnqueueRequest(request);
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
if (result == KernelResult.Success)
|
||||
{
|
||||
|
|
|
@ -4,9 +4,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
class KLightClientSession : KAutoObject
|
||||
{
|
||||
private KLightSession _parent;
|
||||
private readonly KLightSession _parent;
|
||||
|
||||
public KLightClientSession(Horizon system, KLightSession parent) : base(system)
|
||||
public KLightClientSession(KernelContext context, KLightSession parent) : base(context)
|
||||
{
|
||||
_parent = parent;
|
||||
}
|
||||
|
|
|
@ -4,9 +4,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
class KLightServerSession : KAutoObject
|
||||
{
|
||||
private KLightSession _parent;
|
||||
private readonly KLightSession _parent;
|
||||
|
||||
public KLightServerSession(Horizon system, KLightSession parent) : base(system)
|
||||
public KLightServerSession(KernelContext context, KLightSession parent) : base(context)
|
||||
{
|
||||
_parent = parent;
|
||||
}
|
||||
|
|
|
@ -7,10 +7,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
public KLightServerSession ServerSession { get; }
|
||||
public KLightClientSession ClientSession { get; }
|
||||
|
||||
public KLightSession(Horizon system) : base(system)
|
||||
public KLightSession(KernelContext context) : base(context)
|
||||
{
|
||||
ServerSession = new KLightServerSession(system, this);
|
||||
ClientSession = new KLightClientSession(system, this);
|
||||
ServerSession = new KLightServerSession(context, this);
|
||||
ClientSession = new KLightClientSession(context, this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,10 +13,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
public bool IsLight { get; private set; }
|
||||
|
||||
public KPort(Horizon system, int maxSessions, bool isLight, long nameAddress) : base(system)
|
||||
public KPort(KernelContext context, int maxSessions, bool isLight, long nameAddress) : base(context)
|
||||
{
|
||||
ServerPort = new KServerPort(system, this);
|
||||
ClientPort = new KClientPort(system, this, maxSessions);
|
||||
ServerPort = new KServerPort(context, this);
|
||||
ClientPort = new KClientPort(context, this, maxSessions);
|
||||
|
||||
IsLight = isLight;
|
||||
_nameAddress = nameAddress;
|
||||
|
@ -28,7 +28,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
KernelResult result;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (_state == ChannelState.Open)
|
||||
{
|
||||
|
@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
result = KernelResult.PortClosed;
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
KernelResult result;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (_state == ChannelState.Open)
|
||||
{
|
||||
|
@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
result = KernelResult.PortClosed;
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -5,14 +5,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
class KServerPort : KSynchronizationObject
|
||||
{
|
||||
private LinkedList<KServerSession> _incomingConnections;
|
||||
private LinkedList<KLightServerSession> _lightIncomingConnections;
|
||||
private readonly LinkedList<KServerSession> _incomingConnections;
|
||||
private readonly LinkedList<KLightServerSession> _lightIncomingConnections;
|
||||
|
||||
private KPort _parent;
|
||||
private readonly KPort _parent;
|
||||
|
||||
public bool IsLight => _parent.IsLight;
|
||||
|
||||
public KServerPort(Horizon system, KPort parent) : base(system)
|
||||
public KServerPort(KernelContext context, KPort parent) : base(context)
|
||||
{
|
||||
_parent = parent;
|
||||
|
||||
|
@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private void AcceptIncomingConnection<T>(LinkedList<T> list, T session)
|
||||
{
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
list.AddLast(session);
|
||||
|
||||
|
@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
Signal();
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
}
|
||||
|
||||
public KServerSession AcceptIncomingConnection()
|
||||
|
@ -56,9 +56,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private T AcceptIncomingConnection<T>(LinkedList<T> list)
|
||||
{
|
||||
T session = default(T);
|
||||
T session = default;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (list.Count != 0)
|
||||
{
|
||||
|
@ -67,7 +67,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
list.RemoveFirst();
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return session;
|
||||
}
|
||||
|
|
|
@ -177,7 +177,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private KSessionRequest _activeRequest;
|
||||
|
||||
public KServerSession(Horizon system, KSession parent) : base(system)
|
||||
public KServerSession(KernelContext context, KSession parent) : base(context)
|
||||
{
|
||||
_parent = parent;
|
||||
|
||||
|
@ -214,28 +214,28 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
public KernelResult Receive(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
|
||||
{
|
||||
KThread serverThread = System.Scheduler.GetCurrentThread();
|
||||
KThread serverThread = KernelContext.Scheduler.GetCurrentThread();
|
||||
KProcess serverProcess = serverThread.Owner;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (_parent.ClientSession.State != ChannelState.Open)
|
||||
{
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return KernelResult.PortRemoteClosed;
|
||||
}
|
||||
|
||||
if (_activeRequest != null || !DequeueRequest(out KSessionRequest request))
|
||||
{
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return KernelResult.NotFound;
|
||||
}
|
||||
|
||||
if (request.ClientThread == null)
|
||||
{
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return KernelResult.PortRemoteClosed;
|
||||
}
|
||||
|
@ -243,7 +243,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
KThread clientThread = request.ClientThread;
|
||||
KProcess clientProcess = clientThread.Owner;
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
_activeRequest = request;
|
||||
|
||||
|
@ -267,7 +267,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
CloseAllHandles(serverMsg, clientHeader, serverProcess);
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
_activeRequest = null;
|
||||
|
||||
|
@ -276,7 +276,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
Signal();
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
WakeClientThread(request, clientResult);
|
||||
}
|
||||
|
@ -351,8 +351,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
for (int index = 0; index < clientHeader.CopyHandlesCount; index++)
|
||||
{
|
||||
int newHandle = 0;
|
||||
|
||||
int handle = System.Device.Memory.Read<int>(clientMsg.DramAddress + offset * 4);
|
||||
int handle = KernelContext.Memory.Read<int>(clientMsg.DramAddress + offset * 4);
|
||||
|
||||
if (clientResult == KernelResult.Success && handle != 0)
|
||||
{
|
||||
|
@ -367,8 +366,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
for (int index = 0; index < clientHeader.MoveHandlesCount; index++)
|
||||
{
|
||||
int newHandle = 0;
|
||||
|
||||
int handle = System.Device.Memory.Read<int>(clientMsg.DramAddress + offset * 4);
|
||||
int handle = KernelContext.Memory.Read<int>(clientMsg.DramAddress + offset * 4);
|
||||
|
||||
if (handle != 0)
|
||||
{
|
||||
|
@ -404,7 +402,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
for (int index = 0; index < clientHeader.PointerBuffersCount; index++)
|
||||
{
|
||||
ulong pointerDesc = System.Device.Memory.Read<ulong>(clientMsg.DramAddress + offset * 4);
|
||||
ulong pointerDesc = KernelContext.Memory.Read<ulong>(clientMsg.DramAddress + offset * 4);
|
||||
|
||||
PointerBufferDesc descriptor = new PointerBufferDesc(pointerDesc);
|
||||
|
||||
|
@ -465,9 +463,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
ulong clientDescAddress = clientMsg.DramAddress + offset * 4;
|
||||
|
||||
uint descWord0 = System.Device.Memory.Read<uint>(clientDescAddress + 0);
|
||||
uint descWord1 = System.Device.Memory.Read<uint>(clientDescAddress + 4);
|
||||
uint descWord2 = System.Device.Memory.Read<uint>(clientDescAddress + 8);
|
||||
uint descWord0 = KernelContext.Memory.Read<uint>(clientDescAddress + 0);
|
||||
uint descWord1 = KernelContext.Memory.Read<uint>(clientDescAddress + 4);
|
||||
uint descWord2 = KernelContext.Memory.Read<uint>(clientDescAddress + 8);
|
||||
|
||||
bool isSendDesc = index < clientHeader.SendBuffersCount;
|
||||
bool isExchangeDesc = index >= clientHeader.SendBuffersCount + clientHeader.ReceiveBuffersCount;
|
||||
|
@ -580,7 +578,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
copySrc = clientProcess.MemoryManager.GetDramAddressFromVa(copySrc);
|
||||
copyDst = serverProcess.MemoryManager.GetDramAddressFromVa(copyDst);
|
||||
|
||||
System.Device.Memory.Copy(copyDst, copySrc, copySize);
|
||||
KernelContext.Memory.Copy(copyDst, copySrc, copySize);
|
||||
}
|
||||
|
||||
if (clientResult != KernelResult.Success)
|
||||
|
@ -596,14 +594,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
public KernelResult Reply(ulong customCmdBuffAddr = 0, ulong customCmdBuffSize = 0)
|
||||
{
|
||||
KThread serverThread = System.Scheduler.GetCurrentThread();
|
||||
KThread serverThread = KernelContext.Scheduler.GetCurrentThread();
|
||||
KProcess serverProcess = serverThread.Owner;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (_activeRequest == null)
|
||||
{
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return KernelResult.InvalidState;
|
||||
}
|
||||
|
@ -617,7 +615,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
Signal();
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
KThread clientThread = request.ClientThread;
|
||||
KProcess clientProcess = clientThread.Owner;
|
||||
|
@ -700,8 +698,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
}
|
||||
|
||||
// Copy header.
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + 0, serverHeader.Word0);
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + 4, serverHeader.Word1);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + 0, serverHeader.Word0);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + 4, serverHeader.Word1);
|
||||
|
||||
// Copy handles.
|
||||
uint offset;
|
||||
|
@ -710,11 +708,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
offset = 3;
|
||||
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + 8, serverHeader.Word2);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + 8, serverHeader.Word2);
|
||||
|
||||
if (serverHeader.HasPid)
|
||||
{
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, serverProcess.Pid);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, serverProcess.Pid);
|
||||
|
||||
offset += 2;
|
||||
}
|
||||
|
@ -730,7 +728,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
GetCopyObjectHandle(serverThread, clientProcess, handle, out newHandle);
|
||||
}
|
||||
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle);
|
||||
|
||||
offset++;
|
||||
}
|
||||
|
@ -753,7 +751,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
}
|
||||
}
|
||||
|
||||
System.Device.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle);
|
||||
KernelContext.Memory.Write(clientMsg.DramAddress + offset * 4, newHandle);
|
||||
|
||||
offset++;
|
||||
}
|
||||
|
@ -821,9 +819,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
ulong dstDescAddress = clientMsg.DramAddress + offset * 4;
|
||||
|
||||
System.Device.Memory.Write(dstDescAddress + 0, 0);
|
||||
System.Device.Memory.Write(dstDescAddress + 4, 0);
|
||||
System.Device.Memory.Write(dstDescAddress + 8, 0);
|
||||
KernelContext.Memory.Write(dstDescAddress + 0, 0);
|
||||
KernelContext.Memory.Write(dstDescAddress + 4, 0);
|
||||
KernelContext.Memory.Write(dstDescAddress + 8, 0);
|
||||
|
||||
offset += 3;
|
||||
}
|
||||
|
@ -857,7 +855,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
copyDst = clientProcess.MemoryManager.GetDramAddressFromVa(copyDst);
|
||||
copySrc = serverProcess.MemoryManager.GetDramAddressFromVa(copySrc);
|
||||
|
||||
System.Device.Memory.Copy(copyDst, copySrc, copySize);
|
||||
KernelContext.Memory.Copy(copyDst, copySrc, copySize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -878,16 +876,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private MessageHeader GetClientMessageHeader(Message clientMsg)
|
||||
{
|
||||
uint word0 = System.Device.Memory.Read<uint>(clientMsg.DramAddress + 0);
|
||||
uint word1 = System.Device.Memory.Read<uint>(clientMsg.DramAddress + 4);
|
||||
uint word2 = System.Device.Memory.Read<uint>(clientMsg.DramAddress + 8);
|
||||
uint word0 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 0);
|
||||
uint word1 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 4);
|
||||
uint word2 = KernelContext.Memory.Read<uint>(clientMsg.DramAddress + 8);
|
||||
|
||||
return new MessageHeader(word0, word1, word2);
|
||||
}
|
||||
|
||||
private MessageHeader GetServerMessageHeader(Message serverMsg)
|
||||
{
|
||||
KProcess currentProcess = System.Scheduler.GetCurrentProcess();
|
||||
KProcess currentProcess = KernelContext.Scheduler.GetCurrentProcess();
|
||||
|
||||
uint word0 = currentProcess.CpuMemory.Read<uint>(serverMsg.Address + 0);
|
||||
uint word1 = currentProcess.CpuMemory.Read<uint>(serverMsg.Address + 4);
|
||||
|
@ -974,7 +972,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
for (int index = 0; index < recvListSize; index++)
|
||||
{
|
||||
receiveList[index] = System.Device.Memory.Read<ulong>(recvListAddress + (ulong)index * 8);
|
||||
receiveList[index] = KernelContext.Memory.Read<ulong>(recvListAddress + (ulong)index * 8);
|
||||
}
|
||||
|
||||
return receiveList;
|
||||
|
@ -1139,7 +1137,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private IEnumerable<KSessionRequest> IterateWithRemovalOfAllRequests()
|
||||
{
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
if (_activeRequest != null)
|
||||
{
|
||||
|
@ -1147,13 +1145,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
_activeRequest = null;
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
yield return request;
|
||||
}
|
||||
else
|
||||
{
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
}
|
||||
|
||||
while (DequeueRequest(out KSessionRequest request))
|
||||
|
@ -1166,7 +1164,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
{
|
||||
request = null;
|
||||
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
bool hasRequest = _requests.First != null;
|
||||
|
||||
|
@ -1177,7 +1175,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
_requests.RemoveFirst();
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
|
||||
return hasRequest;
|
||||
}
|
||||
|
@ -1211,11 +1209,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
}
|
||||
else
|
||||
{
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
WakeAndSetResult(request.ClientThread, result);
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1225,8 +1223,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
ulong address = clientProcess.MemoryManager.GetDramAddressFromVa(request.CustomCmdBuffAddr);
|
||||
|
||||
System.Device.Memory.Write<ulong>(address, 0);
|
||||
System.Device.Memory.Write(address + 8, (int)result);
|
||||
KernelContext.Memory.Write<ulong>(address, 0);
|
||||
KernelContext.Memory.Write(address + 8, (int)result);
|
||||
|
||||
clientProcess.MemoryManager.UnborrowIpcBuffer(
|
||||
request.CustomCmdBuffAddr,
|
||||
|
@ -1238,14 +1236,14 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
private void WakeServerThreads(KernelResult result)
|
||||
{
|
||||
// Wake all server threads waiting for requests.
|
||||
System.CriticalSection.Enter();
|
||||
KernelContext.CriticalSection.Enter();
|
||||
|
||||
foreach (KThread thread in WaitingThreads)
|
||||
{
|
||||
WakeAndSetResult(thread, result);
|
||||
}
|
||||
|
||||
System.CriticalSection.Leave();
|
||||
KernelContext.CriticalSection.Leave();
|
||||
}
|
||||
|
||||
private void WakeAndSetResult(KThread thread, KernelResult result)
|
||||
|
|
|
@ -11,10 +11,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Ipc
|
|||
|
||||
private bool _hasBeenInitialized;
|
||||
|
||||
public KSession(Horizon system) : base(system)
|
||||
public KSession(KernelContext context) : base(context)
|
||||
{
|
||||
ServerSession = new KServerSession(system, this);
|
||||
ClientSession = new KClientSession(system, this);
|
||||
ServerSession = new KServerSession(context, this);
|
||||
ClientSession = new KClientSession(context, this);
|
||||
|
||||
_hasBeenInitialized = true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue