/** @file

  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
  Portions copyright (c) 2011, 2012, ARM Ltd. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef SEMIHOSTING_LIB_H_
#define SEMIHOSTING_LIB_H_

/*
 *
 *  Please refer to ARM RVDS 3.0 Compiler and Libraries Guide for more information
 *  about the semihosting interface.
 *
 */

#define SEMIHOST_FILE_MODE_READ    (0 << 2)
#define SEMIHOST_FILE_MODE_WRITE   (1 << 2)
#define SEMIHOST_FILE_MODE_APPEND  (2 << 2)
#define SEMIHOST_FILE_MODE_UPDATE  (1 << 1)
#define SEMIHOST_FILE_MODE_BINARY  (1 << 0)
#define SEMIHOST_FILE_MODE_ASCII   (0 << 0)

BOOLEAN
SemihostConnectionSupported (
  VOID
  );

RETURN_STATUS
SemihostFileOpen (
  IN  CHAR8   *FileName,
  IN  UINT32  Mode,
  OUT UINTN   *FileHandle
  );

RETURN_STATUS
SemihostFileSeek (
  IN UINTN  FileHandle,
  IN UINTN  Offset
  );

RETURN_STATUS
SemihostFileRead (
  IN     UINTN  FileHandle,
  IN OUT UINTN  *Length,
  OUT    VOID   *Buffer
  );

RETURN_STATUS
SemihostFileWrite (
  IN     UINTN  FileHandle,
  IN OUT UINTN  *Length,
  IN     VOID   *Buffer
  );

RETURN_STATUS
SemihostFileClose (
  IN UINTN  FileHandle
  );

RETURN_STATUS
SemihostFileLength (
  IN  UINTN  FileHandle,
  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
  );

VOID
SemihostWriteCharacter (
  IN CHAR8  Character
  );

VOID
SemihostWriteString (
  IN CHAR8  *String
  );

UINT32
SemihostSystem (
  IN CHAR8  *CommandLine
  );

#endif // SEMIHOSTING_LIB_H_