hand.c revision 1.1.1.1.6.2 1 1.1.1.1.6.2 yamt /* $NetBSD: hand.c,v 1.1.1.1.6.2 2014/05/22 11:40:58 yamt Exp $ */
2 1.1.1.1.6.2 yamt
3 1.1.1.1.6.2 yamt /*++
4 1.1.1.1.6.2 yamt
5 1.1.1.1.6.2 yamt Copyright (c) 1998 Intel Corporation
6 1.1.1.1.6.2 yamt
7 1.1.1.1.6.2 yamt Module Name:
8 1.1.1.1.6.2 yamt
9 1.1.1.1.6.2 yamt hand.c
10 1.1.1.1.6.2 yamt
11 1.1.1.1.6.2 yamt Abstract:
12 1.1.1.1.6.2 yamt
13 1.1.1.1.6.2 yamt
14 1.1.1.1.6.2 yamt
15 1.1.1.1.6.2 yamt
16 1.1.1.1.6.2 yamt Revision History
17 1.1.1.1.6.2 yamt
18 1.1.1.1.6.2 yamt --*/
19 1.1.1.1.6.2 yamt
20 1.1.1.1.6.2 yamt #include "lib.h"
21 1.1.1.1.6.2 yamt #include "efistdarg.h" // !!!
22 1.1.1.1.6.2 yamt
23 1.1.1.1.6.2 yamt
24 1.1.1.1.6.2 yamt EFI_STATUS
25 1.1.1.1.6.2 yamt LibLocateProtocol (
26 1.1.1.1.6.2 yamt IN EFI_GUID *ProtocolGuid,
27 1.1.1.1.6.2 yamt OUT VOID **Interface
28 1.1.1.1.6.2 yamt )
29 1.1.1.1.6.2 yamt //
30 1.1.1.1.6.2 yamt // Find the first instance of this Protocol in the system and return it's interface
31 1.1.1.1.6.2 yamt //
32 1.1.1.1.6.2 yamt {
33 1.1.1.1.6.2 yamt EFI_STATUS Status;
34 1.1.1.1.6.2 yamt UINTN NumberHandles, Index;
35 1.1.1.1.6.2 yamt EFI_HANDLE *Handles;
36 1.1.1.1.6.2 yamt
37 1.1.1.1.6.2 yamt
38 1.1.1.1.6.2 yamt *Interface = NULL;
39 1.1.1.1.6.2 yamt Status = LibLocateHandle (ByProtocol, ProtocolGuid, NULL, &NumberHandles, &Handles);
40 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
41 1.1.1.1.6.2 yamt DEBUG((D_INFO, "LibLocateProtocol: Handle not found\n"));
42 1.1.1.1.6.2 yamt return Status;
43 1.1.1.1.6.2 yamt }
44 1.1.1.1.6.2 yamt
45 1.1.1.1.6.2 yamt for (Index=0; Index < NumberHandles; Index++) {
46 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handles[Index], ProtocolGuid, Interface);
47 1.1.1.1.6.2 yamt if (!EFI_ERROR(Status)) {
48 1.1.1.1.6.2 yamt break;
49 1.1.1.1.6.2 yamt }
50 1.1.1.1.6.2 yamt }
51 1.1.1.1.6.2 yamt
52 1.1.1.1.6.2 yamt if (Handles) {
53 1.1.1.1.6.2 yamt FreePool (Handles);
54 1.1.1.1.6.2 yamt }
55 1.1.1.1.6.2 yamt
56 1.1.1.1.6.2 yamt return Status;
57 1.1.1.1.6.2 yamt }
58 1.1.1.1.6.2 yamt
59 1.1.1.1.6.2 yamt EFI_STATUS
60 1.1.1.1.6.2 yamt LibLocateHandle (
61 1.1.1.1.6.2 yamt IN EFI_LOCATE_SEARCH_TYPE SearchType,
62 1.1.1.1.6.2 yamt IN EFI_GUID *Protocol OPTIONAL,
63 1.1.1.1.6.2 yamt IN VOID *SearchKey OPTIONAL,
64 1.1.1.1.6.2 yamt IN OUT UINTN *NoHandles,
65 1.1.1.1.6.2 yamt OUT EFI_HANDLE **Buffer
66 1.1.1.1.6.2 yamt )
67 1.1.1.1.6.2 yamt
68 1.1.1.1.6.2 yamt {
69 1.1.1.1.6.2 yamt EFI_STATUS Status;
70 1.1.1.1.6.2 yamt UINTN BufferSize;
71 1.1.1.1.6.2 yamt
72 1.1.1.1.6.2 yamt //
73 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
74 1.1.1.1.6.2 yamt //
75 1.1.1.1.6.2 yamt
76 1.1.1.1.6.2 yamt Status = EFI_SUCCESS;
77 1.1.1.1.6.2 yamt *Buffer = NULL;
78 1.1.1.1.6.2 yamt BufferSize = 50 * sizeof(EFI_HANDLE);
79 1.1.1.1.6.2 yamt
80 1.1.1.1.6.2 yamt //
81 1.1.1.1.6.2 yamt // Call the real function
82 1.1.1.1.6.2 yamt //
83 1.1.1.1.6.2 yamt
84 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **) Buffer, BufferSize)) {
85 1.1.1.1.6.2 yamt
86 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
87 1.1.1.1.6.2 yamt BS->LocateHandle,
88 1.1.1.1.6.2 yamt 5,
89 1.1.1.1.6.2 yamt SearchType,
90 1.1.1.1.6.2 yamt Protocol,
91 1.1.1.1.6.2 yamt SearchKey,
92 1.1.1.1.6.2 yamt &BufferSize,
93 1.1.1.1.6.2 yamt *Buffer
94 1.1.1.1.6.2 yamt );
95 1.1.1.1.6.2 yamt
96 1.1.1.1.6.2 yamt }
97 1.1.1.1.6.2 yamt
98 1.1.1.1.6.2 yamt *NoHandles = BufferSize / sizeof (EFI_HANDLE);
99 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
100 1.1.1.1.6.2 yamt *NoHandles = 0;
101 1.1.1.1.6.2 yamt }
102 1.1.1.1.6.2 yamt
103 1.1.1.1.6.2 yamt return Status;
104 1.1.1.1.6.2 yamt }
105 1.1.1.1.6.2 yamt
106 1.1.1.1.6.2 yamt EFI_STATUS
107 1.1.1.1.6.2 yamt LibLocateHandleByDiskSignature (
108 1.1.1.1.6.2 yamt IN UINT8 MBRType,
109 1.1.1.1.6.2 yamt IN UINT8 SignatureType,
110 1.1.1.1.6.2 yamt IN VOID *Signature,
111 1.1.1.1.6.2 yamt IN OUT UINTN *NoHandles,
112 1.1.1.1.6.2 yamt OUT EFI_HANDLE **Buffer
113 1.1.1.1.6.2 yamt )
114 1.1.1.1.6.2 yamt
115 1.1.1.1.6.2 yamt {
116 1.1.1.1.6.2 yamt EFI_STATUS Status;
117 1.1.1.1.6.2 yamt UINTN BufferSize;
118 1.1.1.1.6.2 yamt UINTN NoBlockIoHandles;
119 1.1.1.1.6.2 yamt EFI_HANDLE *BlockIoBuffer;
120 1.1.1.1.6.2 yamt EFI_DEVICE_PATH *DevicePath;
121 1.1.1.1.6.2 yamt UINTN Index;
122 1.1.1.1.6.2 yamt EFI_DEVICE_PATH *Start, *Next, *DevPath;
123 1.1.1.1.6.2 yamt HARDDRIVE_DEVICE_PATH *HardDriveDevicePath;
124 1.1.1.1.6.2 yamt BOOLEAN Match;
125 1.1.1.1.6.2 yamt BOOLEAN PreviousNodeIsHardDriveDevicePath;
126 1.1.1.1.6.2 yamt
127 1.1.1.1.6.2 yamt //
128 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
129 1.1.1.1.6.2 yamt //
130 1.1.1.1.6.2 yamt
131 1.1.1.1.6.2 yamt BlockIoBuffer = NULL;
132 1.1.1.1.6.2 yamt BufferSize = 50 * sizeof(EFI_HANDLE);
133 1.1.1.1.6.2 yamt
134 1.1.1.1.6.2 yamt //
135 1.1.1.1.6.2 yamt // Call the real function
136 1.1.1.1.6.2 yamt //
137 1.1.1.1.6.2 yamt
138 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **)&BlockIoBuffer, BufferSize)) {
139 1.1.1.1.6.2 yamt
140 1.1.1.1.6.2 yamt //
141 1.1.1.1.6.2 yamt // Get list of device handles that support the BLOCK_IO Protocol.
142 1.1.1.1.6.2 yamt //
143 1.1.1.1.6.2 yamt
144 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
145 1.1.1.1.6.2 yamt BS->LocateHandle,
146 1.1.1.1.6.2 yamt 5,
147 1.1.1.1.6.2 yamt ByProtocol,
148 1.1.1.1.6.2 yamt &BlockIoProtocol,
149 1.1.1.1.6.2 yamt NULL,
150 1.1.1.1.6.2 yamt &BufferSize,
151 1.1.1.1.6.2 yamt BlockIoBuffer
152 1.1.1.1.6.2 yamt );
153 1.1.1.1.6.2 yamt
154 1.1.1.1.6.2 yamt }
155 1.1.1.1.6.2 yamt
156 1.1.1.1.6.2 yamt NoBlockIoHandles = BufferSize / sizeof (EFI_HANDLE);
157 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
158 1.1.1.1.6.2 yamt NoBlockIoHandles = 0;
159 1.1.1.1.6.2 yamt }
160 1.1.1.1.6.2 yamt
161 1.1.1.1.6.2 yamt //
162 1.1.1.1.6.2 yamt // If there was an error or there are no device handles that support
163 1.1.1.1.6.2 yamt // the BLOCK_IO Protocol, then return.
164 1.1.1.1.6.2 yamt //
165 1.1.1.1.6.2 yamt
166 1.1.1.1.6.2 yamt if (NoBlockIoHandles == 0) {
167 1.1.1.1.6.2 yamt FreePool(BlockIoBuffer);
168 1.1.1.1.6.2 yamt *NoHandles = 0;
169 1.1.1.1.6.2 yamt *Buffer = NULL;
170 1.1.1.1.6.2 yamt return Status;
171 1.1.1.1.6.2 yamt }
172 1.1.1.1.6.2 yamt
173 1.1.1.1.6.2 yamt //
174 1.1.1.1.6.2 yamt // Loop through all the device handles that support the BLOCK_IO Protocol
175 1.1.1.1.6.2 yamt //
176 1.1.1.1.6.2 yamt
177 1.1.1.1.6.2 yamt *NoHandles = 0;
178 1.1.1.1.6.2 yamt
179 1.1.1.1.6.2 yamt for(Index=0;Index<NoBlockIoHandles;Index++) {
180 1.1.1.1.6.2 yamt
181 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
182 1.1.1.1.6.2 yamt BS->HandleProtocol,
183 1.1.1.1.6.2 yamt 3,
184 1.1.1.1.6.2 yamt BlockIoBuffer[Index],
185 1.1.1.1.6.2 yamt &DevicePathProtocol,
186 1.1.1.1.6.2 yamt (VOID*)&DevicePath
187 1.1.1.1.6.2 yamt );
188 1.1.1.1.6.2 yamt
189 1.1.1.1.6.2 yamt //
190 1.1.1.1.6.2 yamt // Search DevicePath for a Hard Drive Media Device Path node.
191 1.1.1.1.6.2 yamt // If one is found, then see if it matches the signature that was
192 1.1.1.1.6.2 yamt // passed in. If it does match, and the next node is the End of the
193 1.1.1.1.6.2 yamt // device path, and the previous node is not a Hard Drive Media Device
194 1.1.1.1.6.2 yamt // Path, then we have found a match.
195 1.1.1.1.6.2 yamt //
196 1.1.1.1.6.2 yamt
197 1.1.1.1.6.2 yamt Match = FALSE;
198 1.1.1.1.6.2 yamt
199 1.1.1.1.6.2 yamt if (DevicePath != NULL) {
200 1.1.1.1.6.2 yamt
201 1.1.1.1.6.2 yamt PreviousNodeIsHardDriveDevicePath = FALSE;
202 1.1.1.1.6.2 yamt
203 1.1.1.1.6.2 yamt DevPath = DevicePath;
204 1.1.1.1.6.2 yamt Start = DevPath;
205 1.1.1.1.6.2 yamt
206 1.1.1.1.6.2 yamt //
207 1.1.1.1.6.2 yamt // Check for end of device path type
208 1.1.1.1.6.2 yamt //
209 1.1.1.1.6.2 yamt
210 1.1.1.1.6.2 yamt for (; ;) {
211 1.1.1.1.6.2 yamt
212 1.1.1.1.6.2 yamt if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) &&
213 1.1.1.1.6.2 yamt (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) {
214 1.1.1.1.6.2 yamt
215 1.1.1.1.6.2 yamt HardDriveDevicePath = (HARDDRIVE_DEVICE_PATH *)(DevPath);
216 1.1.1.1.6.2 yamt
217 1.1.1.1.6.2 yamt if (PreviousNodeIsHardDriveDevicePath == FALSE) {
218 1.1.1.1.6.2 yamt
219 1.1.1.1.6.2 yamt Next = NextDevicePathNode(DevPath);
220 1.1.1.1.6.2 yamt if (IsDevicePathEndType(Next)) {
221 1.1.1.1.6.2 yamt if ((HardDriveDevicePath->MBRType == MBRType) &&
222 1.1.1.1.6.2 yamt (HardDriveDevicePath->SignatureType == SignatureType)) {
223 1.1.1.1.6.2 yamt switch(SignatureType) {
224 1.1.1.1.6.2 yamt case SIGNATURE_TYPE_MBR:
225 1.1.1.1.6.2 yamt if (*((UINT32 *)(Signature)) == *(UINT32 *)(&(HardDriveDevicePath->Signature[0]))) {
226 1.1.1.1.6.2 yamt Match = TRUE;
227 1.1.1.1.6.2 yamt }
228 1.1.1.1.6.2 yamt break;
229 1.1.1.1.6.2 yamt case SIGNATURE_TYPE_GUID:
230 1.1.1.1.6.2 yamt if (CompareGuid((EFI_GUID *)Signature,(EFI_GUID *)(&(HardDriveDevicePath->Signature[0]))) == 0) {
231 1.1.1.1.6.2 yamt Match = TRUE;
232 1.1.1.1.6.2 yamt }
233 1.1.1.1.6.2 yamt break;
234 1.1.1.1.6.2 yamt }
235 1.1.1.1.6.2 yamt }
236 1.1.1.1.6.2 yamt }
237 1.1.1.1.6.2 yamt }
238 1.1.1.1.6.2 yamt PreviousNodeIsHardDriveDevicePath = TRUE;
239 1.1.1.1.6.2 yamt } else {
240 1.1.1.1.6.2 yamt PreviousNodeIsHardDriveDevicePath = FALSE;
241 1.1.1.1.6.2 yamt }
242 1.1.1.1.6.2 yamt
243 1.1.1.1.6.2 yamt if (IsDevicePathEnd(DevPath)) {
244 1.1.1.1.6.2 yamt break;
245 1.1.1.1.6.2 yamt }
246 1.1.1.1.6.2 yamt
247 1.1.1.1.6.2 yamt DevPath = NextDevicePathNode(DevPath);
248 1.1.1.1.6.2 yamt }
249 1.1.1.1.6.2 yamt
250 1.1.1.1.6.2 yamt }
251 1.1.1.1.6.2 yamt
252 1.1.1.1.6.2 yamt if (Match == FALSE) {
253 1.1.1.1.6.2 yamt BlockIoBuffer[Index] = NULL;
254 1.1.1.1.6.2 yamt } else {
255 1.1.1.1.6.2 yamt *NoHandles = *NoHandles + 1;
256 1.1.1.1.6.2 yamt }
257 1.1.1.1.6.2 yamt }
258 1.1.1.1.6.2 yamt
259 1.1.1.1.6.2 yamt //
260 1.1.1.1.6.2 yamt // If there are no matches, then return
261 1.1.1.1.6.2 yamt //
262 1.1.1.1.6.2 yamt
263 1.1.1.1.6.2 yamt if (*NoHandles == 0) {
264 1.1.1.1.6.2 yamt FreePool(BlockIoBuffer);
265 1.1.1.1.6.2 yamt *NoHandles = 0;
266 1.1.1.1.6.2 yamt *Buffer = NULL;
267 1.1.1.1.6.2 yamt return EFI_SUCCESS;
268 1.1.1.1.6.2 yamt }
269 1.1.1.1.6.2 yamt
270 1.1.1.1.6.2 yamt //
271 1.1.1.1.6.2 yamt // Allocate space for the return buffer of device handles.
272 1.1.1.1.6.2 yamt //
273 1.1.1.1.6.2 yamt
274 1.1.1.1.6.2 yamt *Buffer = AllocatePool(*NoHandles * sizeof(EFI_HANDLE));
275 1.1.1.1.6.2 yamt
276 1.1.1.1.6.2 yamt if (*Buffer == NULL) {
277 1.1.1.1.6.2 yamt FreePool(BlockIoBuffer);
278 1.1.1.1.6.2 yamt *NoHandles = 0;
279 1.1.1.1.6.2 yamt *Buffer = NULL;
280 1.1.1.1.6.2 yamt return EFI_OUT_OF_RESOURCES;
281 1.1.1.1.6.2 yamt }
282 1.1.1.1.6.2 yamt
283 1.1.1.1.6.2 yamt //
284 1.1.1.1.6.2 yamt // Build list of matching device handles.
285 1.1.1.1.6.2 yamt //
286 1.1.1.1.6.2 yamt
287 1.1.1.1.6.2 yamt *NoHandles = 0;
288 1.1.1.1.6.2 yamt for(Index=0;Index<NoBlockIoHandles;Index++) {
289 1.1.1.1.6.2 yamt if (BlockIoBuffer[Index] != NULL) {
290 1.1.1.1.6.2 yamt (*Buffer)[*NoHandles] = BlockIoBuffer[Index];
291 1.1.1.1.6.2 yamt *NoHandles = *NoHandles + 1;
292 1.1.1.1.6.2 yamt }
293 1.1.1.1.6.2 yamt }
294 1.1.1.1.6.2 yamt
295 1.1.1.1.6.2 yamt FreePool(BlockIoBuffer);
296 1.1.1.1.6.2 yamt
297 1.1.1.1.6.2 yamt return EFI_SUCCESS;
298 1.1.1.1.6.2 yamt }
299 1.1.1.1.6.2 yamt
300 1.1.1.1.6.2 yamt EFI_FILE_HANDLE
301 1.1.1.1.6.2 yamt LibOpenRoot (
302 1.1.1.1.6.2 yamt IN EFI_HANDLE DeviceHandle
303 1.1.1.1.6.2 yamt )
304 1.1.1.1.6.2 yamt {
305 1.1.1.1.6.2 yamt EFI_STATUS Status;
306 1.1.1.1.6.2 yamt EFI_FILE_IO_INTERFACE *Volume;
307 1.1.1.1.6.2 yamt EFI_FILE_HANDLE File;
308 1.1.1.1.6.2 yamt
309 1.1.1.1.6.2 yamt
310 1.1.1.1.6.2 yamt //
311 1.1.1.1.6.2 yamt // File the file system interface to the device
312 1.1.1.1.6.2 yamt //
313 1.1.1.1.6.2 yamt
314 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->HandleProtocol, 3, DeviceHandle, &FileSystemProtocol, (VOID*)&Volume);
315 1.1.1.1.6.2 yamt
316 1.1.1.1.6.2 yamt //
317 1.1.1.1.6.2 yamt // Open the root directory of the volume
318 1.1.1.1.6.2 yamt //
319 1.1.1.1.6.2 yamt
320 1.1.1.1.6.2 yamt if (!EFI_ERROR(Status)) {
321 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(Volume->OpenVolume, 2, Volume, &File);
322 1.1.1.1.6.2 yamt }
323 1.1.1.1.6.2 yamt
324 1.1.1.1.6.2 yamt //
325 1.1.1.1.6.2 yamt // Done
326 1.1.1.1.6.2 yamt //
327 1.1.1.1.6.2 yamt
328 1.1.1.1.6.2 yamt return EFI_ERROR(Status) ? NULL : File;
329 1.1.1.1.6.2 yamt }
330 1.1.1.1.6.2 yamt
331 1.1.1.1.6.2 yamt EFI_FILE_INFO *
332 1.1.1.1.6.2 yamt LibFileInfo (
333 1.1.1.1.6.2 yamt IN EFI_FILE_HANDLE FHand
334 1.1.1.1.6.2 yamt )
335 1.1.1.1.6.2 yamt {
336 1.1.1.1.6.2 yamt EFI_STATUS Status;
337 1.1.1.1.6.2 yamt EFI_FILE_INFO *Buffer;
338 1.1.1.1.6.2 yamt UINTN BufferSize;
339 1.1.1.1.6.2 yamt
340 1.1.1.1.6.2 yamt //
341 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
342 1.1.1.1.6.2 yamt //
343 1.1.1.1.6.2 yamt
344 1.1.1.1.6.2 yamt Buffer = NULL;
345 1.1.1.1.6.2 yamt BufferSize = SIZE_OF_EFI_FILE_INFO + 200;
346 1.1.1.1.6.2 yamt
347 1.1.1.1.6.2 yamt //
348 1.1.1.1.6.2 yamt // Call the real function
349 1.1.1.1.6.2 yamt //
350 1.1.1.1.6.2 yamt
351 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
352 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
353 1.1.1.1.6.2 yamt FHand->GetInfo,
354 1.1.1.1.6.2 yamt 4,
355 1.1.1.1.6.2 yamt FHand,
356 1.1.1.1.6.2 yamt &GenericFileInfo,
357 1.1.1.1.6.2 yamt &BufferSize,
358 1.1.1.1.6.2 yamt Buffer
359 1.1.1.1.6.2 yamt );
360 1.1.1.1.6.2 yamt }
361 1.1.1.1.6.2 yamt
362 1.1.1.1.6.2 yamt return Buffer;
363 1.1.1.1.6.2 yamt }
364 1.1.1.1.6.2 yamt
365 1.1.1.1.6.2 yamt
366 1.1.1.1.6.2 yamt EFI_FILE_SYSTEM_INFO *
367 1.1.1.1.6.2 yamt LibFileSystemInfo (
368 1.1.1.1.6.2 yamt IN EFI_FILE_HANDLE FHand
369 1.1.1.1.6.2 yamt )
370 1.1.1.1.6.2 yamt {
371 1.1.1.1.6.2 yamt EFI_STATUS Status;
372 1.1.1.1.6.2 yamt EFI_FILE_SYSTEM_INFO *Buffer;
373 1.1.1.1.6.2 yamt UINTN BufferSize;
374 1.1.1.1.6.2 yamt
375 1.1.1.1.6.2 yamt //
376 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
377 1.1.1.1.6.2 yamt //
378 1.1.1.1.6.2 yamt
379 1.1.1.1.6.2 yamt Buffer = NULL;
380 1.1.1.1.6.2 yamt BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + 200;
381 1.1.1.1.6.2 yamt
382 1.1.1.1.6.2 yamt //
383 1.1.1.1.6.2 yamt // Call the real function
384 1.1.1.1.6.2 yamt //
385 1.1.1.1.6.2 yamt
386 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
387 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
388 1.1.1.1.6.2 yamt FHand->GetInfo,
389 1.1.1.1.6.2 yamt 4,
390 1.1.1.1.6.2 yamt FHand,
391 1.1.1.1.6.2 yamt &FileSystemInfo,
392 1.1.1.1.6.2 yamt &BufferSize,
393 1.1.1.1.6.2 yamt Buffer
394 1.1.1.1.6.2 yamt );
395 1.1.1.1.6.2 yamt }
396 1.1.1.1.6.2 yamt
397 1.1.1.1.6.2 yamt return Buffer;
398 1.1.1.1.6.2 yamt }
399 1.1.1.1.6.2 yamt
400 1.1.1.1.6.2 yamt EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *
401 1.1.1.1.6.2 yamt LibFileSystemVolumeLabelInfo (
402 1.1.1.1.6.2 yamt IN EFI_FILE_HANDLE FHand
403 1.1.1.1.6.2 yamt )
404 1.1.1.1.6.2 yamt {
405 1.1.1.1.6.2 yamt EFI_STATUS Status;
406 1.1.1.1.6.2 yamt EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *Buffer;
407 1.1.1.1.6.2 yamt UINTN BufferSize;
408 1.1.1.1.6.2 yamt
409 1.1.1.1.6.2 yamt //
410 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
411 1.1.1.1.6.2 yamt //
412 1.1.1.1.6.2 yamt
413 1.1.1.1.6.2 yamt Buffer = NULL;
414 1.1.1.1.6.2 yamt BufferSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + 200;
415 1.1.1.1.6.2 yamt
416 1.1.1.1.6.2 yamt //
417 1.1.1.1.6.2 yamt // Call the real function
418 1.1.1.1.6.2 yamt //
419 1.1.1.1.6.2 yamt
420 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
421 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
422 1.1.1.1.6.2 yamt FHand->GetInfo,
423 1.1.1.1.6.2 yamt 4,
424 1.1.1.1.6.2 yamt FHand,
425 1.1.1.1.6.2 yamt &FileSystemVolumeLabelInfo,
426 1.1.1.1.6.2 yamt &BufferSize,
427 1.1.1.1.6.2 yamt Buffer
428 1.1.1.1.6.2 yamt );
429 1.1.1.1.6.2 yamt }
430 1.1.1.1.6.2 yamt
431 1.1.1.1.6.2 yamt return Buffer;
432 1.1.1.1.6.2 yamt }
433 1.1.1.1.6.2 yamt
434 1.1.1.1.6.2 yamt
435 1.1.1.1.6.2 yamt
436 1.1.1.1.6.2 yamt EFI_STATUS
437 1.1.1.1.6.2 yamt LibInstallProtocolInterfaces (
438 1.1.1.1.6.2 yamt IN OUT EFI_HANDLE *Handle,
439 1.1.1.1.6.2 yamt ...
440 1.1.1.1.6.2 yamt )
441 1.1.1.1.6.2 yamt {
442 1.1.1.1.6.2 yamt va_list args;
443 1.1.1.1.6.2 yamt EFI_STATUS Status;
444 1.1.1.1.6.2 yamt EFI_GUID *Protocol;
445 1.1.1.1.6.2 yamt VOID *Interface;
446 1.1.1.1.6.2 yamt EFI_TPL OldTpl;
447 1.1.1.1.6.2 yamt UINTN Index;
448 1.1.1.1.6.2 yamt EFI_HANDLE OldHandle;
449 1.1.1.1.6.2 yamt
450 1.1.1.1.6.2 yamt //
451 1.1.1.1.6.2 yamt // Syncronize with notifcations
452 1.1.1.1.6.2 yamt //
453 1.1.1.1.6.2 yamt
454 1.1.1.1.6.2 yamt OldTpl = uefi_call_wrapper(BS->RaiseTPL, 1, TPL_NOTIFY);
455 1.1.1.1.6.2 yamt OldHandle = *Handle;
456 1.1.1.1.6.2 yamt
457 1.1.1.1.6.2 yamt //
458 1.1.1.1.6.2 yamt // Install the protocol interfaces
459 1.1.1.1.6.2 yamt //
460 1.1.1.1.6.2 yamt
461 1.1.1.1.6.2 yamt Index = 0;
462 1.1.1.1.6.2 yamt Status = EFI_SUCCESS;
463 1.1.1.1.6.2 yamt va_start (args, Handle);
464 1.1.1.1.6.2 yamt
465 1.1.1.1.6.2 yamt while (!EFI_ERROR(Status)) {
466 1.1.1.1.6.2 yamt
467 1.1.1.1.6.2 yamt //
468 1.1.1.1.6.2 yamt // If protocol is NULL, then it's the end of the list
469 1.1.1.1.6.2 yamt //
470 1.1.1.1.6.2 yamt
471 1.1.1.1.6.2 yamt Protocol = va_arg(args, EFI_GUID *);
472 1.1.1.1.6.2 yamt if (!Protocol) {
473 1.1.1.1.6.2 yamt break;
474 1.1.1.1.6.2 yamt }
475 1.1.1.1.6.2 yamt
476 1.1.1.1.6.2 yamt Interface = va_arg(args, VOID *);
477 1.1.1.1.6.2 yamt
478 1.1.1.1.6.2 yamt //
479 1.1.1.1.6.2 yamt // Install it
480 1.1.1.1.6.2 yamt //
481 1.1.1.1.6.2 yamt
482 1.1.1.1.6.2 yamt DEBUG((D_INFO, "LibInstallProtocolInterface: %d %x\n", Protocol, Interface));
483 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->InstallProtocolInterface, 4, Handle, Protocol, EFI_NATIVE_INTERFACE, Interface);
484 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
485 1.1.1.1.6.2 yamt break;
486 1.1.1.1.6.2 yamt }
487 1.1.1.1.6.2 yamt
488 1.1.1.1.6.2 yamt Index += 1;
489 1.1.1.1.6.2 yamt }
490 1.1.1.1.6.2 yamt
491 1.1.1.1.6.2 yamt //
492 1.1.1.1.6.2 yamt // If there was an error, remove all the interfaces that were
493 1.1.1.1.6.2 yamt // installed without any errors
494 1.1.1.1.6.2 yamt //
495 1.1.1.1.6.2 yamt
496 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
497 1.1.1.1.6.2 yamt va_start (args, Handle);
498 1.1.1.1.6.2 yamt while (Index) {
499 1.1.1.1.6.2 yamt
500 1.1.1.1.6.2 yamt Protocol = va_arg(args, EFI_GUID *);
501 1.1.1.1.6.2 yamt Interface = va_arg(args, VOID *);
502 1.1.1.1.6.2 yamt uefi_call_wrapper(BS->UninstallProtocolInterface, 3, *Handle, Protocol, Interface);
503 1.1.1.1.6.2 yamt
504 1.1.1.1.6.2 yamt Index -= 1;
505 1.1.1.1.6.2 yamt }
506 1.1.1.1.6.2 yamt
507 1.1.1.1.6.2 yamt *Handle = OldHandle;
508 1.1.1.1.6.2 yamt }
509 1.1.1.1.6.2 yamt
510 1.1.1.1.6.2 yamt //
511 1.1.1.1.6.2 yamt // Done
512 1.1.1.1.6.2 yamt //
513 1.1.1.1.6.2 yamt
514 1.1.1.1.6.2 yamt uefi_call_wrapper(BS->RestoreTPL, 1, OldTpl);
515 1.1.1.1.6.2 yamt return Status;
516 1.1.1.1.6.2 yamt }
517 1.1.1.1.6.2 yamt
518 1.1.1.1.6.2 yamt
519 1.1.1.1.6.2 yamt VOID
520 1.1.1.1.6.2 yamt LibUninstallProtocolInterfaces (
521 1.1.1.1.6.2 yamt IN EFI_HANDLE Handle,
522 1.1.1.1.6.2 yamt ...
523 1.1.1.1.6.2 yamt )
524 1.1.1.1.6.2 yamt {
525 1.1.1.1.6.2 yamt va_list args;
526 1.1.1.1.6.2 yamt EFI_STATUS Status;
527 1.1.1.1.6.2 yamt EFI_GUID *Protocol;
528 1.1.1.1.6.2 yamt VOID *Interface;
529 1.1.1.1.6.2 yamt
530 1.1.1.1.6.2 yamt
531 1.1.1.1.6.2 yamt va_start (args, Handle);
532 1.1.1.1.6.2 yamt for (; ;) {
533 1.1.1.1.6.2 yamt
534 1.1.1.1.6.2 yamt //
535 1.1.1.1.6.2 yamt // If protocol is NULL, then it's the end of the list
536 1.1.1.1.6.2 yamt //
537 1.1.1.1.6.2 yamt
538 1.1.1.1.6.2 yamt Protocol = va_arg(args, EFI_GUID *);
539 1.1.1.1.6.2 yamt if (!Protocol) {
540 1.1.1.1.6.2 yamt break;
541 1.1.1.1.6.2 yamt }
542 1.1.1.1.6.2 yamt
543 1.1.1.1.6.2 yamt Interface = va_arg(args, VOID *);
544 1.1.1.1.6.2 yamt
545 1.1.1.1.6.2 yamt //
546 1.1.1.1.6.2 yamt // Uninstall it
547 1.1.1.1.6.2 yamt //
548 1.1.1.1.6.2 yamt
549 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->UninstallProtocolInterface, 3, Handle, Protocol, Interface);
550 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
551 1.1.1.1.6.2 yamt DEBUG((D_ERROR, "LibUninstallProtocolInterfaces: failed %g, %r\n", Protocol, Handle));
552 1.1.1.1.6.2 yamt }
553 1.1.1.1.6.2 yamt }
554 1.1.1.1.6.2 yamt }
555 1.1.1.1.6.2 yamt
556 1.1.1.1.6.2 yamt
557 1.1.1.1.6.2 yamt EFI_STATUS
558 1.1.1.1.6.2 yamt LibReinstallProtocolInterfaces (
559 1.1.1.1.6.2 yamt IN OUT EFI_HANDLE *Handle,
560 1.1.1.1.6.2 yamt ...
561 1.1.1.1.6.2 yamt )
562 1.1.1.1.6.2 yamt {
563 1.1.1.1.6.2 yamt va_list args;
564 1.1.1.1.6.2 yamt EFI_STATUS Status;
565 1.1.1.1.6.2 yamt EFI_GUID *Protocol;
566 1.1.1.1.6.2 yamt VOID *OldInterface, *NewInterface;
567 1.1.1.1.6.2 yamt EFI_TPL OldTpl;
568 1.1.1.1.6.2 yamt UINTN Index;
569 1.1.1.1.6.2 yamt
570 1.1.1.1.6.2 yamt //
571 1.1.1.1.6.2 yamt // Syncronize with notifcations
572 1.1.1.1.6.2 yamt //
573 1.1.1.1.6.2 yamt
574 1.1.1.1.6.2 yamt OldTpl = uefi_call_wrapper(BS->RaiseTPL, 1, TPL_NOTIFY);
575 1.1.1.1.6.2 yamt
576 1.1.1.1.6.2 yamt //
577 1.1.1.1.6.2 yamt // Install the protocol interfaces
578 1.1.1.1.6.2 yamt //
579 1.1.1.1.6.2 yamt
580 1.1.1.1.6.2 yamt Index = 0;
581 1.1.1.1.6.2 yamt Status = EFI_SUCCESS;
582 1.1.1.1.6.2 yamt va_start (args, Handle);
583 1.1.1.1.6.2 yamt
584 1.1.1.1.6.2 yamt while (!EFI_ERROR(Status)) {
585 1.1.1.1.6.2 yamt
586 1.1.1.1.6.2 yamt //
587 1.1.1.1.6.2 yamt // If protocol is NULL, then it's the end of the list
588 1.1.1.1.6.2 yamt //
589 1.1.1.1.6.2 yamt
590 1.1.1.1.6.2 yamt Protocol = va_arg(args, EFI_GUID *);
591 1.1.1.1.6.2 yamt if (!Protocol) {
592 1.1.1.1.6.2 yamt break;
593 1.1.1.1.6.2 yamt }
594 1.1.1.1.6.2 yamt
595 1.1.1.1.6.2 yamt OldInterface = va_arg(args, VOID *);
596 1.1.1.1.6.2 yamt NewInterface = va_arg(args, VOID *);
597 1.1.1.1.6.2 yamt
598 1.1.1.1.6.2 yamt //
599 1.1.1.1.6.2 yamt // Reinstall it
600 1.1.1.1.6.2 yamt //
601 1.1.1.1.6.2 yamt
602 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->ReinstallProtocolInterface, 4, Handle, Protocol, OldInterface, NewInterface);
603 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
604 1.1.1.1.6.2 yamt break;
605 1.1.1.1.6.2 yamt }
606 1.1.1.1.6.2 yamt
607 1.1.1.1.6.2 yamt Index += 1;
608 1.1.1.1.6.2 yamt }
609 1.1.1.1.6.2 yamt
610 1.1.1.1.6.2 yamt //
611 1.1.1.1.6.2 yamt // If there was an error, undo all the interfaces that were
612 1.1.1.1.6.2 yamt // reinstalled without any errors
613 1.1.1.1.6.2 yamt //
614 1.1.1.1.6.2 yamt
615 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
616 1.1.1.1.6.2 yamt va_start (args, Handle);
617 1.1.1.1.6.2 yamt while (Index) {
618 1.1.1.1.6.2 yamt
619 1.1.1.1.6.2 yamt Protocol = va_arg(args, EFI_GUID *);
620 1.1.1.1.6.2 yamt OldInterface = va_arg(args, VOID *);
621 1.1.1.1.6.2 yamt NewInterface = va_arg(args, VOID *);
622 1.1.1.1.6.2 yamt
623 1.1.1.1.6.2 yamt uefi_call_wrapper(BS->ReinstallProtocolInterface, 4, Handle, Protocol, NewInterface, OldInterface);
624 1.1.1.1.6.2 yamt
625 1.1.1.1.6.2 yamt Index -= 1;
626 1.1.1.1.6.2 yamt }
627 1.1.1.1.6.2 yamt }
628 1.1.1.1.6.2 yamt
629 1.1.1.1.6.2 yamt //
630 1.1.1.1.6.2 yamt // Done
631 1.1.1.1.6.2 yamt //
632 1.1.1.1.6.2 yamt
633 1.1.1.1.6.2 yamt uefi_call_wrapper(BS->RestoreTPL, 1, OldTpl);
634 1.1.1.1.6.2 yamt return Status;
635 1.1.1.1.6.2 yamt }
636