]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Library/SemihostLib/SemihostLib.c
87c0379d6b3a34eddd9cfea8a48bd86451d97bdf
[mirror_edk2.git] / ArmPkg / Library / SemihostLib / SemihostLib.c
1 /** @file
2
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
4
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14 #include <Base.h>
15
16 #include <Library/BaseLib.h>
17 #include <Library/SemihostLib.h>
18
19 #include "SemihostPrivate.h"
20
21 BOOLEAN
22 SemihostConnectionSupported (
23 VOID
24 )
25 {
26 return SEMIHOST_SUPPORTED;
27 }
28
29 RETURN_STATUS
30 SemihostFileOpen (
31 IN CHAR8 *FileName,
32 IN UINT32 Mode,
33 OUT UINTN *FileHandle
34 )
35 {
36 SEMIHOST_FILE_OPEN_BLOCK OpenBlock;
37 INT32 Result;
38
39 if (FileHandle == NULL) {
40 return RETURN_INVALID_PARAMETER;
41 }
42
43 // Remove any leading separator (e.g.: '\'). EFI Shell adds one.
44 if (*FileName == '\\') {
45 FileName++;
46 }
47
48 OpenBlock.FileName = FileName;
49 OpenBlock.Mode = Mode;
50 OpenBlock.NameLength = AsciiStrLen(FileName);
51
52 Result = Semihost_SYS_OPEN(&OpenBlock);
53
54 if (Result == -1) {
55 return RETURN_NOT_FOUND;
56 } else {
57 *FileHandle = Result;
58 return RETURN_SUCCESS;
59 }
60 }
61
62 RETURN_STATUS
63 SemihostFileSeek (
64 IN UINTN FileHandle,
65 IN UINTN Offset
66 )
67 {
68 SEMIHOST_FILE_SEEK_BLOCK SeekBlock;
69 INT32 Result;
70
71 SeekBlock.Handle = FileHandle;
72 SeekBlock.Location = Offset;
73
74 Result = Semihost_SYS_SEEK(&SeekBlock);
75
76 if (Result == 0) {
77 return RETURN_SUCCESS;
78 } else {
79 return RETURN_ABORTED;
80 }
81 }
82
83 RETURN_STATUS
84 SemihostFileRead (
85 IN UINTN FileHandle,
86 IN OUT UINTN *Length,
87 OUT VOID *Buffer
88 )
89 {
90 SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock;
91 UINT32 Result;
92
93 if ((Length == NULL) || (Buffer == NULL)) {
94 return RETURN_INVALID_PARAMETER;
95 }
96
97 ReadBlock.Handle = FileHandle;
98 ReadBlock.Buffer = Buffer;
99 ReadBlock.Length = *Length;
100
101 Result = Semihost_SYS_READ(&ReadBlock);
102
103 if (Result == *Length) {
104 return RETURN_ABORTED;
105 } else {
106 *Length -= Result;
107 return RETURN_SUCCESS;
108 }
109 }
110
111 RETURN_STATUS
112 SemihostFileWrite (
113 IN UINTN FileHandle,
114 IN OUT UINTN *Length,
115 IN VOID *Buffer
116 )
117 {
118 SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock;
119
120 if ((Length == NULL) || (Buffer == NULL)) {
121 return RETURN_INVALID_PARAMETER;
122 }
123
124 WriteBlock.Handle = FileHandle;
125 WriteBlock.Buffer = Buffer;
126 WriteBlock.Length = *Length;
127
128 *Length = Semihost_SYS_WRITE(&WriteBlock);
129
130 return RETURN_SUCCESS;
131 }
132
133 RETURN_STATUS
134 SemihostFileClose (
135 IN UINTN FileHandle
136 )
137 {
138 INT32 Result = Semihost_SYS_CLOSE(&FileHandle);
139
140 if (Result == -1) {
141 return RETURN_INVALID_PARAMETER;
142 } else {
143 return RETURN_SUCCESS;
144 }
145 }
146
147 RETURN_STATUS
148 SemihostFileLength (
149 IN UINTN FileHandle,
150 OUT UINTN *Length
151 )
152 {
153 INT32 Result;
154
155 if (Length == NULL) {
156 return RETURN_INVALID_PARAMETER;
157 }
158
159 Result = Semihost_SYS_FLEN(&FileHandle);
160
161 if (Result == -1) {
162 return RETURN_ABORTED;
163 } else {
164 *Length = Result;
165 return RETURN_SUCCESS;
166 }
167 }
168
169 RETURN_STATUS
170 SemihostFileRemove (
171 IN CHAR8 *FileName
172 )
173 {
174 SEMIHOST_FILE_REMOVE_BLOCK RemoveBlock;
175 UINT32 Result;
176
177 RemoveBlock.FileName = FileName;
178 RemoveBlock.NameLength = AsciiStrLen(FileName);
179
180 Result = Semihost_SYS_REMOVE(&RemoveBlock);
181
182 if (Result == 0) {
183 return RETURN_SUCCESS;
184 } else {
185 return RETURN_ABORTED;
186 }
187 }
188
189 CHAR8
190 SemihostReadCharacter (
191 VOID
192 )
193 {
194 return Semihost_SYS_READC();
195 }
196
197 VOID
198 SemihostWriteCharacter (
199 IN CHAR8 Character
200 )
201 {
202 Semihost_SYS_WRITEC(&Character);
203 }
204
205 VOID
206 SemihostWriteString (
207 IN CHAR8 *String
208 )
209 {
210 Semihost_SYS_WRITE0(String);
211 }
212
213 UINT32
214 SemihostSystem (
215 IN CHAR8 *CommandLine
216 )
217 {
218 SEMIHOST_SYSTEM_BLOCK SystemBlock;
219
220 SystemBlock.CommandLine = CommandLine;
221 SystemBlock.CommandLength = AsciiStrLen(CommandLine);
222
223 return Semihost_SYS_SYSTEM(&SystemBlock);
224 }