mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:59:04 -06:00 
			
		
		
		
	Update kernel GetInfo SVC for firmware 18.0.0 (#7075)
* Implement kernel GetInfo AliasRegionExtraSize * Implement IsSvcPermitted * Remove warning supressions that are no longer needed * Remove useless cast
This commit is contained in:
		@@ -1,10 +0,0 @@
 | 
			
		||||
namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
{
 | 
			
		||||
    enum AddressSpaceType
 | 
			
		||||
    {
 | 
			
		||||
        Addr32Bits = 0,
 | 
			
		||||
        Addr36Bits = 1,
 | 
			
		||||
        Addr32BitsNoMap = 2,
 | 
			
		||||
        Addr39Bits = 3,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -58,11 +58,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
        public ulong AslrRegionStart { get; private set; }
 | 
			
		||||
        public ulong AslrRegionEnd { get; private set; }
 | 
			
		||||
 | 
			
		||||
#pragma warning disable IDE0052 // Remove unread private member
 | 
			
		||||
        private ulong _heapCapacity;
 | 
			
		||||
#pragma warning restore IDE0052
 | 
			
		||||
 | 
			
		||||
        public ulong PhysicalMemoryUsage { get; private set; }
 | 
			
		||||
        public ulong AliasRegionExtraSize { get; private set; }
 | 
			
		||||
 | 
			
		||||
        private readonly KMemoryBlockManager _blockManager;
 | 
			
		||||
 | 
			
		||||
@@ -98,30 +97,21 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
            _reservedAddressSpaceSize = reservedAddressSpaceSize;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static readonly int[] _addrSpaceSizes = { 32, 36, 32, 39 };
 | 
			
		||||
 | 
			
		||||
        public Result InitializeForProcess(
 | 
			
		||||
            AddressSpaceType addrSpaceType,
 | 
			
		||||
            bool aslrEnabled,
 | 
			
		||||
            ProcessCreationFlags flags,
 | 
			
		||||
            bool fromBack,
 | 
			
		||||
            MemoryRegion memRegion,
 | 
			
		||||
            ulong address,
 | 
			
		||||
            ulong size,
 | 
			
		||||
            KMemoryBlockSlabManager slabManager)
 | 
			
		||||
        {
 | 
			
		||||
            if ((uint)addrSpaceType > (uint)AddressSpaceType.Addr39Bits)
 | 
			
		||||
            {
 | 
			
		||||
                throw new ArgumentException($"AddressSpaceType bigger than {(uint)AddressSpaceType.Addr39Bits}: {(uint)addrSpaceType}", nameof(addrSpaceType));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _contextId = Context.ContextIdManager.GetId();
 | 
			
		||||
 | 
			
		||||
            ulong addrSpaceBase = 0;
 | 
			
		||||
            ulong addrSpaceSize = 1UL << _addrSpaceSizes[(int)addrSpaceType];
 | 
			
		||||
            ulong addrSpaceSize = 1UL << GetAddressSpaceWidth(flags);
 | 
			
		||||
 | 
			
		||||
            Result result = CreateUserAddressSpace(
 | 
			
		||||
                addrSpaceType,
 | 
			
		||||
                aslrEnabled,
 | 
			
		||||
                flags,
 | 
			
		||||
                fromBack,
 | 
			
		||||
                addrSpaceBase,
 | 
			
		||||
                addrSpaceSize,
 | 
			
		||||
@@ -138,6 +128,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static int GetAddressSpaceWidth(ProcessCreationFlags flags)
 | 
			
		||||
        {
 | 
			
		||||
            switch (flags & ProcessCreationFlags.AddressSpaceMask)
 | 
			
		||||
            {
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace32Bit:
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace32BitWithoutAlias:
 | 
			
		||||
                    return 32;
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace64BitDeprecated:
 | 
			
		||||
                    return 36;
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace64Bit:
 | 
			
		||||
                    return 39;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw new ArgumentException($"Invalid process flags {flags}", nameof(flags));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private struct Region
 | 
			
		||||
        {
 | 
			
		||||
            public ulong Start;
 | 
			
		||||
@@ -147,8 +153,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private Result CreateUserAddressSpace(
 | 
			
		||||
            AddressSpaceType addrSpaceType,
 | 
			
		||||
            bool aslrEnabled,
 | 
			
		||||
            ProcessCreationFlags flags,
 | 
			
		||||
            bool fromBack,
 | 
			
		||||
            ulong addrSpaceStart,
 | 
			
		||||
            ulong addrSpaceEnd,
 | 
			
		||||
@@ -168,9 +173,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
            ulong stackAndTlsIoStart;
 | 
			
		||||
            ulong stackAndTlsIoEnd;
 | 
			
		||||
 | 
			
		||||
            switch (addrSpaceType)
 | 
			
		||||
            AliasRegionExtraSize = 0;
 | 
			
		||||
 | 
			
		||||
            switch (flags & ProcessCreationFlags.AddressSpaceMask)
 | 
			
		||||
            {
 | 
			
		||||
                case AddressSpaceType.Addr32Bits:
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace32Bit:
 | 
			
		||||
                    aliasRegion.Size = 0x40000000;
 | 
			
		||||
                    heapRegion.Size = 0x40000000;
 | 
			
		||||
                    stackRegion.Size = 0;
 | 
			
		||||
@@ -183,7 +190,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
                    stackAndTlsIoEnd = 0x40000000;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case AddressSpaceType.Addr36Bits:
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace64BitDeprecated:
 | 
			
		||||
                    aliasRegion.Size = 0x180000000;
 | 
			
		||||
                    heapRegion.Size = 0x180000000;
 | 
			
		||||
                    stackRegion.Size = 0;
 | 
			
		||||
@@ -196,7 +203,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
                    stackAndTlsIoEnd = 0x80000000;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case AddressSpaceType.Addr32BitsNoMap:
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace32BitWithoutAlias:
 | 
			
		||||
                    aliasRegion.Size = 0;
 | 
			
		||||
                    heapRegion.Size = 0x80000000;
 | 
			
		||||
                    stackRegion.Size = 0;
 | 
			
		||||
@@ -209,7 +216,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
                    stackAndTlsIoEnd = 0x40000000;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case AddressSpaceType.Addr39Bits:
 | 
			
		||||
                case ProcessCreationFlags.AddressSpace64Bit:
 | 
			
		||||
                    if (_reservedAddressSpaceSize < addrSpaceEnd)
 | 
			
		||||
                    {
 | 
			
		||||
                        int addressSpaceWidth = (int)ulong.Log2(_reservedAddressSpaceSize);
 | 
			
		||||
@@ -218,8 +225,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
                        heapRegion.Size = 0x180000000;
 | 
			
		||||
                        stackRegion.Size = 1UL << (addressSpaceWidth - 8);
 | 
			
		||||
                        tlsIoRegion.Size = 1UL << (addressSpaceWidth - 3);
 | 
			
		||||
                        CodeRegionStart = BitUtils.AlignDown<ulong>(address, RegionAlignment);
 | 
			
		||||
                        codeRegionSize = BitUtils.AlignUp<ulong>(endAddr, RegionAlignment) - CodeRegionStart;
 | 
			
		||||
                        CodeRegionStart = BitUtils.AlignDown(address, RegionAlignment);
 | 
			
		||||
                        codeRegionSize = BitUtils.AlignUp(endAddr, RegionAlignment) - CodeRegionStart;
 | 
			
		||||
                        stackAndTlsIoStart = 0;
 | 
			
		||||
                        stackAndTlsIoEnd = 0;
 | 
			
		||||
                        AslrRegionStart = 0x8000000;
 | 
			
		||||
@@ -239,9 +246,16 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
                        stackAndTlsIoStart = 0;
 | 
			
		||||
                        stackAndTlsIoEnd = 0;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (flags.HasFlag(ProcessCreationFlags.EnableAliasRegionExtraSize))
 | 
			
		||||
                    {
 | 
			
		||||
                        AliasRegionExtraSize = addrSpaceEnd / 8;
 | 
			
		||||
                        aliasRegion.Size += AliasRegionExtraSize;
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new ArgumentException($"AddressSpaceType bigger than {(uint)AddressSpaceType.Addr39Bits}: {(uint)addrSpaceType}", nameof(addrSpaceType));
 | 
			
		||||
                    throw new ArgumentException($"Invalid process flags {flags}", nameof(flags));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            CodeRegionEnd = CodeRegionStart + codeRegionSize;
 | 
			
		||||
@@ -266,6 +280,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
 | 
			
		||||
            ulong aslrMaxOffset = mapAvailableSize - mapTotalSize;
 | 
			
		||||
 | 
			
		||||
            bool aslrEnabled = flags.HasFlag(ProcessCreationFlags.EnableAslr);
 | 
			
		||||
 | 
			
		||||
            _aslrEnabled = aslrEnabled;
 | 
			
		||||
 | 
			
		||||
            AddrSpaceStart = addrSpaceStart;
 | 
			
		||||
@@ -725,7 +741,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Memory
 | 
			
		||||
        {
 | 
			
		||||
            address = 0;
 | 
			
		||||
 | 
			
		||||
            if (size > HeapRegionEnd - HeapRegionStart)
 | 
			
		||||
            if (size > HeapRegionEnd - HeapRegionStart || size > _heapCapacity)
 | 
			
		||||
            {
 | 
			
		||||
                return KernelResult.OutOfMemory;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -126,8 +126,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
            _contextFactory = contextFactory ?? new ProcessContextFactory();
 | 
			
		||||
            _customThreadStart = customThreadStart;
 | 
			
		||||
 | 
			
		||||
            AddressSpaceType addrSpaceType = (AddressSpaceType)((int)(creationInfo.Flags & ProcessCreationFlags.AddressSpaceMask) >> (int)ProcessCreationFlags.AddressSpaceShift);
 | 
			
		||||
 | 
			
		||||
            Pid = KernelContext.NewKipId();
 | 
			
		||||
 | 
			
		||||
            if (Pid == 0 || Pid >= KernelConstants.InitialProcessId)
 | 
			
		||||
@@ -137,8 +135,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
 | 
			
		||||
            InitializeMemoryManager(creationInfo.Flags);
 | 
			
		||||
 | 
			
		||||
            bool aslrEnabled = creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr);
 | 
			
		||||
 | 
			
		||||
            ulong codeAddress = creationInfo.CodeAddress;
 | 
			
		||||
 | 
			
		||||
            ulong codeSize = (ulong)creationInfo.CodePagesCount * KPageTableBase.PageSize;
 | 
			
		||||
@@ -148,9 +144,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
                : KernelContext.SmallMemoryBlockSlabManager;
 | 
			
		||||
 | 
			
		||||
            Result result = MemoryManager.InitializeForProcess(
 | 
			
		||||
                addrSpaceType,
 | 
			
		||||
                aslrEnabled,
 | 
			
		||||
                !aslrEnabled,
 | 
			
		||||
                creationInfo.Flags,
 | 
			
		||||
                !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
 | 
			
		||||
                memRegion,
 | 
			
		||||
                codeAddress,
 | 
			
		||||
                codeSize,
 | 
			
		||||
@@ -234,8 +229,6 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
                    : KernelContext.SmallMemoryBlockSlabManager;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            AddressSpaceType addrSpaceType = (AddressSpaceType)((int)(creationInfo.Flags & ProcessCreationFlags.AddressSpaceMask) >> (int)ProcessCreationFlags.AddressSpaceShift);
 | 
			
		||||
 | 
			
		||||
            Pid = KernelContext.NewProcessId();
 | 
			
		||||
 | 
			
		||||
            if (Pid == ulong.MaxValue || Pid < KernelConstants.InitialProcessId)
 | 
			
		||||
@@ -245,16 +238,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
 | 
			
		||||
            InitializeMemoryManager(creationInfo.Flags);
 | 
			
		||||
 | 
			
		||||
            bool aslrEnabled = creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr);
 | 
			
		||||
 | 
			
		||||
            ulong codeAddress = creationInfo.CodeAddress;
 | 
			
		||||
 | 
			
		||||
            ulong codeSize = codePagesCount * KPageTableBase.PageSize;
 | 
			
		||||
 | 
			
		||||
            Result result = MemoryManager.InitializeForProcess(
 | 
			
		||||
                addrSpaceType,
 | 
			
		||||
                aslrEnabled,
 | 
			
		||||
                !aslrEnabled,
 | 
			
		||||
                creationInfo.Flags,
 | 
			
		||||
                !creationInfo.Flags.HasFlag(ProcessCreationFlags.EnableAslr),
 | 
			
		||||
                memRegion,
 | 
			
		||||
                codeAddress,
 | 
			
		||||
                codeSize,
 | 
			
		||||
@@ -309,8 +299,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
        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;
 | 
			
		||||
            uint requiredKernelVersionMinor = ((uint)Capabilities.KernelReleaseVersion >> 15) & 0xf;
 | 
			
		||||
            uint requiredKernelVersionMajor = Capabilities.KernelReleaseVersion >> 19;
 | 
			
		||||
            uint requiredKernelVersionMinor = (Capabilities.KernelReleaseVersion >> 15) & 0xf;
 | 
			
		||||
 | 
			
		||||
            if (KernelContext.EnableVersionChecks)
 | 
			
		||||
            {
 | 
			
		||||
@@ -519,12 +509,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        private void GenerateRandomEntropy()
 | 
			
		||||
        {
 | 
			
		||||
            // TODO.
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        public Result Start(int mainThreadPriority, ulong stackSize)
 | 
			
		||||
        {
 | 
			
		||||
@@ -1182,5 +1170,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
            // TODO
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool IsSvcPermitted(int svcId)
 | 
			
		||||
        {
 | 
			
		||||
            return Capabilities.IsSvcPermitted(svcId);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
{
 | 
			
		||||
    class KProcessCapabilities
 | 
			
		||||
    {
 | 
			
		||||
        private const int SvcMaskElementBits = 8;
 | 
			
		||||
 | 
			
		||||
        public byte[] SvcAccessMask { get; }
 | 
			
		||||
        public byte[] IrqAccessMask { get; }
 | 
			
		||||
 | 
			
		||||
@@ -22,7 +24,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
        public KProcessCapabilities()
 | 
			
		||||
        {
 | 
			
		||||
            // length / number of bits of the underlying type
 | 
			
		||||
            SvcAccessMask = new byte[KernelConstants.SupervisorCallCount / 8];
 | 
			
		||||
            SvcAccessMask = new byte[KernelConstants.SupervisorCallCount / SvcMaskElementBits];
 | 
			
		||||
            IrqAccessMask = new byte[0x80];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -208,7 +210,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
                                return KernelResult.MaximumExceeded;
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            SvcAccessMask[svcId / 8] |= (byte)(1 << (svcId & 7));
 | 
			
		||||
                            SvcAccessMask[svcId / SvcMaskElementBits] |= (byte)(1 << (svcId % SvcMaskElementBits));
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
@@ -324,5 +326,13 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
 | 
			
		||||
            return mask << (int)min;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool IsSvcPermitted(int svcId)
 | 
			
		||||
        {
 | 
			
		||||
            int index = svcId / SvcMaskElementBits;
 | 
			
		||||
            int mask = 1 << (svcId % SvcMaskElementBits);
 | 
			
		||||
 | 
			
		||||
            return (uint)svcId < KernelConstants.SupervisorCallCount && (SvcAccessMask[index] & mask) != 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
        PoolPartitionMask = 0xf << PoolPartitionShift,
 | 
			
		||||
 | 
			
		||||
        OptimizeMemoryAllocation = 1 << 11,
 | 
			
		||||
        DisableDeviceAddressSpaceMerge = 1 << 12,
 | 
			
		||||
        EnableAliasRegionExtraSize = 1 << 13,
 | 
			
		||||
 | 
			
		||||
        All =
 | 
			
		||||
            Is64Bit |
 | 
			
		||||
@@ -38,6 +40,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
 | 
			
		||||
            IsApplication |
 | 
			
		||||
            DeprecatedUseSecureMemory |
 | 
			
		||||
            PoolPartitionMask |
 | 
			
		||||
            OptimizeMemoryAllocation,
 | 
			
		||||
            OptimizeMemoryAllocation |
 | 
			
		||||
            DisableDeviceAddressSpaceMerge |
 | 
			
		||||
            EnableAliasRegionExtraSize,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,14 +21,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        SystemResourceSizeTotal,
 | 
			
		||||
        SystemResourceSizeUsed,
 | 
			
		||||
        ProgramId,
 | 
			
		||||
        // NOTE: Added in 4.0.0, removed in 5.0.0.
 | 
			
		||||
        InitialProcessIdRange,
 | 
			
		||||
        InitialProcessIdRange, // NOTE: Added in 4.0.0, removed in 5.0.0.
 | 
			
		||||
        UserExceptionContextAddress,
 | 
			
		||||
        TotalNonSystemMemorySize,
 | 
			
		||||
        UsedNonSystemMemorySize,
 | 
			
		||||
        IsApplication,
 | 
			
		||||
        FreeThreadCount,
 | 
			
		||||
        ThreadTickCount,
 | 
			
		||||
        IsSvcPermitted,
 | 
			
		||||
        IoRegionHint,
 | 
			
		||||
        AliasRegionExtraSize,
 | 
			
		||||
 | 
			
		||||
        MesosphereCurrentProcess = 65001,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -84,6 +84,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                return KernelResult.InvalidSize;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (info.Flags.HasFlag(ProcessCreationFlags.EnableAliasRegionExtraSize))
 | 
			
		||||
            {
 | 
			
		||||
                if ((info.Flags & ProcessCreationFlags.AddressSpaceMask) != ProcessCreationFlags.AddressSpace64Bit ||
 | 
			
		||||
                    info.SystemResourcePagesCount <= 0)
 | 
			
		||||
                {
 | 
			
		||||
                    return KernelResult.InvalidState;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // TODO: Check that we are in debug mode.
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (info.Flags.HasFlag(ProcessCreationFlags.OptimizeMemoryAllocation) &&
 | 
			
		||||
                !info.Flags.HasFlag(ProcessCreationFlags.IsApplication))
 | 
			
		||||
            {
 | 
			
		||||
@@ -139,7 +150,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
            return handleTable.GenerateHandle(process, out handle);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result StartProcess(int handle, int priority, int cpuCore, ulong mainThreadStackSize)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KProcess>(handle);
 | 
			
		||||
@@ -172,17 +182,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x5f)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result FlushProcessDataCache(int processHandle, ulong address, ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            // FIXME: This needs to be implemented as ARMv7 doesn't have any way to do cache maintenance operations on EL0.
 | 
			
		||||
            // As we don't support (and don't actually need) to flush the cache, this is stubbed.
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        // IPC
 | 
			
		||||
 | 
			
		||||
@@ -256,7 +263,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x22)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SendSyncRequestWithUserBuffer(
 | 
			
		||||
            [PointerSized] ulong messagePtr,
 | 
			
		||||
            [PointerSized] ulong messageSize,
 | 
			
		||||
@@ -306,7 +312,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x23)]
 | 
			
		||||
        public Result SendAsyncRequestWithUserBuffer(
 | 
			
		||||
@@ -896,7 +901,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(2)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetMemoryPermission([PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -928,10 +932,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return currentProcess.MemoryManager.SetMemoryPermission(address, size, permission);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(3)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetMemoryAttribute(
 | 
			
		||||
            [PointerSized] ulong address,
 | 
			
		||||
            [PointerSized] ulong size,
 | 
			
		||||
@@ -979,10 +981,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(4)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(src | dst))
 | 
			
		||||
@@ -1018,10 +1018,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return process.MemoryManager.Map(dst, src, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(5)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapMemory([PointerSized] ulong dst, [PointerSized] ulong src, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(src | dst))
 | 
			
		||||
@@ -1057,7 +1055,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return process.MemoryManager.Unmap(dst, src, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(6)]
 | 
			
		||||
        public Result QueryMemory([PointerSized] ulong infoPtr, [PointerSized] out ulong pageInfo, [PointerSized] ulong address)
 | 
			
		||||
@@ -1074,7 +1071,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result QueryMemory(out MemoryInfo info, out ulong pageInfo, ulong address)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -1094,10 +1090,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x13)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1143,10 +1137,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                currentProcess,
 | 
			
		||||
                permission);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x14)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapSharedMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1186,7 +1178,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                size,
 | 
			
		||||
                currentProcess);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x15)]
 | 
			
		||||
        public Result CreateTransferMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission)
 | 
			
		||||
@@ -1253,7 +1244,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x51)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size, KMemoryPermission permission)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1299,10 +1289,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                currentProcess,
 | 
			
		||||
                permission);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x52)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapTransferMemory(int handle, [PointerSized] ulong address, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1342,10 +1330,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                size,
 | 
			
		||||
                currentProcess);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x2c)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1380,10 +1366,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return process.MemoryManager.MapPhysicalMemory(address, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x2d)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapPhysicalMemory([PointerSized] ulong address, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(address))
 | 
			
		||||
@@ -1418,7 +1402,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return process.MemoryManager.UnmapPhysicalMemory(address, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x4b)]
 | 
			
		||||
        public Result CreateCodeMemory(out int handle, [PointerSized] ulong address, [PointerSized] ulong size)
 | 
			
		||||
@@ -1462,7 +1445,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x4c)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result ControlCodeMemory(
 | 
			
		||||
            int handle,
 | 
			
		||||
            CodeMemoryOperation op,
 | 
			
		||||
@@ -1540,10 +1522,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                    return KernelResult.InvalidEnumValue;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x73)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetProcessMemoryPermission(
 | 
			
		||||
            int handle,
 | 
			
		||||
            ulong src,
 | 
			
		||||
@@ -1584,10 +1564,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return targetProcess.MemoryManager.SetProcessMemoryPermission(src, size, permission);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x74)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapProcessMemory(
 | 
			
		||||
            [PointerSized] ulong dst,
 | 
			
		||||
            int handle,
 | 
			
		||||
@@ -1643,10 +1621,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return dstProcess.MemoryManager.MapPages(dst, pageList, MemoryState.ProcessMemory, KMemoryPermission.ReadAndWrite);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x75)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapProcessMemory(
 | 
			
		||||
            [PointerSized] ulong dst,
 | 
			
		||||
            int handle,
 | 
			
		||||
@@ -1691,10 +1667,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x77)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result MapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(dst) || !PageAligned(src))
 | 
			
		||||
@@ -1731,10 +1705,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return targetProcess.MemoryManager.MapProcessCodeMemory(dst, src, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x78)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result UnmapProcessCodeMemory(int handle, ulong dst, ulong src, ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            if (!PageAligned(dst) || !PageAligned(src))
 | 
			
		||||
@@ -1771,7 +1743,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return targetProcess.MemoryManager.UnmapProcessCodeMemory(dst, src, size);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        private static bool PageAligned(ulong address)
 | 
			
		||||
        {
 | 
			
		||||
@@ -1781,7 +1752,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        // System
 | 
			
		||||
 | 
			
		||||
        [Svc(0x7b)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result TerminateProcess(int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -1810,15 +1780,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(7)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public void ExitProcess()
 | 
			
		||||
        {
 | 
			
		||||
            KernelStatic.GetCurrentProcess().TerminateCurrentProcess();
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x11)]
 | 
			
		||||
        public Result SignalEvent(int handle)
 | 
			
		||||
@@ -1911,7 +1878,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x26)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public void Break(ulong reason)
 | 
			
		||||
        {
 | 
			
		||||
            KThread currentThread = KernelStatic.GetCurrentThread();
 | 
			
		||||
@@ -1937,10 +1903,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                Logger.Debug?.Print(LogClass.KernelSvc, "Debugger triggered.");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x27)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public void OutputDebugString([PointerSized] ulong strPtr, [PointerSized] ulong size)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -1949,7 +1913,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            Logger.Warning?.Print(LogClass.KernelSvc, str);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x29)]
 | 
			
		||||
        public Result GetInfo(out ulong value, InfoType id, int handle, long subId)
 | 
			
		||||
@@ -1978,6 +1941,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                case InfoType.UsedNonSystemMemorySize:
 | 
			
		||||
                case InfoType.IsApplication:
 | 
			
		||||
                case InfoType.FreeThreadCount:
 | 
			
		||||
                case InfoType.AliasRegionExtraSize:
 | 
			
		||||
                    {
 | 
			
		||||
                        if (subId != 0)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -2006,22 +1970,19 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                                value = process.MemoryManager.AliasRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
                            case InfoType.AliasRegionSize:
 | 
			
		||||
                                value = (process.MemoryManager.AliasRegionEnd -
 | 
			
		||||
                                         process.MemoryManager.AliasRegionStart);
 | 
			
		||||
                                value = process.MemoryManager.AliasRegionEnd - process.MemoryManager.AliasRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.HeapRegionAddress:
 | 
			
		||||
                                value = process.MemoryManager.HeapRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
                            case InfoType.HeapRegionSize:
 | 
			
		||||
                                value = (process.MemoryManager.HeapRegionEnd -
 | 
			
		||||
                                         process.MemoryManager.HeapRegionStart);
 | 
			
		||||
                                value = process.MemoryManager.HeapRegionEnd - process.MemoryManager.HeapRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.TotalMemorySize:
 | 
			
		||||
                                value = process.GetMemoryCapacity();
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.UsedMemorySize:
 | 
			
		||||
                                value = process.GetMemoryUsage();
 | 
			
		||||
                                break;
 | 
			
		||||
@@ -2029,7 +1990,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                            case InfoType.AslrRegionAddress:
 | 
			
		||||
                                value = process.MemoryManager.GetAddrSpaceBaseAddr();
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.AslrRegionSize:
 | 
			
		||||
                                value = process.MemoryManager.GetAddrSpaceSize();
 | 
			
		||||
                                break;
 | 
			
		||||
@@ -2038,20 +1998,17 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                                value = process.MemoryManager.StackRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
                            case InfoType.StackRegionSize:
 | 
			
		||||
                                value = (process.MemoryManager.StackRegionEnd -
 | 
			
		||||
                                         process.MemoryManager.StackRegionStart);
 | 
			
		||||
                                value = process.MemoryManager.StackRegionEnd - process.MemoryManager.StackRegionStart;
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.SystemResourceSizeTotal:
 | 
			
		||||
                                value = process.PersonalMmHeapPagesCount * KPageTableBase.PageSize;
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.SystemResourceSizeUsed:
 | 
			
		||||
                                if (process.PersonalMmHeapPagesCount != 0)
 | 
			
		||||
                                {
 | 
			
		||||
                                    value = process.MemoryManager.GetMmUsedPages() * KPageTableBase.PageSize;
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.ProgramId:
 | 
			
		||||
@@ -2065,7 +2022,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                            case InfoType.TotalNonSystemMemorySize:
 | 
			
		||||
                                value = process.GetMemoryCapacityWithoutPersonalMmHeap();
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.UsedNonSystemMemorySize:
 | 
			
		||||
                                value = process.GetMemoryUsageWithoutPersonalMmHeap();
 | 
			
		||||
                                break;
 | 
			
		||||
@@ -2084,10 +2040,12 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                                {
 | 
			
		||||
                                    value = 0;
 | 
			
		||||
                                }
 | 
			
		||||
                                break;
 | 
			
		||||
 | 
			
		||||
                            case InfoType.AliasRegionExtraSize:
 | 
			
		||||
                                value = process.MemoryManager.AliasRegionExtraSize;
 | 
			
		||||
                                break;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2104,7 +2062,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        value = KernelStatic.GetCurrentProcess().Debug ? 1UL : 0UL;
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2136,7 +2093,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
                            value = (uint)resLimHandle;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2155,7 +2111,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        value = (ulong)KTimeManager.ConvertHostTicksToTicks(_context.Schedulers[currentCore].TotalIdleTimeTicks);
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2174,7 +2129,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                        KProcess currentProcess = KernelStatic.GetCurrentProcess();
 | 
			
		||||
 | 
			
		||||
                        value = currentProcess.RandomEntropy[subId];
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2220,7 +2174,22 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
                            value = (ulong)KTimeManager.ConvertHostTicksToTicks(totalTimeRunning);
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                case InfoType.IsSvcPermitted:
 | 
			
		||||
                    {
 | 
			
		||||
                        if (handle != 0)
 | 
			
		||||
                        {
 | 
			
		||||
                            return KernelResult.InvalidHandle;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (subId != 0x36)
 | 
			
		||||
                        {
 | 
			
		||||
                            return KernelResult.InvalidCombination;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        value = KernelStatic.GetCurrentProcess().IsSvcPermitted((int)subId) ? 1UL : 0UL;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2231,7 +2200,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                            return KernelResult.InvalidHandle;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if ((ulong)subId != 0)
 | 
			
		||||
                        if (subId != 0)
 | 
			
		||||
                        {
 | 
			
		||||
                            return KernelResult.InvalidCombination;
 | 
			
		||||
                        }
 | 
			
		||||
@@ -2246,8 +2215,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                            return result;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        value = (ulong)outHandle;
 | 
			
		||||
 | 
			
		||||
                        value = (uint)outHandle;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@@ -2398,7 +2366,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x30)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetResourceLimitLimitValue(out long limitValue, int handle, LimitableResource resource)
 | 
			
		||||
        {
 | 
			
		||||
            limitValue = 0;
 | 
			
		||||
@@ -2419,10 +2386,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x31)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetResourceLimitCurrentValue(out long limitValue, int handle, LimitableResource resource)
 | 
			
		||||
        {
 | 
			
		||||
            limitValue = 0;
 | 
			
		||||
@@ -2443,10 +2408,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x37)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetResourceLimitPeakValue(out long peak, int handle, LimitableResource resource)
 | 
			
		||||
        {
 | 
			
		||||
            peak = 0;
 | 
			
		||||
@@ -2467,7 +2430,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x7d)]
 | 
			
		||||
        public Result CreateResourceLimit(out int handle)
 | 
			
		||||
@@ -2480,7 +2442,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x7e)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetResourceLimitLimitValue(int handle, LimitableResource resource, long limitValue)
 | 
			
		||||
        {
 | 
			
		||||
            if (resource >= LimitableResource.Count)
 | 
			
		||||
@@ -2497,7 +2458,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return resourceLimit.SetLimitValue(resource, limitValue);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        // Thread
 | 
			
		||||
 | 
			
		||||
@@ -2577,7 +2537,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(9)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result StartThread(int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2604,17 +2563,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                return KernelResult.InvalidHandle;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0xa)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public void ExitThread()
 | 
			
		||||
        {
 | 
			
		||||
            KThread currentThread = KernelStatic.GetCurrentThread();
 | 
			
		||||
 | 
			
		||||
            currentThread.Exit();
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0xb)]
 | 
			
		||||
        public void SleepThread(long timeout)
 | 
			
		||||
@@ -2641,7 +2597,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0xc)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetThreadPriority(out int priority, int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2661,10 +2616,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                return KernelResult.InvalidHandle;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0xd)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetThreadPriority(int handle, int priority)
 | 
			
		||||
        {
 | 
			
		||||
            // TODO: NPDM check.
 | 
			
		||||
@@ -2682,10 +2635,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0xe)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetThreadCoreMask(out int preferredCore, out ulong affinityMask, int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2707,10 +2658,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                return KernelResult.InvalidHandle;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0xf)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetThreadCoreMask(int handle, int preferredCore, ulong affinityMask)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess currentProcess = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2758,18 +2707,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return thread.SetCoreAndAffinityMask(preferredCore, affinityMask);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x10)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public int GetCurrentProcessorNumber()
 | 
			
		||||
        {
 | 
			
		||||
            return KernelStatic.GetCurrentThread().CurrentCore;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x25)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetThreadId(out ulong threadUid, int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2789,10 +2734,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                return KernelResult.InvalidHandle;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x32)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SetThreadActivity(int handle, bool pause)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess process = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2816,10 +2759,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return thread.SetActivity(pause);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x33)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result GetThreadContext3([PointerSized] ulong address, int handle)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess currentProcess = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -2853,7 +2794,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        // Thread synchronization
 | 
			
		||||
 | 
			
		||||
@@ -2986,7 +2926,6 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Svc(0x1a)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result ArbitrateLock(int ownerHandle, [PointerSized] ulong mutexAddress, int requesterHandle)
 | 
			
		||||
        {
 | 
			
		||||
            if (IsPointingInsideKernel(mutexAddress))
 | 
			
		||||
@@ -3003,10 +2942,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return currentProcess.AddressArbiter.ArbitrateLock(ownerHandle, mutexAddress, requesterHandle);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x1b)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result ArbitrateUnlock([PointerSized] ulong mutexAddress)
 | 
			
		||||
        {
 | 
			
		||||
            if (IsPointingInsideKernel(mutexAddress))
 | 
			
		||||
@@ -3023,10 +2960,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return currentProcess.AddressArbiter.ArbitrateUnlock(mutexAddress);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x1c)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result WaitProcessWideKeyAtomic(
 | 
			
		||||
            [PointerSized] ulong mutexAddress,
 | 
			
		||||
            [PointerSized] ulong condVarAddress,
 | 
			
		||||
@@ -3056,10 +2991,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                handle,
 | 
			
		||||
                timeout);
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x1d)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SignalProcessWideKey([PointerSized] ulong address, int count)
 | 
			
		||||
        {
 | 
			
		||||
            KProcess currentProcess = KernelStatic.GetCurrentProcess();
 | 
			
		||||
@@ -3068,10 +3001,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x34)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result WaitForAddress([PointerSized] ulong address, ArbitrationType type, int value, long timeout)
 | 
			
		||||
        {
 | 
			
		||||
            if (IsPointingInsideKernel(address))
 | 
			
		||||
@@ -3102,10 +3033,8 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                _ => KernelResult.InvalidEnumValue,
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x35)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SignalToAddress([PointerSized] ulong address, SignalType type, int value, int count)
 | 
			
		||||
        {
 | 
			
		||||
            if (IsPointingInsideKernel(address))
 | 
			
		||||
@@ -3131,17 +3060,14 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
 | 
			
		||||
                _ => KernelResult.InvalidEnumValue,
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        [Svc(0x36)]
 | 
			
		||||
#pragma warning disable CA1822 // Mark member as static
 | 
			
		||||
        public Result SynchronizePreemptionState()
 | 
			
		||||
        {
 | 
			
		||||
            KernelStatic.GetCurrentThread().SynchronizePreemptionState();
 | 
			
		||||
 | 
			
		||||
            return Result.Success;
 | 
			
		||||
        }
 | 
			
		||||
#pragma warning restore CA1822
 | 
			
		||||
 | 
			
		||||
        // Not actual syscalls, used by HLE services and such.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user