STATIC\r
EFI_STATUS\r
VirtioFsReadConfig (\r
- IN VIRTIO_DEVICE_PROTOCOL *Virtio,\r
- OUT VIRTIO_FS_CONFIG *Config\r
+ IN VIRTIO_DEVICE_PROTOCOL *Virtio,\r
+ OUT VIRTIO_FS_CONFIG *Config\r
)\r
{\r
- UINTN Idx;\r
- EFI_STATUS Status;\r
+ UINTN Idx;\r
+ EFI_STATUS Status;\r
\r
for (Idx = 0; Idx < VIRTIO_FS_TAG_BYTES; Idx++) {\r
Status = Virtio->ReadDevice (\r
**/\r
EFI_STATUS\r
VirtioFsInit (\r
- IN OUT VIRTIO_FS *VirtioFs\r
+ IN OUT VIRTIO_FS *VirtioFs\r
)\r
{\r
- UINT8 NextDevStat;\r
- EFI_STATUS Status;\r
- UINT64 Features;\r
- VIRTIO_FS_CONFIG Config;\r
- UINTN Idx;\r
- UINT64 RingBaseShift;\r
+ UINT8 NextDevStat;\r
+ EFI_STATUS Status;\r
+ UINT64 Features;\r
+ VIRTIO_FS_CONFIG Config;\r
+ UINTN Idx;\r
+ UINT64 RingBaseShift;\r
\r
//\r
// Execute virtio-v1.1-cs01-87fa6b5d8155, 3.1.1 Driver Requirements: Device\r
// 1. Reset the device.\r
//\r
NextDevStat = 0;\r
- Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
+ Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
// 2. Set the ACKNOWLEDGE status bit [...]\r
//\r
NextDevStat |= VSTAT_ACK;\r
- Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
+ Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
// 3. Set the DRIVER status bit [...]\r
//\r
NextDevStat |= VSTAT_DRIVER;\r
- Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
+ Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
+\r
if ((Features & VIRTIO_F_VERSION_1) == 0) {\r
Status = EFI_UNSUPPORTED;\r
goto Failed;\r
}\r
+\r
//\r
// No device-specific feature bits have been defined in file "virtio-fs.tex"\r
// of the virtio spec at <https://github.com/oasis-tcs/virtio-spec.git>, as\r
// original label.\r
//\r
for (Idx = 0; Idx < VIRTIO_FS_TAG_BYTES && Config.Tag[Idx] != '\0'; Idx++) {\r
- if (Config.Tag[Idx] < 0x20 || Config.Tag[Idx] > 0x7E) {\r
+ if ((Config.Tag[Idx] < 0x20) || (Config.Tag[Idx] > 0x7E)) {\r
Status = EFI_UNSUPPORTED;\r
goto Failed;\r
}\r
+\r
VirtioFs->Label[Idx] = Config.Tag[Idx];\r
}\r
+\r
VirtioFs->Label[Idx] = L'\0';\r
\r
//\r
// queue at once. We'll need two descriptors per request, as a minimum --\r
// request header, response header.\r
//\r
- Status = VirtioFs->Virtio->SetQueueSel (VirtioFs->Virtio,\r
- VIRTIO_FS_REQUEST_QUEUE);\r
+ Status = VirtioFs->Virtio->SetQueueSel (\r
+ VirtioFs->Virtio,\r
+ VIRTIO_FS_REQUEST_QUEUE\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
- Status = VirtioFs->Virtio->GetQueueNumMax (VirtioFs->Virtio,\r
- &VirtioFs->QueueSize);\r
+\r
+ Status = VirtioFs->Virtio->GetQueueNumMax (\r
+ VirtioFs->Virtio,\r
+ &VirtioFs->QueueSize\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
+\r
if (VirtioFs->QueueSize < 2) {\r
Status = EFI_UNSUPPORTED;\r
goto Failed;\r
//\r
// 7.d. [...] population of virtqueues [...]\r
//\r
- Status = VirtioRingInit (VirtioFs->Virtio, VirtioFs->QueueSize,\r
- &VirtioFs->Ring);\r
+ Status = VirtioRingInit (\r
+ VirtioFs->Virtio,\r
+ VirtioFs->QueueSize,\r
+ &VirtioFs->Ring\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto Failed;\r
}\r
\r
- Status = VirtioRingMap (VirtioFs->Virtio, &VirtioFs->Ring, &RingBaseShift,\r
- &VirtioFs->RingMap);\r
+ Status = VirtioRingMap (\r
+ VirtioFs->Virtio,\r
+ &VirtioFs->Ring,\r
+ &RingBaseShift,\r
+ &VirtioFs->RingMap\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto ReleaseQueue;\r
}\r
\r
- Status = VirtioFs->Virtio->SetQueueAddress (VirtioFs->Virtio,\r
- &VirtioFs->Ring, RingBaseShift);\r
+ Status = VirtioFs->Virtio->SetQueueAddress (\r
+ VirtioFs->Virtio,\r
+ &VirtioFs->Ring,\r
+ RingBaseShift\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto UnmapQueue;\r
}\r
// 8. Set the DRIVER_OK status bit.\r
//\r
NextDevStat |= VSTAT_DRIVER_OK;\r
- Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
+ Status = VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, NextDevStat);\r
if (EFI_ERROR (Status)) {\r
goto UnmapQueue;\r
}\r
**/\r
VOID\r
VirtioFsUninit (\r
- IN OUT VIRTIO_FS *VirtioFs\r
+ IN OUT VIRTIO_FS *VirtioFs\r
)\r
{\r
//\r
VOID\r
EFIAPI\r
VirtioFsExitBoot (\r
- IN EFI_EVENT ExitBootEvent,\r
- IN VOID *VirtioFsAsVoid\r
+ IN EFI_EVENT ExitBootEvent,\r
+ IN VOID *VirtioFsAsVoid\r
)\r
{\r
- VIRTIO_FS *VirtioFs;\r
+ VIRTIO_FS *VirtioFs;\r
\r
VirtioFs = VirtioFsAsVoid;\r
- DEBUG ((DEBUG_VERBOSE, "%a: VirtioFs=0x%p Label=\"%s\"\n", __FUNCTION__,\r
- VirtioFsAsVoid, VirtioFs->Label));\r
+ DEBUG ((\r
+ DEBUG_VERBOSE,\r
+ "%a: VirtioFs=0x%p Label=\"%s\"\n",\r
+ __FUNCTION__,\r
+ VirtioFsAsVoid,\r
+ VirtioFs->Label\r
+ ));\r
VirtioFs->Virtio->SetDeviceStatus (VirtioFs->Virtio, 0);\r
}\r
\r
**/\r
EFI_STATUS\r
VirtioFsSgListsValidate (\r
- IN VIRTIO_FS *VirtioFs,\r
- IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *RequestSgList,\r
- IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList OPTIONAL\r
+ IN VIRTIO_FS *VirtioFs,\r
+ IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *RequestSgList,\r
+ IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList OPTIONAL\r
)\r
{\r
- VIRTIO_FS_SCATTER_GATHER_LIST *SgListParam[2];\r
- UINT16 DescriptorsNeeded;\r
- UINTN ListId;\r
+ VIRTIO_FS_SCATTER_GATHER_LIST *SgListParam[2];\r
+ UINT16 DescriptorsNeeded;\r
+ UINTN ListId;\r
\r
if (RequestSgList == NULL) {\r
return EFI_INVALID_PARAMETER;\r
\r
DescriptorsNeeded = 0;\r
for (ListId = 0; ListId < ARRAY_SIZE (SgListParam); ListId++) {\r
- VIRTIO_FS_SCATTER_GATHER_LIST *SgList;\r
- UINT32 SgListTotalSize;\r
- UINTN IoVecIdx;\r
+ VIRTIO_FS_SCATTER_GATHER_LIST *SgList;\r
+ UINT32 SgListTotalSize;\r
+ UINTN IoVecIdx;\r
\r
SgList = SgListParam[ListId];\r
if (SgList == NULL) {\r
continue;\r
}\r
+\r
//\r
// Sanity-check SgList -- it must provide at least one IO Vector.\r
//\r
- if (SgList->IoVec == NULL || SgList->NumVec == 0) {\r
+ if ((SgList->IoVec == NULL) || (SgList->NumVec == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Make sure that, for each IO Vector in this SgList, a virtio descriptor\r
// can be added to the virtio queue, after the other descriptors added\r
// previously.\r
//\r
- if (SgList->NumVec > (UINTN)(MAX_UINT16 - DescriptorsNeeded) ||\r
- DescriptorsNeeded + SgList->NumVec > VirtioFs->QueueSize) {\r
+ if ((SgList->NumVec > (UINTN)(MAX_UINT16 - DescriptorsNeeded)) ||\r
+ (DescriptorsNeeded + SgList->NumVec > VirtioFs->QueueSize))\r
+ {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
DescriptorsNeeded += (UINT16)SgList->NumVec;\r
\r
SgListTotalSize = 0;\r
for (IoVecIdx = 0; IoVecIdx < SgList->NumVec; IoVecIdx++) {\r
- VIRTIO_FS_IO_VECTOR *IoVec;\r
+ VIRTIO_FS_IO_VECTOR *IoVec;\r
\r
IoVec = &SgList->IoVec[IoVecIdx];\r
//\r
// Sanity-check this IoVec -- it must describe a non-empty buffer.\r
//\r
- if (IoVec->Buffer == NULL || IoVec->Size == 0) {\r
+ if ((IoVec->Buffer == NULL) || (IoVec->Size == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Make sure the cumulative size of all IO Vectors in this SgList remains\r
// expressible as a UINT32.\r
if (IoVec->Size > MAX_UINT32 - SgListTotalSize) {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
SgListTotalSize += (UINT32)IoVec->Size;\r
\r
//\r
**/\r
EFI_STATUS\r
VirtioFsSgListsSubmit (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *RequestSgList,\r
- IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList OPTIONAL\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *RequestSgList,\r
+ IN OUT VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList OPTIONAL\r
)\r
{\r
- VIRTIO_FS_SCATTER_GATHER_LIST *SgListParam[2];\r
- VIRTIO_MAP_OPERATION SgListVirtioMapOp[ARRAY_SIZE (SgListParam)];\r
- UINT16 SgListDescriptorFlag[ARRAY_SIZE (SgListParam)];\r
- UINTN ListId;\r
- VIRTIO_FS_SCATTER_GATHER_LIST *SgList;\r
- UINTN IoVecIdx;\r
- VIRTIO_FS_IO_VECTOR *IoVec;\r
- EFI_STATUS Status;\r
- DESC_INDICES Indices;\r
- UINT32 TotalBytesWrittenByDevice;\r
- UINT32 BytesPermittedForWrite;\r
+ VIRTIO_FS_SCATTER_GATHER_LIST *SgListParam[2];\r
+ VIRTIO_MAP_OPERATION SgListVirtioMapOp[ARRAY_SIZE (SgListParam)];\r
+ UINT16 SgListDescriptorFlag[ARRAY_SIZE (SgListParam)];\r
+ UINTN ListId;\r
+ VIRTIO_FS_SCATTER_GATHER_LIST *SgList;\r
+ UINTN IoVecIdx;\r
+ VIRTIO_FS_IO_VECTOR *IoVec;\r
+ EFI_STATUS Status;\r
+ DESC_INDICES Indices;\r
+ UINT32 TotalBytesWrittenByDevice;\r
+ UINT32 BytesPermittedForWrite;\r
\r
SgListParam[0] = RequestSgList;\r
SgListVirtioMapOp[0] = VirtioOperationBusMasterRead;\r
if (SgList == NULL) {\r
continue;\r
}\r
+\r
for (IoVecIdx = 0; IoVecIdx < SgList->NumVec; IoVecIdx++) {\r
IoVec = &SgList->IoVec[IoVecIdx];\r
//\r
if (EFI_ERROR (Status)) {\r
goto Unmap;\r
}\r
+\r
IoVec->Mapped = TRUE;\r
}\r
}\r
if (SgList == NULL) {\r
continue;\r
}\r
+\r
for (IoVecIdx = 0; IoVecIdx < SgList->NumVec; IoVecIdx++) {\r
- UINT16 NextFlag;\r
+ UINT16 NextFlag;\r
\r
IoVec = &SgList->IoVec[IoVecIdx];\r
//\r
// Set VRING_DESC_F_NEXT on all except the very last descriptor.\r
//\r
NextFlag = VRING_DESC_F_NEXT;\r
- if (ListId == ARRAY_SIZE (SgListParam) - 1 &&\r
- IoVecIdx == SgList->NumVec - 1) {\r
+ if ((ListId == ARRAY_SIZE (SgListParam) - 1) &&\r
+ (IoVecIdx == SgList->NumVec - 1))\r
+ {\r
NextFlag = 0;\r
}\r
+\r
VirtioAppendDesc (\r
&VirtioFs->Ring,\r
IoVec->MappedAddress,\r
//\r
// Submit the descriptor chain.\r
//\r
- Status = VirtioFlush (VirtioFs->Virtio, VIRTIO_FS_REQUEST_QUEUE,\r
- &VirtioFs->Ring, &Indices, &TotalBytesWrittenByDevice);\r
+ Status = VirtioFlush (\r
+ VirtioFs->Virtio,\r
+ VIRTIO_FS_REQUEST_QUEUE,\r
+ &VirtioFs->Ring,\r
+ &Indices,\r
+ &TotalBytesWrittenByDevice\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto Unmap;\r
}\r
} else {\r
BytesPermittedForWrite = ResponseSgList->TotalSize;\r
}\r
+\r
if (TotalBytesWrittenByDevice > BytesPermittedForWrite) {\r
Status = EFI_DEVICE_ERROR;\r
goto Unmap;\r
if (SgList == NULL) {\r
continue;\r
}\r
+\r
for (IoVecIdx = 0; IoVecIdx < SgList->NumVec; IoVecIdx++) {\r
IoVec = &SgList->IoVec[IoVecIdx];\r
if (SgListVirtioMapOp[ListId] == VirtioOperationBusMasterRead) {\r
// across all device-writeable descriptors, in the order they were\r
// chained on the ring.\r
//\r
- IoVec->Transferred = MIN ((UINTN)TotalBytesWrittenByDevice,\r
- IoVec->Size);\r
+ IoVec->Transferred = MIN (\r
+ (UINTN)TotalBytesWrittenByDevice,\r
+ IoVec->Size\r
+ );\r
TotalBytesWrittenByDevice -= (UINT32)IoVec->Transferred;\r
}\r
}\r
if (SgList == NULL) {\r
continue;\r
}\r
+\r
IoVecIdx = SgList->NumVec;\r
while (IoVecIdx > 0) {\r
- EFI_STATUS UnmapStatus;\r
+ EFI_STATUS UnmapStatus;\r
\r
--IoVecIdx;\r
IoVec = &SgList->IoVec[IoVecIdx];\r
if (!IoVec->Mapped) {\r
continue;\r
}\r
- UnmapStatus = VirtioFs->Virtio->UnmapSharedBuffer (VirtioFs->Virtio,\r
- IoVec->Mapping);\r
+\r
+ UnmapStatus = VirtioFs->Virtio->UnmapSharedBuffer (\r
+ VirtioFs->Virtio,\r
+ IoVec->Mapping\r
+ );\r
//\r
// Re-set the following fields to the values they initially got from\r
// VirtioFsSgListsValidate() -- the above unmapping attempt is considered\r
EFI_STATUS\r
VirtioFsFuseNewRequest (\r
IN OUT VIRTIO_FS *VirtioFs,\r
- OUT VIRTIO_FS_FUSE_REQUEST *Request,\r
+ OUT VIRTIO_FS_FUSE_REQUEST *Request,\r
IN UINT32 RequestSize,\r
IN VIRTIO_FS_FUSE_OPCODE Opcode,\r
IN UINT64 NodeId\r
**/\r
EFI_STATUS\r
VirtioFsFuseCheckResponse (\r
- IN VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList,\r
- IN UINT64 RequestId,\r
- OUT UINTN *TailBufferFill\r
+ IN VIRTIO_FS_SCATTER_GATHER_LIST *ResponseSgList,\r
+ IN UINT64 RequestId,\r
+ OUT UINTN *TailBufferFill\r
)\r
{\r
- UINTN NumFixedSizeVec;\r
- VIRTIO_FS_FUSE_RESPONSE *CommonResp;\r
- UINT32 TotalTransferred;\r
- UINTN Idx;\r
+ UINTN NumFixedSizeVec;\r
+ VIRTIO_FS_FUSE_RESPONSE *CommonResp;\r
+ UINT32 TotalTransferred;\r
+ UINTN Idx;\r
\r
//\r
// Ensured by VirtioFsSgListsValidate().\r
if (ResponseSgList->NumVec == 1) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
NumFixedSizeVec = ResponseSgList->NumVec - 1;\r
}\r
\r
if (ResponseSgList->IoVec[0].Size != sizeof *CommonResp) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (ResponseSgList->IoVec[0].Transferred != ResponseSgList->IoVec[0].Size) {\r
return EFI_PROTOCOL_ERROR;\r
}\r
// FUSE must report the same number of bytes, written by the Virtio\r
// Filesystem device, as the virtio transport does.\r
//\r
- CommonResp = ResponseSgList->IoVec[0].Buffer;\r
+ CommonResp = ResponseSgList->IoVec[0].Buffer;\r
TotalTransferred = 0;\r
for (Idx = 0; Idx < ResponseSgList->NumVec; Idx++) {\r
//\r
//\r
TotalTransferred += (UINT32)ResponseSgList->IoVec[Idx].Transferred;\r
}\r
+\r
if (CommonResp->Len != TotalTransferred) {\r
return EFI_PROTOCOL_ERROR;\r
}\r
ASSERT (NumFixedSizeVec >= 1);\r
for (Idx = 1; Idx < NumFixedSizeVec; Idx++) {\r
if (ResponseSgList->IoVec[Idx].Transferred !=\r
- ResponseSgList->IoVec[Idx].Size) {\r
+ ResponseSgList->IoVec[Idx].Size)\r
+ {\r
return EFI_PROTOCOL_ERROR;\r
}\r
}\r
**/\r
EFI_STATUS\r
VirtioFsErrnoToEfiStatus (\r
- IN INT32 Errno\r
+ IN INT32 Errno\r
)\r
{\r
switch (Errno) {\r
- case -1: // EPERM Operation not permitted\r
- return EFI_SECURITY_VIOLATION;\r
-\r
- case -2: // ENOENT No such file or directory\r
- case -3: // ESRCH No such process\r
- case -6: // ENXIO No such device or address\r
- case -10: // ECHILD No child processes\r
- case -19: // ENODEV No such device\r
- case -49: // EUNATCH Protocol driver not attached\r
- case -65: // ENOPKG Package not installed\r
- case -79: // ELIBACC Can not access a needed shared library\r
- case -126: // ENOKEY Required key not available\r
- return EFI_NOT_FOUND;\r
-\r
- case -4: // EINTR Interrupted system call\r
- case -11: // EAGAIN, EWOULDBLOCK Resource temporarily unavailable\r
- case -16: // EBUSY Device or resource busy\r
- case -26: // ETXTBSY Text file busy\r
- case -35: // EDEADLK, EDEADLOCK Resource deadlock avoided\r
- case -39: // ENOTEMPTY Directory not empty\r
- case -42: // ENOMSG No message of desired type\r
- case -61: // ENODATA No data available\r
- case -85: // ERESTART Interrupted system call should be restarted\r
- return EFI_NOT_READY;\r
-\r
- case -5: // EIO Input/output error\r
- case -45: // EL2NSYNC Level 2 not synchronized\r
- case -46: // EL3HLT Level 3 halted\r
- case -47: // EL3RST Level 3 reset\r
- case -51: // EL2HLT Level 2 halted\r
- case -121: // EREMOTEIO Remote I/O error\r
- case -133: // EHWPOISON Memory page has hardware error\r
- return EFI_DEVICE_ERROR;\r
-\r
- case -7: // E2BIG Argument list too long\r
- case -36: // ENAMETOOLONG File name too long\r
- case -90: // EMSGSIZE Message too long\r
- return EFI_BAD_BUFFER_SIZE;\r
-\r
- case -8: // ENOEXEC Exec format error\r
- case -15: // ENOTBLK Block device required\r
- case -18: // EXDEV Invalid cross-device link\r
- case -20: // ENOTDIR Not a directory\r
- case -21: // EISDIR Is a directory\r
- case -25: // ENOTTY Inappropriate ioctl for device\r
- case -27: // EFBIG File too large\r
- case -29: // ESPIPE Illegal seek\r
- case -38: // ENOSYS Function not implemented\r
- case -59: // EBFONT Bad font file format\r
- case -60: // ENOSTR Device not a stream\r
- case -83: // ELIBEXEC Cannot exec a shared library directly\r
- case -88: // ENOTSOCK Socket operation on non-socket\r
- case -91: // EPROTOTYPE Protocol wrong type for socket\r
- case -92: // ENOPROTOOPT Protocol not available\r
- case -93: // EPROTONOSUPPORT Protocol not supported\r
- case -94: // ESOCKTNOSUPPORT Socket type not supported\r
- case -95: // ENOTSUP, EOPNOTSUPP Operation not supported\r
- case -96: // EPFNOSUPPORT Protocol family not supported\r
- case -97: // EAFNOSUPPORT Address family not supported by protocol\r
- case -99: // EADDRNOTAVAIL Cannot assign requested address\r
- case -118: // ENOTNAM Not a XENIX named type file\r
- case -120: // EISNAM Is a named type file\r
- case -124: // EMEDIUMTYPE Wrong medium type\r
- return EFI_UNSUPPORTED;\r
-\r
- case -9: // EBADF Bad file descriptor\r
- case -14: // EFAULT Bad address\r
- case -44: // ECHRNG Channel number out of range\r
- case -48: // ELNRNG Link number out of range\r
- case -53: // EBADR Invalid request descriptor\r
- case -56: // EBADRQC Invalid request code\r
- case -57: // EBADSLT Invalid slot\r
- case -76: // ENOTUNIQ Name not unique on network\r
- case -84: // EILSEQ Invalid or incomplete multibyte or wide character\r
- return EFI_NO_MAPPING;\r
-\r
- case -12: // ENOMEM Cannot allocate memory\r
- case -23: // ENFILE Too many open files in system\r
- case -24: // EMFILE Too many open files\r
- case -31: // EMLINK Too many links\r
- case -37: // ENOLCK No locks available\r
- case -40: // ELOOP Too many levels of symbolic links\r
- case -50: // ENOCSI No CSI structure available\r
- case -55: // ENOANO No anode\r
- case -63: // ENOSR Out of streams resources\r
- case -82: // ELIBMAX Attempting to link in too many shared libraries\r
- case -87: // EUSERS Too many users\r
- case -105: // ENOBUFS No buffer space available\r
- case -109: // ETOOMANYREFS Too many references: cannot splice\r
- case -119: // ENAVAIL No XENIX semaphores available\r
- case -122: // EDQUOT Disk quota exceeded\r
- return EFI_OUT_OF_RESOURCES;\r
+ case -1:// EPERM Operation not permitted\r
+ return EFI_SECURITY_VIOLATION;\r
+\r
+ case -2: // ENOENT No such file or directory\r
+ case -3: // ESRCH No such process\r
+ case -6: // ENXIO No such device or address\r
+ case -10: // ECHILD No child processes\r
+ case -19: // ENODEV No such device\r
+ case -49: // EUNATCH Protocol driver not attached\r
+ case -65: // ENOPKG Package not installed\r
+ case -79: // ELIBACC Can not access a needed shared library\r
+ case -126: // ENOKEY Required key not available\r
+ return EFI_NOT_FOUND;\r
+\r
+ case -4: // EINTR Interrupted system call\r
+ case -11: // EAGAIN, EWOULDBLOCK Resource temporarily unavailable\r
+ case -16: // EBUSY Device or resource busy\r
+ case -26: // ETXTBSY Text file busy\r
+ case -35: // EDEADLK, EDEADLOCK Resource deadlock avoided\r
+ case -39: // ENOTEMPTY Directory not empty\r
+ case -42: // ENOMSG No message of desired type\r
+ case -61: // ENODATA No data available\r
+ case -85: // ERESTART Interrupted system call should be restarted\r
+ return EFI_NOT_READY;\r
+\r
+ case -5: // EIO Input/output error\r
+ case -45: // EL2NSYNC Level 2 not synchronized\r
+ case -46: // EL3HLT Level 3 halted\r
+ case -47: // EL3RST Level 3 reset\r
+ case -51: // EL2HLT Level 2 halted\r
+ case -121: // EREMOTEIO Remote I/O error\r
+ case -133: // EHWPOISON Memory page has hardware error\r
+ return EFI_DEVICE_ERROR;\r
+\r
+ case -7: // E2BIG Argument list too long\r
+ case -36: // ENAMETOOLONG File name too long\r
+ case -90: // EMSGSIZE Message too long\r
+ return EFI_BAD_BUFFER_SIZE;\r
+\r
+ case -8: // ENOEXEC Exec format error\r
+ case -15: // ENOTBLK Block device required\r
+ case -18: // EXDEV Invalid cross-device link\r
+ case -20: // ENOTDIR Not a directory\r
+ case -21: // EISDIR Is a directory\r
+ case -25: // ENOTTY Inappropriate ioctl for device\r
+ case -27: // EFBIG File too large\r
+ case -29: // ESPIPE Illegal seek\r
+ case -38: // ENOSYS Function not implemented\r
+ case -59: // EBFONT Bad font file format\r
+ case -60: // ENOSTR Device not a stream\r
+ case -83: // ELIBEXEC Cannot exec a shared library directly\r
+ case -88: // ENOTSOCK Socket operation on non-socket\r
+ case -91: // EPROTOTYPE Protocol wrong type for socket\r
+ case -92: // ENOPROTOOPT Protocol not available\r
+ case -93: // EPROTONOSUPPORT Protocol not supported\r
+ case -94: // ESOCKTNOSUPPORT Socket type not supported\r
+ case -95: // ENOTSUP, EOPNOTSUPP Operation not supported\r
+ case -96: // EPFNOSUPPORT Protocol family not supported\r
+ case -97: // EAFNOSUPPORT Address family not supported by protocol\r
+ case -99: // EADDRNOTAVAIL Cannot assign requested address\r
+ case -118: // ENOTNAM Not a XENIX named type file\r
+ case -120: // EISNAM Is a named type file\r
+ case -124: // EMEDIUMTYPE Wrong medium type\r
+ return EFI_UNSUPPORTED;\r
\r
- case -13: // EACCES Permission denied\r
- return EFI_ACCESS_DENIED;\r
+ case -9: // EBADF Bad file descriptor\r
+ case -14: // EFAULT Bad address\r
+ case -44: // ECHRNG Channel number out of range\r
+ case -48: // ELNRNG Link number out of range\r
+ case -53: // EBADR Invalid request descriptor\r
+ case -56: // EBADRQC Invalid request code\r
+ case -57: // EBADSLT Invalid slot\r
+ case -76: // ENOTUNIQ Name not unique on network\r
+ case -84: // EILSEQ Invalid or incomplete multibyte or wide character\r
+ return EFI_NO_MAPPING;\r
+\r
+ case -12: // ENOMEM Cannot allocate memory\r
+ case -23: // ENFILE Too many open files in system\r
+ case -24: // EMFILE Too many open files\r
+ case -31: // EMLINK Too many links\r
+ case -37: // ENOLCK No locks available\r
+ case -40: // ELOOP Too many levels of symbolic links\r
+ case -50: // ENOCSI No CSI structure available\r
+ case -55: // ENOANO No anode\r
+ case -63: // ENOSR Out of streams resources\r
+ case -82: // ELIBMAX Attempting to link in too many shared libraries\r
+ case -87: // EUSERS Too many users\r
+ case -105: // ENOBUFS No buffer space available\r
+ case -109: // ETOOMANYREFS Too many references: cannot splice\r
+ case -119: // ENAVAIL No XENIX semaphores available\r
+ case -122: // EDQUOT Disk quota exceeded\r
+ return EFI_OUT_OF_RESOURCES;\r
\r
- case -17: // EEXIST File exists\r
- case -98: // EADDRINUSE Address already in use\r
- case -106: // EISCONN Transport endpoint is already connected\r
- case -114: // EALREADY Operation already in progress\r
- case -115: // EINPROGRESS Operation now in progress\r
- return EFI_ALREADY_STARTED;\r
+ case -13:// EACCES Permission denied\r
+ return EFI_ACCESS_DENIED;\r
\r
- case -22: // EINVAL Invalid argument\r
- case -33: // EDOM Numerical argument out of domain\r
- return EFI_INVALID_PARAMETER;\r
+ case -17: // EEXIST File exists\r
+ case -98: // EADDRINUSE Address already in use\r
+ case -106: // EISCONN Transport endpoint is already connected\r
+ case -114: // EALREADY Operation already in progress\r
+ case -115: // EINPROGRESS Operation now in progress\r
+ return EFI_ALREADY_STARTED;\r
\r
- case -28: // ENOSPC No space left on device\r
- case -54: // EXFULL Exchange full\r
- return EFI_VOLUME_FULL;\r
-\r
- case -30: // EROFS Read-only file system\r
- return EFI_WRITE_PROTECTED;\r
-\r
- case -32: // EPIPE Broken pipe\r
- case -43: // EIDRM Identifier removed\r
- case -67: // ENOLINK Link has been severed\r
- case -68: // EADV Advertise error\r
- case -69: // ESRMNT Srmount error\r
- case -70: // ECOMM Communication error on send\r
- case -73: // EDOTDOT RFS specific error\r
- case -78: // EREMCHG Remote address changed\r
- case -86: // ESTRPIPE Streams pipe error\r
- case -102: // ENETRESET Network dropped connection on reset\r
- case -103: // ECONNABORTED Software caused connection abort\r
- case -104: // ECONNRESET Connection reset by peer\r
- case -116: // ESTALE Stale file handle\r
- case -125: // ECANCELED Operation canceled\r
- case -128: // EKEYREVOKED Key has been revoked\r
- case -129: // EKEYREJECTED Key was rejected by service\r
- case -130: // EOWNERDEAD Owner died\r
- case -131: // ENOTRECOVERABLE State not recoverable\r
- return EFI_ABORTED;\r
-\r
- case -34: // ERANGE Numerical result out of range\r
- case -75: // EOVERFLOW Value too large for defined data type\r
- return EFI_BUFFER_TOO_SMALL;\r
+ case -22: // EINVAL Invalid argument\r
+ case -33: // EDOM Numerical argument out of domain\r
+ return EFI_INVALID_PARAMETER;\r
\r
- case -52: // EBADE Invalid exchange\r
- case -108: // ESHUTDOWN Cannot send after transport endpoint shutdown\r
- case -111: // ECONNREFUSED Connection refused\r
- return EFI_END_OF_FILE;\r
-\r
- case -62: // ETIME Timer expired\r
- case -110: // ETIMEDOUT Connection timed out\r
- case -127: // EKEYEXPIRED Key has expired\r
- return EFI_TIMEOUT;\r
-\r
- case -64: // ENONET Machine is not on the network\r
- case -66: // EREMOTE Object is remote\r
- case -72: // EMULTIHOP Multihop attempted\r
- case -100: // ENETDOWN Network is down\r
- case -101: // ENETUNREACH Network is unreachable\r
- case -112: // EHOSTDOWN Host is down\r
- case -113: // EHOSTUNREACH No route to host\r
- case -123: // ENOMEDIUM No medium found\r
- case -132: // ERFKILL Operation not possible due to RF-kill\r
- return EFI_NO_MEDIA;\r
-\r
- case -71: // EPROTO Protocol error\r
- return EFI_PROTOCOL_ERROR;\r
+ case -28: // ENOSPC No space left on device\r
+ case -54: // EXFULL Exchange full\r
+ return EFI_VOLUME_FULL;\r
+\r
+ case -30:// EROFS Read-only file system\r
+ return EFI_WRITE_PROTECTED;\r
+\r
+ case -32: // EPIPE Broken pipe\r
+ case -43: // EIDRM Identifier removed\r
+ case -67: // ENOLINK Link has been severed\r
+ case -68: // EADV Advertise error\r
+ case -69: // ESRMNT Srmount error\r
+ case -70: // ECOMM Communication error on send\r
+ case -73: // EDOTDOT RFS specific error\r
+ case -78: // EREMCHG Remote address changed\r
+ case -86: // ESTRPIPE Streams pipe error\r
+ case -102: // ENETRESET Network dropped connection on reset\r
+ case -103: // ECONNABORTED Software caused connection abort\r
+ case -104: // ECONNRESET Connection reset by peer\r
+ case -116: // ESTALE Stale file handle\r
+ case -125: // ECANCELED Operation canceled\r
+ case -128: // EKEYREVOKED Key has been revoked\r
+ case -129: // EKEYREJECTED Key was rejected by service\r
+ case -130: // EOWNERDEAD Owner died\r
+ case -131: // ENOTRECOVERABLE State not recoverable\r
+ return EFI_ABORTED;\r
+\r
+ case -34: // ERANGE Numerical result out of range\r
+ case -75: // EOVERFLOW Value too large for defined data type\r
+ return EFI_BUFFER_TOO_SMALL;\r
+\r
+ case -52: // EBADE Invalid exchange\r
+ case -108: // ESHUTDOWN Cannot send after transport endpoint shutdown\r
+ case -111: // ECONNREFUSED Connection refused\r
+ return EFI_END_OF_FILE;\r
+\r
+ case -62: // ETIME Timer expired\r
+ case -110: // ETIMEDOUT Connection timed out\r
+ case -127: // EKEYEXPIRED Key has expired\r
+ return EFI_TIMEOUT;\r
+\r
+ case -64: // ENONET Machine is not on the network\r
+ case -66: // EREMOTE Object is remote\r
+ case -72: // EMULTIHOP Multihop attempted\r
+ case -100: // ENETDOWN Network is down\r
+ case -101: // ENETUNREACH Network is unreachable\r
+ case -112: // EHOSTDOWN Host is down\r
+ case -113: // EHOSTUNREACH No route to host\r
+ case -123: // ENOMEDIUM No medium found\r
+ case -132: // ERFKILL Operation not possible due to RF-kill\r
+ return EFI_NO_MEDIA;\r
+\r
+ case -71:// EPROTO Protocol error\r
+ return EFI_PROTOCOL_ERROR;\r
\r
- case -74: // EBADMSG Bad message\r
- case -77: // EBADFD File descriptor in bad state\r
- case -80: // ELIBBAD Accessing a corrupted shared library\r
- case -81: // ELIBSCN .lib section in a.out corrupted\r
- case -117: // EUCLEAN Structure needs cleaning\r
- return EFI_VOLUME_CORRUPTED;\r
+ case -74: // EBADMSG Bad message\r
+ case -77: // EBADFD File descriptor in bad state\r
+ case -80: // ELIBBAD Accessing a corrupted shared library\r
+ case -81: // ELIBSCN .lib section in a.out corrupted\r
+ case -117: // EUCLEAN Structure needs cleaning\r
+ return EFI_VOLUME_CORRUPTED;\r
\r
- case -89: // EDESTADDRREQ Destination address required\r
- case -107: // ENOTCONN Transport endpoint is not connected\r
- return EFI_NOT_STARTED;\r
+ case -89: // EDESTADDRREQ Destination address required\r
+ case -107: // ENOTCONN Transport endpoint is not connected\r
+ return EFI_NOT_STARTED;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
}\r
\r
return EFI_DEVICE_ERROR;\r
STATIC\r
VOID\r
ParserStripSlash (\r
- IN CHAR8 *Buffer,\r
- IN OUT UINTN *Position\r
+ IN CHAR8 *Buffer,\r
+ IN OUT UINTN *Position\r
)\r
{\r
ASSERT (*Position >= 1);\r
if (*Position == 1) {\r
return;\r
}\r
+\r
(*Position)--;\r
}\r
\r
STATIC\r
VOID\r
ParserCopy (\r
- OUT CHAR8 *Buffer,\r
- IN OUT UINTN *Position,\r
- IN UINTN Size,\r
- IN CHAR8 Char8\r
+ OUT CHAR8 *Buffer,\r
+ IN OUT UINTN *Position,\r
+ IN UINTN Size,\r
+ IN CHAR8 Char8\r
)\r
{\r
ASSERT (*Position < Size);\r
STATIC\r
VOID\r
ParserRewindDot (\r
- IN CHAR8 *Buffer,\r
- IN OUT UINTN *Position\r
+ IN CHAR8 *Buffer,\r
+ IN OUT UINTN *Position\r
)\r
{\r
ASSERT (*Position >= 2);\r
STATIC\r
VOID\r
ParserRewindDotDot (\r
- IN CHAR8 *Buffer,\r
- IN OUT UINTN *Position,\r
- OUT BOOLEAN *RootEscape\r
+ IN CHAR8 *Buffer,\r
+ IN OUT UINTN *Position,\r
+ OUT BOOLEAN *RootEscape\r
\r
)\r
{\r
ASSERT (*Position > 0);\r
(*Position)--;\r
} while (Buffer[*Position] != '/');\r
+\r
(*Position)++;\r
}\r
\r
VirtioFsAppendPath (\r
IN CHAR8 *LhsPath8,\r
IN CHAR16 *RhsPath16,\r
- OUT CHAR8 **ResultPath8,\r
- OUT BOOLEAN *RootEscape\r
+ OUT CHAR8 **ResultPath8,\r
+ OUT BOOLEAN *RootEscape\r
)\r
{\r
- UINTN RhsLen;\r
- CHAR8 *RhsPath8;\r
- UINTN Idx;\r
- EFI_STATUS Status;\r
- UINTN SizeToSanitize;\r
- CHAR8 *BufferToSanitize;\r
- CHAR8 *SanitizedBuffer;\r
- PARSER_STATE State;\r
- UINTN SanitizedPosition;\r
+ UINTN RhsLen;\r
+ CHAR8 *RhsPath8;\r
+ UINTN Idx;\r
+ EFI_STATUS Status;\r
+ UINTN SizeToSanitize;\r
+ CHAR8 *BufferToSanitize;\r
+ CHAR8 *SanitizedBuffer;\r
+ PARSER_STATE State;\r
+ UINTN SanitizedPosition;\r
\r
//\r
// Appending an empty pathname is not allowed.\r
if (RhsLen == 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Enforce length restriction on RhsPath16.\r
//\r
if (RhsPath8 == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
for (Idx = 0; RhsPath16[Idx] != L'\0'; Idx++) {\r
- if (RhsPath16[Idx] < 0x20 || RhsPath16[Idx] > 0x7E ||\r
- RhsPath16[Idx] == L'/') {\r
+ if ((RhsPath16[Idx] < 0x20) || (RhsPath16[Idx] > 0x7E) ||\r
+ (RhsPath16[Idx] == L'/'))\r
+ {\r
Status = EFI_UNSUPPORTED;\r
goto FreeRhsPath8;\r
}\r
+\r
RhsPath8[Idx] = (CHAR8)((RhsPath16[Idx] == L'\\') ? L'/' : RhsPath16[Idx]);\r
}\r
+\r
RhsPath8[Idx++] = '\0';\r
\r
//\r
// If the right hand side path is absolute, then it is not appended to the\r
// left hand side path -- it *replaces* the left hand side path.\r
//\r
- SizeToSanitize = RhsLen + 1;\r
+ SizeToSanitize = RhsLen + 1;\r
BufferToSanitize = RhsPath8;\r
} else {\r
//\r
// If the right hand side path is relative, then it is appended (naively)\r
// to the left hand side.\r
//\r
- UINTN LhsLen;\r
+ UINTN LhsLen;\r
\r
- LhsLen = AsciiStrLen (LhsPath8);\r
- SizeToSanitize = LhsLen + 1 + RhsLen + 1;\r
+ LhsLen = AsciiStrLen (LhsPath8);\r
+ SizeToSanitize = LhsLen + 1 + RhsLen + 1;\r
BufferToSanitize = AllocatePool (SizeToSanitize);\r
if (BufferToSanitize == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto FreeRhsPath8;\r
}\r
+\r
CopyMem (BufferToSanitize, LhsPath8, LhsLen);\r
BufferToSanitize[LhsLen] = '/';\r
CopyMem (BufferToSanitize + LhsLen + 1, RhsPath8, RhsLen + 1);\r
State = ParserInit;\r
SanitizedPosition = 0;\r
do {\r
- CHAR8 Chr8;\r
+ CHAR8 Chr8;\r
\r
ASSERT (Idx < SizeToSanitize);\r
Chr8 = BufferToSanitize[Idx++];\r
\r
switch (State) {\r
- case ParserInit: // just starting\r
- ASSERT (Chr8 == '/');\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserSlash;\r
- break;\r
-\r
- case ParserSlash: // slash(es) seen\r
- switch (Chr8) {\r
- case '\0':\r
- ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
+ case ParserInit: // just starting\r
+ ASSERT (Chr8 == '/');\r
ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserEnd;\r
- break;\r
- case '/':\r
- //\r
- // skip & stay in same state\r
- //\r
- break;\r
- case '.':\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserDot;\r
- break;\r
- default:\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserNormal;\r
- break;\r
- }\r
- break;\r
-\r
- case ParserDot: // one dot seen since last slash\r
- switch (Chr8) {\r
- case '\0':\r
- ParserRewindDot (SanitizedBuffer, &SanitizedPosition);\r
- ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserEnd;\r
- break;\r
- case '/':\r
- ParserRewindDot (SanitizedBuffer, &SanitizedPosition);\r
State = ParserSlash;\r
break;\r
- case '.':\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserDotDot;\r
- break;\r
- default:\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserNormal;\r
- break;\r
- }\r
- break;\r
\r
- case ParserDotDot: // two dots seen since last slash\r
- switch (Chr8) {\r
- case '\0':\r
- ParserRewindDotDot (SanitizedBuffer, &SanitizedPosition, RootEscape);\r
- ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserEnd;\r
- break;\r
- case '/':\r
- ParserRewindDotDot (SanitizedBuffer, &SanitizedPosition, RootEscape);\r
- State = ParserSlash;\r
+ case ParserSlash: // slash(es) seen\r
+ switch (Chr8) {\r
+ case '\0':\r
+ ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserEnd;\r
+ break;\r
+ case '/':\r
+ //\r
+ // skip & stay in same state\r
+ //\r
+ break;\r
+ case '.':\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserDot;\r
+ break;\r
+ default:\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserNormal;\r
+ break;\r
+ }\r
+\r
break;\r
- case '.':\r
- //\r
- // fall through\r
- //\r
- default:\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserNormal;\r
+\r
+ case ParserDot: // one dot seen since last slash\r
+ switch (Chr8) {\r
+ case '\0':\r
+ ParserRewindDot (SanitizedBuffer, &SanitizedPosition);\r
+ ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserEnd;\r
+ break;\r
+ case '/':\r
+ ParserRewindDot (SanitizedBuffer, &SanitizedPosition);\r
+ State = ParserSlash;\r
+ break;\r
+ case '.':\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserDotDot;\r
+ break;\r
+ default:\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserNormal;\r
+ break;\r
+ }\r
+\r
break;\r
- }\r
- break;\r
\r
- case ParserNormal: // a different sequence seen\r
- switch (Chr8) {\r
- case '\0':\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserEnd;\r
+ case ParserDotDot: // two dots seen since last slash\r
+ switch (Chr8) {\r
+ case '\0':\r
+ ParserRewindDotDot (SanitizedBuffer, &SanitizedPosition, RootEscape);\r
+ ParserStripSlash (SanitizedBuffer, &SanitizedPosition);\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserEnd;\r
+ break;\r
+ case '/':\r
+ ParserRewindDotDot (SanitizedBuffer, &SanitizedPosition, RootEscape);\r
+ State = ParserSlash;\r
+ break;\r
+ case '.':\r
+ //\r
+ // fall through\r
+ //\r
+ default:\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserNormal;\r
+ break;\r
+ }\r
+\r
break;\r
- case '/':\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
- State = ParserSlash;\r
+\r
+ case ParserNormal: // a different sequence seen\r
+ switch (Chr8) {\r
+ case '\0':\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserEnd;\r
+ break;\r
+ case '/':\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ State = ParserSlash;\r
+ break;\r
+ case '.':\r
+ //\r
+ // fall through\r
+ //\r
+ default:\r
+ //\r
+ // copy and stay in same state\r
+ //\r
+ ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ break;\r
+ }\r
+\r
break;\r
- case '.':\r
- //\r
- // fall through\r
- //\r
+\r
default:\r
- //\r
- // copy and stay in same state\r
- //\r
- ParserCopy (SanitizedBuffer, &SanitizedPosition, SizeToSanitize, Chr8);\r
+ ASSERT (FALSE);\r
break;\r
- }\r
- break;\r
-\r
- default:\r
- ASSERT (FALSE);\r
- break;\r
}\r
} while (State != ParserEnd);\r
\r
**/\r
EFI_STATUS\r
VirtioFsLookupMostSpecificParentDir (\r
- IN OUT VIRTIO_FS *VirtioFs,\r
- IN OUT CHAR8 *Path,\r
- OUT UINT64 *DirNodeId,\r
- OUT CHAR8 **LastComponent\r
+ IN OUT VIRTIO_FS *VirtioFs,\r
+ IN OUT CHAR8 *Path,\r
+ OUT UINT64 *DirNodeId,\r
+ OUT CHAR8 **LastComponent\r
)\r
{\r
- UINT64 ParentDirNodeId;\r
- CHAR8 *Slash;\r
- EFI_STATUS Status;\r
- UINT64 NextDirNodeId;\r
+ UINT64 ParentDirNodeId;\r
+ CHAR8 *Slash;\r
+ EFI_STATUS Status;\r
+ UINT64 NextDirNodeId;\r
\r
if (AsciiStrCmp (Path, "/") == 0) {\r
return EFI_INVALID_PARAMETER;\r
\r
ParentDirNodeId = VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID;\r
Slash = Path;\r
- for (;;) {\r
- CHAR8 *NextSlash;\r
- VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
- EFI_FILE_INFO FileInfo;\r
+ for ( ; ;) {\r
+ CHAR8 *NextSlash;\r
+ VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE FuseAttr;\r
+ EFI_FILE_INFO FileInfo;\r
\r
//\r
// Find the slash (if any) that terminates the next pathname component.\r
// up.\r
//\r
*NextSlash = '\0';\r
- Status = VirtioFsFuseLookup (VirtioFs, ParentDirNodeId, Slash + 1,\r
- &NextDirNodeId, &FuseAttr);\r
+ Status = VirtioFsFuseLookup (\r
+ VirtioFs,\r
+ ParentDirNodeId,\r
+ Slash + 1,\r
+ &NextDirNodeId,\r
+ &FuseAttr\r
+ );\r
*NextSlash = '/';\r
\r
//\r
if (EFI_ERROR (Status)) {\r
goto ForgetNextDirNodeId;\r
}\r
+\r
if ((FileInfo.Attribute & EFI_FILE_DIRECTORY) == 0) {\r
Status = EFI_ACCESS_DENIED;\r
goto ForgetNextDirNodeId;\r
EFI_STATUS\r
VirtioFsGetBasename (\r
IN CHAR8 *Path,\r
- OUT CHAR16 *Basename OPTIONAL,\r
+ OUT CHAR16 *Basename OPTIONAL,\r
IN OUT UINTN *BasenameSize\r
)\r
{\r
- UINTN AllocSize;\r
- UINTN LastComponent;\r
- UINTN Idx;\r
- UINTN PathSize;\r
+ UINTN AllocSize;\r
+ UINTN LastComponent;\r
+ UINTN Idx;\r
+ UINTN PathSize;\r
\r
AllocSize = *BasenameSize;\r
\r
LastComponent = Idx;\r
}\r
}\r
+\r
PathSize = Idx + 1;\r
ASSERT (LastComponent < MAX_UINTN);\r
LastComponent++;\r
for (Idx = LastComponent; Idx < PathSize; Idx++) {\r
Basename[Idx - LastComponent] = Path[Idx];\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
VirtioFsComposeRenameDestination (\r
IN CHAR8 *LhsPath8,\r
IN CHAR16 *RhsPath16,\r
- OUT CHAR8 **ResultPath8,\r
- OUT BOOLEAN *RootEscape\r
+ OUT CHAR8 **ResultPath8,\r
+ OUT BOOLEAN *RootEscape\r
)\r
{\r
//\r
// excluding terminating NULs. Sizes are expressed as byte counts, including\r
// the bytes taken up by terminating NULs.\r
//\r
- UINTN RhsLen;\r
- UINTN LhsBasename16Size;\r
- EFI_STATUS Status;\r
- UINTN LhsBasenameLen;\r
- UINTN DestSuffix16Size;\r
- CHAR16 *DestSuffix16;\r
- CHAR8 *DestPrefix8;\r
+ UINTN RhsLen;\r
+ UINTN LhsBasename16Size;\r
+ EFI_STATUS Status;\r
+ UINTN LhsBasenameLen;\r
+ UINTN DestSuffix16Size;\r
+ CHAR16 *DestSuffix16;\r
+ CHAR8 *DestPrefix8;\r
\r
//\r
// An empty destination operand for the rename/move operation is not allowed.\r
if (RhsLen == 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// Enforce length restriction on RhsPath16.\r
//\r
// Determine the length of the basename of LhsPath8.\r
//\r
LhsBasename16Size = 0;\r
- Status = VirtioFsGetBasename (LhsPath8, NULL, &LhsBasename16Size);\r
+ Status = VirtioFsGetBasename (LhsPath8, NULL, &LhsBasename16Size);\r
ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
ASSERT (LhsBasename16Size >= sizeof (CHAR16));\r
ASSERT (LhsBasename16Size % sizeof (CHAR16) == 0);\r
// Append the basename of LhsPath8 as a CHAR16 string to RhsPath16.\r
//\r
DestSuffix16Size = RhsLen * sizeof (CHAR16) + LhsBasename16Size;\r
- DestSuffix16 = AllocatePool (DestSuffix16Size);\r
+ DestSuffix16 = AllocatePool (DestSuffix16Size);\r
if (DestSuffix16 == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
CopyMem (DestSuffix16, RhsPath16, RhsLen * sizeof (CHAR16));\r
- Status = VirtioFsGetBasename (LhsPath8, DestSuffix16 + RhsLen,\r
- &LhsBasename16Size);\r
+ Status = VirtioFsGetBasename (\r
+ LhsPath8,\r
+ DestSuffix16 + RhsLen,\r
+ &LhsBasename16Size\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
} else {\r
//\r
// Just create a copy of RhsPath16.\r
//\r
DestSuffix16Size = (RhsLen + 1) * sizeof (CHAR16);\r
- DestSuffix16 = AllocateCopyPool (DestSuffix16Size, RhsPath16);\r
+ DestSuffix16 = AllocateCopyPool (DestSuffix16Size, RhsPath16);\r
if (DestSuffix16 == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
goto FreeDestSuffix16;\r
}\r
} else {\r
- UINTN LhsLen;\r
- UINTN DestPrefixLen;\r
+ UINTN LhsLen;\r
+ UINTN DestPrefixLen;\r
\r
//\r
// Strip the basename of LhsPath8.\r
if (DestPrefixLen > 1) {\r
DestPrefixLen--;\r
}\r
+\r
DestPrefix8 = AllocatePool (DestPrefixLen + 1);\r
if (DestPrefix8 == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
goto FreeDestSuffix16;\r
}\r
+\r
CopyMem (DestPrefix8, LhsPath8, DestPrefixLen);\r
DestPrefix8[DestPrefixLen] = '\0';\r
}\r
// Now combine DestPrefix8 and DestSuffix16 into the final canonical\r
// pathname.\r
//\r
- Status = VirtioFsAppendPath (DestPrefix8, DestSuffix16, ResultPath8,\r
- RootEscape);\r
+ Status = VirtioFsAppendPath (\r
+ DestPrefix8,\r
+ DestSuffix16,\r
+ ResultPath8,\r
+ RootEscape\r
+ );\r
\r
FreePool (DestPrefix8);\r
//\r
**/\r
EFI_STATUS\r
VirtioFsFuseAttrToEfiFileInfo (\r
- IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr,\r
- OUT EFI_FILE_INFO *FileInfo\r
+ IN VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE *FuseAttr,\r
+ OUT EFI_FILE_INFO *FileInfo\r
)\r
{\r
- UINT64 EpochTime[3];\r
- EFI_TIME *ConvertedTime[ARRAY_SIZE (EpochTime)];\r
- UINTN Idx;\r
+ UINT64 EpochTime[3];\r
+ EFI_TIME *ConvertedTime[ARRAY_SIZE (EpochTime)];\r
+ UINTN Idx;\r
\r
FileInfo->FileSize = FuseAttr->Size;\r
\r
if (FuseAttr->Blocks >= BIT55) {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
FileInfo->PhysicalSize = LShiftU64 (FuseAttr->Blocks, 9);\r
\r
//\r
if (EpochTime[Idx] > MAX_UINTN) {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
//\r
// Set the following fields in the converted time: Year, Month, Day, Hour,\r
// Minute, Second, Nanosecond.\r
// Set the attributes.\r
//\r
switch (FuseAttr->Mode & VIRTIO_FS_FUSE_MODE_TYPE_MASK) {\r
- case VIRTIO_FS_FUSE_MODE_TYPE_DIR:\r
- FileInfo->Attribute = EFI_FILE_DIRECTORY;\r
- break;\r
- case VIRTIO_FS_FUSE_MODE_TYPE_REG:\r
- FileInfo->Attribute = 0;\r
- break;\r
- default:\r
- //\r
- // Other file types are not supported.\r
- //\r
- return EFI_UNSUPPORTED;\r
+ case VIRTIO_FS_FUSE_MODE_TYPE_DIR:\r
+ FileInfo->Attribute = EFI_FILE_DIRECTORY;\r
+ break;\r
+ case VIRTIO_FS_FUSE_MODE_TYPE_REG:\r
+ FileInfo->Attribute = 0;\r
+ break;\r
+ default:\r
+ //\r
+ // Other file types are not supported.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
}\r
+\r
//\r
// Report the regular file or directory as read-only if all classes lack\r
// write permission.\r
//\r
if ((FuseAttr->Mode & (VIRTIO_FS_FUSE_MODE_PERM_WUSR |\r
VIRTIO_FS_FUSE_MODE_PERM_WGRP |\r
- VIRTIO_FS_FUSE_MODE_PERM_WOTH)) == 0) {\r
+ VIRTIO_FS_FUSE_MODE_PERM_WOTH)) == 0)\r
+ {\r
FileInfo->Attribute |= EFI_FILE_READ_ONLY;\r
}\r
\r
//\r
// A hard link count greater than 1 is not supported for regular files.\r
//\r
- if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0 && FuseAttr->Nlink > 1) {\r
+ if (((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) && (FuseAttr->Nlink > 1)) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
**/\r
EFI_STATUS\r
VirtioFsFuseDirentPlusToEfiFileInfo (\r
- IN VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE *FuseDirent,\r
- IN OUT EFI_FILE_INFO *FileInfo\r
+ IN VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE *FuseDirent,\r
+ IN OUT EFI_FILE_INFO *FileInfo\r
)\r
{\r
- UINTN DirentSize;\r
- UINTN FileInfoSize;\r
- UINT8 *DirentName;\r
- UINT32 Idx;\r
+ UINTN DirentSize;\r
+ UINTN FileInfoSize;\r
+ UINT8 *DirentName;\r
+ UINT32 Idx;\r
\r
DirentSize = VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE (FuseDirent->Namelen);\r
if (DirentSize == 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
//\r
// We're now safe from overflow in the calculation below.\r
//\r
//\r
DirentName = (UINT8 *)(FuseDirent + 1);\r
for (Idx = 0; Idx < FuseDirent->Namelen; Idx++) {\r
- UINT8 NameByte;\r
+ UINT8 NameByte;\r
\r
NameByte = DirentName[Idx];\r
- if (NameByte < 0x20 || NameByte > 0x7E ||\r
- NameByte == '/' || NameByte == '\\') {\r
+ if ((NameByte < 0x20) || (NameByte > 0x7E) ||\r
+ (NameByte == '/') || (NameByte == '\\'))\r
+ {\r
return EFI_UNSUPPORTED;\r
}\r
+\r
FileInfo->FileName[Idx] = (CHAR16)NameByte;\r
}\r
+\r
FileInfo->FileName[Idx++] = L'\0';\r
//\r
// Set the (possibly reduced) size.\r
**/\r
VOID\r
VirtioFsGetFuseSizeUpdate (\r
- IN EFI_FILE_INFO *Info,\r
- IN EFI_FILE_INFO *NewInfo,\r
- OUT BOOLEAN *Update,\r
- OUT UINT64 *Size\r
+ IN EFI_FILE_INFO *Info,\r
+ IN EFI_FILE_INFO *NewInfo,\r
+ OUT BOOLEAN *Update,\r
+ OUT UINT64 *Size\r
)\r
{\r
- BOOLEAN IsDirectory;\r
+ BOOLEAN IsDirectory;\r
\r
IsDirectory = (BOOLEAN)((Info->Attribute & EFI_FILE_DIRECTORY) != 0);\r
\r
- if (IsDirectory || Info->FileSize == NewInfo->FileSize) {\r
+ if (IsDirectory || (Info->FileSize == NewInfo->FileSize)) {\r
*Update = FALSE;\r
return;\r
}\r
+\r
*Update = TRUE;\r
- *Size = NewInfo->FileSize;\r
+ *Size = NewInfo->FileSize;\r
}\r
\r
/**\r
**/\r
EFI_STATUS\r
VirtioFsGetFuseTimeUpdates (\r
- IN EFI_FILE_INFO *Info,\r
- IN EFI_FILE_INFO *NewInfo,\r
- OUT BOOLEAN *UpdateAtime,\r
- OUT BOOLEAN *UpdateMtime,\r
- OUT UINT64 *Atime,\r
- OUT UINT64 *Mtime\r
+ IN EFI_FILE_INFO *Info,\r
+ IN EFI_FILE_INFO *NewInfo,\r
+ OUT BOOLEAN *UpdateAtime,\r
+ OUT BOOLEAN *UpdateMtime,\r
+ OUT UINT64 *Atime,\r
+ OUT UINT64 *Mtime\r
)\r
{\r
- EFI_TIME *Time[3];\r
- EFI_TIME *NewTime[ARRAY_SIZE (Time)];\r
- UINTN Idx;\r
- STATIC CONST EFI_TIME ZeroTime = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\r
- BOOLEAN Change[ARRAY_SIZE (Time)];\r
- UINT64 Seconds[ARRAY_SIZE (Time)];\r
+ EFI_TIME *Time[3];\r
+ EFI_TIME *NewTime[ARRAY_SIZE (Time)];\r
+ UINTN Idx;\r
+ STATIC CONST EFI_TIME ZeroTime = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\r
+ BOOLEAN Change[ARRAY_SIZE (Time)];\r
+ UINT64 Seconds[ARRAY_SIZE (Time)];\r
\r
Time[0] = &Info->CreateTime;\r
Time[1] = &Info->LastAccessTime;\r
// changed, calculate the seconds since the Epoch.\r
//\r
for (Idx = 0; Idx < ARRAY_SIZE (Time); Idx++) {\r
- if (CompareMem (NewTime[Idx], &ZeroTime, sizeof (EFI_TIME)) == 0 ||\r
- CompareMem (NewTime[Idx], Time[Idx], sizeof (EFI_TIME)) == 0) {\r
+ if ((CompareMem (NewTime[Idx], &ZeroTime, sizeof (EFI_TIME)) == 0) ||\r
+ (CompareMem (NewTime[Idx], Time[Idx], sizeof (EFI_TIME)) == 0))\r
+ {\r
Change[Idx] = FALSE;\r
} else {\r
if (!IsTimeValid (NewTime[Idx])) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- Change[Idx] = TRUE;\r
+\r
+ Change[Idx] = TRUE;\r
Seconds[Idx] = EfiTimeToEpoch (NewTime[Idx]);\r
}\r
}\r
// last modification time. If changes are requested for both, but to\r
// different timestamps, we reject the request.\r
//\r
- if (Change[0] && Change[2] && Seconds[0] != Seconds[2]) {\r
+ if (Change[0] && Change[2] && (Seconds[0] != Seconds[2])) {\r
return EFI_ACCESS_DENIED;\r
}\r
\r
\r
if (Change[0]) {\r
*UpdateMtime = TRUE;\r
- *Mtime = Seconds[0];\r
+ *Mtime = Seconds[0];\r
}\r
+\r
if (Change[1]) {\r
*UpdateAtime = TRUE;\r
- *Atime = Seconds[1];\r
+ *Atime = Seconds[1];\r
}\r
+\r
if (Change[2]) {\r
*UpdateMtime = TRUE;\r
- *Mtime = Seconds[2];\r
+ *Mtime = Seconds[2];\r
}\r
\r
return EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
VirtioFsGetFuseModeUpdate (\r
- IN EFI_FILE_INFO *Info,\r
- IN EFI_FILE_INFO *NewInfo,\r
- OUT BOOLEAN *Update,\r
- OUT UINT32 *Mode\r
- )\r
+ IN EFI_FILE_INFO *Info,\r
+ IN EFI_FILE_INFO *NewInfo,\r
+ OUT BOOLEAN *Update,\r
+ OUT UINT32 *Mode\r
+ )\r
{\r
- UINT64 Toggle;\r
- BOOLEAN IsDirectory;\r
- BOOLEAN IsWriteable;\r
- BOOLEAN WillBeWriteable;\r
+ UINT64 Toggle;\r
+ BOOLEAN IsDirectory;\r
+ BOOLEAN IsWriteable;\r
+ BOOLEAN WillBeWriteable;\r
\r
Toggle = Info->Attribute ^ NewInfo->Attribute;\r
if ((Toggle & ~EFI_FILE_VALID_ATTR) != 0) {\r
//\r
return EFI_ACCESS_DENIED;\r
}\r
+\r
if ((Toggle & EFI_FILE_DIRECTORY) != 0) {\r
//\r
// EFI_FILE_DIRECTORY cannot be toggled.\r
VIRTIO_FS_FUSE_MODE_PERM_ROTH);\r
}\r
}\r
+\r
*Update = TRUE;\r
return EFI_SUCCESS;\r
}\r