]> git.proxmox.com Git - mirror_edk2.git/blob - ArmPkg/Library/SemihostLib/Arm/SemihostLib.c
Working on having a single stack for all modes. This code currently has an issue...
[mirror_edk2.git] / ArmPkg / Library / SemihostLib / Arm / SemihostLib.c
1 /** @file
2
3 Copyright (c) 2008-2009, Apple Inc. All rights reserved.
4
5 All rights reserved. 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 <Uefi.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 EFI_STATUS
30 SemihostFileOpen (
31 IN CHAR8 *FileName,
32 IN UINT32 Mode,
33 OUT UINT32 *FileHandle
34 )
35 {
36 SEMIHOST_FILE_OPEN_BLOCK OpenBlock;
37 INT32 Result;
38
39 if (FileHandle == NULL)
40 return EFI_INVALID_PARAMETER;
41
42 OpenBlock.FileName = FileName;
43 OpenBlock.Mode = Mode;
44 OpenBlock.NameLength = AsciiStrLen(FileName);
45
46 Result = Semihost_SYS_OPEN(&OpenBlock);
47
48 if (Result == -1)
49 {
50 return EFI_NOT_FOUND;
51 }
52 else
53 {
54 *FileHandle = Result;
55 return EFI_SUCCESS;
56 }
57 }
58
59 EFI_STATUS
60 SemihostFileSeek (
61 IN UINT32 FileHandle,
62 IN UINT32 Offset
63 )
64 {
65 SEMIHOST_FILE_SEEK_BLOCK SeekBlock;
66 INT32 Result;
67
68 SeekBlock.Handle = FileHandle;
69 SeekBlock.Location = Offset;
70
71 Result = Semihost_SYS_SEEK(&SeekBlock);
72
73 if (Result == 0)
74 return EFI_SUCCESS;
75 else
76 return EFI_ABORTED;
77 }
78
79 EFI_STATUS
80 SemihostFileRead (
81 IN UINT32 FileHandle,
82 IN OUT UINT32 *Length,
83 OUT VOID *Buffer
84 )
85 {
86 SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock;
87 UINT32 Result;
88
89 if ((Length == NULL) || (Buffer == NULL))
90 return EFI_INVALID_PARAMETER;
91
92 ReadBlock.Handle = FileHandle;
93 ReadBlock.Buffer = Buffer;
94 ReadBlock.Length = *Length;
95
96 Result = Semihost_SYS_READ(&ReadBlock);
97
98 if (Result == *Length)
99 {
100 return EFI_ABORTED;
101 }
102 else
103 {
104 *Length -= Result;
105 return EFI_SUCCESS;
106 }
107 }
108
109 EFI_STATUS
110 SemihostFileWrite (
111 IN UINT32 FileHandle,
112 IN OUT UINT32 *Length,
113 IN VOID *Buffer
114 )
115 {
116 SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock;
117
118 if ((Length == NULL) || (Buffer == NULL))
119 return EFI_INVALID_PARAMETER;
120
121 WriteBlock.Handle = FileHandle;
122 WriteBlock.Buffer = Buffer;
123 WriteBlock.Length = *Length;
124
125 *Length = Semihost_SYS_WRITE(&WriteBlock);
126
127 return EFI_SUCCESS;
128 }
129
130 EFI_STATUS
131 SemihostFileClose (
132 IN UINT32 FileHandle
133 )
134 {
135 INT32 Result = Semihost_SYS_CLOSE(&FileHandle);
136
137 if (Result == -1)
138 return EFI_INVALID_PARAMETER;
139 else
140 return EFI_SUCCESS;
141 }
142
143 EFI_STATUS
144 SemihostFileLength (
145 IN UINT32 FileHandle,
146 OUT UINT32 *Length
147 )
148 {
149 INT32 Result;
150
151 if (Length == NULL)
152 return EFI_INVALID_PARAMETER;
153
154 Result = Semihost_SYS_FLEN(&FileHandle);
155
156 if (Result == -1)
157 {
158 return EFI_ABORTED;
159 }
160 else
161 {
162 *Length = Result;
163 return EFI_SUCCESS;
164 }
165 }
166
167 EFI_STATUS
168 SemihostFileRemove (
169 IN CHAR8 *FileName
170 )
171 {
172 SEMIHOST_FILE_REMOVE_BLOCK RemoveBlock;
173 UINT32 Result;
174
175 RemoveBlock.FileName = FileName;
176 RemoveBlock.NameLength = AsciiStrLen(FileName);
177
178 Result = Semihost_SYS_REMOVE(&RemoveBlock);
179
180 if (Result == 0)
181 return EFI_SUCCESS;
182 else
183 return EFI_ABORTED;
184 }
185
186 CHAR8
187 SemihostReadCharacter (
188 VOID
189 )
190 {
191 return Semihost_SYS_READC();
192 }
193
194 VOID
195 SemihostWriteCharacter (
196 IN CHAR8 Character
197 )
198 {
199 Semihost_SYS_WRITEC(&Character);
200 }
201
202 VOID
203 SemihostWriteString (
204 IN CHAR8 *String
205 )
206 {
207 Semihost_SYS_WRITE0(String);
208 }
209
210 UINT32
211 SemihostSystem (
212 IN CHAR8 *CommandLine
213 )
214 {
215 SEMIHOST_SYSTEM_BLOCK SystemBlock;
216
217 SystemBlock.CommandLine = CommandLine;
218 SystemBlock.CommandLength = AsciiStrLen(CommandLine);
219
220 return Semihost_SYS_SYSTEM(&SystemBlock);
221 }