182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin/** @file 282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 4d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel Copyright (c) 2013 - 2014, ARM Ltd. All rights reserved.<BR> 5d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel 682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin This program and the accompanying materials 782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin are licensed and made available under the terms and conditions of the BSD License 882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin which accompanies this distribution. The full text of the license may be found at 982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin http://opensource.org/licenses/bsd-license.php 1082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 1182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 1482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin**/ 1582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin#include <Base.h> 1682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 1782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin#include <Library/BaseLib.h> 1882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin#include <Library/SemihostLib.h> 1982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 2082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin#include "SemihostPrivate.h" 2182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 2282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinBOOLEAN 2382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostConnectionSupported ( 2482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin VOID 2582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 2682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 2782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return SEMIHOST_SUPPORTED; 2882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 2982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 3082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 3182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileOpen ( 3282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN CHAR8 *FileName, 3382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN UINT32 Mode, 34c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin OUT UINTN *FileHandle 3582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 3682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 3782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_FILE_OPEN_BLOCK OpenBlock; 3882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin INT32 Result; 3982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 4082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (FileHandle == NULL) { 4182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_INVALID_PARAMETER; 4282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 4382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 448fa3caf2bc544591e8e1eae984dad24872a45efeoliviermartin // Remove any leading separator (e.g.: '\'). EFI Shell adds one. 458fa3caf2bc544591e8e1eae984dad24872a45efeoliviermartin if (*FileName == '\\') { 468fa3caf2bc544591e8e1eae984dad24872a45efeoliviermartin FileName++; 478fa3caf2bc544591e8e1eae984dad24872a45efeoliviermartin } 488fa3caf2bc544591e8e1eae984dad24872a45efeoliviermartin 4982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin OpenBlock.FileName = FileName; 5082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin OpenBlock.Mode = Mode; 5182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin OpenBlock.NameLength = AsciiStrLen(FileName); 5282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 5382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Result = Semihost_SYS_OPEN(&OpenBlock); 5482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 5582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (Result == -1) { 5682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_NOT_FOUND; 5782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } else { 5882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin *FileHandle = Result; 5982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_SUCCESS; 6082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 6182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 6282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 6382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 6482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileSeek ( 65c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN FileHandle, 66c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN Offset 6782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 6882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 6982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_FILE_SEEK_BLOCK SeekBlock; 7082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin INT32 Result; 7182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 7282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SeekBlock.Handle = FileHandle; 7382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SeekBlock.Location = Offset; 7482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 7582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Result = Semihost_SYS_SEEK(&SeekBlock); 7682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 77d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel // Semihosting does not behave as documented. It returns the offset on 78d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel // success. 79d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel if (Result < 0) { 8082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_ABORTED; 81d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel } else { 82d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel return RETURN_SUCCESS; 8382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 8482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 8582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 8682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 8782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileRead ( 88c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN FileHandle, 89c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN OUT UINTN *Length, 9082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin OUT VOID *Buffer 9182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 9282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 9382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock; 9482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin UINT32 Result; 9582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 9682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if ((Length == NULL) || (Buffer == NULL)) { 9782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_INVALID_PARAMETER; 9882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 9982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 10082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ReadBlock.Handle = FileHandle; 10182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ReadBlock.Buffer = Buffer; 10282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ReadBlock.Length = *Length; 10382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 10482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Result = Semihost_SYS_READ(&ReadBlock); 10582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 106d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel if ((*Length != 0) && (Result == *Length)) { 10782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_ABORTED; 10882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } else { 10982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin *Length -= Result; 11082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_SUCCESS; 11182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 11282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 11382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 11482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 11582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileWrite ( 116c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN FileHandle, 117c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN OUT UINTN *Length, 11882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN VOID *Buffer 11982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 12082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 12182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock; 12282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 12382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if ((Length == NULL) || (Buffer == NULL)) { 12482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_INVALID_PARAMETER; 12582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 12682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 12782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin WriteBlock.Handle = FileHandle; 12882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin WriteBlock.Buffer = Buffer; 12982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin WriteBlock.Length = *Length; 13082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 13182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin *Length = Semihost_SYS_WRITE(&WriteBlock); 132d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel 133d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel if (*Length != 0) 134d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel return RETURN_ABORTED; 135d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel else 136d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel return RETURN_SUCCESS; 13782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 13882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 13982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 14082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileClose ( 141c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN FileHandle 14282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 14382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 14482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin INT32 Result = Semihost_SYS_CLOSE(&FileHandle); 14582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 14682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (Result == -1) { 14782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_INVALID_PARAMETER; 14882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } else { 14982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_SUCCESS; 15082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 15182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 15282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 15382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 15482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileLength ( 155c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin IN UINTN FileHandle, 156c63626b7d31cb8c6ffee5870de742f4aa859fee8oliviermartin OUT UINTN *Length 15782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 15882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 15982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin INT32 Result; 16082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 16182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (Length == NULL) { 16282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_INVALID_PARAMETER; 16382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 16482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 16582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Result = Semihost_SYS_FLEN(&FileHandle); 16682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 16782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (Result == -1) { 16882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_ABORTED; 16982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } else { 17082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin *Length = Result; 17182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_SUCCESS; 17282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 17382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 17482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 1755521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron/** 1765521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron Get a temporary name for a file from the host running the debug agent. 1775521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 1785521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @param[out] Buffer Pointer to the buffer where the temporary name has to 1795521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron be stored 1805521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @param[in] Identifier File name identifier (integer in the range 0 to 255) 1815521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @param[in] Length Length of the buffer to store the temporary name 1825521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 1835521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_SUCCESS Temporary name returned 1845521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_INVALID_PARAMETER Invalid buffer address 1855521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_ABORTED Temporary name not returned 1865521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 1875521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron**/ 1885521b5cc73e21957023b634cb7f75e415bba0225Ronald CronRETURN_STATUS 1895521b5cc73e21957023b634cb7f75e415bba0225Ronald CronSemihostFileTmpName( 1905521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron OUT VOID *Buffer, 1915521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron IN UINT8 Identifier, 1925521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron IN UINTN Length 1935521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron ) 1945521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron{ 1955521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron SEMIHOST_FILE_TMPNAME_BLOCK TmpNameBlock; 1965521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron INT32 Result; 1975521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 1985521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron if (Buffer == NULL) { 1995521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_INVALID_PARAMETER; 2005521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } 2015521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2025521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron TmpNameBlock.Buffer = Buffer; 2035521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron TmpNameBlock.Identifier = Identifier; 2045521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron TmpNameBlock.Length = Length; 2055521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2065521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron Result = Semihost_SYS_TMPNAME (&TmpNameBlock); 2075521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2085521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron if (Result != 0) { 2095521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_ABORTED; 2105521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } else { 2115521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_SUCCESS; 2125521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } 2135521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron} 2145521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 21582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinRETURN_STATUS 21682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostFileRemove ( 21782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN CHAR8 *FileName 21882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 21982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 22082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_FILE_REMOVE_BLOCK RemoveBlock; 22182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin UINT32 Result; 22282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 223d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel // Remove any leading separator (e.g.: '\'). EFI Shell adds one. 224d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel if (*FileName == '\\') { 225d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel FileName++; 226d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel } 227d276ac10f184aea06b5b484c8eeef88c5d6df881Harry Liebel 22882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin RemoveBlock.FileName = FileName; 22982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin RemoveBlock.NameLength = AsciiStrLen(FileName); 23082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 23182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Result = Semihost_SYS_REMOVE(&RemoveBlock); 23282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 23382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin if (Result == 0) { 23482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_SUCCESS; 23582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } else { 23682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return RETURN_ABORTED; 23782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin } 23882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 23982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 2405521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron/** 2415521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron Rename a specified file. 2425521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2435521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @param[in] FileName Name of the file to rename. 2445521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @param[in] NewFileName The new name of the file. 2455521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2465521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_SUCCESS File Renamed 2475521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_INVALID_PARAMETER Either the current or the new name is not specified 2485521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron @retval RETURN_ABORTED Rename failed 2495521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2505521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron**/ 2515521b5cc73e21957023b634cb7f75e415bba0225Ronald CronRETURN_STATUS 2525521b5cc73e21957023b634cb7f75e415bba0225Ronald CronSemihostFileRename( 2535521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron IN CHAR8 *FileName, 2545521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron IN CHAR8 *NewFileName 2555521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron ) 2565521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron{ 2575521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron SEMIHOST_FILE_RENAME_BLOCK RenameBlock; 2585521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron INT32 Result; 2595521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2605521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron if ((FileName == NULL) || (NewFileName == NULL)) { 2615521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_INVALID_PARAMETER; 2625521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } 2635521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2645521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron RenameBlock.FileName = FileName; 2655521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron RenameBlock.FileNameLength = AsciiStrLen (FileName); 2665521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron RenameBlock.NewFileName = NewFileName; 2675521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron RenameBlock.NewFileNameLength = AsciiStrLen (NewFileName); 2685521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2695521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron Result = Semihost_SYS_RENAME (&RenameBlock); 2705521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 2715521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron if (Result != 0) { 2725521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_ABORTED; 2735521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } else { 2745521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron return RETURN_SUCCESS; 2755521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron } 2765521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron} 2775521b5cc73e21957023b634cb7f75e415bba0225Ronald Cron 27882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinCHAR8 27982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostReadCharacter ( 28082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin VOID 28182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 28282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 28382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return Semihost_SYS_READC(); 28482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 28582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 28682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinVOID 28782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostWriteCharacter ( 28882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN CHAR8 Character 28982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 29082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 29182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Semihost_SYS_WRITEC(&Character); 29282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 29382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 29482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinVOID 29582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostWriteString ( 29682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN CHAR8 *String 29782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 29882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 29982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin Semihost_SYS_WRITE0(String); 30082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 3013402aac7d985bf8a9f9d3c639f3fe93609380513Ronald Cron 30282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinUINT32 30382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartinSemihostSystem ( 30482325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin IN CHAR8 *CommandLine 30582325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin ) 30682325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin{ 30782325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SEMIHOST_SYSTEM_BLOCK SystemBlock; 30882325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 30982325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SystemBlock.CommandLine = CommandLine; 31082325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin SystemBlock.CommandLength = AsciiStrLen(CommandLine); 31182325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin 31282325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin return Semihost_SYS_SYSTEM(&SystemBlock); 31382325f95c55c67b56f8badcd4f60101e5fc19683oliviermartin} 314