]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/SemihostLib/Arm/SemihostLib.c
ARM Packages: Minor changes (fixed mispelling, line endings, incorrect comments)
[mirror_edk2.git] / ArmPkg / Library / SemihostLib / Arm / 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
33 OUT UINT32 *FileHandle\r
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
43 OpenBlock.FileName = FileName;\r
44 OpenBlock.Mode = Mode;\r
45 OpenBlock.NameLength = AsciiStrLen(FileName);\r
46\r
47 Result = Semihost_SYS_OPEN(&OpenBlock);\r
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
59 IN UINT32 FileHandle,\r
60 IN UINT32 Offset\r
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
69 Result = Semihost_SYS_SEEK(&SeekBlock);\r
70\r
71 if (Result == 0) {\r
72 return RETURN_SUCCESS;\r
73 } else {\r
74 return RETURN_ABORTED;\r
75 }\r
76}\r
77\r
78RETURN_STATUS\r
79SemihostFileRead (\r
80 IN UINT32 FileHandle,\r
81 IN OUT UINT32 *Length,\r
82 OUT VOID *Buffer\r
83 )\r
84{\r
85 SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock;\r
86 UINT32 Result;\r
87\r
88 if ((Length == NULL) || (Buffer == NULL)) {\r
89 return RETURN_INVALID_PARAMETER;\r
90 }\r
91\r
92 ReadBlock.Handle = FileHandle;\r
93 ReadBlock.Buffer = Buffer;\r
94 ReadBlock.Length = *Length;\r
95\r
96 Result = Semihost_SYS_READ(&ReadBlock);\r
97\r
98 if (Result == *Length) {\r
99 return RETURN_ABORTED;\r
100 } else {\r
101 *Length -= Result;\r
102 return RETURN_SUCCESS;\r
103 }\r
104}\r
105\r
106RETURN_STATUS\r
107SemihostFileWrite (\r
108 IN UINT32 FileHandle,\r
109 IN OUT UINT32 *Length,\r
110 IN VOID *Buffer\r
111 )\r
112{\r
113 SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock;\r
114\r
115 if ((Length == NULL) || (Buffer == NULL)) {\r
116 return RETURN_INVALID_PARAMETER;\r
117 }\r
118\r
119 WriteBlock.Handle = FileHandle;\r
120 WriteBlock.Buffer = Buffer;\r
121 WriteBlock.Length = *Length;\r
122\r
123 *Length = Semihost_SYS_WRITE(&WriteBlock);\r
124 \r
125 return RETURN_SUCCESS;\r
126}\r
127\r
128RETURN_STATUS\r
129SemihostFileClose (\r
130 IN UINT32 FileHandle\r
131 )\r
132{\r
133 INT32 Result = Semihost_SYS_CLOSE(&FileHandle);\r
134\r
135 if (Result == -1) {\r
136 return RETURN_INVALID_PARAMETER;\r
137 } else {\r
138 return RETURN_SUCCESS;\r
139 }\r
140}\r
141\r
142RETURN_STATUS\r
143SemihostFileLength (\r
144 IN UINT32 FileHandle,\r
145 OUT UINT32 *Length\r
146 )\r
147{\r
148 INT32 Result;\r
149\r
150 if (Length == NULL) {\r
151 return RETURN_INVALID_PARAMETER;\r
152 }\r
153\r
154 Result = Semihost_SYS_FLEN(&FileHandle);\r
155\r
156 if (Result == -1) {\r
157 return RETURN_ABORTED;\r
158 } else {\r
159 *Length = Result;\r
160 return RETURN_SUCCESS;\r
161 }\r
162}\r
163\r
164RETURN_STATUS\r
165SemihostFileRemove (\r
166 IN CHAR8 *FileName\r
167 )\r
168{\r
169 SEMIHOST_FILE_REMOVE_BLOCK RemoveBlock;\r
170 UINT32 Result;\r
171\r
172 RemoveBlock.FileName = FileName;\r
173 RemoveBlock.NameLength = AsciiStrLen(FileName);\r
174\r
175 Result = Semihost_SYS_REMOVE(&RemoveBlock);\r
176\r
177 if (Result == 0) {\r
178 return RETURN_SUCCESS;\r
179 } else {\r
180 return RETURN_ABORTED;\r
181 }\r
182}\r
183\r
184CHAR8\r
185SemihostReadCharacter (\r
186 VOID\r
187 )\r
188{\r
189 return Semihost_SYS_READC();\r
190}\r
191\r
192VOID\r
193SemihostWriteCharacter (\r
194 IN CHAR8 Character\r
195 )\r
196{\r
197 Semihost_SYS_WRITEC(&Character);\r
198}\r
199\r
200VOID\r
201SemihostWriteString (\r
202 IN CHAR8 *String\r
203 )\r
204{\r
205 Semihost_SYS_WRITE0(String);\r
206}\r
207 \r
208UINT32\r
209SemihostSystem (\r
210 IN CHAR8 *CommandLine\r
211 )\r
212{\r
213 SEMIHOST_SYSTEM_BLOCK SystemBlock;\r
214\r
215 SystemBlock.CommandLine = CommandLine;\r
216 SystemBlock.CommandLength = AsciiStrLen(CommandLine);\r
217\r
218 return Semihost_SYS_SYSTEM(&SystemBlock);\r
219}\r