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