\r
#include "SemihostFs.h"\r
\r
-#define DEFAULT_SEMIHOST_FS_LABEL L"SemihostFs"\r
+#define DEFAULT_SEMIHOST_FS_LABEL L"SemihostFs"\r
\r
-STATIC CHAR16 *mSemihostFsLabel;\r
+STATIC CHAR16 *mSemihostFsLabel;\r
\r
-EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gSemihostFs = {\r
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gSemihostFs = {\r
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,\r
VolumeOpen\r
};\r
\r
-EFI_FILE gSemihostFsFile = {\r
+EFI_FILE gSemihostFsFile = {\r
EFI_FILE_PROTOCOL_REVISION,\r
FileOpen,\r
FileClose,\r
// Device path for semi-hosting. It contains our auto-generated Caller ID GUID.\r
//\r
typedef struct {\r
- VENDOR_DEVICE_PATH Guid;\r
- EFI_DEVICE_PATH_PROTOCOL End;\r
+ VENDOR_DEVICE_PATH Guid;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
} SEMIHOST_DEVICE_PATH;\r
\r
-SEMIHOST_DEVICE_PATH gDevicePath = {\r
+SEMIHOST_DEVICE_PATH gDevicePath = {\r
{\r
- { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } },\r
+ { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 }\r
+ },\r
EFI_CALLER_ID_GUID\r
},\r
- { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } }\r
+ { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }\r
+ }\r
};\r
\r
typedef struct {\r
- LIST_ENTRY Link;\r
- UINT64 Signature;\r
- EFI_FILE File;\r
- CHAR8 *FileName;\r
- UINT64 OpenMode;\r
- UINT32 Position;\r
- UINTN SemihostHandle;\r
- BOOLEAN IsRoot;\r
- EFI_FILE_INFO Info;\r
+ LIST_ENTRY Link;\r
+ UINT64 Signature;\r
+ EFI_FILE File;\r
+ CHAR8 *FileName;\r
+ UINT64 OpenMode;\r
+ UINT32 Position;\r
+ UINTN SemihostHandle;\r
+ BOOLEAN IsRoot;\r
+ EFI_FILE_INFO Info;\r
} SEMIHOST_FCB;\r
\r
-#define SEMIHOST_FCB_SIGNATURE SIGNATURE_32( 'S', 'H', 'F', 'C' )\r
-#define SEMIHOST_FCB_FROM_THIS(a) CR(a, SEMIHOST_FCB, File, SEMIHOST_FCB_SIGNATURE)\r
-#define SEMIHOST_FCB_FROM_LINK(a) CR(a, SEMIHOST_FCB, Link, SEMIHOST_FCB_SIGNATURE);\r
+#define SEMIHOST_FCB_SIGNATURE SIGNATURE_32( 'S', 'H', 'F', 'C' )\r
+#define SEMIHOST_FCB_FROM_THIS(a) CR(a, SEMIHOST_FCB, File, SEMIHOST_FCB_SIGNATURE)\r
+#define SEMIHOST_FCB_FROM_LINK(a) CR(a, SEMIHOST_FCB, Link, SEMIHOST_FCB_SIGNATURE);\r
\r
EFI_HANDLE gInstallHandle = NULL;\r
-LIST_ENTRY gFileList = INITIALIZE_LIST_HEAD_VARIABLE (gFileList);\r
+LIST_ENTRY gFileList = INITIALIZE_LIST_HEAD_VARIABLE (gFileList);\r
\r
SEMIHOST_FCB *\r
AllocateFCB (\r
VOID\r
)\r
{\r
- SEMIHOST_FCB *Fcb;\r
+ SEMIHOST_FCB *Fcb;\r
\r
Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB));\r
if (Fcb != NULL) {\r
\r
VOID\r
FreeFCB (\r
- IN SEMIHOST_FCB *Fcb\r
+ IN SEMIHOST_FCB *Fcb\r
)\r
{\r
// Remove Fcb from gFileList.\r
FreePool (Fcb);\r
}\r
\r
-\r
-\r
EFI_STATUS\r
VolumeOpen (\r
- IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
- OUT EFI_FILE **Root\r
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,\r
+ OUT EFI_FILE **Root\r
)\r
{\r
- SEMIHOST_FCB *RootFcb;\r
+ SEMIHOST_FCB *RootFcb;\r
\r
if (Root == NULL) {\r
return EFI_INVALID_PARAMETER;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- RootFcb->IsRoot = TRUE;\r
+ RootFcb->IsRoot = TRUE;\r
RootFcb->Info.Attribute = EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY;\r
\r
InsertTailList (&gFileList, &RootFcb->Link);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if ( (OpenMode != EFI_FILE_MODE_READ) &&\r
- (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&\r
- (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) {\r
+ if ((OpenMode != EFI_FILE_MODE_READ) &&\r
+ (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&\r
+ (OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&\r
- ((Attributes & EFI_FILE_DIRECTORY) != 0)) {\r
+ ((Attributes & EFI_FILE_DIRECTORY) != 0))\r
+ {\r
return EFI_WRITE_PROTECTED;\r
}\r
\r
- Length = StrLen (FileName) + 1;\r
+ Length = StrLen (FileName) + 1;\r
AsciiFileName = AllocatePool (Length);\r
if (AsciiFileName == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);\r
\r
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory\r
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||\r
(AsciiStrCmp (AsciiFileName, "/") == 0) ||\r
(AsciiStrCmp (AsciiFileName, "") == 0) ||\r
- (AsciiStrCmp (AsciiFileName, ".") == 0) ) {\r
+ (AsciiStrCmp (AsciiFileName, ".") == 0))\r
+ {\r
FreePool (AsciiFileName);\r
return (VolumeOpen (&gSemihostFs, NewHandle));\r
}\r
} else {\r
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;\r
}\r
+\r
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);\r
\r
if (RETURN_ERROR (Return)) {\r
FileFcb->Info.FileSize = Length;\r
FileFcb->Info.PhysicalSize = Length;\r
FileFcb->Info.Attribute = ((OpenMode & EFI_FILE_MODE_CREATE) != 0) ?\r
- Attributes : 0;\r
+ Attributes : 0;\r
\r
InsertTailList (&gFileList, &FileFcb->Link);\r
\r
EFI_STATUS\r
TruncateFile (\r
IN CHAR8 *FileName,\r
- IN UINTN Size\r
+ IN UINTN Size\r
)\r
{\r
EFI_STATUS Status;\r
goto Error;\r
}\r
\r
- Read = 0;\r
+ Read = 0;\r
Remaining = Size;\r
while (Remaining > 0) {\r
ToRead = Remaining;\r
if (RETURN_ERROR (Return)) {\r
goto Error;\r
}\r
+\r
Remaining -= ToRead;\r
Read += ToRead;\r
}\r
\r
- Return = SemihostFileClose (FileHandle);\r
+ Return = SemihostFileClose (FileHandle);\r
FileHandle = 0;\r
if (RETURN_ERROR (Return)) {\r
goto Error;\r
if (FileHandle != 0) {\r
SemihostFileClose (FileHandle);\r
}\r
+\r
if (Buffer != NULL) {\r
FreePool (Buffer);\r
}\r
\r
return (Status);\r
-\r
}\r
\r
/**\r
IN EFI_FILE *This\r
)\r
{\r
- SEMIHOST_FCB *Fcb;\r
+ SEMIHOST_FCB *Fcb;\r
\r
if (This == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Fcb = SEMIHOST_FCB_FROM_THIS(This);\r
+ Fcb = SEMIHOST_FCB_FROM_THIS (This);\r
\r
if (!Fcb->IsRoot) {\r
SemihostFileClose (Fcb->SemihostHandle);\r
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {\r
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);\r
}\r
+\r
FreePool (Fcb->FileName);\r
}\r
\r
**/\r
EFI_STATUS\r
FileDelete (\r
- IN EFI_FILE *This\r
+ IN EFI_FILE *This\r
)\r
{\r
SEMIHOST_FCB *Fcb;\r
if (RETURN_ERROR (Return)) {\r
return EFI_WARN_DELETE_FAILURE;\r
}\r
+\r
return EFI_SUCCESS;\r
} else {\r
return EFI_WARN_DELETE_FAILURE;\r
}\r
\r
Remaining = Size;\r
- SetMem (WriteBuffer, 0, sizeof(WriteBuffer));\r
+ SetMem (WriteBuffer, 0, sizeof (WriteBuffer));\r
while (Remaining > 0) {\r
- WriteNb = MIN (Remaining, sizeof(WriteBuffer));\r
+ WriteNb = MIN (Remaining, sizeof (WriteBuffer));\r
WriteSize = WriteNb;\r
- Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);\r
+ Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);\r
if (RETURN_ERROR (Return)) {\r
return EFI_DEVICE_ERROR;\r
}\r
+\r
Remaining -= WriteNb;\r
}\r
\r
**/\r
EFI_STATUS\r
FileWrite (\r
- IN EFI_FILE *This,\r
- IN OUT UINTN *BufferSize,\r
- IN VOID *Buffer\r
+ IN EFI_FILE *This,\r
+ IN OUT UINTN *BufferSize,\r
+ IN VOID *Buffer\r
)\r
{\r
SEMIHOST_FCB *Fcb;\r
Fcb = SEMIHOST_FCB_FROM_THIS (This);\r
\r
// We cannot write a read-only file\r
- if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)\r
- || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {\r
+ if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)\r
+ || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))\r
+ {\r
return EFI_ACCESS_DENIED;\r
}\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
Fcb->Info.FileSize = Fcb->Position;\r
}\r
\r
WriteSize = *BufferSize;\r
- Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, Buffer);\r
+ Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, Buffer);\r
if (RETURN_ERROR (Return)) {\r
return EFI_DEVICE_ERROR;\r
}\r
if (RETURN_ERROR (Return)) {\r
return EFI_DEVICE_ERROR;\r
}\r
+\r
Fcb->Info.PhysicalSize = Length;\r
\r
return EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
FileGetPosition (\r
- IN EFI_FILE *This,\r
- OUT UINT64 *Position\r
+ IN EFI_FILE *This,\r
+ OUT UINT64 *Position\r
)\r
{\r
- SEMIHOST_FCB *Fcb;\r
+ SEMIHOST_FCB *Fcb;\r
\r
if ((This == NULL) || (Position == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Fcb = SEMIHOST_FCB_FROM_THIS(This);\r
+ Fcb = SEMIHOST_FCB_FROM_THIS (This);\r
\r
*Position = Fcb->Position;\r
\r
**/\r
EFI_STATUS\r
FileSetPosition (\r
- IN EFI_FILE *This,\r
- IN UINT64 Position\r
+ IN EFI_FILE *This,\r
+ IN UINT64 Position\r
)\r
{\r
SEMIHOST_FCB *Fcb;\r
if (Position != 0) {\r
return EFI_UNSUPPORTED;\r
}\r
- }\r
- else {\r
+ } else {\r
//\r
// UEFI Spec section 12.5:\r
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to\r
if (Position == 0xFFFFFFFFFFFFFFFF) {\r
Position = Fcb->Info.FileSize;\r
}\r
+\r
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));\r
if (RETURN_ERROR (Return)) {\r
return EFI_DEVICE_ERROR;\r
OUT VOID *Buffer\r
)\r
{\r
- EFI_FILE_INFO *Info;\r
- UINTN NameSize;\r
- UINTN ResultSize;\r
- UINTN Index;\r
+ EFI_FILE_INFO *Info;\r
+ UINTN NameSize;\r
+ UINTN ResultSize;\r
+ UINTN Index;\r
\r
if (Fcb->IsRoot) {\r
- NameSize = 0;\r
- ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);\r
+ NameSize = 0;\r
+ ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof (CHAR16);\r
} else {\r
NameSize = AsciiStrLen (Fcb->FileName) + 1;\r
ResultSize = SIZE_OF_EFI_FILE_INFO + NameSize * sizeof (CHAR16);\r
Info->Size = ResultSize;\r
\r
if (Fcb->IsRoot) {\r
- Info->FileName[0] = L'\0';\r
+ Info->FileName[0] = L'\0';\r
} else {\r
for (Index = 0; Index < NameSize; Index++) {\r
Info->FileName[Index] = Fcb->FileName[Index];\r
STATIC\r
EFI_STATUS\r
GetFilesystemInfo (\r
- IN SEMIHOST_FCB *Fcb,\r
- IN OUT UINTN *BufferSize,\r
- OUT VOID *Buffer\r
+ IN SEMIHOST_FCB *Fcb,\r
+ IN OUT UINTN *BufferSize,\r
+ OUT VOID *Buffer\r
)\r
{\r
EFI_FILE_SYSTEM_INFO *Info;\r
OUT VOID *Buffer\r
)\r
{\r
- SEMIHOST_FCB *Fcb;\r
- EFI_STATUS Status;\r
- UINTN ResultSize;\r
+ SEMIHOST_FCB *Fcb;\r
+ EFI_STATUS Status;\r
+ UINTN ResultSize;\r
\r
if ((This == NULL) ||\r
(InformationType == NULL) ||\r
(BufferSize == NULL) ||\r
- ((Buffer == NULL) && (*BufferSize > 0)) ) {\r
+ ((Buffer == NULL) && (*BufferSize > 0)))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Fcb = SEMIHOST_FCB_FROM_THIS(This);\r
+ Fcb = SEMIHOST_FCB_FROM_THIS (This);\r
\r
if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
Status = GetFilesystemInfo (Fcb, BufferSize, Buffer);\r
return EFI_ACCESS_DENIED;\r
}\r
\r
- Length = StrLen (Info->FileName) + 1;\r
+ Length = StrLen (Info->FileName) + 1;\r
AsciiFileName = AllocatePool (Length);\r
if (AsciiFileName == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+\r
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);\r
\r
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);\r
// description.\r
//\r
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||\r
- (Fcb->Info.Attribute & EFI_FILE_READ_ONLY) ) {\r
+ (Fcb->Info.Attribute & EFI_FILE_READ_ONLY))\r
+ {\r
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {\r
Status = EFI_ACCESS_DENIED;\r
goto Error;\r
if (EFI_ERROR (Status)) {\r
goto Error;\r
}\r
+\r
//\r
// The read/write position from the host file system point of view\r
// is at the end of the file. If the position from this module\r
FileSetPosition (&Fcb->File, Fcb->Position);\r
}\r
}\r
+\r
Fcb->Info.FileSize = FileSize;\r
\r
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);\r
if (RETURN_ERROR (Return)) {\r
goto Error;\r
}\r
+\r
Fcb->Info.PhysicalSize = Length;\r
}\r
\r
if (RETURN_ERROR (Return)) {\r
goto Error;\r
}\r
+\r
FreePool (Fcb->FileName);\r
Fcb->FileName = AsciiFileName;\r
AsciiFileName = NULL;\r
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (BufferSize < Info->Size) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
+\r
return SetFileInfo (Fcb, Info);\r
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
SystemInfo = Buffer;\r
if (SystemInfo->Size <\r
- (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) {\r
+ (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel)))\r
+ {\r
return EFI_INVALID_PARAMETER;\r
}\r
+\r
if (BufferSize < SystemInfo->Size) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
+\r
Buffer = SystemInfo->VolumeLabel;\r
\r
if (StrSize (Buffer) > 0) {\r
\r
EFI_STATUS\r
FileFlush (\r
- IN EFI_FILE *File\r
+ IN EFI_FILE *File\r
)\r
{\r
- SEMIHOST_FCB *Fcb;\r
+ SEMIHOST_FCB *Fcb;\r
\r
- Fcb = SEMIHOST_FCB_FROM_THIS(File);\r
+ Fcb = SEMIHOST_FCB_FROM_THIS (File);\r
\r
if (Fcb->IsRoot) {\r
return EFI_SUCCESS;\r
} else {\r
- if ((Fcb->Info.Attribute & EFI_FILE_READ_ONLY)\r
- || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {\r
+ if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)\r
+ || !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))\r
+ {\r
return EFI_ACCESS_DENIED;\r
} else {\r
return EFI_SUCCESS;\r
\r
EFI_STATUS\r
SemihostFsEntryPoint (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
Status = EFI_NOT_FOUND;\r
\r
\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&gInstallHandle,\r
- &gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,\r
- &gEfiDevicePathProtocolGuid, &gDevicePath,\r
+ &gEfiSimpleFileSystemProtocolGuid,\r
+ &gSemihostFs,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &gDevicePath,\r
NULL\r
);\r
\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
FreePool (mSemihostFsLabel);\r
}\r
}\r