From 5521b5cc73e21957023b634cb7f75e415bba0225 Mon Sep 17 00:00:00 2001 From: Ronald Cron Date: Mon, 27 Oct 2014 10:38:18 +0000 Subject: [PATCH] ArmPkg/SemihostLib: Add library functions Add library functions to rename a file and get a temporary name for a file through the semi-hosting interface. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ronald Cron Reviewed-By: Olivier Martin git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16238 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPkg/Include/Library/SemihostLib.h | 37 ++++++++++ ArmPkg/Library/SemihostLib/SemihostLib.c | 78 ++++++++++++++++++++ ArmPkg/Library/SemihostLib/SemihostPrivate.h | 33 +++++++++ 3 files changed, 148 insertions(+) diff --git a/ArmPkg/Include/Library/SemihostLib.h b/ArmPkg/Include/Library/SemihostLib.h index 4e4f43d8bd..4a91593e31 100644 --- a/ArmPkg/Include/Library/SemihostLib.h +++ b/ArmPkg/Include/Library/SemihostLib.h @@ -73,11 +73,48 @@ SemihostFileLength ( OUT UINTN *Length ); +/** + Get a temporary name for a file from the host running the debug agent. + + @param[out] Buffer Pointer to the buffer where the temporary name has to + be stored + @param[in] Identifier File name identifier (integer in the range 0 to 255) + @param[in] Length Length of the buffer to store the temporary name + + @retval RETURN_SUCCESS Temporary name returned + @retval RETURN_INVALID_PARAMETER Invalid buffer address + @retval RETURN_ABORTED Temporary name not returned + +**/ +RETURN_STATUS +SemihostFileTmpName( + OUT VOID *Buffer, + IN UINT8 Identifier, + IN UINTN Length + ); + RETURN_STATUS SemihostFileRemove ( IN CHAR8 *FileName ); +/** + Rename a specified file. + + @param[in] FileName Name of the file to rename. + @param[in] NewFileName The new name of the file. + + @retval RETURN_SUCCESS File Renamed + @retval RETURN_INVALID_PARAMETER Either the current or the new name is not specified + @retval RETURN_ABORTED Rename failed + +**/ +RETURN_STATUS +SemihostFileRename( + IN CHAR8 *FileName, + IN CHAR8 *NewFileName + ); + CHAR8 SemihostReadCharacter ( VOID diff --git a/ArmPkg/Library/SemihostLib/SemihostLib.c b/ArmPkg/Library/SemihostLib/SemihostLib.c index f93d7991d2..b1bbcbb392 100644 --- a/ArmPkg/Library/SemihostLib/SemihostLib.c +++ b/ArmPkg/Library/SemihostLib/SemihostLib.c @@ -172,6 +172,46 @@ SemihostFileLength ( } } +/** + Get a temporary name for a file from the host running the debug agent. + + @param[out] Buffer Pointer to the buffer where the temporary name has to + be stored + @param[in] Identifier File name identifier (integer in the range 0 to 255) + @param[in] Length Length of the buffer to store the temporary name + + @retval RETURN_SUCCESS Temporary name returned + @retval RETURN_INVALID_PARAMETER Invalid buffer address + @retval RETURN_ABORTED Temporary name not returned + +**/ +RETURN_STATUS +SemihostFileTmpName( + OUT VOID *Buffer, + IN UINT8 Identifier, + IN UINTN Length + ) +{ + SEMIHOST_FILE_TMPNAME_BLOCK TmpNameBlock; + INT32 Result; + + if (Buffer == NULL) { + return RETURN_INVALID_PARAMETER; + } + + TmpNameBlock.Buffer = Buffer; + TmpNameBlock.Identifier = Identifier; + TmpNameBlock.Length = Length; + + Result = Semihost_SYS_TMPNAME (&TmpNameBlock); + + if (Result != 0) { + return RETURN_ABORTED; + } else { + return RETURN_SUCCESS; + } +} + RETURN_STATUS SemihostFileRemove ( IN CHAR8 *FileName @@ -197,6 +237,44 @@ SemihostFileRemove ( } } +/** + Rename a specified file. + + @param[in] FileName Name of the file to rename. + @param[in] NewFileName The new name of the file. + + @retval RETURN_SUCCESS File Renamed + @retval RETURN_INVALID_PARAMETER Either the current or the new name is not specified + @retval RETURN_ABORTED Rename failed + +**/ +RETURN_STATUS +SemihostFileRename( + IN CHAR8 *FileName, + IN CHAR8 *NewFileName + ) +{ + SEMIHOST_FILE_RENAME_BLOCK RenameBlock; + INT32 Result; + + if ((FileName == NULL) || (NewFileName == NULL)) { + return RETURN_INVALID_PARAMETER; + } + + RenameBlock.FileName = FileName; + RenameBlock.FileNameLength = AsciiStrLen (FileName); + RenameBlock.NewFileName = NewFileName; + RenameBlock.NewFileNameLength = AsciiStrLen (NewFileName); + + Result = Semihost_SYS_RENAME (&RenameBlock); + + if (Result != 0) { + return RETURN_ABORTED; + } else { + return RETURN_SUCCESS; + } +} + CHAR8 SemihostReadCharacter ( VOID diff --git a/ArmPkg/Library/SemihostLib/SemihostPrivate.h b/ArmPkg/Library/SemihostLib/SemihostPrivate.h index bb0a026d4e..afc53274b0 100644 --- a/ArmPkg/Library/SemihostLib/SemihostPrivate.h +++ b/ArmPkg/Library/SemihostLib/SemihostPrivate.h @@ -33,11 +33,24 @@ typedef struct { UINTN Location; } SEMIHOST_FILE_SEEK_BLOCK; +typedef struct { + VOID *Buffer; + UINTN Identifier; + UINTN Length; +} SEMIHOST_FILE_TMPNAME_BLOCK; + typedef struct { CHAR8 *FileName; UINTN NameLength; } SEMIHOST_FILE_REMOVE_BLOCK; +typedef struct { + CHAR8 *FileName; + UINTN FileNameLength; + CHAR8 *NewFileName; + UINTN NewFileNameLength; +} SEMIHOST_FILE_RENAME_BLOCK; + typedef struct { CHAR8 *CommandLine; UINTN CommandLength; @@ -116,6 +129,13 @@ _Semihost_SYS_FLEN( IN UINT32 *Handle ); +__swi(SWI) +UINT32 +_Semihost_SYS_TMPNAME( + IN UINTN SWI_0x0D, + IN SEMIHOST_FILE_TMPNAME_BLOCK *TmpNameBlock + ); + __swi(SWI) UINT32 _Semihost_SYS_REMOVE( @@ -123,6 +143,13 @@ _Semihost_SYS_REMOVE( IN SEMIHOST_FILE_REMOVE_BLOCK *RemoveBlock ); +__swi(SWI) +UINT32 +_Semihost_SYS_RENAME( + IN UINTN SWI_0x0F, + IN SEMIHOST_FILE_RENAME_BLOCK *RenameBlock + ); + __swi(SWI) UINT32 _Semihost_SYS_SYSTEM( @@ -139,7 +166,9 @@ _Semihost_SYS_SYSTEM( #define Semihost_SYS_READC() _Semihost_SYS_READC(0x07, 0) #define Semihost_SYS_SEEK(SeekBlock) _Semihost_SYS_SEEK(0x0A, SeekBlock) #define Semihost_SYS_FLEN(Handle) _Semihost_SYS_FLEN(0x0C, Handle) +#define Semihost_SYS_TMPNAME(TmpNameBlock) _Semihost_SYS_TMPNAME(0x0D, TmpNameBlock) #define Semihost_SYS_REMOVE(RemoveBlock) _Semihost_SYS_REMOVE(0x0E, RemoveBlock) +#define Semihost_SYS_RENAME(RenameBlock) _Semihost_SYS_RENAME(0x0F, RenameBlock) #define Semihost_SYS_SYSTEM(SystemBlock) _Semihost_SYS_SYSTEM(0x12, SystemBlock) #elif defined(__GNUC__) // __CC_ARM @@ -161,7 +190,9 @@ GccSemihostCall ( #define Semihost_SYS_READC() GccSemihostCall(0x07, (UINTN)(0)) #define Semihost_SYS_SEEK(SeekBlock) GccSemihostCall(0x0A, (UINTN)(SeekBlock)) #define Semihost_SYS_FLEN(Handle) GccSemihostCall(0x0C, (UINTN)(Handle)) +#define Semihost_SYS_TMPNAME(TmpNameBlock) GccSemihostCall(0x0D, (UINTN)(TmpNameBlock)) #define Semihost_SYS_REMOVE(RemoveBlock) GccSemihostCall(0x0E, (UINTN)(RemoveBlock)) +#define Semihost_SYS_RENAME(RenameBlock) GccSemihostCall(0x0F, (UINTN)(RenameBlock)) #define Semihost_SYS_SYSTEM(SystemBlock) GccSemihostCall(0x12, (UINTN)(SystemBlock)) #else // __CC_ARM @@ -177,7 +208,9 @@ GccSemihostCall ( #define Semihost_SYS_READC() ('x') #define Semihost_SYS_SEEK(SeekBlock) (-1) #define Semihost_SYS_FLEN(Handle) (-1) +#define Semihost_SYS_TMPNAME(TmpNameBlock) (-1) #define Semihost_SYS_REMOVE(RemoveBlock) (-1) +#define Semihost_SYS_RENAME(RenameBlock) (-1) #define Semihost_SYS_SYSTEM(SystemBlock) (-1) #endif // __CC_ARM -- 2.39.5