From 8acb3f7b54ec6ebf9c01b8c570f5ec0c7530be80 Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Fri, 4 Jul 2014 01:58:48 +0000 Subject: [PATCH] Refine the save action for the BdsDxe. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15616 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/BdsDxe/BootMaint/BootMaint.c | 280 ++++-------------- .../Universal/BdsDxe/BootMaint/FE.vfr | 16 +- .../Universal/BdsDxe/BootMaint/FileExplorer.c | 56 ++-- .../Universal/BdsDxe/BootMaint/FormGuid.h | 8 + .../Universal/BdsDxe/BootMaint/UpdatePage.c | 34 ++- .../Universal/BdsDxe/BootMaint/Variable.c | 20 ++ 6 files changed, 148 insertions(+), 266 deletions(-) diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c index 205537f494..9f3f6d3247 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c @@ -428,6 +428,22 @@ BootMaintRouteConfig ( Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID); } + // + // Change for "delete boot option" page need update NewBmmData->BootOptionOrder, so process + // NewBmmData->BootOptionOrder before NewBmmData->BootOptionDel + // + if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { + Status = Var_UpdateBootOrder (Private); + } + + // + // Change for "delete driver option" page need update NewBmmData->DriverOptionOrder, so process + // NewBmmData->DriverOptionOrder before NewBmmData->DriverOptionDel + // + if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { + Status = Var_UpdateDriverOrder (Private); + } + // // Check data which located in Boot Options Menu and save the settings if need // @@ -438,6 +454,8 @@ BootMaintRouteConfig ( NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index]; + NewBmmData->BootOptionDel[Index] = FALSE; + NewBmmData->BootOptionDelMark[Index] = FALSE; } Var_DelBootOption (); @@ -453,18 +471,12 @@ BootMaintRouteConfig ( NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index]; + NewBmmData->DriverOptionDel[Index] = FALSE; + NewBmmData->DriverOptionDelMark[Index] = FALSE; } Var_DelDriverOption (); } - if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { - Status = Var_UpdateBootOrder (Private); - } - - if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { - Status = Var_UpdateDriverOrder (Private); - } - if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) { Status = gRT->SetVariable ( L"Timeout", @@ -837,13 +849,28 @@ BootMaintCallback ( if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } - - // - // need to be subtituded. - // - // Update Select FD/HD/CD/NET/BEV Order Form - // - if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) { + if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) { + if (Value->b){ + // + // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu. + // + CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE; + } else { + // + // Means user remove the old check status. + // + CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE; + } + } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) { + if (Value->b){ + CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE; + } else { + CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE; + } + } else if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) { + // + // Update Select FD/HD/CD/NET/BEV Order Form + // DisMap = Private->BmmOldFakeNVData.DisableMap; @@ -991,21 +1018,15 @@ BootMaintCallback ( } else { switch (QuestionId) { case KEY_VALUE_SAVE_AND_EXIT: - case KEY_VALUE_NO_SAVE_AND_EXIT: - if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) { - Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId); - if (EFI_ERROR (Status)) { - return Status; - } - } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) { - DiscardChangeHandler (Private, CurrentFakeNVMap); - } - - // - // Tell browser not to ask for confirmation of changes, - // since we have already applied or discarded. - // *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; + break; + + case KEY_VALUE_NO_SAVE_AND_EXIT: + // + // Restore local maintain data. + // + DiscardChangeHandler (Private, CurrentFakeNVMap); + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT; break; case FORM_RESET: @@ -1025,205 +1046,6 @@ BootMaintCallback ( return EFI_SUCCESS; } -/** - Function handling request to apply changes for BMM pages. - - @param Private Pointer to callback data buffer. - @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM - @param FormId ID of the form which has sent the request to apply change. - - @retval EFI_SUCCESS Change successfully applied. - @retval Other Error occurs while trying to apply changes. - -**/ -EFI_STATUS -ApplyChangeHandler ( - IN BMM_CALLBACK_DATA *Private, - IN BMM_FAKE_NV_DATA *CurrentFakeNVMap, - IN EFI_FORM_ID FormId - ) -{ - BM_CONSOLE_CONTEXT *NewConsoleContext; - BM_TERMINAL_CONTEXT *NewTerminalContext; - BM_LOAD_CONTEXT *NewLoadContext; - BM_MENU_ENTRY *NewMenuEntry; - EFI_STATUS Status; - UINT16 Index; - - Status = EFI_SUCCESS; - - switch (FormId) { - case FORM_SET_FD_ORDER_ID: - case FORM_SET_HD_ORDER_ID: - case FORM_SET_CD_ORDER_ID: - case FORM_SET_NET_ORDER_ID: - case FORM_SET_BEV_ORDER_ID: - Var_UpdateBBSOption (Private, FormId); - break; - - case FORM_BOOT_DEL_ID: - for (Index = 0; - ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); - Index ++) { - NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); - NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; - NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index]; - } - - Var_DelBootOption (); - break; - - case FORM_DRV_DEL_ID: - for (Index = 0; - ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); - Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); - NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; - NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index]; - } - - Var_DelDriverOption (); - break; - - case FORM_BOOT_CHG_ID: - Status = Var_UpdateBootOrder (Private); - break; - - case FORM_DRV_CHG_ID: - Status = Var_UpdateDriverOrder (Private); - break; - - case FORM_TIME_OUT_ID: - BdsDxeSetVariableAndReportStatusCodeOnError ( - L"Timeout", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, - sizeof (UINT16), - &(CurrentFakeNVMap->BootTimeOut) - ); - - Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut; - break; - - case FORM_BOOT_NEXT_ID: - Status = Var_UpdateBootNext (Private); - break; - - case FORM_CON_MODE_ID: - Status = Var_UpdateConMode (Private); - break; - - case FORM_CON_COM_SETUP_ID: - Index = (UINT16)Private->CurrentTerminal; - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); - - ASSERT (NewMenuEntry != NULL); - - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - - NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate[Index]; - ASSERT (CurrentFakeNVMap->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0]))); - NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate[Index]].Value; - NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate[Index]; - ASSERT (CurrentFakeNVMap->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0]))); - NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate[Index]].Value; - NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits[Index]; - ASSERT (CurrentFakeNVMap->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0]))); - NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits[Index]].Value; - NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity[Index]; - ASSERT (CurrentFakeNVMap->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0]))); - NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity[Index]].Value; - NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType[Index]; - NewTerminalContext->FlowControl = CurrentFakeNVMap->COMFlowControl[Index]; - - ChangeTerminalDevicePath ( - &(NewTerminalContext->DevicePath), - FALSE - ); - - Var_UpdateConsoleInpOption (); - Var_UpdateConsoleOutOption (); - Var_UpdateErrorOutOption (); - break; - - case FORM_CON_IN_ID: - for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index); - NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleInCheck[Index]; - } - - for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER); - NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber]; - } - - Var_UpdateConsoleInpOption (); - break; - - case FORM_CON_OUT_ID: - for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index); - NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleOutCheck[Index]; - } - - for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER); - NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber]; - } - - Var_UpdateConsoleOutOption (); - break; - - case FORM_CON_ERR_ID: - for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index); - NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleErrCheck[Index]; - } - - for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER); - NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber]; - } - - Var_UpdateErrorOutOption (); - break; - - case FORM_DRV_ADD_HANDLE_DESC_ID: - Status = Var_UpdateDriverOption ( - Private, - Private->BmmHiiHandle, - CurrentFakeNVMap->DriverAddHandleDesc, - CurrentFakeNVMap->DriverAddHandleOptionalData, - CurrentFakeNVMap->DriverAddForceReconnect - ); - if (EFI_ERROR (Status)) { - goto Error; - } - - BOpt_GetDriverOptions (Private); - CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu); - break; - - default: - break; - } - -Error: - return Status; -} - /** Discard all changes done to the BMM pages such as Boot Order change, Driver order change. @@ -1253,6 +1075,7 @@ DiscardChangeHandler ( ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0]))); for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { CurrentFakeNVMap->BootOptionDel[Index] = FALSE; + CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE; } break; @@ -1260,6 +1083,7 @@ DiscardChangeHandler ( ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0]))); for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) { CurrentFakeNVMap->DriverOptionDel[Index] = FALSE; + CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE; } break; diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr index ee181babca..c4ccc578a7 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FE.vfr @@ -44,17 +44,21 @@ formset subtitle text = STRING_TOKEN(STR_NULL_STRING); string varid = FeData.BootDescriptionData, + questionid = KEY_VALUE_BOOT_DESCRIPTION, prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC), help = STRING_TOKEN(STR_NULL_STRING), + flags = INTERACTIVE, minsize = 6, maxsize = 75, endstring; string varid = FeData.BootOptionalData, - prompt = STRING_TOKEN(STR_OPTIONAL_DATA), - help = STRING_TOKEN(STR_NULL_STRING), - minsize = 0, - maxsize = 120, + questionid = KEY_VALUE_BOOT_OPTION, + prompt = STRING_TOKEN(STR_OPTIONAL_DATA), + help = STRING_TOKEN(STR_NULL_STRING), + flags = INTERACTIVE, + minsize = 0, + maxsize = 120, endstring; subtitle text = STRING_TOKEN(STR_NULL_STRING); @@ -84,15 +88,19 @@ formset subtitle text = STRING_TOKEN(STR_NULL_STRING); string varid = FeData.DriverDescriptionData, + questionid = KEY_VALUE_DRIVER_DESCRIPTION, prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC), help = STRING_TOKEN(STR_NULL_STRING), + flags = INTERACTIVE, minsize = 6, maxsize = 75, endstring; string varid = FeData.DriverOptionalData, + questionid = KEY_VALUE_DRIVER_OPTION, prompt = STRING_TOKEN(STR_OPTIONAL_DATA), help = STRING_TOKEN(STR_NULL_STRING), + flags = INTERACTIVE, minsize = 0, maxsize = 120, endstring; diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c index 69bcb94535..f804984fa9 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FileExplorer.c @@ -177,8 +177,16 @@ UpdateFileExplorer ( case FileExplorerStateAddDriverOptionState: if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; + if (!CallbackData->FeFakeNvData.BootOptionChanged) { + ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData)); + ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData)); + } } else { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; + if (!CallbackData->FeFakeNvData.DriverOptionChanged) { + ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData)); + ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData)); + } } CallbackData->MenuEntry = NewMenuEntry; @@ -400,41 +408,19 @@ FileExplorerCallback ( return EFI_INVALID_PARAMETER; } - if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) { - // - // Apply changes and exit formset - // - if (FileExplorerStateAddBootOption == Private->FeCurrentState) { - Status = Var_UpdateBootOption (Private, NvRamMap); - if (EFI_ERROR (Status)) { - return Status; - } - - BOpt_GetBootOptions (Private); - CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu); - } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) { - Status = Var_UpdateDriverOption ( - Private, - Private->FeHiiHandle, - NvRamMap->DriverDescriptionData, - NvRamMap->DriverOptionalData, - NvRamMap->ForceReconnect - ); - if (EFI_ERROR (Status)) { - return Status; - } - - BOpt_GetDriverOptions (Private); - CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu); - } - - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; + if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) { + NvRamMap->BootOptionChanged = FALSE; + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT; + } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) { + NvRamMap->DriverOptionChanged = FALSE; + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT; } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) { // // Discard changes and exit formset // NvRamMap->DriverOptionalData[0] = 0x0000; NvRamMap->DriverDescriptionData[0] = 0x0000; + NvRamMap->DriverOptionChanged = FALSE; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) { // @@ -442,8 +428,13 @@ FileExplorerCallback ( // NvRamMap->BootOptionalData[0] = 0x0000; NvRamMap->BootDescriptionData[0] = 0x0000; + NvRamMap->BootOptionChanged = FALSE; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; - }else if (QuestionId < FILE_OPTION_OFFSET) { + } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) { + NvRamMap->BootOptionChanged = TRUE; + } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) { + NvRamMap->DriverOptionChanged = TRUE; + } else if (QuestionId < FILE_OPTION_OFFSET) { // // Exit File Explorer formset // @@ -469,5 +460,10 @@ FileExplorerCallback ( } } + // + // Pass changed uncommitted data back to Form Browser + // + HiiSetBrowserData (&gFileExploreFormSetGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL); + return Status; } diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h index 6f65307d06..f2e1866845 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/FormGuid.h @@ -66,6 +66,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define KEY_VALUE_SAVE_AND_EXIT 0x110B #define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C #define KEY_VALUE_BOOT_FROM_FILE 0x110D +#define KEY_VALUE_BOOT_DESCRIPTION 0x110E +#define KEY_VALUE_BOOT_OPTION 0x110F +#define KEY_VALUE_DRIVER_DESCRIPTION 0x1110 +#define KEY_VALUE_DRIVER_OPTION 0x1111 #define MAXIMUM_NORMAL_KEY_VALUE 0x11FF @@ -162,11 +166,13 @@ typedef struct { // Boot Option Delete storage // BOOLEAN BootOptionDel[MAX_MENU_NUMBER]; + BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER]; // // Driver Option Delete storage // BOOLEAN DriverOptionDel[MAX_MENU_NUMBER]; + BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER]; // // This is the Terminal Attributes value storage @@ -221,6 +227,8 @@ typedef struct { UINT16 BootOptionalData[127]; UINT16 DriverDescriptionData[75]; UINT16 DriverOptionalData[127]; + BOOLEAN BootOptionChanged; + BOOLEAN DriverOptionChanged; UINT8 Active; UINT8 ForceReconnect; } FILE_EXPLORER_NV_DATA; diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c index 91a38ec702..febfc054ee 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/UpdatePage.c @@ -263,7 +263,16 @@ UpdateBootDelPage ( } NewLoadContext->Deleted = FALSE; - //CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE; + + 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] = FALSE; + + 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 ); @@ -1349,6 +1367,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. diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c index 63eeb54ccf..0e9dbda667 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Variable.c @@ -708,6 +708,16 @@ Var_UpdateDriverOption ( InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link); DriverOptionMenu.MenuNumber++; + // + // Update "change boot order" page used data, append the new add boot + // option at the end. + // + Index = 0; + while (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] != 0) { + Index++; + } + CallbackData->BmmFakeNvData.DriverOptionOrder[Index] = (UINT32) (NewMenuEntry->OptionNumber + 1); + *DescriptionData = 0x0000; *OptionalData = 0x0000; } @@ -879,6 +889,16 @@ Var_UpdateBootOption ( InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); BootOptionMenu.MenuNumber++; + // + // Update "change driver order" page used data, append the new add driver + // option at the end. + // + Index = 0; + while (CallbackData->BmmFakeNvData.BootOptionOrder[Index] != 0) { + Index++; + } + CallbackData->BmmFakeNvData.BootOptionOrder[Index] = (UINT32) (NewMenuEntry->OptionNumber + 1); + NvRamMap->BootDescriptionData[0] = 0x0000; NvRamMap->BootOptionalData[0] = 0x0000; }