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