Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame^] | 1 | /** @file
|
| 2 |
|
| 3 | Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
| 4 | Copyright (c) 2013 - 2014, ARM Ltd. All rights reserved.<BR>
|
| 5 |
|
| 6 | This program and the accompanying materials
|
| 7 | are licensed and made available under the terms and conditions of the BSD License
|
| 8 | which accompanies this distribution. The full text of the license may be found at
|
| 9 | http://opensource.org/licenses/bsd-license.php
|
| 10 |
|
| 11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 13 |
|
| 14 | **/
|
| 15 |
|
| 16 | #ifndef __SEMIHOST_PRIVATE_H__
|
| 17 | #define __SEMIHOST_PRIVATE_H__
|
| 18 |
|
| 19 | typedef struct {
|
| 20 | CHAR8 *FileName;
|
| 21 | UINTN Mode;
|
| 22 | UINTN NameLength;
|
| 23 | } SEMIHOST_FILE_OPEN_BLOCK;
|
| 24 |
|
| 25 | typedef struct {
|
| 26 | UINTN Handle;
|
| 27 | VOID *Buffer;
|
| 28 | UINTN Length;
|
| 29 | } SEMIHOST_FILE_READ_WRITE_BLOCK;
|
| 30 |
|
| 31 | typedef struct {
|
| 32 | UINTN Handle;
|
| 33 | UINTN Location;
|
| 34 | } SEMIHOST_FILE_SEEK_BLOCK;
|
| 35 |
|
| 36 | typedef struct {
|
| 37 | VOID *Buffer;
|
| 38 | UINTN Identifier;
|
| 39 | UINTN Length;
|
| 40 | } SEMIHOST_FILE_TMPNAME_BLOCK;
|
| 41 |
|
| 42 | typedef struct {
|
| 43 | CHAR8 *FileName;
|
| 44 | UINTN NameLength;
|
| 45 | } SEMIHOST_FILE_REMOVE_BLOCK;
|
| 46 |
|
| 47 | typedef struct {
|
| 48 | CHAR8 *FileName;
|
| 49 | UINTN FileNameLength;
|
| 50 | CHAR8 *NewFileName;
|
| 51 | UINTN NewFileNameLength;
|
| 52 | } SEMIHOST_FILE_RENAME_BLOCK;
|
| 53 |
|
| 54 | typedef struct {
|
| 55 | CHAR8 *CommandLine;
|
| 56 | UINTN CommandLength;
|
| 57 | } SEMIHOST_SYSTEM_BLOCK;
|
| 58 |
|
| 59 | #if defined(__CC_ARM)
|
| 60 |
|
| 61 | #if defined(__thumb__)
|
| 62 | #define SWI 0xAB
|
| 63 | #else
|
| 64 | #define SWI 0x123456
|
| 65 | #endif
|
| 66 |
|
| 67 | #define SEMIHOST_SUPPORTED TRUE
|
| 68 |
|
| 69 | __swi(SWI)
|
| 70 | INT32
|
| 71 | _Semihost_SYS_OPEN(
|
| 72 | IN UINTN SWI_0x01,
|
| 73 | IN SEMIHOST_FILE_OPEN_BLOCK *OpenBlock
|
| 74 | );
|
| 75 |
|
| 76 | __swi(SWI)
|
| 77 | INT32
|
| 78 | _Semihost_SYS_CLOSE(
|
| 79 | IN UINTN SWI_0x02,
|
| 80 | IN UINT32 *Handle
|
| 81 | );
|
| 82 |
|
| 83 | __swi(SWI)
|
| 84 | VOID
|
| 85 | _Semihost_SYS_WRITEC(
|
| 86 | IN UINTN SWI_0x03,
|
| 87 | IN CHAR8 *Character
|
| 88 | );
|
| 89 |
|
| 90 | __swi(SWI)
|
| 91 | VOID
|
| 92 | _Semihost_SYS_WRITE0(
|
| 93 | IN UINTN SWI_0x04,
|
| 94 | IN CHAR8 *String
|
| 95 | );
|
| 96 |
|
| 97 | __swi(SWI)
|
| 98 | UINT32
|
| 99 | _Semihost_SYS_WRITE(
|
| 100 | IN UINTN SWI_0x05,
|
| 101 | IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *WriteBlock
|
| 102 | );
|
| 103 |
|
| 104 | __swi(SWI)
|
| 105 | UINT32
|
| 106 | _Semihost_SYS_READ(
|
| 107 | IN UINTN SWI_0x06,
|
| 108 | IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *ReadBlock
|
| 109 | );
|
| 110 |
|
| 111 | __swi(SWI)
|
| 112 | CHAR8
|
| 113 | _Semihost_SYS_READC(
|
| 114 | IN UINTN SWI_0x07,
|
| 115 | IN UINTN Zero
|
| 116 | );
|
| 117 |
|
| 118 | __swi(SWI)
|
| 119 | INT32
|
| 120 | _Semihost_SYS_SEEK(
|
| 121 | IN UINTN SWI_0x0A,
|
| 122 | IN SEMIHOST_FILE_SEEK_BLOCK *SeekBlock
|
| 123 | );
|
| 124 |
|
| 125 | __swi(SWI)
|
| 126 | INT32
|
| 127 | _Semihost_SYS_FLEN(
|
| 128 | IN UINTN SWI_0x0C,
|
| 129 | IN UINT32 *Handle
|
| 130 | );
|
| 131 |
|
| 132 | __swi(SWI)
|
| 133 | UINT32
|
| 134 | _Semihost_SYS_TMPNAME(
|
| 135 | IN UINTN SWI_0x0D,
|
| 136 | IN SEMIHOST_FILE_TMPNAME_BLOCK *TmpNameBlock
|
| 137 | );
|
| 138 |
|
| 139 | __swi(SWI)
|
| 140 | UINT32
|
| 141 | _Semihost_SYS_REMOVE(
|
| 142 | IN UINTN SWI_0x0E,
|
| 143 | IN SEMIHOST_FILE_REMOVE_BLOCK *RemoveBlock
|
| 144 | );
|
| 145 |
|
| 146 | __swi(SWI)
|
| 147 | UINT32
|
| 148 | _Semihost_SYS_RENAME(
|
| 149 | IN UINTN SWI_0x0F,
|
| 150 | IN SEMIHOST_FILE_RENAME_BLOCK *RenameBlock
|
| 151 | );
|
| 152 |
|
| 153 | __swi(SWI)
|
| 154 | UINT32
|
| 155 | _Semihost_SYS_SYSTEM(
|
| 156 | IN UINTN SWI_0x12,
|
| 157 | IN SEMIHOST_SYSTEM_BLOCK *SystemBlock
|
| 158 | );
|
| 159 |
|
| 160 | #define Semihost_SYS_OPEN(OpenBlock) _Semihost_SYS_OPEN(0x01, OpenBlock)
|
| 161 | #define Semihost_SYS_CLOSE(Handle) _Semihost_SYS_CLOSE(0x02, Handle)
|
| 162 | #define Semihost_SYS_WRITE0(String) _Semihost_SYS_WRITE0(0x04, String)
|
| 163 | #define Semihost_SYS_WRITEC(Character) _Semihost_SYS_WRITEC(0x03, Character)
|
| 164 | #define Semihost_SYS_WRITE(WriteBlock) _Semihost_SYS_WRITE(0x05, WriteBlock)
|
| 165 | #define Semihost_SYS_READ(ReadBlock) _Semihost_SYS_READ(0x06, ReadBlock)
|
| 166 | #define Semihost_SYS_READC() _Semihost_SYS_READC(0x07, 0)
|
| 167 | #define Semihost_SYS_SEEK(SeekBlock) _Semihost_SYS_SEEK(0x0A, SeekBlock)
|
| 168 | #define Semihost_SYS_FLEN(Handle) _Semihost_SYS_FLEN(0x0C, Handle)
|
| 169 | #define Semihost_SYS_TMPNAME(TmpNameBlock) _Semihost_SYS_TMPNAME(0x0D, TmpNameBlock)
|
| 170 | #define Semihost_SYS_REMOVE(RemoveBlock) _Semihost_SYS_REMOVE(0x0E, RemoveBlock)
|
| 171 | #define Semihost_SYS_RENAME(RenameBlock) _Semihost_SYS_RENAME(0x0F, RenameBlock)
|
| 172 | #define Semihost_SYS_SYSTEM(SystemBlock) _Semihost_SYS_SYSTEM(0x12, SystemBlock)
|
| 173 |
|
| 174 | #elif defined(__GNUC__) // __CC_ARM
|
| 175 |
|
| 176 | #define SEMIHOST_SUPPORTED TRUE
|
| 177 |
|
| 178 | UINT32
|
| 179 | GccSemihostCall (
|
| 180 | IN UINT32 Operation,
|
| 181 | IN UINTN SystemBlockAddress
|
| 182 | ); // __attribute__ ((interrupt ("SVC")));
|
| 183 |
|
| 184 | #define Semihost_SYS_OPEN(OpenBlock) GccSemihostCall(0x01, (UINTN)(OpenBlock))
|
| 185 | #define Semihost_SYS_CLOSE(Handle) GccSemihostCall(0x02, (UINTN)(Handle))
|
| 186 | #define Semihost_SYS_WRITE0(String) GccSemihostCall(0x04, (UINTN)(String))
|
| 187 | #define Semihost_SYS_WRITEC(Character) GccSemihostCall(0x03, (UINTN)(Character))
|
| 188 | #define Semihost_SYS_WRITE(WriteBlock) GccSemihostCall(0x05, (UINTN)(WriteBlock))
|
| 189 | #define Semihost_SYS_READ(ReadBlock) GccSemihostCall(0x06, (UINTN)(ReadBlock))
|
| 190 | #define Semihost_SYS_READC() GccSemihostCall(0x07, (UINTN)(0))
|
| 191 | #define Semihost_SYS_SEEK(SeekBlock) GccSemihostCall(0x0A, (UINTN)(SeekBlock))
|
| 192 | #define Semihost_SYS_FLEN(Handle) GccSemihostCall(0x0C, (UINTN)(Handle))
|
| 193 | #define Semihost_SYS_TMPNAME(TmpNameBlock) GccSemihostCall(0x0D, (UINTN)(TmpNameBlock))
|
| 194 | #define Semihost_SYS_REMOVE(RemoveBlock) GccSemihostCall(0x0E, (UINTN)(RemoveBlock))
|
| 195 | #define Semihost_SYS_RENAME(RenameBlock) GccSemihostCall(0x0F, (UINTN)(RenameBlock))
|
| 196 | #define Semihost_SYS_SYSTEM(SystemBlock) GccSemihostCall(0x12, (UINTN)(SystemBlock))
|
| 197 |
|
| 198 | #else // __CC_ARM
|
| 199 |
|
| 200 | #define SEMIHOST_SUPPORTED FALSE
|
| 201 |
|
| 202 | #define Semihost_SYS_OPEN(OpenBlock) (-1)
|
| 203 | #define Semihost_SYS_CLOSE(Handle) (-1)
|
| 204 | #define Semihost_SYS_WRITE0(String)
|
| 205 | #define Semihost_SYS_WRITEC(Character)
|
| 206 | #define Semihost_SYS_WRITE(WriteBlock) (0)
|
| 207 | #define Semihost_SYS_READ(ReadBlock) ((ReadBlock)->Length)
|
| 208 | #define Semihost_SYS_READC() ('x')
|
| 209 | #define Semihost_SYS_SEEK(SeekBlock) (-1)
|
| 210 | #define Semihost_SYS_FLEN(Handle) (-1)
|
| 211 | #define Semihost_SYS_TMPNAME(TmpNameBlock) (-1)
|
| 212 | #define Semihost_SYS_REMOVE(RemoveBlock) (-1)
|
| 213 | #define Semihost_SYS_RENAME(RenameBlock) (-1)
|
| 214 | #define Semihost_SYS_SYSTEM(SystemBlock) (-1)
|
| 215 |
|
| 216 | #endif // __CC_ARM
|
| 217 |
|
| 218 | #endif //__SEMIHOST_PRIVATE_H__
|