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
220 BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR);
223 // Call the real function
226 while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
227 Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion);
231 // Convert buffer size to NoEntries
234 if (!EFI_ERROR(Status)) {
235 *NoEntries = BufferSize / *DescriptorSize;
242 LibGetVariableAndSize (
244 IN EFI_GUID *VendorGuid,
253 // Initialize for GrowBuffer loop
260 // Call the real function
263 while (GrowBuffer (&Status, &Buffer, BufferSize)) {
264 Status = uefi_call_wrapper(
275 *VarSize = BufferSize;
285 IN EFI_GUID *VendorGuid
290 return LibGetVariableAndSize (Name, VendorGuid, &VarSize);
302 VarBuf = LibGetVariable(VarName,VarGuid);
304 Status = EFI_NOT_FOUND;
308 // Delete variable from Storage
310 Status = uefi_call_wrapper(
314 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
317 ASSERT (!EFI_ERROR(Status));
325 LibInsertToTailOfBootOrder (
326 IN UINT16 BootOption,
327 IN BOOLEAN OnlyInsertIfEmpty
330 UINT16 *BootOptionArray;
331 UINT16 *NewBootOptionArray;
336 BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize);
337 if (VarSize != 0 && OnlyInsertIfEmpty) {
338 if (BootOptionArray) {
339 FreePool (BootOptionArray);
341 return EFI_UNSUPPORTED;
344 VarSize += sizeof(UINT16);
345 NewBootOptionArray = AllocatePool (VarSize);
347 for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) {
348 NewBootOptionArray[Index] = BootOptionArray[Index];
351 // Insert in the tail of the array
353 NewBootOptionArray[Index] = BootOption;
355 Status = uefi_call_wrapper(
358 VarBootOrder, &EfiGlobalVariable,
359 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
360 VarSize, (VOID*) NewBootOptionArray
363 if (NewBootOptionArray) {
364 FreePool (NewBootOptionArray);
366 if (BootOptionArray) {
367 FreePool (BootOptionArray);
375 IN MASTER_BOOT_RECORD *Mbr,
376 IN EFI_BLOCK_IO *BlkIo
379 UINT32 StartingLBA, EndingLBA;
384 if (Mbr->Signature != MBR_SIGNATURE) {
386 // The BPB also has this signature, so it can not be used alone.
392 for (i=0; i<MAX_MBR_PARTITIONS; i++) {
393 if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) {
397 StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA);
398 EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1;
399 if (EndingLBA > BlkIo->Media->LastBlock) {
401 // Compatability Errata:
402 // Some systems try to hide drive space with thier INT 13h driver
403 // This does not hide space from the OS driver. This means the MBR
404 // that gets created from DOS is smaller than the MBR created from
405 // a real OS (NT & Win98). This leads to BlkIo->LastBlock being
406 // wrong on some systems FDISKed by the OS.
409 if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) {
411 // If this is a very small device then trust the BlkIo->LastBlock
416 if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) {
421 for (j=i+1; j<MAX_MBR_PARTITIONS; j++) {
422 if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) {
425 if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA &&
426 EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) {
428 // The Start of this region overlaps with the i'th region
432 NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1;
433 if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) {
435 // The End of this region overlaps with the i'th region
442 // Non of the regions overlapped so MBR is O.K.
453 return RtDecimaltoBCD (DecValue);
462 return RtBCDtoDecimal (BcdValue);
466 LibGetSystemConfigurationTable(
467 IN EFI_GUID *TableGuid,
474 for(Index=0;Index<ST->NumberOfTableEntries;Index++) {
475 if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) {
476 *Table = ST->ConfigurationTable[Index].VendorTable;
480 return EFI_NOT_FOUND;
486 IN EFI_HANDLE Handle,
487 IN UI_STRING_TYPE StringType,
488 IN ISO_639_2 *LangCode,
489 IN BOOLEAN ReturnDevicePathStrOnMismatch
493 UI_STRING_TYPE Index;
494 UI_STRING_ENTRY *Array;
497 Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui);
498 if (EFI_ERROR(Status)) {
499 return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
503 // Skip the first strings
505 for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) {
506 while (Array->LangCode) {
512 // Search for the match
514 while (Array->LangCode) {
515 if (strcmpa (Array->LangCode, LangCode) == 0) {
516 return Array->UiString;
519 return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;