kernel: Add resource limit related syscalls (#2773)

* kernel: Add resource limit related syscalls

This commit implements all resource limit related syscalls.

* Fix register mapping being wrong for SetResourceLimitLimitValue

* Address gdkchan's comment
This commit is contained in:
Mary 2021-10-24 01:40:13 +02:00 committed by GitHub
parent c94d47cc40
commit dc837c0042
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 206 additions and 2 deletions

View file

@ -1918,6 +1918,95 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
return KernelResult.Success;
}
public KernelResult GetResourceLimitLimitValue(int handle, LimitableResource resource, out long limitValue)
{
limitValue = 0;
if (resource >= LimitableResource.Count)
{
return KernelResult.InvalidEnumValue;
}
KResourceLimit resourceLimit = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KResourceLimit>(handle);
if (resourceLimit == null)
{
return KernelResult.InvalidHandle;
}
limitValue = resourceLimit.GetLimitValue(resource);
return KernelResult.Success;
}
public KernelResult GetResourceLimitCurrentValue(int handle, LimitableResource resource, out long limitValue)
{
limitValue = 0;
if (resource >= LimitableResource.Count)
{
return KernelResult.InvalidEnumValue;
}
KResourceLimit resourceLimit = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KResourceLimit>(handle);
if (resourceLimit == null)
{
return KernelResult.InvalidHandle;
}
limitValue = resourceLimit.GetCurrentValue(resource);
return KernelResult.Success;
}
public KernelResult GetResourceLimitPeakValue(int handle, LimitableResource resource, out long peak)
{
peak = 0;
if (resource >= LimitableResource.Count)
{
return KernelResult.InvalidEnumValue;
}
KResourceLimit resourceLimit = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KResourceLimit>(handle);
if (resourceLimit == null)
{
return KernelResult.InvalidHandle;
}
peak = resourceLimit.GetPeakValue(resource);
return KernelResult.Success;
}
public KernelResult CreateResourceLimit(out int handle)
{
KResourceLimit limit = new KResourceLimit(_context);
KProcess process = KernelStatic.GetCurrentProcess();
return process.HandleTable.GenerateHandle(limit, out handle);
}
public KernelResult SetResourceLimitLimitValue(int handle, LimitableResource resource, long limitValue)
{
if (resource >= LimitableResource.Count)
{
return KernelResult.InvalidEnumValue;
}
KResourceLimit resourceLimit = KernelStatic.GetCurrentProcess().HandleTable.GetObject<KResourceLimit>(handle);
if (resourceLimit == null)
{
return KernelResult.InvalidHandle;
}
return resourceLimit.SetLimitValue(resource, limitValue);
}
// Thread
public KernelResult CreateThread(