3 Copyright (c) 1998 Intel Corporation
33 Status
= uefi_call_wrapper(BS
->AllocatePool
, 3, PoolAllocationType
, Size
, &p
);
34 if (EFI_ERROR(Status
)) {
35 DEBUG((D_ERROR
, "AllocatePool: out of pool %x\n", Status
));
48 p
= AllocatePool (Size
);
67 NewPool
= AllocatePool (NewSize
);
72 CopyMem (NewPool
, OldPool
, OldSize
< NewSize
? OldSize
: NewSize
);
87 uefi_call_wrapper(BS
->FreePool
, 1, Buffer
);
98 RtZeroMem (Buffer
, Size
);
108 RtSetMem (Buffer
, Size
, Value
);
118 RtCopyMem (Dest
, Src
, len
);
128 return RtCompareMem (Dest
, Src
, len
);
133 IN OUT EFI_STATUS
*Status
,
134 IN OUT VOID
**Buffer
,
141 Helper function called as part of the code needed
142 to allocate the proper sized buffer for various
147 Status - Current status
149 Buffer - Current allocated buffer, or NULL
151 BufferSize - Current buffer size needed
155 TRUE - if the buffer was reallocated and the caller
156 should try the API again.
163 // If this is an initial request, buffer will be null with a new buffer size
166 if (!*Buffer
&& BufferSize
) {
167 *Status
= EFI_BUFFER_TOO_SMALL
;
171 // If the status code is "buffer too small", resize the buffer
175 if (*Status
== EFI_BUFFER_TOO_SMALL
) {
181 *Buffer
= AllocatePool (BufferSize
);
186 *Status
= EFI_OUT_OF_RESOURCES
;
191 // If there's an error, free the buffer
194 if (!TryAgain
&& EFI_ERROR(*Status
) && *Buffer
) {
203 EFI_MEMORY_DESCRIPTOR
*
205 OUT UINTN
*NoEntries
,
207 OUT UINTN
*DescriptorSize
,
208 OUT UINT32
*DescriptorVersion
212 EFI_MEMORY_DESCRIPTOR
*Buffer
;
216 // Initialize for GrowBuffer loop
219 Status
= EFI_SUCCESS
;
221 BufferSize
= sizeof(EFI_MEMORY_DESCRIPTOR
);
224 // Call the real function
227 while (GrowBuffer (&Status
, (VOID
**) &Buffer
, BufferSize
)) {
228 Status
= uefi_call_wrapper(BS
->GetMemoryMap
, 5, &BufferSize
, Buffer
, MapKey
, DescriptorSize
, DescriptorVersion
);
232 // Convert buffer size to NoEntries
235 if (!EFI_ERROR(Status
)) {
236 *NoEntries
= BufferSize
/ *DescriptorSize
;
243 LibGetVariableAndSize (
245 IN EFI_GUID
*VendorGuid
,
254 // Initialize for GrowBuffer loop
261 // Call the real function
264 while (GrowBuffer (&Status
, &Buffer
, BufferSize
)) {
265 Status
= uefi_call_wrapper(
276 *VarSize
= BufferSize
;
286 IN EFI_GUID
*VendorGuid
291 return LibGetVariableAndSize (Name
, VendorGuid
, &VarSize
);
303 VarBuf
= LibGetVariable(VarName
,VarGuid
);
305 Status
= EFI_NOT_FOUND
;
309 // Delete variable from Storage
311 Status
= uefi_call_wrapper(
315 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
| EFI_VARIABLE_NON_VOLATILE
,
318 ASSERT (!EFI_ERROR(Status
));
328 IN EFI_GUID
*VarGuid
,
335 Status
= uefi_call_wrapper(
339 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
| EFI_VARIABLE_NON_VOLATILE
,
342 ASSERT (!EFI_ERROR(Status
));
349 IN EFI_GUID
*VarGuid
,
356 Status
= uefi_call_wrapper(
360 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
363 ASSERT (!EFI_ERROR(Status
));
368 LibInsertToTailOfBootOrder (
369 IN UINT16 BootOption
,
370 IN BOOLEAN OnlyInsertIfEmpty
373 UINT16
*BootOptionArray
;
374 UINT16
*NewBootOptionArray
;
379 BootOptionArray
= LibGetVariableAndSize (VarBootOrder
, &EfiGlobalVariable
, &VarSize
);
380 if (VarSize
!= 0 && OnlyInsertIfEmpty
) {
381 if (BootOptionArray
) {
382 FreePool (BootOptionArray
);
384 return EFI_UNSUPPORTED
;
387 VarSize
+= sizeof(UINT16
);
388 NewBootOptionArray
= AllocatePool (VarSize
);
390 for (Index
= 0; Index
< ((VarSize
/sizeof(UINT16
)) - 1); Index
++) {
391 NewBootOptionArray
[Index
] = BootOptionArray
[Index
];
394 // Insert in the tail of the array
396 NewBootOptionArray
[Index
] = BootOption
;
398 Status
= uefi_call_wrapper(
401 VarBootOrder
, &EfiGlobalVariable
,
402 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
| EFI_VARIABLE_NON_VOLATILE
,
403 VarSize
, (VOID
*) NewBootOptionArray
406 if (NewBootOptionArray
) {
407 FreePool (NewBootOptionArray
);
409 if (BootOptionArray
) {
410 FreePool (BootOptionArray
);
418 IN MASTER_BOOT_RECORD
*Mbr
,
419 IN EFI_BLOCK_IO
*BlkIo
422 UINT32 StartingLBA
, EndingLBA
;
427 if (Mbr
->Signature
!= MBR_SIGNATURE
) {
429 // The BPB also has this signature, so it can not be used alone.
435 for (i
=0; i
<MAX_MBR_PARTITIONS
; i
++) {
436 if ( Mbr
->Partition
[i
].OSIndicator
== 0x00 || EXTRACT_UINT32(Mbr
->Partition
[i
].SizeInLBA
) == 0 ) {
440 StartingLBA
= EXTRACT_UINT32(Mbr
->Partition
[i
].StartingLBA
);
441 EndingLBA
= StartingLBA
+ EXTRACT_UINT32(Mbr
->Partition
[i
].SizeInLBA
) - 1;
442 if (EndingLBA
> BlkIo
->Media
->LastBlock
) {
444 // Compatability Errata:
445 // Some systems try to hide drive space with thier INT 13h driver
446 // This does not hide space from the OS driver. This means the MBR
447 // that gets created from DOS is smaller than the MBR created from
448 // a real OS (NT & Win98). This leads to BlkIo->LastBlock being
449 // wrong on some systems FDISKed by the OS.
452 if (BlkIo
->Media
->LastBlock
< MIN_MBR_DEVICE_SIZE
) {
454 // If this is a very small device then trust the BlkIo->LastBlock
459 if (EndingLBA
> (BlkIo
->Media
->LastBlock
+ MBR_ERRATA_PAD
)) {
464 for (j
=i
+1; j
<MAX_MBR_PARTITIONS
; j
++) {
465 if (Mbr
->Partition
[j
].OSIndicator
== 0x00 || EXTRACT_UINT32(Mbr
->Partition
[j
].SizeInLBA
) == 0) {
468 if ( EXTRACT_UINT32(Mbr
->Partition
[j
].StartingLBA
) >= StartingLBA
&&
469 EXTRACT_UINT32(Mbr
->Partition
[j
].StartingLBA
) <= EndingLBA
) {
471 // The Start of this region overlaps with the i'th region
475 NewEndingLBA
= EXTRACT_UINT32(Mbr
->Partition
[j
].StartingLBA
) + EXTRACT_UINT32(Mbr
->Partition
[j
].SizeInLBA
) - 1;
476 if ( NewEndingLBA
>= StartingLBA
&& NewEndingLBA
<= EndingLBA
) {
478 // The End of this region overlaps with the i'th region
485 // Non of the regions overlapped so MBR is O.K.
496 return RtDecimaltoBCD (DecValue
);
505 return RtBCDtoDecimal (BcdValue
);
509 LibGetSystemConfigurationTable(
510 IN EFI_GUID
*TableGuid
,
517 for(Index
=0;Index
<ST
->NumberOfTableEntries
;Index
++) {
518 if (CompareGuid(TableGuid
,&(ST
->ConfigurationTable
[Index
].VendorGuid
))==0) {
519 *Table
= ST
->ConfigurationTable
[Index
].VendorTable
;
523 return EFI_NOT_FOUND
;
526 #define strcmp(s1, s2) __builtin_strcmp(s1, s2)
530 IN EFI_HANDLE Handle
,
531 IN UI_STRING_TYPE StringType
,
532 IN ISO_639_2
*LangCode
,
533 IN BOOLEAN ReturnDevicePathStrOnMismatch
537 UI_STRING_TYPE Index
;
538 UI_STRING_ENTRY
*Array
;
541 Status
= uefi_call_wrapper(BS
->HandleProtocol
, 3, Handle
, &UiProtocol
, (VOID
*)&Ui
);
542 if (EFI_ERROR(Status
)) {
543 return (ReturnDevicePathStrOnMismatch
) ? DevicePathToStr(DevicePathFromHandle(Handle
)) : NULL
;
547 // Skip the first strings
549 for (Index
= UiDeviceString
, Array
= Ui
->Entry
; Index
< StringType
; Index
++, Array
++) {
550 while (Array
->LangCode
) {
556 // Search for the match
558 while (Array
->LangCode
) {
559 if (strcmp(Array
->LangCode
, LangCode
) == 0) {
560 return Array
->UiString
;
563 return (ReturnDevicePathStrOnMismatch
) ? DevicePathToStr(DevicePathFromHandle(Handle
)) : NULL
;