private static int Alloc(ServiceCtx context) { long inputPosition = context.Request.GetBufferType0x21().Position; long outputPosition = context.Request.GetBufferType0x22().Position; NvMapAlloc args = MemoryHelper.Read <NvMapAlloc>(context.Memory, inputPosition); NvMapHandle map = GetNvMap(context, args.Handle); if (map == null) { Logger.PrintWarning(LogClass.ServiceNv, $"Invalid handle 0x{args.Handle:x8}!"); return(NvResult.InvalidInput); } if ((args.Align & (args.Align - 1)) != 0) { Logger.PrintWarning(LogClass.ServiceNv, $"Invalid alignment 0x{args.Align:x8}!"); return(NvResult.InvalidInput); } if ((uint)args.Align < NvGpuVmm.PageSize) { args.Align = NvGpuVmm.PageSize; } int result = NvResult.Success; if (!map.Allocated) { map.Allocated = true; map.Align = args.Align; map.Kind = (byte)args.Kind; int size = BitUtils.AlignUp(map.Size, NvGpuVmm.PageSize); long address = args.Address; if (address == 0) { // When the address is zero, we need to allocate // our own backing memory for the NvMap. // TODO: Is this allocation inside the transfer memory? result = NvResult.OutOfMemory; } if (result == NvResult.Success) { map.Size = size; map.Address = address; } } MemoryHelper.Write(context.Memory, outputPosition, args); return(result); }
private NvInternalResult Alloc(ref NvMapAlloc arguments) { NvMapHandle map = GetMapFromHandle(Owner, arguments.Handle); if (map == null) { Logger.Warning?.Print(LogClass.ServiceNv, $"Invalid handle 0x{arguments.Handle:x8}!"); return(NvInternalResult.InvalidInput); } if ((arguments.Align & (arguments.Align - 1)) != 0) { Logger.Warning?.Print(LogClass.ServiceNv, $"Invalid alignment 0x{arguments.Align:x8}!"); return(NvInternalResult.InvalidInput); } if ((uint)arguments.Align < MemoryManager.PageSize) { arguments.Align = (int)MemoryManager.PageSize; } NvInternalResult result = NvInternalResult.Success; if (!map.Allocated) { map.Allocated = true; map.Align = arguments.Align; map.Kind = (byte)arguments.Kind; int size = BitUtils.AlignUp(map.Size, (int)MemoryManager.PageSize); long address = arguments.Address; if (address == 0) { // When the address is zero, we need to allocate // our own backing memory for the NvMap. // TODO: Is this allocation inside the transfer memory? result = NvInternalResult.OutOfMemory; } if (result == NvInternalResult.Success) { map.Size = size; map.Address = address; } } return(result); }