misc.c revision 1.1.1.1.34.1 1 1.1.1.1.34.1 pgoyette /* $NetBSD: misc.c,v 1.1.1.1.34.1 2018/09/06 06:56:39 pgoyette Exp $ */
2 1.1 jakllsch
3 1.1 jakllsch /*++
4 1.1 jakllsch
5 1.1 jakllsch Copyright (c) 1998 Intel Corporation
6 1.1 jakllsch
7 1.1 jakllsch Module Name:
8 1.1 jakllsch
9 1.1 jakllsch misc.c
10 1.1 jakllsch
11 1.1 jakllsch Abstract:
12 1.1 jakllsch
13 1.1 jakllsch
14 1.1 jakllsch
15 1.1 jakllsch
16 1.1 jakllsch Revision History
17 1.1 jakllsch
18 1.1 jakllsch --*/
19 1.1 jakllsch
20 1.1 jakllsch #include "lib.h"
21 1.1 jakllsch
22 1.1 jakllsch
23 1.1 jakllsch //
24 1.1 jakllsch //
25 1.1 jakllsch //
26 1.1 jakllsch
27 1.1 jakllsch VOID *
28 1.1 jakllsch AllocatePool (
29 1.1 jakllsch IN UINTN Size
30 1.1 jakllsch )
31 1.1 jakllsch {
32 1.1 jakllsch EFI_STATUS Status;
33 1.1 jakllsch VOID *p;
34 1.1 jakllsch
35 1.1 jakllsch Status = uefi_call_wrapper(BS->AllocatePool, 3, PoolAllocationType, Size, &p);
36 1.1 jakllsch if (EFI_ERROR(Status)) {
37 1.1 jakllsch DEBUG((D_ERROR, "AllocatePool: out of pool %x\n", Status));
38 1.1 jakllsch p = NULL;
39 1.1 jakllsch }
40 1.1 jakllsch return p;
41 1.1 jakllsch }
42 1.1 jakllsch
43 1.1 jakllsch VOID *
44 1.1 jakllsch AllocateZeroPool (
45 1.1 jakllsch IN UINTN Size
46 1.1 jakllsch )
47 1.1 jakllsch {
48 1.1 jakllsch VOID *p;
49 1.1 jakllsch
50 1.1 jakllsch p = AllocatePool (Size);
51 1.1 jakllsch if (p) {
52 1.1 jakllsch ZeroMem (p, Size);
53 1.1 jakllsch }
54 1.1 jakllsch
55 1.1 jakllsch return p;
56 1.1 jakllsch }
57 1.1 jakllsch
58 1.1 jakllsch VOID *
59 1.1 jakllsch ReallocatePool (
60 1.1 jakllsch IN VOID *OldPool,
61 1.1 jakllsch IN UINTN OldSize,
62 1.1 jakllsch IN UINTN NewSize
63 1.1 jakllsch )
64 1.1 jakllsch {
65 1.1 jakllsch VOID *NewPool;
66 1.1 jakllsch
67 1.1 jakllsch NewPool = NULL;
68 1.1 jakllsch if (NewSize) {
69 1.1 jakllsch NewPool = AllocatePool (NewSize);
70 1.1 jakllsch }
71 1.1 jakllsch
72 1.1 jakllsch if (OldPool) {
73 1.1 jakllsch if (NewPool) {
74 1.1 jakllsch CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
75 1.1 jakllsch }
76 1.1 jakllsch
77 1.1 jakllsch FreePool (OldPool);
78 1.1 jakllsch }
79 1.1 jakllsch
80 1.1 jakllsch return NewPool;
81 1.1 jakllsch }
82 1.1 jakllsch
83 1.1 jakllsch
84 1.1 jakllsch VOID
85 1.1 jakllsch FreePool (
86 1.1 jakllsch IN VOID *Buffer
87 1.1 jakllsch )
88 1.1 jakllsch {
89 1.1 jakllsch uefi_call_wrapper(BS->FreePool, 1, Buffer);
90 1.1 jakllsch }
91 1.1 jakllsch
92 1.1 jakllsch
93 1.1 jakllsch
94 1.1 jakllsch VOID
95 1.1 jakllsch ZeroMem (
96 1.1 jakllsch IN VOID *Buffer,
97 1.1 jakllsch IN UINTN Size
98 1.1 jakllsch )
99 1.1 jakllsch {
100 1.1 jakllsch RtZeroMem (Buffer, Size);
101 1.1 jakllsch }
102 1.1 jakllsch
103 1.1 jakllsch VOID
104 1.1 jakllsch SetMem (
105 1.1 jakllsch IN VOID *Buffer,
106 1.1 jakllsch IN UINTN Size,
107 1.1 jakllsch IN UINT8 Value
108 1.1 jakllsch )
109 1.1 jakllsch {
110 1.1 jakllsch RtSetMem (Buffer, Size, Value);
111 1.1 jakllsch }
112 1.1 jakllsch
113 1.1 jakllsch VOID
114 1.1 jakllsch CopyMem (
115 1.1 jakllsch IN VOID *Dest,
116 1.1.1.1.34.1 pgoyette IN CONST VOID *Src,
117 1.1 jakllsch IN UINTN len
118 1.1 jakllsch )
119 1.1 jakllsch {
120 1.1 jakllsch RtCopyMem (Dest, Src, len);
121 1.1 jakllsch }
122 1.1 jakllsch
123 1.1 jakllsch INTN
124 1.1 jakllsch CompareMem (
125 1.1.1.1.34.1 pgoyette IN CONST VOID *Dest,
126 1.1.1.1.34.1 pgoyette IN CONST VOID *Src,
127 1.1 jakllsch IN UINTN len
128 1.1 jakllsch )
129 1.1 jakllsch {
130 1.1 jakllsch return RtCompareMem (Dest, Src, len);
131 1.1 jakllsch }
132 1.1 jakllsch
133 1.1 jakllsch BOOLEAN
134 1.1 jakllsch GrowBuffer(
135 1.1 jakllsch IN OUT EFI_STATUS *Status,
136 1.1 jakllsch IN OUT VOID **Buffer,
137 1.1 jakllsch IN UINTN BufferSize
138 1.1 jakllsch )
139 1.1 jakllsch /*++
140 1.1 jakllsch
141 1.1 jakllsch Routine Description:
142 1.1 jakllsch
143 1.1 jakllsch Helper function called as part of the code needed
144 1.1 jakllsch to allocate the proper sized buffer for various
145 1.1 jakllsch EFI interfaces.
146 1.1 jakllsch
147 1.1 jakllsch Arguments:
148 1.1 jakllsch
149 1.1 jakllsch Status - Current status
150 1.1 jakllsch
151 1.1 jakllsch Buffer - Current allocated buffer, or NULL
152 1.1 jakllsch
153 1.1 jakllsch BufferSize - Current buffer size needed
154 1.1 jakllsch
155 1.1 jakllsch Returns:
156 1.1 jakllsch
157 1.1 jakllsch TRUE - if the buffer was reallocated and the caller
158 1.1 jakllsch should try the API again.
159 1.1 jakllsch
160 1.1 jakllsch --*/
161 1.1 jakllsch {
162 1.1 jakllsch BOOLEAN TryAgain;
163 1.1 jakllsch
164 1.1 jakllsch //
165 1.1 jakllsch // If this is an initial request, buffer will be null with a new buffer size
166 1.1 jakllsch //
167 1.1 jakllsch
168 1.1 jakllsch if (!*Buffer && BufferSize) {
169 1.1 jakllsch *Status = EFI_BUFFER_TOO_SMALL;
170 1.1 jakllsch }
171 1.1 jakllsch
172 1.1 jakllsch //
173 1.1 jakllsch // If the status code is "buffer too small", resize the buffer
174 1.1 jakllsch //
175 1.1 jakllsch
176 1.1 jakllsch TryAgain = FALSE;
177 1.1 jakllsch if (*Status == EFI_BUFFER_TOO_SMALL) {
178 1.1 jakllsch
179 1.1 jakllsch if (*Buffer) {
180 1.1 jakllsch FreePool (*Buffer);
181 1.1 jakllsch }
182 1.1 jakllsch
183 1.1 jakllsch *Buffer = AllocatePool (BufferSize);
184 1.1 jakllsch
185 1.1 jakllsch if (*Buffer) {
186 1.1 jakllsch TryAgain = TRUE;
187 1.1 jakllsch } else {
188 1.1 jakllsch *Status = EFI_OUT_OF_RESOURCES;
189 1.1 jakllsch }
190 1.1 jakllsch }
191 1.1 jakllsch
192 1.1 jakllsch //
193 1.1 jakllsch // If there's an error, free the buffer
194 1.1 jakllsch //
195 1.1 jakllsch
196 1.1 jakllsch if (!TryAgain && EFI_ERROR(*Status) && *Buffer) {
197 1.1 jakllsch FreePool (*Buffer);
198 1.1 jakllsch *Buffer = NULL;
199 1.1 jakllsch }
200 1.1 jakllsch
201 1.1 jakllsch return TryAgain;
202 1.1 jakllsch }
203 1.1 jakllsch
204 1.1 jakllsch
205 1.1 jakllsch EFI_MEMORY_DESCRIPTOR *
206 1.1 jakllsch LibMemoryMap (
207 1.1 jakllsch OUT UINTN *NoEntries,
208 1.1 jakllsch OUT UINTN *MapKey,
209 1.1 jakllsch OUT UINTN *DescriptorSize,
210 1.1 jakllsch OUT UINT32 *DescriptorVersion
211 1.1 jakllsch )
212 1.1 jakllsch {
213 1.1 jakllsch EFI_STATUS Status;
214 1.1 jakllsch EFI_MEMORY_DESCRIPTOR *Buffer;
215 1.1 jakllsch UINTN BufferSize;
216 1.1 jakllsch
217 1.1 jakllsch //
218 1.1 jakllsch // Initialize for GrowBuffer loop
219 1.1 jakllsch //
220 1.1 jakllsch
221 1.1.1.1.34.1 pgoyette Status = EFI_SUCCESS;
222 1.1 jakllsch Buffer = NULL;
223 1.1 jakllsch BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR);
224 1.1 jakllsch
225 1.1 jakllsch //
226 1.1 jakllsch // Call the real function
227 1.1 jakllsch //
228 1.1 jakllsch
229 1.1 jakllsch while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
230 1.1 jakllsch Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion);
231 1.1 jakllsch }
232 1.1 jakllsch
233 1.1 jakllsch //
234 1.1 jakllsch // Convert buffer size to NoEntries
235 1.1 jakllsch //
236 1.1 jakllsch
237 1.1 jakllsch if (!EFI_ERROR(Status)) {
238 1.1 jakllsch *NoEntries = BufferSize / *DescriptorSize;
239 1.1 jakllsch }
240 1.1 jakllsch
241 1.1 jakllsch return Buffer;
242 1.1 jakllsch }
243 1.1 jakllsch
244 1.1 jakllsch VOID *
245 1.1 jakllsch LibGetVariableAndSize (
246 1.1 jakllsch IN CHAR16 *Name,
247 1.1 jakllsch IN EFI_GUID *VendorGuid,
248 1.1 jakllsch OUT UINTN *VarSize
249 1.1 jakllsch )
250 1.1 jakllsch {
251 1.1 jakllsch EFI_STATUS Status;
252 1.1 jakllsch VOID *Buffer;
253 1.1 jakllsch UINTN BufferSize;
254 1.1 jakllsch
255 1.1 jakllsch //
256 1.1 jakllsch // Initialize for GrowBuffer loop
257 1.1 jakllsch //
258 1.1 jakllsch
259 1.1 jakllsch Buffer = NULL;
260 1.1 jakllsch BufferSize = 100;
261 1.1 jakllsch
262 1.1 jakllsch //
263 1.1 jakllsch // Call the real function
264 1.1 jakllsch //
265 1.1 jakllsch
266 1.1 jakllsch while (GrowBuffer (&Status, &Buffer, BufferSize)) {
267 1.1 jakllsch Status = uefi_call_wrapper(
268 1.1 jakllsch RT->GetVariable,
269 1.1 jakllsch 5,
270 1.1 jakllsch Name,
271 1.1 jakllsch VendorGuid,
272 1.1 jakllsch NULL,
273 1.1 jakllsch &BufferSize,
274 1.1 jakllsch Buffer
275 1.1 jakllsch );
276 1.1 jakllsch }
277 1.1 jakllsch if (Buffer) {
278 1.1 jakllsch *VarSize = BufferSize;
279 1.1 jakllsch } else {
280 1.1 jakllsch *VarSize = 0;
281 1.1 jakllsch }
282 1.1 jakllsch return Buffer;
283 1.1 jakllsch }
284 1.1 jakllsch
285 1.1 jakllsch VOID *
286 1.1 jakllsch LibGetVariable (
287 1.1 jakllsch IN CHAR16 *Name,
288 1.1 jakllsch IN EFI_GUID *VendorGuid
289 1.1 jakllsch )
290 1.1 jakllsch {
291 1.1 jakllsch UINTN VarSize;
292 1.1 jakllsch
293 1.1 jakllsch return LibGetVariableAndSize (Name, VendorGuid, &VarSize);
294 1.1 jakllsch }
295 1.1 jakllsch
296 1.1 jakllsch EFI_STATUS
297 1.1 jakllsch LibDeleteVariable (
298 1.1 jakllsch IN CHAR16 *VarName,
299 1.1 jakllsch IN EFI_GUID *VarGuid
300 1.1 jakllsch )
301 1.1 jakllsch {
302 1.1 jakllsch VOID *VarBuf;
303 1.1 jakllsch EFI_STATUS Status;
304 1.1 jakllsch
305 1.1 jakllsch VarBuf = LibGetVariable(VarName,VarGuid);
306 1.1 jakllsch
307 1.1 jakllsch Status = EFI_NOT_FOUND;
308 1.1 jakllsch
309 1.1 jakllsch if (VarBuf) {
310 1.1 jakllsch //
311 1.1 jakllsch // Delete variable from Storage
312 1.1 jakllsch //
313 1.1 jakllsch Status = uefi_call_wrapper(
314 1.1 jakllsch RT->SetVariable,
315 1.1 jakllsch 5,
316 1.1 jakllsch VarName, VarGuid,
317 1.1 jakllsch EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
318 1.1 jakllsch 0, NULL
319 1.1 jakllsch );
320 1.1 jakllsch ASSERT (!EFI_ERROR(Status));
321 1.1 jakllsch FreePool(VarBuf);
322 1.1 jakllsch }
323 1.1 jakllsch
324 1.1 jakllsch return (Status);
325 1.1 jakllsch }
326 1.1 jakllsch
327 1.1 jakllsch EFI_STATUS
328 1.1.1.1.34.1 pgoyette LibSetNVVariable (
329 1.1.1.1.34.1 pgoyette IN CHAR16 *VarName,
330 1.1.1.1.34.1 pgoyette IN EFI_GUID *VarGuid,
331 1.1.1.1.34.1 pgoyette IN UINTN DataSize,
332 1.1.1.1.34.1 pgoyette IN VOID *Data
333 1.1.1.1.34.1 pgoyette )
334 1.1.1.1.34.1 pgoyette {
335 1.1.1.1.34.1 pgoyette EFI_STATUS Status;
336 1.1.1.1.34.1 pgoyette
337 1.1.1.1.34.1 pgoyette Status = uefi_call_wrapper(
338 1.1.1.1.34.1 pgoyette RT->SetVariable,
339 1.1.1.1.34.1 pgoyette 5,
340 1.1.1.1.34.1 pgoyette VarName, VarGuid,
341 1.1.1.1.34.1 pgoyette EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
342 1.1.1.1.34.1 pgoyette DataSize, Data
343 1.1.1.1.34.1 pgoyette );
344 1.1.1.1.34.1 pgoyette ASSERT (!EFI_ERROR(Status));
345 1.1.1.1.34.1 pgoyette return (Status);
346 1.1.1.1.34.1 pgoyette }
347 1.1.1.1.34.1 pgoyette
348 1.1.1.1.34.1 pgoyette EFI_STATUS
349 1.1.1.1.34.1 pgoyette LibSetVariable (
350 1.1.1.1.34.1 pgoyette IN CHAR16 *VarName,
351 1.1.1.1.34.1 pgoyette IN EFI_GUID *VarGuid,
352 1.1.1.1.34.1 pgoyette IN UINTN DataSize,
353 1.1.1.1.34.1 pgoyette IN VOID *Data
354 1.1.1.1.34.1 pgoyette )
355 1.1.1.1.34.1 pgoyette {
356 1.1.1.1.34.1 pgoyette EFI_STATUS Status;
357 1.1.1.1.34.1 pgoyette
358 1.1.1.1.34.1 pgoyette Status = uefi_call_wrapper(
359 1.1.1.1.34.1 pgoyette RT->SetVariable,
360 1.1.1.1.34.1 pgoyette 5,
361 1.1.1.1.34.1 pgoyette VarName, VarGuid,
362 1.1.1.1.34.1 pgoyette EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
363 1.1.1.1.34.1 pgoyette DataSize, Data
364 1.1.1.1.34.1 pgoyette );
365 1.1.1.1.34.1 pgoyette ASSERT (!EFI_ERROR(Status));
366 1.1.1.1.34.1 pgoyette return (Status);
367 1.1.1.1.34.1 pgoyette }
368 1.1.1.1.34.1 pgoyette
369 1.1.1.1.34.1 pgoyette EFI_STATUS
370 1.1 jakllsch LibInsertToTailOfBootOrder (
371 1.1 jakllsch IN UINT16 BootOption,
372 1.1 jakllsch IN BOOLEAN OnlyInsertIfEmpty
373 1.1 jakllsch )
374 1.1 jakllsch {
375 1.1 jakllsch UINT16 *BootOptionArray;
376 1.1 jakllsch UINT16 *NewBootOptionArray;
377 1.1 jakllsch UINTN VarSize;
378 1.1 jakllsch UINTN Index;
379 1.1 jakllsch EFI_STATUS Status;
380 1.1 jakllsch
381 1.1 jakllsch BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize);
382 1.1 jakllsch if (VarSize != 0 && OnlyInsertIfEmpty) {
383 1.1 jakllsch if (BootOptionArray) {
384 1.1 jakllsch FreePool (BootOptionArray);
385 1.1 jakllsch }
386 1.1 jakllsch return EFI_UNSUPPORTED;
387 1.1 jakllsch }
388 1.1 jakllsch
389 1.1 jakllsch VarSize += sizeof(UINT16);
390 1.1 jakllsch NewBootOptionArray = AllocatePool (VarSize);
391 1.1 jakllsch
392 1.1 jakllsch for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) {
393 1.1 jakllsch NewBootOptionArray[Index] = BootOptionArray[Index];
394 1.1 jakllsch }
395 1.1 jakllsch //
396 1.1 jakllsch // Insert in the tail of the array
397 1.1 jakllsch //
398 1.1 jakllsch NewBootOptionArray[Index] = BootOption;
399 1.1 jakllsch
400 1.1 jakllsch Status = uefi_call_wrapper(
401 1.1 jakllsch RT->SetVariable,
402 1.1 jakllsch 5,
403 1.1 jakllsch VarBootOrder, &EfiGlobalVariable,
404 1.1 jakllsch EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
405 1.1 jakllsch VarSize, (VOID*) NewBootOptionArray
406 1.1 jakllsch );
407 1.1 jakllsch
408 1.1 jakllsch if (NewBootOptionArray) {
409 1.1 jakllsch FreePool (NewBootOptionArray);
410 1.1 jakllsch }
411 1.1 jakllsch if (BootOptionArray) {
412 1.1 jakllsch FreePool (BootOptionArray);
413 1.1 jakllsch }
414 1.1 jakllsch return Status;
415 1.1 jakllsch }
416 1.1 jakllsch
417 1.1 jakllsch
418 1.1 jakllsch BOOLEAN
419 1.1 jakllsch ValidMBR(
420 1.1 jakllsch IN MASTER_BOOT_RECORD *Mbr,
421 1.1 jakllsch IN EFI_BLOCK_IO *BlkIo
422 1.1 jakllsch )
423 1.1 jakllsch {
424 1.1 jakllsch UINT32 StartingLBA, EndingLBA;
425 1.1 jakllsch UINT32 NewEndingLBA;
426 1.1 jakllsch INTN i, j;
427 1.1 jakllsch BOOLEAN ValidMbr;
428 1.1 jakllsch
429 1.1 jakllsch if (Mbr->Signature != MBR_SIGNATURE) {
430 1.1 jakllsch //
431 1.1 jakllsch // The BPB also has this signature, so it can not be used alone.
432 1.1 jakllsch //
433 1.1 jakllsch return FALSE;
434 1.1 jakllsch }
435 1.1 jakllsch
436 1.1 jakllsch ValidMbr = FALSE;
437 1.1 jakllsch for (i=0; i<MAX_MBR_PARTITIONS; i++) {
438 1.1 jakllsch if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) {
439 1.1 jakllsch continue;
440 1.1 jakllsch }
441 1.1 jakllsch ValidMbr = TRUE;
442 1.1 jakllsch StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA);
443 1.1 jakllsch EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1;
444 1.1 jakllsch if (EndingLBA > BlkIo->Media->LastBlock) {
445 1.1 jakllsch //
446 1.1 jakllsch // Compatability Errata:
447 1.1 jakllsch // Some systems try to hide drive space with thier INT 13h driver
448 1.1 jakllsch // This does not hide space from the OS driver. This means the MBR
449 1.1 jakllsch // that gets created from DOS is smaller than the MBR created from
450 1.1 jakllsch // a real OS (NT & Win98). This leads to BlkIo->LastBlock being
451 1.1 jakllsch // wrong on some systems FDISKed by the OS.
452 1.1 jakllsch //
453 1.1 jakllsch //
454 1.1 jakllsch if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) {
455 1.1 jakllsch //
456 1.1 jakllsch // If this is a very small device then trust the BlkIo->LastBlock
457 1.1 jakllsch //
458 1.1 jakllsch return FALSE;
459 1.1 jakllsch }
460 1.1 jakllsch
461 1.1 jakllsch if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) {
462 1.1 jakllsch return FALSE;
463 1.1 jakllsch }
464 1.1 jakllsch
465 1.1 jakllsch }
466 1.1 jakllsch for (j=i+1; j<MAX_MBR_PARTITIONS; j++) {
467 1.1 jakllsch if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) {
468 1.1 jakllsch continue;
469 1.1 jakllsch }
470 1.1 jakllsch if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA &&
471 1.1 jakllsch EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) {
472 1.1 jakllsch //
473 1.1 jakllsch // The Start of this region overlaps with the i'th region
474 1.1 jakllsch //
475 1.1 jakllsch return FALSE;
476 1.1 jakllsch }
477 1.1 jakllsch NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1;
478 1.1 jakllsch if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) {
479 1.1 jakllsch //
480 1.1 jakllsch // The End of this region overlaps with the i'th region
481 1.1 jakllsch //
482 1.1 jakllsch return FALSE;
483 1.1 jakllsch }
484 1.1 jakllsch }
485 1.1 jakllsch }
486 1.1 jakllsch //
487 1.1 jakllsch // Non of the regions overlapped so MBR is O.K.
488 1.1 jakllsch //
489 1.1 jakllsch return ValidMbr;
490 1.1 jakllsch }
491 1.1 jakllsch
492 1.1 jakllsch
493 1.1 jakllsch UINT8
494 1.1 jakllsch DecimaltoBCD(
495 1.1 jakllsch IN UINT8 DecValue
496 1.1 jakllsch )
497 1.1 jakllsch {
498 1.1 jakllsch return RtDecimaltoBCD (DecValue);
499 1.1 jakllsch }
500 1.1 jakllsch
501 1.1 jakllsch
502 1.1 jakllsch UINT8
503 1.1 jakllsch BCDtoDecimal(
504 1.1 jakllsch IN UINT8 BcdValue
505 1.1 jakllsch )
506 1.1 jakllsch {
507 1.1 jakllsch return RtBCDtoDecimal (BcdValue);
508 1.1 jakllsch }
509 1.1 jakllsch
510 1.1 jakllsch EFI_STATUS
511 1.1 jakllsch LibGetSystemConfigurationTable(
512 1.1 jakllsch IN EFI_GUID *TableGuid,
513 1.1 jakllsch IN OUT VOID **Table
514 1.1 jakllsch )
515 1.1 jakllsch
516 1.1 jakllsch {
517 1.1 jakllsch UINTN Index;
518 1.1 jakllsch
519 1.1 jakllsch for(Index=0;Index<ST->NumberOfTableEntries;Index++) {
520 1.1 jakllsch if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) {
521 1.1 jakllsch *Table = ST->ConfigurationTable[Index].VendorTable;
522 1.1 jakllsch return EFI_SUCCESS;
523 1.1 jakllsch }
524 1.1 jakllsch }
525 1.1 jakllsch return EFI_NOT_FOUND;
526 1.1 jakllsch }
527 1.1 jakllsch
528 1.1 jakllsch
529 1.1 jakllsch CHAR16 *
530 1.1 jakllsch LibGetUiString (
531 1.1 jakllsch IN EFI_HANDLE Handle,
532 1.1 jakllsch IN UI_STRING_TYPE StringType,
533 1.1 jakllsch IN ISO_639_2 *LangCode,
534 1.1 jakllsch IN BOOLEAN ReturnDevicePathStrOnMismatch
535 1.1 jakllsch )
536 1.1 jakllsch {
537 1.1 jakllsch UI_INTERFACE *Ui;
538 1.1 jakllsch UI_STRING_TYPE Index;
539 1.1 jakllsch UI_STRING_ENTRY *Array;
540 1.1 jakllsch EFI_STATUS Status;
541 1.1 jakllsch
542 1.1 jakllsch Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui);
543 1.1 jakllsch if (EFI_ERROR(Status)) {
544 1.1 jakllsch return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
545 1.1 jakllsch }
546 1.1 jakllsch
547 1.1 jakllsch //
548 1.1 jakllsch // Skip the first strings
549 1.1 jakllsch //
550 1.1 jakllsch for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) {
551 1.1 jakllsch while (Array->LangCode) {
552 1.1 jakllsch Array++;
553 1.1 jakllsch }
554 1.1 jakllsch }
555 1.1 jakllsch
556 1.1 jakllsch //
557 1.1 jakllsch // Search for the match
558 1.1 jakllsch //
559 1.1 jakllsch while (Array->LangCode) {
560 1.1 jakllsch if (strcmpa (Array->LangCode, LangCode) == 0) {
561 1.1 jakllsch return Array->UiString;
562 1.1 jakllsch }
563 1.1 jakllsch }
564 1.1 jakllsch return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
565 1.1 jakllsch }
566