123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- /*++
- Copyright (c) 1998 Intel Corporation
- Module Name:
- misc.c
- Abstract:
- Revision History
- --*/
- #include "lib.h"
- //
- //
- //
- VOID *
- AllocatePool (
- IN UINTN Size
- )
- {
- EFI_STATUS Status;
- VOID *p;
- Status = uefi_call_wrapper(BS->AllocatePool, 3, PoolAllocationType, Size, &p);
- if (EFI_ERROR(Status)) {
- DEBUG((D_ERROR, "AllocatePool: out of pool %x\n", Status));
- p = NULL;
- }
- return p;
- }
- VOID *
- AllocateZeroPool (
- IN UINTN Size
- )
- {
- VOID *p;
- p = AllocatePool (Size);
- if (p) {
- ZeroMem (p, Size);
- }
- return p;
- }
- VOID *
- ReallocatePool (
- IN VOID *OldPool,
- IN UINTN OldSize,
- IN UINTN NewSize
- )
- {
- VOID *NewPool;
- NewPool = NULL;
- if (NewSize) {
- NewPool = AllocatePool (NewSize);
- }
- if (OldPool) {
- if (NewPool) {
- CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
- }
-
- FreePool (OldPool);
- }
-
- return NewPool;
- }
- VOID
- FreePool (
- IN VOID *Buffer
- )
- {
- uefi_call_wrapper(BS->FreePool, 1, Buffer);
- }
- VOID
- ZeroMem (
- IN VOID *Buffer,
- IN UINTN Size
- )
- {
- RtZeroMem (Buffer, Size);
- }
- VOID EFIAPI
- SetMem (
- IN VOID *Buffer,
- IN UINTN Size,
- IN UINT8 Value
- )
- {
- RtSetMem (Buffer, Size, Value);
- }
- VOID EFIAPI
- CopyMem (
- IN VOID *Dest,
- IN VOID *Src,
- IN UINTN len
- )
- {
- RtCopyMem (Dest, Src, len);
- }
- INTN
- CompareMem (
- IN CONST VOID *Dest,
- IN CONST VOID *Src,
- IN UINTN len
- )
- {
- return RtCompareMem (Dest, Src, len);
- }
- BOOLEAN
- GrowBuffer(
- IN OUT EFI_STATUS *Status,
- IN OUT VOID **Buffer,
- IN UINTN BufferSize
- )
- /*++
- Routine Description:
- Helper function called as part of the code needed
- to allocate the proper sized buffer for various
- EFI interfaces.
- Arguments:
- Status - Current status
- Buffer - Current allocated buffer, or NULL
- BufferSize - Current buffer size needed
-
- Returns:
-
- TRUE - if the buffer was reallocated and the caller
- should try the API again.
- --*/
- {
- BOOLEAN TryAgain;
- //
- // If this is an initial request, buffer will be null with a new buffer size
- //
- if (!*Buffer && BufferSize) {
- *Status = EFI_BUFFER_TOO_SMALL;
- }
- //
- // If the status code is "buffer too small", resize the buffer
- //
-
- TryAgain = FALSE;
- if (*Status == EFI_BUFFER_TOO_SMALL) {
- if (*Buffer) {
- FreePool (*Buffer);
- }
- *Buffer = AllocatePool (BufferSize);
- if (*Buffer) {
- TryAgain = TRUE;
- } else {
- *Status = EFI_OUT_OF_RESOURCES;
- }
- }
- //
- // If there's an error, free the buffer
- //
- if (!TryAgain && EFI_ERROR(*Status) && *Buffer) {
- FreePool (*Buffer);
- *Buffer = NULL;
- }
- return TryAgain;
- }
- EFI_MEMORY_DESCRIPTOR *
- LibMemoryMap (
- OUT UINTN *NoEntries,
- OUT UINTN *MapKey,
- OUT UINTN *DescriptorSize,
- OUT UINT32 *DescriptorVersion
- )
- {
- EFI_STATUS Status;
- EFI_MEMORY_DESCRIPTOR *Buffer;
- UINTN BufferSize;
- //
- // Initialize for GrowBuffer loop
- //
- Status = EFI_SUCCESS;
- Buffer = NULL;
- BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR);
- //
- // Call the real function
- //
- while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
- Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion);
- }
- //
- // Convert buffer size to NoEntries
- //
- if (!EFI_ERROR(Status)) {
- *NoEntries = BufferSize / *DescriptorSize;
- }
- return Buffer;
- }
- VOID *
- LibGetVariableAndSize (
- IN CHAR16 *Name,
- IN EFI_GUID *VendorGuid,
- OUT UINTN *VarSize
- )
- {
- EFI_STATUS Status = EFI_SUCCESS;
- VOID *Buffer;
- UINTN BufferSize;
- //
- // Initialize for GrowBuffer loop
- //
- Buffer = NULL;
- BufferSize = 100;
- //
- // Call the real function
- //
- while (GrowBuffer (&Status, &Buffer, BufferSize)) {
- Status = uefi_call_wrapper(
- RT->GetVariable,
- 5,
- Name,
- VendorGuid,
- NULL,
- &BufferSize,
- Buffer
- );
- }
- if (Buffer) {
- *VarSize = BufferSize;
- } else {
- *VarSize = 0;
- }
- return Buffer;
- }
-
- VOID *
- LibGetVariable (
- IN CHAR16 *Name,
- IN EFI_GUID *VendorGuid
- )
- {
- UINTN VarSize;
- return LibGetVariableAndSize (Name, VendorGuid, &VarSize);
- }
- EFI_STATUS
- LibDeleteVariable (
- IN CHAR16 *VarName,
- IN EFI_GUID *VarGuid
- )
- {
- VOID *VarBuf;
- EFI_STATUS Status;
- VarBuf = LibGetVariable(VarName,VarGuid);
- Status = EFI_NOT_FOUND;
- if (VarBuf) {
- //
- // Delete variable from Storage
- //
- Status = uefi_call_wrapper(
- RT->SetVariable,
- 5,
- VarName, VarGuid,
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
- 0, NULL
- );
- ASSERT (!EFI_ERROR(Status));
- FreePool(VarBuf);
- }
- return (Status);
- }
- EFI_STATUS
- LibSetNVVariable (
- IN CHAR16 *VarName,
- IN EFI_GUID *VarGuid,
- IN UINTN DataSize,
- IN VOID *Data
- )
- {
- EFI_STATUS Status;
- Status = uefi_call_wrapper(
- RT->SetVariable,
- 5,
- VarName, VarGuid,
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
- DataSize, Data
- );
- ASSERT (!EFI_ERROR(Status));
- return (Status);
- }
- EFI_STATUS
- LibSetVariable (
- IN CHAR16 *VarName,
- IN EFI_GUID *VarGuid,
- IN UINTN DataSize,
- IN VOID *Data
- )
- {
- EFI_STATUS Status;
- Status = uefi_call_wrapper(
- RT->SetVariable,
- 5,
- VarName, VarGuid,
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
- DataSize, Data
- );
- ASSERT (!EFI_ERROR(Status));
- return (Status);
- }
- EFI_STATUS
- LibInsertToTailOfBootOrder (
- IN UINT16 BootOption,
- IN BOOLEAN OnlyInsertIfEmpty
- )
- {
- UINT16 *BootOptionArray;
- UINT16 *NewBootOptionArray;
- UINTN VarSize;
- UINTN Index;
- EFI_STATUS Status;
- BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize);
- if (VarSize != 0 && OnlyInsertIfEmpty) {
- if (BootOptionArray) {
- FreePool (BootOptionArray);
- }
- return EFI_UNSUPPORTED;
- }
- VarSize += sizeof(UINT16);
- NewBootOptionArray = AllocatePool (VarSize);
- if (!NewBootOptionArray)
- return EFI_OUT_OF_RESOURCES;
- for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) {
- NewBootOptionArray[Index] = BootOptionArray[Index];
- }
- //
- // Insert in the tail of the array
- //
- NewBootOptionArray[Index] = BootOption;
- Status = uefi_call_wrapper(
- RT->SetVariable,
- 5,
- VarBootOrder, &EfiGlobalVariable,
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
- VarSize, (VOID*) NewBootOptionArray
- );
- FreePool (NewBootOptionArray);
- if (BootOptionArray) {
- FreePool (BootOptionArray);
- }
- return Status;
- }
- BOOLEAN
- ValidMBR(
- IN MASTER_BOOT_RECORD *Mbr,
- IN EFI_BLOCK_IO *BlkIo
- )
- {
- UINT32 StartingLBA, EndingLBA;
- UINT32 NewEndingLBA;
- INTN i, j;
- BOOLEAN ValidMbr;
- if (Mbr->Signature != MBR_SIGNATURE) {
- //
- // The BPB also has this signature, so it can not be used alone.
- //
- return FALSE;
- }
- ValidMbr = FALSE;
- for (i=0; i<MAX_MBR_PARTITIONS; i++) {
- if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) {
- continue;
- }
- ValidMbr = TRUE;
- StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA);
- EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1;
- if (EndingLBA > BlkIo->Media->LastBlock) {
- //
- // Compatability Errata:
- // Some systems try to hide drive space with thier INT 13h driver
- // This does not hide space from the OS driver. This means the MBR
- // that gets created from DOS is smaller than the MBR created from
- // a real OS (NT & Win98). This leads to BlkIo->LastBlock being
- // wrong on some systems FDISKed by the OS.
- //
- //
- if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) {
- //
- // If this is a very small device then trust the BlkIo->LastBlock
- //
- return FALSE;
- }
- if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) {
- return FALSE;
- }
- }
- for (j=i+1; j<MAX_MBR_PARTITIONS; j++) {
- if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) {
- continue;
- }
- if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA &&
- EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) {
- //
- // The Start of this region overlaps with the i'th region
- //
- return FALSE;
- }
- NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1;
- if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) {
- //
- // The End of this region overlaps with the i'th region
- //
- return FALSE;
- }
- }
- }
- //
- // Non of the regions overlapped so MBR is O.K.
- //
- return ValidMbr;
- }
-
- UINT8
- DecimaltoBCD(
- IN UINT8 DecValue
- )
- {
- return RtDecimaltoBCD (DecValue);
- }
- UINT8
- BCDtoDecimal(
- IN UINT8 BcdValue
- )
- {
- return RtBCDtoDecimal (BcdValue);
- }
- EFI_STATUS
- LibGetSystemConfigurationTable(
- IN EFI_GUID *TableGuid,
- IN OUT VOID **Table
- )
- {
- UINTN Index;
- for(Index=0;Index<ST->NumberOfTableEntries;Index++) {
- if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) {
- *Table = ST->ConfigurationTable[Index].VendorTable;
- return EFI_SUCCESS;
- }
- }
- return EFI_NOT_FOUND;
- }
- CHAR16 *
- LibGetUiString (
- IN EFI_HANDLE Handle,
- IN UI_STRING_TYPE StringType,
- IN ISO_639_2 *LangCode,
- IN BOOLEAN ReturnDevicePathStrOnMismatch
- )
- {
- UI_INTERFACE *Ui;
- UI_STRING_TYPE Index;
- UI_STRING_ENTRY *Array;
- EFI_STATUS Status;
-
- Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui);
- if (EFI_ERROR(Status)) {
- return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
- }
- //
- // Skip the first strings
- //
- for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) {
- while (Array->LangCode) {
- Array++;
- }
- }
- //
- // Search for the match
- //
- while (Array->LangCode) {
- if (strcmpa (Array->LangCode, LangCode) == 0) {
- return Array->UiString;
- }
- }
- return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
- }
|