2013-01-25 12:28:06 +01:00
|
|
|
/** @file
|
|
|
|
|
|
|
|
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
2014-03-25 12:03:54 +01:00
|
|
|
Copyright (c) 2013 - 2014, ARM Ltd. All rights reserved.<BR>
|
2013-01-25 12:28:06 +01:00
|
|
|
|
|
|
|
This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
#ifndef __SEMIHOST_PRIVATE_H__
|
|
|
|
#define __SEMIHOST_PRIVATE_H__
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
CHAR8 *FileName;
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN Mode;
|
|
|
|
UINTN NameLength;
|
2013-01-25 12:28:06 +01:00
|
|
|
} SEMIHOST_FILE_OPEN_BLOCK;
|
|
|
|
|
|
|
|
typedef struct {
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN Handle;
|
2013-01-25 12:28:06 +01:00
|
|
|
VOID *Buffer;
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN Length;
|
2013-01-25 12:28:06 +01:00
|
|
|
} SEMIHOST_FILE_READ_WRITE_BLOCK;
|
|
|
|
|
|
|
|
typedef struct {
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN Handle;
|
|
|
|
UINTN Location;
|
2013-01-25 12:28:06 +01:00
|
|
|
} SEMIHOST_FILE_SEEK_BLOCK;
|
|
|
|
|
2014-10-27 11:38:18 +01:00
|
|
|
typedef struct {
|
|
|
|
VOID *Buffer;
|
|
|
|
UINTN Identifier;
|
|
|
|
UINTN Length;
|
|
|
|
} SEMIHOST_FILE_TMPNAME_BLOCK;
|
|
|
|
|
2013-01-25 12:28:06 +01:00
|
|
|
typedef struct {
|
|
|
|
CHAR8 *FileName;
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN NameLength;
|
2013-01-25 12:28:06 +01:00
|
|
|
} SEMIHOST_FILE_REMOVE_BLOCK;
|
|
|
|
|
2014-10-27 11:38:18 +01:00
|
|
|
typedef struct {
|
|
|
|
CHAR8 *FileName;
|
|
|
|
UINTN FileNameLength;
|
|
|
|
CHAR8 *NewFileName;
|
|
|
|
UINTN NewFileNameLength;
|
|
|
|
} SEMIHOST_FILE_RENAME_BLOCK;
|
|
|
|
|
2013-01-25 12:28:06 +01:00
|
|
|
typedef struct {
|
|
|
|
CHAR8 *CommandLine;
|
2014-03-25 12:03:54 +01:00
|
|
|
UINTN CommandLength;
|
2013-01-25 12:28:06 +01:00
|
|
|
} SEMIHOST_SYSTEM_BLOCK;
|
|
|
|
|
2014-08-19 15:29:52 +02:00
|
|
|
#if defined(__CC_ARM)
|
2013-01-25 12:28:06 +01:00
|
|
|
|
|
|
|
#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
|
|
|
|
);
|
|
|
|
|
2014-10-27 11:38:18 +01:00
|
|
|
__swi(SWI)
|
|
|
|
UINT32
|
|
|
|
_Semihost_SYS_TMPNAME(
|
|
|
|
IN UINTN SWI_0x0D,
|
|
|
|
IN SEMIHOST_FILE_TMPNAME_BLOCK *TmpNameBlock
|
|
|
|
);
|
|
|
|
|
2013-01-25 12:28:06 +01:00
|
|
|
__swi(SWI)
|
|
|
|
UINT32
|
|
|
|
_Semihost_SYS_REMOVE(
|
|
|
|
IN UINTN SWI_0x0E,
|
|
|
|
IN SEMIHOST_FILE_REMOVE_BLOCK *RemoveBlock
|
|
|
|
);
|
|
|
|
|
2014-10-27 11:38:18 +01:00
|
|
|
__swi(SWI)
|
|
|
|
UINT32
|
|
|
|
_Semihost_SYS_RENAME(
|
|
|
|
IN UINTN SWI_0x0F,
|
|
|
|
IN SEMIHOST_FILE_RENAME_BLOCK *RenameBlock
|
|
|
|
);
|
|
|
|
|
2013-01-25 12:28:06 +01:00
|
|
|
__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)
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_TMPNAME(TmpNameBlock) _Semihost_SYS_TMPNAME(0x0D, TmpNameBlock)
|
2013-01-25 12:28:06 +01:00
|
|
|
#define Semihost_SYS_REMOVE(RemoveBlock) _Semihost_SYS_REMOVE(0x0E, RemoveBlock)
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_RENAME(RenameBlock) _Semihost_SYS_RENAME(0x0F, RenameBlock)
|
2013-01-25 12:28:06 +01:00
|
|
|
#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))
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_TMPNAME(TmpNameBlock) GccSemihostCall(0x0D, (UINTN)(TmpNameBlock))
|
2013-01-25 12:28:06 +01:00
|
|
|
#define Semihost_SYS_REMOVE(RemoveBlock) GccSemihostCall(0x0E, (UINTN)(RemoveBlock))
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_RENAME(RenameBlock) GccSemihostCall(0x0F, (UINTN)(RenameBlock))
|
2013-01-25 12:28:06 +01:00
|
|
|
#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)
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_TMPNAME(TmpNameBlock) (-1)
|
2013-01-25 12:28:06 +01:00
|
|
|
#define Semihost_SYS_REMOVE(RemoveBlock) (-1)
|
2014-10-27 11:38:18 +01:00
|
|
|
#define Semihost_SYS_RENAME(RenameBlock) (-1)
|
2013-01-25 12:28:06 +01:00
|
|
|
#define Semihost_SYS_SYSTEM(SystemBlock) (-1)
|
|
|
|
|
|
|
|
#endif // __CC_ARM
|
|
|
|
|
|
|
|
#endif //__SEMIHOST_PRIVATE_H__
|