blob: afc53274b094dc0a3cc5b85db71b7d8dbece5783 [file] [log] [blame]
Vishal Bhoj82c80712015-12-15 21:13:33 +05301/** @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
19typedef struct {
20 CHAR8 *FileName;
21 UINTN Mode;
22 UINTN NameLength;
23} SEMIHOST_FILE_OPEN_BLOCK;
24
25typedef struct {
26 UINTN Handle;
27 VOID *Buffer;
28 UINTN Length;
29} SEMIHOST_FILE_READ_WRITE_BLOCK;
30
31typedef struct {
32 UINTN Handle;
33 UINTN Location;
34} SEMIHOST_FILE_SEEK_BLOCK;
35
36typedef struct {
37 VOID *Buffer;
38 UINTN Identifier;
39 UINTN Length;
40} SEMIHOST_FILE_TMPNAME_BLOCK;
41
42typedef struct {
43 CHAR8 *FileName;
44 UINTN NameLength;
45} SEMIHOST_FILE_REMOVE_BLOCK;
46
47typedef struct {
48 CHAR8 *FileName;
49 UINTN FileNameLength;
50 CHAR8 *NewFileName;
51 UINTN NewFileNameLength;
52} SEMIHOST_FILE_RENAME_BLOCK;
53
54typedef 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)
70INT32
71_Semihost_SYS_OPEN(
72 IN UINTN SWI_0x01,
73 IN SEMIHOST_FILE_OPEN_BLOCK *OpenBlock
74 );
75
76__swi(SWI)
77INT32
78_Semihost_SYS_CLOSE(
79 IN UINTN SWI_0x02,
80 IN UINT32 *Handle
81 );
82
83__swi(SWI)
84VOID
85_Semihost_SYS_WRITEC(
86 IN UINTN SWI_0x03,
87 IN CHAR8 *Character
88 );
89
90__swi(SWI)
91VOID
92_Semihost_SYS_WRITE0(
93 IN UINTN SWI_0x04,
94 IN CHAR8 *String
95 );
96
97__swi(SWI)
98UINT32
99_Semihost_SYS_WRITE(
100 IN UINTN SWI_0x05,
101 IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *WriteBlock
102 );
103
104__swi(SWI)
105UINT32
106_Semihost_SYS_READ(
107 IN UINTN SWI_0x06,
108 IN OUT SEMIHOST_FILE_READ_WRITE_BLOCK *ReadBlock
109 );
110
111__swi(SWI)
112CHAR8
113_Semihost_SYS_READC(
114 IN UINTN SWI_0x07,
115 IN UINTN Zero
116 );
117
118__swi(SWI)
119INT32
120_Semihost_SYS_SEEK(
121 IN UINTN SWI_0x0A,
122 IN SEMIHOST_FILE_SEEK_BLOCK *SeekBlock
123 );
124
125__swi(SWI)
126INT32
127_Semihost_SYS_FLEN(
128 IN UINTN SWI_0x0C,
129 IN UINT32 *Handle
130 );
131
132__swi(SWI)
133UINT32
134_Semihost_SYS_TMPNAME(
135 IN UINTN SWI_0x0D,
136 IN SEMIHOST_FILE_TMPNAME_BLOCK *TmpNameBlock
137 );
138
139__swi(SWI)
140UINT32
141_Semihost_SYS_REMOVE(
142 IN UINTN SWI_0x0E,
143 IN SEMIHOST_FILE_REMOVE_BLOCK *RemoveBlock
144 );
145
146__swi(SWI)
147UINT32
148_Semihost_SYS_RENAME(
149 IN UINTN SWI_0x0F,
150 IN SEMIHOST_FILE_RENAME_BLOCK *RenameBlock
151 );
152
153__swi(SWI)
154UINT32
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
178UINT32
179GccSemihostCall (
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__