/** @file Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
Copyright (c) 2013 - 2021, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __SEMIHOST_PRIVATE_H__ #define __SEMIHOST_PRIVATE_H__ typedef struct { CHAR8 *FileName; UINTN Mode; UINTN NameLength; } SEMIHOST_FILE_OPEN_BLOCK; typedef struct { UINTN Handle; VOID *Buffer; UINTN Length; } SEMIHOST_FILE_READ_WRITE_BLOCK; typedef struct { UINTN Handle; 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; } SEMIHOST_SYSTEM_BLOCK; #if defined(__CC_ARM) #if defined(__thumb__) #define SWI 0xAB #else #define SWI 0x123456 #endif #define SEMIHOST_SUPPORTED TRUE __swi(SWI) INT32 _Semihost_SYS_OPEN( IN UINTN SWI_0x01, IN SEMIHOST_FILE_OPEN_BLOCK *OpenBlock ); __swi(SWI) INT32 _Semihost_SYS_CLOSE( IN UINTN SWI_0x02, IN UINT32 *Handle ); __swi(SWI) VOID _Semihost_SYS_WRITEC( IN UINTN SWI_0x03, IN CHAR8 *Character ); __swi(SWI) VOID _Semihost_SYS_WRITE0( IN UINTN SWI_0x04, IN CHAR8 *String ); __swi(SWI) UINT32 _Semihost_SYS_WRITE( IN UINTN SWI_0x05, IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *WriteBlock ); __swi(SWI) UINT32 _Semihost_SYS_READ( IN UINTN SWI_0x06, IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *ReadBlock ); __swi(SWI) CHAR8 _Semihost_SYS_READC( IN UINTN SWI_0x07, IN UINTN Zero ); __swi(SWI) INT32 _Semihost_SYS_SEEK( IN UINTN SWI_0x0A, IN SEMIHOST_FILE_SEEK_BLOCK *SeekBlock ); __swi(SWI) INT32 _Semihost_SYS_FLEN( IN UINTN SWI_0x0C, 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( IN UINTN SWI_0x0E, 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( IN UINTN SWI_0x12, IN SEMIHOST_SYSTEM_BLOCK *SystemBlock ); #define SEMIHOST_SYS_OPEN(OpenBlock) _Semihost_SYS_OPEN(0x01, OpenBlock) #define SEMIHOST_SYS_CLOSE(Handle) _Semihost_SYS_CLOSE(0x02, Handle) #define SEMIHOST_SYS_WRITE0(String) _Semihost_SYS_WRITE0(0x04, String) #define SEMIHOST_SYS_WRITEC(Character) _Semihost_SYS_WRITEC(0x03, Character) #define SEMIHOST_SYS_WRITE(WriteBlock) _Semihost_SYS_WRITE(0x05, WriteBlock) #define SEMIHOST_SYS_READ(ReadBlock) _Semihost_SYS_READ(0x06, ReadBlock) #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 #define SEMIHOST_SUPPORTED TRUE UINT32 GccSemihostCall ( IN UINT32 Operation, IN UINTN SystemBlockAddress ); // __attribute__ ((interrupt ("SVC"))); #define SEMIHOST_SYS_OPEN(OpenBlock) GccSemihostCall(0x01, (UINTN)(OpenBlock)) #define SEMIHOST_SYS_CLOSE(Handle) GccSemihostCall(0x02, (UINTN)(Handle)) #define SEMIHOST_SYS_WRITE0(String) GccSemihostCall(0x04, (UINTN)(String)) #define SEMIHOST_SYS_WRITEC(Character) GccSemihostCall(0x03, (UINTN)(Character)) #define SEMIHOST_SYS_WRITE(WriteBlock) GccSemihostCall(0x05, (UINTN)(WriteBlock)) #define SEMIHOST_SYS_READ(ReadBlock) GccSemihostCall(0x06, (UINTN)(ReadBlock)) #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 #define SEMIHOST_SUPPORTED FALSE #define SEMIHOST_SYS_OPEN(OpenBlock) (-1) #define SEMIHOST_SYS_CLOSE(Handle) (-1) #define SEMIHOST_SYS_WRITE0(String) #define SEMIHOST_SYS_WRITEC(Character) #define SEMIHOST_SYS_WRITE(WriteBlock) (0) #define SEMIHOST_SYS_READ(ReadBlock) ((ReadBlock)->Length) #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 #endif //__SEMIHOST_PRIVATE_H__