X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=IntelFrameworkModulePkg%2FUniversal%2FBdsDxe%2FBootMaint%2FUpdatePage.c;h=b13ed116303b0e948da132e062b0b55819f3bd23;hb=49264dac6ea49faa0307a57c49d0611a2055d292;hp=643c90d4b17124796b17b00d2e508561d7606f8e;hpb=8bb37919e31aec9bef6de87f901c185a2955cfb2;p=mirror_edk2.git diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c index 643c90d4b1..b13ed11630 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c @@ -1,8 +1,8 @@ /** @file Dynamically update the pages. -Copyright (c) 2004 - 2008, Intel Corporation.
-All rights reserved. This program and the accompanying materials +Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.
+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 http://opensource.org/licenses/bsd-license.php @@ -99,31 +99,31 @@ UpdatePageEnd ( 0 ); - HiiCreateGotoOpCode ( + HiiCreateActionOpCode ( mStartOpCodeHandle, - FORM_MAIN_ID, + KEY_VALUE_SAVE_AND_EXIT, STRING_TOKEN (STR_SAVE_AND_EXIT), STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, - KEY_VALUE_SAVE_AND_EXIT + 0 ); } // // Ensure user can return to the main page. // - HiiCreateGotoOpCode ( + HiiCreateActionOpCode ( mStartOpCodeHandle, - FORM_MAIN_ID, + KEY_VALUE_NO_SAVE_AND_EXIT, STRING_TOKEN (STR_NO_SAVE_AND_EXIT), STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, - KEY_VALUE_NO_SAVE_AND_EXIT + 0 ); HiiUpdateForm ( CallbackData->BmmHiiHandle, - &mBootMaintGuid, + &gBootMaintFormSetGuid, CallbackData->BmmCurrentPageId, mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId mEndOpCodeHandle // LABEL_END @@ -151,7 +151,7 @@ CleanUpPage ( mStartLabel->Number = LabelId; HiiUpdateForm ( CallbackData->BmmHiiHandle, - &mBootMaintGuid, + &gBootMaintFormSetGuid, LabelId, mStartOpCodeHandle, // Label LabelId mEndOpCodeHandle // LABEL_END @@ -180,7 +180,7 @@ BootThisFile ( Option = (BDS_COMMON_OPTION *) AllocatePool (sizeof (BDS_COMMON_OPTION)); ASSERT (Option != NULL); - Option->Description = FileContext->FileName; + Option->Description = (CHAR16 *) AllocateCopyPool (StrSize (FileContext->FileName), FileContext->FileName); Option->DevicePath = FileContext->DevicePath; Option->LoadOptionsSize = 0; Option->LoadOptions = NULL; @@ -263,7 +263,16 @@ UpdateBootDelPage ( } NewLoadContext->Deleted = FALSE; - CallbackData->BmmFakeNvData.BootOptionDel[Index] = 0x00; + + if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) { + // + // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected + // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has + // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser + // through HiiSetBrowserData function. + // + CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE; + } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, @@ -272,7 +281,7 @@ UpdateBootDelPage ( (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, - 0, + EFI_IFR_FLAG_CALLBACK, 0, NULL ); @@ -343,7 +352,16 @@ UpdateDrvDelPage ( NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext->Deleted = FALSE; - CallbackData->BmmFakeNvData.DriverOptionDel[Index] = 0x00; + + if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) { + // + // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected + // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has + // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser + // through HiiSetBrowserData function. + // + CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE; + } HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, @@ -352,7 +370,7 @@ UpdateDrvDelPage ( (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, - 0, + EFI_IFR_FLAG_CALLBACK, 0, NULL ); @@ -449,70 +467,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; - 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; + case FORM_CON_OUT_ID: + ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0]; + QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID; + VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET; + break; - 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)) - ) { + 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 (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); @@ -534,56 +539,76 @@ UpdateOrderPage ( IN BMM_CALLBACK_DATA *CallbackData ) { - BM_MENU_ENTRY *NewMenuEntry; - UINT16 Index; - VOID *OptionsOpCodeHandle; + BM_MENU_ENTRY *NewMenuEntry; + UINT16 Index; + UINT16 OptionIndex; + VOID *OptionsOpCodeHandle; + BOOLEAN BootOptionFound; + UINT32 *OptionOrder; + EFI_QUESTION_ID QuestionId; + UINT16 VarOffset; - CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu); + + OptionOrder = NULL; + QuestionId = 0; + VarOffset = 0; + switch (UpdatePageId) { - ZeroMem (CallbackData->BmmFakeNvData.OptionOrder, 100); + 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; - ( - (Index < OptionMenu->MenuNumber) && - (Index < - ( - sizeof (CallbackData->BmmFakeNvData.OptionOrder) / - sizeof (UINT8) - ) - ) + NewMenuEntry = NULL; + for (OptionIndex = 0; (OptionIndex < MAX_MENU_NUMBER && OptionOrder[OptionIndex] != 0); OptionIndex++) { + BootOptionFound = FALSE; + for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); + if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) { + BootOptionFound = TRUE; + break; + } + } + if (BootOptionFound) { + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + NewMenuEntry->DisplayStringToken, + 0, + EFI_IFR_TYPE_NUM_SIZE_32, + OptionOrder[OptionIndex] ); - Index++ - ) { - NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); - HiiCreateOneOfOptionOpCode ( - OptionsOpCodeHandle, - NewMenuEntry->DisplayStringToken, - 0, - EFI_IFR_NUMERIC_SIZE_1, - (UINT8) (NewMenuEntry->OptionNumber + 1) - ); - CallbackData->BmmFakeNvData.OptionOrder[Index] = (UINT8) (NewMenuEntry->OptionNumber + 1); + } } - + 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 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET - EFI_IFR_NUMERIC_SIZE_1, // Data type of Question value + EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value 100, // Maximum container OptionsOpCodeHandle, // Option Opcode list NULL // Default Opcode is NULL @@ -593,12 +618,6 @@ UpdateOrderPage ( HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); - - CopyMem ( - CallbackData->BmmOldFakeNVData.OptionOrder, - CallbackData->BmmFakeNvData.OptionOrder, - 100 - ); } /** @@ -629,7 +648,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); @@ -640,16 +659,16 @@ UpdateBootNextPage ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, EFI_IFR_OPTION_DEFAULT, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, Index ); - CallbackData->BmmFakeNvData.BootNext = Index; + //CallbackData->BmmFakeNvData.BootNext = Index; } else { HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, Index ); } @@ -660,7 +679,7 @@ UpdateBootNextPage ( OptionsOpCodeHandle, STRING_TOKEN (STR_NONE), EFI_IFR_OPTION_DEFAULT, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, Index ); } else { @@ -668,7 +687,7 @@ UpdateBootNextPage ( OptionsOpCodeHandle, STRING_TOKEN (STR_NONE), 0, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, Index ); } @@ -714,7 +733,7 @@ UpdateTimeOutPage ( DefaultOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (DefaultOpCodeHandle != NULL); - HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_NUMERIC_SIZE_2, BootTimeOut); + HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, BootTimeOut); HiiCreateNumericOpCode ( mStartOpCodeHandle, @@ -733,7 +752,7 @@ UpdateTimeOutPage ( HiiFreeOpCodeHandle (DefaultOpCodeHandle); - CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut; + //CallbackData->BmmFakeNvData.BootTimeOut = BootTimeOut; UpdatePageEnd (CallbackData); } @@ -753,9 +772,8 @@ UpdateConModePage ( UINTN Index; UINTN Col; UINTN Row; - CHAR16 RowString[50]; CHAR16 ModeString[50]; - UINTN TempStringLen; + CHAR16 *PStr; UINTN MaxMode; UINTN ValidMode; EFI_STRING_ID *ModeToken; @@ -796,7 +814,7 @@ UpdateConModePage ( // // Determin which mode should be the first entry in menu // - GetConsoleOutMode (CallbackData); + // GetConsoleOutMode (CallbackData); // // Build text mode options @@ -810,12 +828,11 @@ UpdateConModePage ( // // Build mode string Column x Row // - TempStringLen = UnicodeValueToString (ModeString, 0, Col, 0); - ASSERT ((TempStringLen + StrLen (L" x ")) < (sizeof (ModeString) / sizeof (ModeString[0]))); - StrCat (ModeString, L" x "); - TempStringLen = UnicodeValueToString (RowString, 0, Row, 0); - ASSERT ((StrLen (ModeString) + TempStringLen) < (sizeof (ModeString) / sizeof (ModeString[0]))); - StrCat (ModeString, RowString); + UnicodeValueToString (ModeString, 0, Col, 0); + PStr = &ModeString[0]; + StrCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x "); + PStr = PStr + StrLen (PStr); + UnicodeValueToString (PStr , 0, Row, 0); ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL); @@ -824,7 +841,7 @@ UpdateConModePage ( OptionsOpCodeHandle, ModeToken[Index], EFI_IFR_OPTION_DEFAULT, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, (UINT16) Mode ); } else { @@ -832,7 +849,7 @@ UpdateConModePage ( OptionsOpCodeHandle, ModeToken[Index], 0, - EFI_IFR_NUMERIC_SIZE_2, + EFI_IFR_TYPE_NUM_SIZE_16, (UINT16) Mode ); } @@ -873,49 +890,43 @@ UpdateTerminalPage ( UINT8 Index; UINT8 CheckFlags; 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) { return ; } - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); 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, CheckFlags, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, Index ); } 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, @@ -931,9 +942,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; } @@ -941,16 +950,16 @@ UpdateTerminalPage ( OptionsOpCodeHandle, DataBitsList[Index].StringToken, CheckFlags, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, Index ); } 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, @@ -965,26 +974,24 @@ 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 ( OptionsOpCodeHandle, ParityList[Index].StringToken, CheckFlags, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, Index ); } 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, @@ -999,26 +1006,24 @@ 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 ( OptionsOpCodeHandle, StopBitsList[Index].StringToken, CheckFlags, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, Index ); } 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, @@ -1033,25 +1038,24 @@ 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 ( OptionsOpCodeHandle, (EFI_STRING_ID) TerminalType[Index], CheckFlags, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, Index ); } 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, @@ -1060,6 +1064,37 @@ UpdateTerminalPage ( NULL ); + HiiFreeOpCodeHandle (OptionsOpCodeHandle); + OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (OptionsOpCodeHandle != NULL); + + 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], + CheckFlags, + EFI_IFR_TYPE_NUM_SIZE_8, + mFlowControlValue[Index] + ); + } + + HiiCreateOneOfOpCode ( + mStartOpCodeHandle, + (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal), + VARSTORE_ID_BOOT_MAINT, + (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal), + STRING_TOKEN (STR_COM_FLOW_CONTROL), + STRING_TOKEN (STR_COM_FLOW_CONTROL), + 0, + EFI_IFR_NUMERIC_SIZE_1, + OptionsOpCodeHandle, + NULL + ); + HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); @@ -1106,92 +1141,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, 100, 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. @@ -1207,7 +1156,7 @@ UpdateSetLegacyDeviceOrderPage ( IN BMM_CALLBACK_DATA *CallbackData ) { - BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder; + LEGACY_DEV_ORDER_ENTRY *DevOrder; BM_MENU_OPTION *OptionMenu; BM_MENU_ENTRY *NewMenuEntry; EFI_STRING_ID StrRef; @@ -1242,9 +1191,8 @@ UpdateSetLegacyDeviceOrderPage ( CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); - DisMap = CallbackData->BmmOldFakeNVData.DisableMap; + DisMap = ZeroMem (CallbackData->BmmOldFakeNVData.DisableMap, sizeof (CallbackData->BmmOldFakeNVData.DisableMap)); - SetMem (DisMap, 32, 0); // // Create oneof option list // @@ -1311,34 +1259,26 @@ UpdateSetLegacyDeviceOrderPage ( for (Index = 0; Index < OptionMenu->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index); - - if (Index == 0) { - HiiCreateOneOfOptionOpCode ( - OptionsOpCodeHandle, - NewMenuEntry->DisplayStringToken, - EFI_IFR_OPTION_DEFAULT, - EFI_IFR_NUMERIC_SIZE_1, - (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index - ); - } - + // + // Create OneOf for each legacy device + // HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, - EFI_IFR_NUMERIC_SIZE_1, - (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->Index + EFI_IFR_TYPE_NUM_SIZE_8, + (UINT8) ((BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext)->BbsIndex ); } // - // for item "Disabled" + // Create OneOf for item "Disabled" // HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE), 0, - EFI_IFR_NUMERIC_SIZE_1, + EFI_IFR_TYPE_NUM_SIZE_8, 0xFF ); @@ -1347,20 +1287,20 @@ UpdateSetLegacyDeviceOrderPage ( // VarData = BdsLibGetVariableAndSize ( VAR_LEGACY_DEV_ORDER, - &EfiLegacyDevOrderGuid, + &gEfiLegacyDevOrderVariableGuid, &VarSize ); if (NULL != VarData) { - DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData; + DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; while (VarData < VarData + VarSize) { if (DevOrder->BbsType == BbsType) { break; } - VarData += sizeof (BBS_TYPE); + VarData = (UINT8 *)((UINTN)VarData + sizeof (BBS_TYPE)); VarData += *(UINT16 *) VarData; - DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData; + DevOrder = (LEGACY_DEV_ORDER_ENTRY *) VarData; } // // Create oneof tag here for FD/HD/CD #1 #2 @@ -1388,7 +1328,7 @@ UpdateSetLegacyDeviceOrderPage ( NULL ); - VarDevOrder = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16)); + VarDevOrder = *(UINT16 *) ((UINTN) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index * sizeof (UINT16)); if (0xFF00 == (VarDevOrder & 0xFF00)) { LegacyOrder[Index] = 0xFF; @@ -1408,6 +1348,7 @@ UpdateSetLegacyDeviceOrderPage ( UpdatePageEnd (CallbackData); } + /** Dispatch the display to the next page based on NewPageId. @@ -1421,6 +1362,14 @@ UpdatePageId ( UINT16 NewPageId ) { + // + // For the question don't impact the page update, just ignore it. + // + if (((NewPageId >= BOOT_OPTION_DEL_QUESTION_ID) && (NewPageId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) || + ((NewPageId >= DRIVER_OPTION_DEL_QUESTION_ID) && (NewPageId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER))) { + return; + } + if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) { // // If we select a handle to add driver option, advance to the add handle description page.