*
*/
+#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 }};
/**
)
{
UINTN Index;
- CHAR16 BootOption[9];
+ CHAR16 BootOption[10];
UINTN BootOptionSize;
UINT8 *BootOptionVar;
BBS_TABLE *BbsEntry;
&BootOptionSize
);
if (NULL == BootOptionVar) {
- continue;
+ continue;
}
//
Ptr += sizeof (BBS_TABLE);
*((UINT16 *) Ptr) = (UINT16) Index;
- Status = gRT->SetVariable (
+ Status = refit_call5_wrapper(gRT->SetVariable,
BootString,
&gEfiGlobalVariableGuid,
VAR_FLAG,
@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
//
// 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);
}
@return Other value LegacyBoot options are not added.
**/
EFI_STATUS
-EFIAPI
BdsAddNonExistingLegacyBootOptions (
VOID
)
mBootOptionBbsMappingCount = 0;
}
- LegacyBios->GetBbsInfo (
+ refit_call5_wrapper(LegacyBios->GetBbsInfo,
LegacyBios,
&HddCount,
&LocalHddInfo,
//
// 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;
);
if (BootOrderSize > 0) {
- Status = gRT->SetVariable (
+ Status = refit_call5_wrapper(gRT->SetVariable,
L"BootOrder",
&gEfiGlobalVariableGuid,
VAR_FLAG,
@retval EFI_NOT_FOUND The Boot Option Variable was not found
**/
EFI_STATUS
-EFIAPI
BdsDeleteBootOption (
IN UINTN OptionNumber,
IN OUT UINT16 *BootOrder,
@retval EFI_NOT_FOUND Fail to retrive variable of boot order.
**/
EFI_STATUS
-EFIAPI
BdsDeleteAllInvalidLegacyBootOptions (
VOID
)
return Status;
}
- LegacyBios->GetBbsInfo (
+ refit_call5_wrapper(LegacyBios->GetBbsInfo,
LegacyBios,
&HddCount,
&LocalHddInfo,
);
if (NULL == BootOptionVar) {
BootOptionSize = 0;
- Status = gRT->GetVariable (
+ Status = refit_call5_wrapper(gRT->GetVariable,
BootOption,
&gEfiGlobalVariableGuid,
NULL,
return EFI_OUT_OF_RESOURCES;
}
}
-
+
//
// Skip Non-Legacy boot option
- //
+ //
if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) {
if (BootOptionVar!= NULL) {
FreePool (BootOptionVar);
// Adjust the number of boot options.
//
if (BootOrderSize != 0) {
- Status = gRT->SetVariable (
+ Status = refit_call5_wrapper(gRT->SetVariable,
L"BootOrder",
&gEfiGlobalVariableGuid,
VAR_FLAG,
}
/**
- 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;
+}