X-Git-Url: https://code.delx.au/refind/blobdiff_plain/a10fb70c1b106f4c816c010c5161b3d6566de95a..HEAD:/EfiLib/legacy.c diff --git a/EfiLib/legacy.c b/EfiLib/legacy.c index 3aae71d..3e5edee 100644 --- a/EfiLib/legacy.c +++ b/EfiLib/legacy.c @@ -15,13 +15,27 @@ * */ +#ifdef __MAKEWITH_GNUEFI +#include "efi.h" +#include "efilib.h" +#include "gnuefi-helper.h" +#define EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH +#define EfiReallocatePool ReallocatePool +#define EfiLibLocateProtocol LibLocateProtocol +#else #include "../include/tiano_includes.h" +#endif #include "legacy.h" +#include "GenericBdsLib.h" +#include "../refind/global.h" +#include "../include/refit_call_wrapper.h" BOOT_OPTION_BBS_MAPPING *mBootOptionBbsMapping = NULL; UINTN mBootOptionBbsMappingCount = 0; extern EFI_DEVICE_PATH EndDevicePath[]; +extern EFI_GUID gEfiLegacyBiosProtocolGuid; +EFI_GUID gEfiLegacyDevOrderVariableGuid = { 0xa56074db, 0x65fe, 0x45f7, {0xbd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52 }}; /** @@ -242,7 +256,7 @@ BdsFindLegacyBootOptionByDevTypeAndName ( ) { UINTN Index; - CHAR16 BootOption[9]; + CHAR16 BootOption[10]; UINTN BootOptionSize; UINT8 *BootOptionVar; BBS_TABLE *BbsEntry; @@ -266,7 +280,7 @@ BdsFindLegacyBootOptionByDevTypeAndName ( &BootOptionSize ); if (NULL == BootOptionVar) { - continue; + continue; } // @@ -446,7 +460,7 @@ BdsCreateLegacyBootOption ( Ptr += sizeof (BBS_TABLE); *((UINT16 *) Ptr) = (UINT16) Index; - Status = gRT->SetVariable ( + Status = refit_call5_wrapper(gRT->SetVariable, BootString, &gEfiGlobalVariableGuid, VAR_FLAG, @@ -644,7 +658,7 @@ EfiLibGetVariable ( @param VarName A Null-terminated Unicode string that is the name of the vendor's variable. - + @param VarGuid A unique identifier for the vendor. @retval EFI_SUCCESS The variable was found and removed @@ -669,7 +683,7 @@ EfiLibDeleteVariable ( // // Delete variable from Storage // - Status = gRT->SetVariable (VarName, VarGuid, VAR_FLAG, 0, NULL); + Status = refit_call5_wrapper(gRT->SetVariable, VarName, VarGuid, VAR_FLAG, 0, NULL); ASSERT (!EFI_ERROR (Status)); FreePool (VarBuf); } @@ -687,7 +701,6 @@ EfiLibDeleteVariable ( @return Other value LegacyBoot options are not added. **/ EFI_STATUS -EFIAPI BdsAddNonExistingLegacyBootOptions ( VOID ) @@ -724,7 +737,7 @@ BdsAddNonExistingLegacyBootOptions ( mBootOptionBbsMappingCount = 0; } - LegacyBios->GetBbsInfo ( + refit_call5_wrapper(LegacyBios->GetBbsInfo, LegacyBios, &HddCount, &LocalHddInfo, @@ -781,10 +794,10 @@ BdsAddNonExistingLegacyBootOptions ( // // Save the BbsIndex // - mBootOptionBbsMapping = ReallocatePool ( + mBootOptionBbsMapping = EfiReallocatePool ( + mBootOptionBbsMapping, mBootOptionBbsMappingCount * sizeof (BOOT_OPTION_BBS_MAPPING), - (mBootOptionBbsMappingCount + 1) * sizeof (BOOT_OPTION_BBS_MAPPING), - mBootOptionBbsMapping + (mBootOptionBbsMappingCount + 1) * sizeof (BOOT_OPTION_BBS_MAPPING) ); ASSERT (mBootOptionBbsMapping != NULL); mBootOptionBbsMapping[mBootOptionBbsMappingCount].BootOptionNumber = OptionNumber; @@ -802,7 +815,7 @@ BdsAddNonExistingLegacyBootOptions ( ); if (BootOrderSize > 0) { - Status = gRT->SetVariable ( + Status = refit_call5_wrapper(gRT->SetVariable, L"BootOrder", &gEfiGlobalVariableGuid, VAR_FLAG, @@ -833,7 +846,6 @@ BdsAddNonExistingLegacyBootOptions ( @retval EFI_NOT_FOUND The Boot Option Variable was not found **/ EFI_STATUS -EFIAPI BdsDeleteBootOption ( IN UINTN OptionNumber, IN OUT UINT16 *BootOrder, @@ -883,7 +895,6 @@ BdsDeleteBootOption ( @retval EFI_NOT_FOUND Fail to retrive variable of boot order. **/ EFI_STATUS -EFIAPI BdsDeleteAllInvalidLegacyBootOptions ( VOID ) @@ -919,7 +930,7 @@ BdsDeleteAllInvalidLegacyBootOptions ( return Status; } - LegacyBios->GetBbsInfo ( + refit_call5_wrapper(LegacyBios->GetBbsInfo, LegacyBios, &HddCount, &LocalHddInfo, @@ -946,7 +957,7 @@ BdsDeleteAllInvalidLegacyBootOptions ( ); if (NULL == BootOptionVar) { BootOptionSize = 0; - Status = gRT->GetVariable ( + Status = refit_call5_wrapper(gRT->GetVariable, BootOption, &gEfiGlobalVariableGuid, NULL, @@ -968,10 +979,10 @@ BdsDeleteAllInvalidLegacyBootOptions ( return EFI_OUT_OF_RESOURCES; } } - + // // Skip Non-Legacy boot option - // + // if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) { if (BootOptionVar!= NULL) { FreePool (BootOptionVar); @@ -1022,7 +1033,7 @@ BdsDeleteAllInvalidLegacyBootOptions ( // Adjust the number of boot options. // if (BootOrderSize != 0) { - Status = gRT->SetVariable ( + Status = refit_call5_wrapper(gRT->SetVariable, L"BootOrder", &gEfiGlobalVariableGuid, VAR_FLAG, @@ -1041,323 +1052,38 @@ BdsDeleteAllInvalidLegacyBootOptions ( } /** - Add the legacy boot devices from BBS table into - the legacy device boot order. - - @retval EFI_SUCCESS The boot devices are added successfully. - @retval EFI_NOT_FOUND The legacy boot devices are not found. - @retval EFI_OUT_OF_RESOURCES Memmory or storage is not enough. - @retval EFI_DEVICE_ERROR Fail to add the legacy device boot order into EFI variable - because of hardware error. + Fill the device order buffer. + + @param BbsTable The BBS table. + @param BbsType The BBS Type. + @param BbsCount The BBS Count. + @param Buf device order buffer. + + @return The device order buffer. + **/ -// EFI_STATUS -// EFIAPI -// BdsUpdateLegacyDevOrder ( -// VOID -// ) -// { -// LEGACY_DEV_ORDER_ENTRY *DevOrder; -// LEGACY_DEV_ORDER_ENTRY *NewDevOrder; -// LEGACY_DEV_ORDER_ENTRY *Ptr; -// LEGACY_DEV_ORDER_ENTRY *NewPtr; -// UINTN DevOrderSize; -// EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; -// EFI_STATUS Status; -// UINT16 HddCount; -// UINT16 BbsCount; -// HDD_INFO *LocalHddInfo; -// BBS_TABLE *LocalBbsTable; -// UINTN Index; -// UINTN Index2; -// UINTN *Idx; -// UINTN FDCount; -// UINTN HDCount; -// UINTN CDCount; -// UINTN NETCount; -// UINTN BEVCount; -// UINTN TotalSize; -// UINTN HeaderSize; -// UINT16 *NewFDPtr; -// UINT16 *NewHDPtr; -// UINT16 *NewCDPtr; -// UINT16 *NewNETPtr; -// UINT16 *NewBEVPtr; -// UINT16 *NewDevPtr; -// UINTN FDIndex; -// UINTN HDIndex; -// UINTN CDIndex; -// UINTN NETIndex; -// UINTN BEVIndex; -// -// Idx = NULL; -// FDCount = 0; -// HDCount = 0; -// CDCount = 0; -// NETCount = 0; -// BEVCount = 0; -// TotalSize = 0; -// HeaderSize = sizeof (BBS_TYPE) + sizeof (UINT16); -// FDIndex = 0; -// HDIndex = 0; -// CDIndex = 0; -// NETIndex = 0; -// BEVIndex = 0; -// NewDevPtr = NULL; -// -// Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios); -// if (EFI_ERROR (Status)) { -// return Status; -// } -// -// Status = LegacyBios->GetBbsInfo ( -// LegacyBios, -// &HddCount, -// &LocalHddInfo, -// &BbsCount, -// &LocalBbsTable -// ); -// if (EFI_ERROR (Status)) { -// return Status; -// } -// -// DevOrder = BdsLibGetVariableAndSize ( -// VAR_LEGACY_DEV_ORDER, -// &gEfiLegacyDevOrderVariableGuid, -// &DevOrderSize -// ); -// if (NULL == DevOrder) { -// return BdsCreateDevOrder (LocalBbsTable, BbsCount); -// } -// // -// // First we figure out how many boot devices with same device type respectively -// // -// for (Index = 0; Index < BbsCount; Index++) { -// if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) || -// (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM) -// ) { -// continue; -// } -// -// switch (LocalBbsTable[Index].DeviceType) { -// case BBS_FLOPPY: -// FDCount++; -// break; -// -// case BBS_HARDDISK: -// HDCount++; -// break; -// -// case BBS_CDROM: -// CDCount++; -// break; -// -// case BBS_EMBED_NETWORK: -// NETCount++; -// break; -// -// case BBS_BEV_DEVICE: -// BEVCount++; -// break; -// -// default: -// break; -// } -// } -// -// TotalSize += (HeaderSize + FDCount * sizeof (UINT16)); -// TotalSize += (HeaderSize + HDCount * sizeof (UINT16)); -// TotalSize += (HeaderSize + CDCount * sizeof (UINT16)); -// TotalSize += (HeaderSize + NETCount * sizeof (UINT16)); -// TotalSize += (HeaderSize + BEVCount * sizeof (UINT16)); -// -// NewDevOrder = AllocateZeroPool (TotalSize); -// if (NULL == NewDevOrder) { -// return EFI_OUT_OF_RESOURCES; -// } -// -// -// -// // -// // copy FD -// // -// Ptr = DevOrder; -// NewPtr = NewDevOrder; -// NewPtr->BbsType = Ptr->BbsType; -// NewPtr->Length = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16)); -// for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { -// if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY -// ) { -// continue; -// } -// -// NewPtr->Data[FDIndex] = Ptr->Data[Index]; -// FDIndex++; -// } -// NewFDPtr = NewPtr->Data; -// -// // -// // copy HD -// // -// Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); -// NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); -// NewPtr->BbsType = Ptr->BbsType; -// NewPtr->Length = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16)); -// for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { -// if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK -// ) { -// continue; -// } -// -// NewPtr->Data[HDIndex] = Ptr->Data[Index]; -// HDIndex++; -// } -// NewHDPtr = NewPtr->Data; -// -// // -// // copy CD -// // -// Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); -// NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); -// NewPtr->BbsType = Ptr->BbsType; -// NewPtr->Length = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16)); -// for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { -// if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM -// ) { -// continue; -// } -// -// NewPtr->Data[CDIndex] = Ptr->Data[Index]; -// CDIndex++; -// } -// NewCDPtr = NewPtr->Data; -// -// // -// // copy NET -// // -// Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); -// NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); -// NewPtr->BbsType = Ptr->BbsType; -// NewPtr->Length = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16)); -// for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { -// if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK -// ) { -// continue; -// } -// -// NewPtr->Data[NETIndex] = Ptr->Data[Index]; -// NETIndex++; -// } -// NewNETPtr = NewPtr->Data; -// -// // -// // copy BEV -// // -// Ptr = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]); -// NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]); -// NewPtr->BbsType = Ptr->BbsType; -// NewPtr->Length = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16)); -// for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) { -// if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY || -// LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE -// ) { -// continue; -// } -// -// NewPtr->Data[BEVIndex] = Ptr->Data[Index]; -// BEVIndex++; -// } -// NewBEVPtr = NewPtr->Data; -// -// for (Index = 0; Index < BbsCount; Index++) { -// if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) || -// (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM) -// ) { -// continue; -// } -// -// switch (LocalBbsTable[Index].DeviceType) { -// case BBS_FLOPPY: -// Idx = &FDIndex; -// NewDevPtr = NewFDPtr; -// break; -// -// case BBS_HARDDISK: -// Idx = &HDIndex; -// NewDevPtr = NewHDPtr; -// break; -// -// case BBS_CDROM: -// Idx = &CDIndex; -// NewDevPtr = NewCDPtr; -// break; -// -// case BBS_EMBED_NETWORK: -// Idx = &NETIndex; -// NewDevPtr = NewNETPtr; -// break; -// -// case BBS_BEV_DEVICE: -// Idx = &BEVIndex; -// NewDevPtr = NewBEVPtr; -// break; -// -// default: -// Idx = NULL; -// break; -// } -// // -// // at this point we have copied those valid indexes to new buffer -// // and we should check if there is any new appeared boot device -// // -// if (Idx != NULL) { -// for (Index2 = 0; Index2 < *Idx; Index2++) { -// if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) { -// break; -// } -// } -// -// if (Index2 == *Idx) { -// // -// // Index2 == *Idx means we didn't find Index -// // so Index is a new appeared device's index in BBS table -// // insert it before disabled indexes. -// // -// for (Index2 = 0; Index2 < *Idx; Index2++) { -// if ((NewDevPtr[Index2] & 0xFF00) == 0xFF00) { -// break; -// } -// } -// CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16)); -// NewDevPtr[Index2] = (UINT16) (Index & 0xFF); -// (*Idx)++; -// } -// } -// } -// -// FreePool (DevOrder); -// -// Status = gRT->SetVariable ( -// VAR_LEGACY_DEV_ORDER, -// &gEfiLegacyDevOrderVariableGuid, -// VAR_FLAG, -// TotalSize, -// NewDevOrder -// ); -// FreePool (NewDevOrder); -// -// return Status; -// } +UINT16 * +BdsFillDevOrderBuf ( + IN BBS_TABLE *BbsTable, + IN BBS_TYPE BbsType, + IN UINTN BbsCount, + OUT UINT16 *Buf + ) +{ + UINTN Index; + for (Index = 0; Index < BbsCount; Index++) { + if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) { + continue; + } + + if (BbsTable[Index].DeviceType != BbsType) { + continue; + } + + *Buf = (UINT16) (Index & 0xFF); + Buf++; + } + + return Buf; +}