// QueryEvent(s32 fd, u32 event_id) -> (u32, handle<copy, event>) public ResultCode QueryEvent(ServiceCtx context) { NvResult errorCode = EnsureInitialized(); if (errorCode == NvResult.Success) { int fd = context.RequestData.ReadInt32(); uint eventId = context.RequestData.ReadUInt32(); errorCode = GetDeviceFileFromFd(fd, out NvDeviceFile deviceFile); if (errorCode == NvResult.Success) { NvInternalResult internalResult = deviceFile.QueryEvent(out int eventHandle, eventId); if (internalResult == NvInternalResult.NotImplemented) { throw new NvQueryEventNotImplementedException(context, deviceFile, eventId); } errorCode = ConvertInternalErrorCode(internalResult); if (errorCode == NvResult.Success) { context.Response.HandleDesc = IpcHandleDesc.MakeCopy(eventHandle); } } } context.ResponseData.Write((uint)errorCode); return(ResultCode.Success); }
// Open(buffer<bytes, 5> path) -> (s32 fd, u32 error_code) public ResultCode Open(ServiceCtx context) { NvResult errorCode = EnsureInitialized(); int fd = -1; if (errorCode == NvResult.Success) { ulong pathPtr = context.Request.SendBuff[0].Position; ulong pathSize = context.Request.SendBuff[0].Size; string path = MemoryHelper.ReadAsciiString(context.Memory, pathPtr, (long)pathSize); fd = Open(context, path); if (fd == -1) { errorCode = NvResult.FileOperationFailed; } } context.ResponseData.Write(fd); context.ResponseData.Write((uint)errorCode); return(ResultCode.Success); }
[Command(12)] // 3.0.0+ // Ioctl3(s32 fd, u32 ioctl_cmd, buffer<bytes, 0x21> in_args) -> (u32 error_code, buffer<bytes, 0x22> out_args, buffer<bytes, 0x22> inline_out_buffer) public ResultCode Ioctl3(ServiceCtx context) { NvResult errorCode = EnsureInitialized(); if (errorCode == NvResult.Success) { int fd = context.RequestData.ReadInt32(); NvIoctl ioctlCommand = context.RequestData.ReadStruct <NvIoctl>(); (long inlineOutBufferPosition, long inlineOutBufferSize) = context.Request.GetBufferType0x22(1); errorCode = GetIoctlArgument(context, ioctlCommand, out Span <byte> arguments); byte[] temp = new byte[inlineOutBufferSize]; context.Memory.Read((ulong)inlineOutBufferPosition, temp); Span <byte> inlineOutBuffer = new Span <byte>(temp); if (errorCode == NvResult.Success) { errorCode = GetDeviceFileFromFd(fd, out NvDeviceFile deviceFile); if (errorCode == NvResult.Success) { NvInternalResult internalResult = deviceFile.Ioctl3(ioctlCommand, arguments, inlineOutBuffer); if (internalResult == NvInternalResult.NotImplemented) { throw new NvIoctlNotImplementedException(context, deviceFile, ioctlCommand); } errorCode = ConvertInternalErrorCode(internalResult); if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0) { context.Memory.Write((ulong)context.Request.GetBufferType0x22(0).Position, arguments.ToArray()); context.Memory.Write((ulong)inlineOutBufferPosition, inlineOutBuffer.ToArray()); } } } } context.ResponseData.Write((uint)errorCode); return(ResultCode.Success); }
// Close(s32 fd) -> u32 error_code public ResultCode Close(ServiceCtx context) { NvResult errorCode = EnsureInitialized(); if (errorCode == NvResult.Success) { int fd = context.RequestData.ReadInt32(); errorCode = GetDeviceFileFromFd(fd, out NvDeviceFile deviceFile); if (errorCode == NvResult.Success) { deviceFile.Close(); _deviceFileIdRegistry.Delete(fd); } } context.ResponseData.Write((uint)errorCode); return(ResultCode.Success); }
// MapSharedMemory(s32 fd, u32 argument, handle<copy, shared_memory>) -> u32 error_code public ResultCode MapSharedMemory(ServiceCtx context) { NvResult errorCode = EnsureInitialized(); if (errorCode == NvResult.Success) { int fd = context.RequestData.ReadInt32(); uint argument = context.RequestData.ReadUInt32(); int sharedMemoryHandle = context.Request.HandleDesc.ToCopy[0]; errorCode = GetDeviceFileFromFd(fd, out NvDeviceFile deviceFile); if (errorCode == NvResult.Success) { errorCode = ConvertInternalErrorCode(deviceFile.MapSharedMemory(sharedMemoryHandle, argument)); } } context.ResponseData.Write((uint)errorCode); return(ResultCode.Success); }