Support RouteConfig function for BdsDxe driver.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Gao, Liming <liming,gao@intel.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15563 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Eric Dong
2014-06-18 02:19:50 +00:00
committed by ydong10
parent 885f7fd0c7
commit be9304f33f
11 changed files with 1567 additions and 511 deletions

View File

@ -1,7 +1,7 @@
/** @file
Dynamically update the pages.
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -254,7 +254,7 @@ UpdateBootDelPage (
UpdatePageStart (CallbackData);
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));
ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
@ -263,13 +263,13 @@ UpdateBootDelPage (
}
NewLoadContext->Deleted = FALSE;
CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;
//CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;
HiiCreateCheckBoxOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),
(EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),
VARSTORE_ID_BOOT_MAINT,
(UINT16) (OPTION_DEL_VAR_OFFSET + Index),
(UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
0,
@ -337,19 +337,19 @@ UpdateDrvDelPage (
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &DriverOptionMenu);
ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionDel) / sizeof (CallbackData->BmmFakeNvData.OptionDel[0])));
ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = FALSE;
CallbackData->BmmFakeNvData.OptionDel[Index] = FALSE;
//CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;
HiiCreateCheckBoxOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) (OPTION_DEL_QUESTION_ID + Index),
(EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),
VARSTORE_ID_BOOT_MAINT,
(UINT16) (OPTION_DEL_VAR_OFFSET + Index),
(UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
0,
@ -449,71 +449,57 @@ UpdateConsolePage (
)
{
BM_MENU_ENTRY *NewMenuEntry;
BM_CONSOLE_CONTEXT *NewConsoleContext;
BM_TERMINAL_CONTEXT *NewTerminalContext;
UINT16 Index;
UINT16 Index2;
UINT8 CheckFlags;
CallbackData->BmmAskSaveOrNot = TRUE;
UINT8 *ConsoleCheck;
EFI_QUESTION_ID QuestionIdBase;
UINT16 VariableOffsetBase;
UpdatePageStart (CallbackData);
for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \
(Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
CheckFlags = 0;
if (NewConsoleContext->IsActive) {
CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
} else {
CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
}
ConsoleCheck = NULL;
QuestionIdBase = 0;
VariableOffsetBase = 0;
HiiCreateCheckBoxOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
VARSTORE_ID_BOOT_MAINT,
(UINT16) (CON_DEVICE_VAR_OFFSET + Index),
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
0,
CheckFlags,
NULL
);
switch (UpdatePageId) {
case FORM_CON_IN_ID:
ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];
QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;
VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;
break;
case FORM_CON_OUT_ID:
ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];
QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;
VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;
break;
case FORM_CON_ERR_ID:
ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];
QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;
VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;
break;
}
ASSERT (ConsoleCheck != NULL);
for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \
(Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {
CheckFlags = 0;
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
ASSERT (Index < MAX_MENU_NUMBER);
if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||
((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||
((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))
) {
for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \
(Index < MAX_MENU_NUMBER)) ; Index++) {
CheckFlags = 0;
if (UpdatePageId != FORM_CON_ERR_ID) {
CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;
CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;
} else {
CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;
}
NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
HiiCreateCheckBoxOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),
(EFI_QUESTION_ID) (QuestionIdBase + Index),
VARSTORE_ID_BOOT_MAINT,
(UINT16) (CON_DEVICE_VAR_OFFSET + Index),
(UINT16) (VariableOffsetBase + Index),
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
0,
CheckFlags,
NULL
);
Index++;
}
UpdatePageEnd (CallbackData);
@ -535,68 +521,73 @@ UpdateOrderPage (
IN BMM_CALLBACK_DATA *CallbackData
)
{
BM_MENU_ENTRY *NewMenuEntry;
UINT16 Index;
UINT16 OptionOrderIndex;
VOID *OptionsOpCodeHandle;
UINTN DeviceType;
BM_LOAD_CONTEXT *NewLoadContext;
BM_MENU_ENTRY *NewMenuEntry;
UINT16 Index;
UINT16 OptionIndex;
VOID *OptionsOpCodeHandle;
BM_LOAD_CONTEXT *NewLoadContext;
BOOLEAN BootOptionFound;
UINT32 *OptionOrder;
EFI_QUESTION_ID QuestionId;
UINT16 VarOffset;
DeviceType = (UINTN) -1;
CallbackData->BmmAskSaveOrNot = TRUE;
UpdatePageStart (CallbackData);
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
OptionOrder = NULL;
QuestionId = 0;
VarOffset = 0;
switch (UpdatePageId) {
ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, sizeof (CallbackData->BmmFakeNvData.OptionOrder));
case FORM_BOOT_CHG_ID:
//GetBootOrder (CallbackData);
OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;
QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;
VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;
break;
case FORM_DRV_CHG_ID:
//GetDriverOrder (CallbackData);
OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;
QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;
VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;
break;
}
ASSERT (OptionOrder != NULL);
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (OptionsOpCodeHandle != NULL);
for (
Index = 0, OptionOrderIndex = 0;
(
(Index < OptionMenu->MenuNumber) &&
(OptionOrderIndex <
(
sizeof (CallbackData->BmmFakeNvData.OptionOrder) /
sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])
)
)
);
Index++
) {
NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
if (NewLoadContext->IsLegacy) {
if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {
DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;
} else {
//
// Only show one legacy boot option for the same device type
// assuming the boot options are grouped by the device type
//
continue;
NewMenuEntry = NULL;
for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {
BootOptionFound = FALSE;
for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {
BootOptionFound = TRUE;
break;
}
}
HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
NewMenuEntry->DisplayStringToken,
0,
EFI_IFR_TYPE_NUM_SIZE_32,
(UINT32) (NewMenuEntry->OptionNumber + 1)
);
CallbackData->BmmFakeNvData.OptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);
if (BootOptionFound) {
HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
NewMenuEntry->DisplayStringToken,
0,
EFI_IFR_TYPE_NUM_SIZE_32,
OptionOrder[OptionIndex]
);
}
}
if (OptionMenu->MenuNumber > 0) {
HiiCreateOrderedListOpCode (
mStartOpCodeHandle, // Container for dynamic created opcodes
(EFI_QUESTION_ID) OPTION_ORDER_QUESTION_ID, // Question ID
QuestionId, // Question ID
VARSTORE_ID_BOOT_MAINT, // VarStore ID
OPTION_ORDER_VAR_OFFSET, // Offset in Buffer Storage
VarOffset, // Offset in Buffer Storage
STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text
STRING_TOKEN (STR_CHANGE_ORDER), // Question help text
0, // Question flag
@ -611,12 +602,6 @@ UpdateOrderPage (
HiiFreeOpCodeHandle (OptionsOpCodeHandle);
UpdatePageEnd (CallbackData);
CopyMem (
CallbackData->BmmOldFakeNVData.OptionOrder,
CallbackData->BmmFakeNvData.OptionOrder,
sizeof (CallbackData->BmmOldFakeNVData.OptionOrder)
);
}
/**
@ -647,7 +632,7 @@ UpdateBootNextPage (
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (OptionsOpCodeHandle != NULL);
CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
//CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
@ -661,7 +646,7 @@ UpdateBootNextPage (
EFI_IFR_TYPE_NUM_SIZE_16,
Index
);
CallbackData->BmmFakeNvData.BootNext = Index;
//CallbackData->BmmFakeNvData.BootNext = Index;
} else {
HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
@ -751,7 +736,7 @@ UpdateTimeOutPage (
HiiFreeOpCodeHandle (DefaultOpCodeHandle);
CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
//CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut;
UpdatePageEnd (CallbackData);
}
@ -813,7 +798,7 @@ UpdateConModePage (
//
// Determin which mode should be the first entry in menu
//
GetConsoleOutMode (CallbackData);
// GetConsoleOutMode (CallbackData);
//
// Build text mode options
@ -891,14 +876,14 @@ UpdateTerminalPage (
BM_MENU_ENTRY *NewMenuEntry;
BM_TERMINAL_CONTEXT *NewTerminalContext;
VOID *OptionsOpCodeHandle;
CallbackData->BmmAskSaveOrNot = TRUE;
UINTN CurrentTerminal;
UpdatePageStart (CallbackData);
CurrentTerminal = CallbackData->CurrentTerminal;
NewMenuEntry = BOpt_GetMenuEntry (
&TerminalMenu,
CallbackData->CurrentTerminal
CurrentTerminal
);
if (NewMenuEntry == NULL) {
@ -912,12 +897,9 @@ UpdateTerminalPage (
for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {
CheckFlags = 0;
if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
if (BaudRateList[Index].Value == 115200) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
NewTerminalContext->BaudRateIndex = Index;
CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;
}
HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
BaudRateList[Index].StringToken,
@ -929,9 +911,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,
(EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_BAUD_RATE_VAR_OFFSET,
(UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_BAUD_RATE),
STRING_TOKEN (STR_COM_BAUD_RATE),
0,
@ -947,9 +929,7 @@ UpdateTerminalPage (
for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {
CheckFlags = 0;
if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
NewTerminalContext->DataBitsIndex = Index;
CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;
if (DataBitsList[Index].Value == 8) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
}
@ -964,9 +944,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,
(EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_DATA_RATE_VAR_OFFSET,
(UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_DATA_BITS),
STRING_TOKEN (STR_COM_DATA_BITS),
0,
@ -981,10 +961,8 @@ UpdateTerminalPage (
for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {
CheckFlags = 0;
if (NewTerminalContext->Parity == ParityList[Index].Value) {
if (ParityList[Index].Value == NoParity) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
NewTerminalContext->ParityIndex = (UINT8) Index;
CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;
}
HiiCreateOneOfOptionOpCode (
@ -998,9 +976,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,
(EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_PARITY_VAR_OFFSET,
(UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_PARITY),
STRING_TOKEN (STR_COM_PARITY),
0,
@ -1015,10 +993,8 @@ UpdateTerminalPage (
for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {
CheckFlags = 0;
if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
if (StopBitsList[Index].Value == OneStopBit) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
NewTerminalContext->StopBitsIndex = (UINT8) Index;
CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;
}
HiiCreateOneOfOptionOpCode (
@ -1032,9 +1008,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,
(EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_STOP_BITS_VAR_OFFSET,
(UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_STOP_BITS),
STRING_TOKEN (STR_COM_STOP_BITS),
0,
@ -1049,9 +1025,8 @@ UpdateTerminalPage (
for (Index = 0; Index < 4; Index++) {
CheckFlags = 0;
if (NewTerminalContext->TerminalType == Index) {
if (Index == 0) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;
}
HiiCreateOneOfOptionOpCode (
@ -1065,9 +1040,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,
(EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_TERMINAL_VAR_OFFSET,
(UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_TERMI_TYPE),
STRING_TOKEN (STR_COM_TERMI_TYPE),
0,
@ -1080,12 +1055,15 @@ UpdateTerminalPage (
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (OptionsOpCodeHandle != NULL);
CallbackData->BmmFakeNvData.COMFlowControl = NewTerminalContext->FlowControl;
for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {
CheckFlags = 0;
if (Index == 0) {
CheckFlags |= EFI_IFR_OPTION_DEFAULT;
}
HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
(EFI_STRING_ID) mFlowControlType[Index],
0,
CheckFlags,
EFI_IFR_TYPE_NUM_SIZE_8,
mFlowControlValue[Index]
);
@ -1093,9 +1071,9 @@ UpdateTerminalPage (
HiiCreateOneOfOpCode (
mStartOpCodeHandle,
(EFI_QUESTION_ID) COM_FLOWCONTROL_QUESTION_ID,
(EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),
VARSTORE_ID_BOOT_MAINT,
COM_FLOWCONTROL_VAR_OFFSET,
(UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),
STRING_TOKEN (STR_COM_FLOW_CONTROL),
STRING_TOKEN (STR_COM_FLOW_CONTROL),
0,
@ -1150,92 +1128,6 @@ UpdatePageBody (
}
}
/**
Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type
specified by DeviceType.
@param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,
etc.
@param OptionIndex Returns the index number (#### in Boot####).
@param OptionSize Return the size of the Boot### variable.
**/
VOID *
GetLegacyBootOptionVar (
IN UINTN DeviceType,
OUT UINTN *OptionIndex,
OUT UINTN *OptionSize
)
{
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
VOID *OptionBuffer;
UINTN OrderSize;
UINTN Index;
UINT16 *OrderBuffer;
CHAR16 StrTemp[100];
UINT16 FilePathSize;
UINT8 *Ptr;
UINT8 *OptionalData;
//
// Get Boot Option number from the size of BootOrder
//
OrderBuffer = BdsLibGetVariableAndSize (
L"BootOrder",
&gEfiGlobalVariableGuid,
&OrderSize
);
if (OrderBuffer == NULL) {
return NULL;
}
for (Index = 0; Index < OrderSize / sizeof (UINT16); Index++) {
UnicodeSPrint (StrTemp, sizeof (StrTemp), L"Boot%04x", OrderBuffer[Index]);
OptionBuffer = BdsLibGetVariableAndSize (
StrTemp,
&gEfiGlobalVariableGuid,
OptionSize
);
if (NULL == OptionBuffer) {
continue;
}
Ptr = (UINT8 *) OptionBuffer;
Ptr += sizeof (UINT32);
FilePathSize = *(UINT16 *) Ptr;
Ptr += sizeof (UINT16);
Ptr += StrSize ((CHAR16 *) Ptr);
//
// Now Ptr point to Device Path
//
DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;
Ptr += FilePathSize;
//
// Now Ptr point to Optional Data
//
OptionalData = Ptr;
if ((DeviceType == ((BBS_TABLE *) OptionalData)->DeviceType) &&
(BBS_DEVICE_PATH == DevicePath->Type) &&
(BBS_BBS_DP == DevicePath->SubType)
) {
*OptionIndex = OrderBuffer[Index];
FreePool (OrderBuffer);
return OptionBuffer;
} else {
FreePool (OptionBuffer);
}
}
FreePool (OrderBuffer);
return NULL;
}
/**
Create a dynamic page so that Legacy Device boot order
can be set for specified device type.
@ -1443,6 +1335,7 @@ UpdateSetLegacyDeviceOrderPage (
UpdatePageEnd (CallbackData);
}
/**
Dispatch the display to the next page based on NewPageId.