]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/SemihostLib/SemihostLib.c
ArmPkg: Apply uncrustify changes
[mirror_edk2.git] / ArmPkg / Library / SemihostLib / SemihostLib.c
CommitLineData
82325f95 1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
58bba221 4 Copyright (c) 2013 - 2021, Arm Limited. All rights reserved.<BR>\r
d276ac10 5\r
4059386c 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
82325f95 7\r
8**/\r
9#include <Base.h>\r
10\r
11#include <Library/BaseLib.h>\r
12#include <Library/SemihostLib.h>\r
13\r
14#include "SemihostPrivate.h"\r
15\r
16BOOLEAN\r
17SemihostConnectionSupported (\r
18 VOID\r
19 )\r
20{\r
21 return SEMIHOST_SUPPORTED;\r
22}\r
23\r
24RETURN_STATUS\r
25SemihostFileOpen (\r
429309e0
MK
26 IN CHAR8 *FileName,\r
27 IN UINT32 Mode,\r
28 OUT UINTN *FileHandle\r
82325f95 29 )\r
30{\r
31 SEMIHOST_FILE_OPEN_BLOCK OpenBlock;\r
32 INT32 Result;\r
33\r
34 if (FileHandle == NULL) {\r
35 return RETURN_INVALID_PARAMETER;\r
36 }\r
37\r
8fa3caf2 38 // Remove any leading separator (e.g.: '\'). EFI Shell adds one.\r
39 if (*FileName == '\\') {\r
40 FileName++;\r
41 }\r
42\r
429309e0
MK
43 OpenBlock.FileName = FileName;\r
44 OpenBlock.Mode = Mode;\r
45 OpenBlock.NameLength = AsciiStrLen (FileName);\r
82325f95 46\r
b9d49769 47 Result = SEMIHOST_SYS_OPEN (&OpenBlock);\r
82325f95 48\r
49 if (Result == -1) {\r
50 return RETURN_NOT_FOUND;\r
51 } else {\r
52 *FileHandle = Result;\r
53 return RETURN_SUCCESS;\r
54 }\r
55}\r
56\r
57RETURN_STATUS\r
58SemihostFileSeek (\r
c63626b7 59 IN UINTN FileHandle,\r
60 IN UINTN Offset\r
82325f95 61 )\r
62{\r
63 SEMIHOST_FILE_SEEK_BLOCK SeekBlock;\r
64 INT32 Result;\r
65\r
66 SeekBlock.Handle = FileHandle;\r
67 SeekBlock.Location = Offset;\r
68\r
b9d49769 69 Result = SEMIHOST_SYS_SEEK (&SeekBlock);\r
82325f95 70\r
d276ac10
HL
71 // Semihosting does not behave as documented. It returns the offset on\r
72 // success.\r
73 if (Result < 0) {\r
82325f95 74 return RETURN_ABORTED;\r
d276ac10
HL
75 } else {\r
76 return RETURN_SUCCESS;\r
82325f95 77 }\r
78}\r
79\r
80RETURN_STATUS\r
81SemihostFileRead (\r
c63626b7 82 IN UINTN FileHandle,\r
83 IN OUT UINTN *Length,\r
82325f95 84 OUT VOID *Buffer\r
85 )\r
86{\r
87 SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock;\r
88 UINT32 Result;\r
89\r
90 if ((Length == NULL) || (Buffer == NULL)) {\r
91 return RETURN_INVALID_PARAMETER;\r
92 }\r
93\r
94 ReadBlock.Handle = FileHandle;\r
95 ReadBlock.Buffer = Buffer;\r
96 ReadBlock.Length = *Length;\r
97\r
b9d49769 98 Result = SEMIHOST_SYS_READ (&ReadBlock);\r
82325f95 99\r
d276ac10 100 if ((*Length != 0) && (Result == *Length)) {\r
82325f95 101 return RETURN_ABORTED;\r
102 } else {\r
103 *Length -= Result;\r
104 return RETURN_SUCCESS;\r
105 }\r
106}\r
107\r
108RETURN_STATUS\r
109SemihostFileWrite (\r
c63626b7 110 IN UINTN FileHandle,\r
111 IN OUT UINTN *Length,\r
82325f95 112 IN VOID *Buffer\r
113 )\r
114{\r
115 SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock;\r
116\r
117 if ((Length == NULL) || (Buffer == NULL)) {\r
118 return RETURN_INVALID_PARAMETER;\r
119 }\r
120\r
121 WriteBlock.Handle = FileHandle;\r
122 WriteBlock.Buffer = Buffer;\r
123 WriteBlock.Length = *Length;\r
124\r
b9d49769 125 *Length = SEMIHOST_SYS_WRITE (&WriteBlock);\r
d276ac10 126\r
429309e0 127 if (*Length != 0) {\r
d276ac10 128 return RETURN_ABORTED;\r
429309e0 129 } else {\r
d276ac10 130 return RETURN_SUCCESS;\r
429309e0 131 }\r
82325f95 132}\r
133\r
134RETURN_STATUS\r
135SemihostFileClose (\r
c63626b7 136 IN UINTN FileHandle\r
82325f95 137 )\r
138{\r
b9d49769 139 if (SEMIHOST_SYS_CLOSE (&FileHandle) == -1) {\r
82325f95 140 return RETURN_INVALID_PARAMETER;\r
141 } else {\r
142 return RETURN_SUCCESS;\r
143 }\r
144}\r
145\r
146RETURN_STATUS\r
147SemihostFileLength (\r
c63626b7 148 IN UINTN FileHandle,\r
149 OUT UINTN *Length\r
82325f95 150 )\r
151{\r
429309e0 152 INT32 Result;\r
82325f95 153\r
154 if (Length == NULL) {\r
155 return RETURN_INVALID_PARAMETER;\r
156 }\r
157\r
b9d49769 158 Result = SEMIHOST_SYS_FLEN (&FileHandle);\r
82325f95 159\r
160 if (Result == -1) {\r
161 return RETURN_ABORTED;\r
162 } else {\r
163 *Length = Result;\r
164 return RETURN_SUCCESS;\r
165 }\r
166}\r
167\r
5521b5cc
RC
168/**\r
169 Get a temporary name for a file from the host running the debug agent.\r
170\r
171 @param[out] Buffer Pointer to the buffer where the temporary name has to\r
172 be stored\r
173 @param[in] Identifier File name identifier (integer in the range 0 to 255)\r
174 @param[in] Length Length of the buffer to store the temporary name\r
175\r
176 @retval RETURN_SUCCESS Temporary name returned\r
177 @retval RETURN_INVALID_PARAMETER Invalid buffer address\r
178 @retval RETURN_ABORTED Temporary name not returned\r
179\r
180**/\r
181RETURN_STATUS\r
429309e0 182SemihostFileTmpName (\r
5521b5cc
RC
183 OUT VOID *Buffer,\r
184 IN UINT8 Identifier,\r
185 IN UINTN Length\r
186 )\r
187{\r
188 SEMIHOST_FILE_TMPNAME_BLOCK TmpNameBlock;\r
189 INT32 Result;\r
190\r
191 if (Buffer == NULL) {\r
192 return RETURN_INVALID_PARAMETER;\r
193 }\r
194\r
195 TmpNameBlock.Buffer = Buffer;\r
196 TmpNameBlock.Identifier = Identifier;\r
197 TmpNameBlock.Length = Length;\r
198\r
b9d49769 199 Result = SEMIHOST_SYS_TMPNAME (&TmpNameBlock);\r
5521b5cc
RC
200\r
201 if (Result != 0) {\r
429309e0 202 return RETURN_ABORTED;\r
5521b5cc 203 } else {\r
429309e0 204 return RETURN_SUCCESS;\r
5521b5cc
RC
205 }\r
206}\r
207\r
82325f95 208RETURN_STATUS\r
209SemihostFileRemove (\r
429309e0 210 IN CHAR8 *FileName\r
82325f95 211 )\r
212{\r
213 SEMIHOST_FILE_REMOVE_BLOCK RemoveBlock;\r
214 UINT32 Result;\r
215\r
d276ac10
HL
216 // Remove any leading separator (e.g.: '\'). EFI Shell adds one.\r
217 if (*FileName == '\\') {\r
218 FileName++;\r
219 }\r
220\r
429309e0
MK
221 RemoveBlock.FileName = FileName;\r
222 RemoveBlock.NameLength = AsciiStrLen (FileName);\r
82325f95 223\r
b9d49769 224 Result = SEMIHOST_SYS_REMOVE (&RemoveBlock);\r
82325f95 225\r
226 if (Result == 0) {\r
227 return RETURN_SUCCESS;\r
228 } else {\r
229 return RETURN_ABORTED;\r
230 }\r
231}\r
232\r
5521b5cc
RC
233/**\r
234 Rename a specified file.\r
235\r
236 @param[in] FileName Name of the file to rename.\r
237 @param[in] NewFileName The new name of the file.\r
238\r
239 @retval RETURN_SUCCESS File Renamed\r
240 @retval RETURN_INVALID_PARAMETER Either the current or the new name is not specified\r
241 @retval RETURN_ABORTED Rename failed\r
242\r
243**/\r
244RETURN_STATUS\r
429309e0 245SemihostFileRename (\r
5521b5cc
RC
246 IN CHAR8 *FileName,\r
247 IN CHAR8 *NewFileName\r
248 )\r
249{\r
250 SEMIHOST_FILE_RENAME_BLOCK RenameBlock;\r
251 INT32 Result;\r
252\r
253 if ((FileName == NULL) || (NewFileName == NULL)) {\r
254 return RETURN_INVALID_PARAMETER;\r
255 }\r
256\r
257 RenameBlock.FileName = FileName;\r
258 RenameBlock.FileNameLength = AsciiStrLen (FileName);\r
259 RenameBlock.NewFileName = NewFileName;\r
260 RenameBlock.NewFileNameLength = AsciiStrLen (NewFileName);\r
261\r
b9d49769 262 Result = SEMIHOST_SYS_RENAME (&RenameBlock);\r
5521b5cc
RC
263\r
264 if (Result != 0) {\r
429309e0 265 return RETURN_ABORTED;\r
5521b5cc 266 } else {\r
429309e0 267 return RETURN_SUCCESS;\r
5521b5cc
RC
268 }\r
269}\r
270\r
82325f95 271CHAR8\r
272SemihostReadCharacter (\r
273 VOID\r
274 )\r
275{\r
b9d49769 276 return SEMIHOST_SYS_READC ();\r
82325f95 277}\r
278\r
279VOID\r
280SemihostWriteCharacter (\r
429309e0 281 IN CHAR8 Character\r
82325f95 282 )\r
283{\r
b9d49769 284 SEMIHOST_SYS_WRITEC (&Character);\r
82325f95 285}\r
286\r
287VOID\r
288SemihostWriteString (\r
429309e0 289 IN CHAR8 *String\r
82325f95 290 )\r
291{\r
b9d49769 292 SEMIHOST_SYS_WRITE0 (String);\r
82325f95 293}\r
3402aac7 294\r
82325f95 295UINT32\r
296SemihostSystem (\r
429309e0 297 IN CHAR8 *CommandLine\r
82325f95 298 )\r
299{\r
429309e0 300 SEMIHOST_SYSTEM_BLOCK SystemBlock;\r
82325f95 301\r
302 SystemBlock.CommandLine = CommandLine;\r
429309e0 303 SystemBlock.CommandLength = AsciiStrLen (CommandLine);\r
82325f95 304\r
b9d49769 305 return SEMIHOST_SYS_SYSTEM (&SystemBlock);\r
82325f95 306}\r