Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID);\r
}\r
\r
+ //\r
+ // Change for "delete boot option" page need update NewBmmData->BootOptionOrder, so process \r
+ // NewBmmData->BootOptionOrder before NewBmmData->BootOptionDel\r
+ //\r
+ if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { \r
+ Status = Var_UpdateBootOrder (Private);\r
+ }\r
+\r
+ //\r
+ // Change for "delete driver option" page need update NewBmmData->DriverOptionOrder, so process \r
+ // NewBmmData->DriverOptionOrder before NewBmmData->DriverOptionDel\r
+ //\r
+ if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
+ Status = Var_UpdateDriverOrder (Private);\r
+ }\r
+\r
//\r
// Check data which located in Boot Options Menu and save the settings if need\r
//\r
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
+ NewBmmData->BootOptionDel[Index] = FALSE;\r
+ NewBmmData->BootOptionDelMark[Index] = FALSE;\r
}\r
\r
Var_DelBootOption ();\r
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
+ NewBmmData->DriverOptionDel[Index] = FALSE;\r
+ NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
}\r
Var_DelDriverOption ();\r
}\r
\r
- if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { \r
- Status = Var_UpdateBootOrder (Private);\r
- }\r
-\r
- if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
- Status = Var_UpdateDriverOrder (Private);\r
- }\r
-\r
if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) {\r
Status = gRT->SetVariable (\r
L"Timeout",\r
if ((Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
- //\r
- // need to be subtituded.\r
- //\r
- // Update Select FD/HD/CD/NET/BEV Order Form\r
- //\r
- if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ //\r
+ // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ //\r
+ // Means user remove the old check status.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
+ }\r
+ } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+ }\r
+ } else if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ //\r
+ // Update Select FD/HD/CD/NET/BEV Order Form\r
+ //\r
\r
DisMap = Private->BmmOldFakeNVData.DisableMap;\r
\r
} else {\r
switch (QuestionId) {\r
case KEY_VALUE_SAVE_AND_EXIT:\r
- case KEY_VALUE_NO_SAVE_AND_EXIT:\r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
- Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
- DiscardChangeHandler (Private, CurrentFakeNVMap);\r
- }\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ break;\r
\r
+ case KEY_VALUE_NO_SAVE_AND_EXIT:\r
//\r
- // Tell browser not to ask for confirmation of changes,\r
- // since we have already applied or discarded.\r
+ // Restore local maintain data.\r
//\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
break; \r
\r
case FORM_RESET:\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Function handling request to apply changes for BMM pages.\r
-\r
- @param Private Pointer to callback data buffer.\r
- @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM\r
- @param FormId ID of the form which has sent the request to apply change.\r
-\r
- @retval EFI_SUCCESS Change successfully applied.\r
- @retval Other Error occurs while trying to apply changes.\r
-\r
-**/\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
- IN EFI_FORM_ID FormId\r
- )\r
-{\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- switch (FormId) {\r
- case FORM_SET_FD_ORDER_ID:\r
- case FORM_SET_HD_ORDER_ID:\r
- case FORM_SET_CD_ORDER_ID:\r
- case FORM_SET_NET_ORDER_ID:\r
- case FORM_SET_BEV_ORDER_ID:\r
- Var_UpdateBBSOption (Private, FormId);\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- for (Index = 0; \r
- ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); \r
- Index ++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
- }\r
-\r
- Var_DelBootOption ();\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- for (Index = 0; \r
- ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); \r
- Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
- }\r
-\r
- Var_DelDriverOption ();\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- Status = Var_UpdateBootOrder (Private);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- Status = Var_UpdateDriverOrder (Private);\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- BdsDxeSetVariableAndReportStatusCodeOnError (\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (UINT16),\r
- &(CurrentFakeNVMap->BootTimeOut)\r
- );\r
-\r
- Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- Status = Var_UpdateBootNext (Private);\r
- break;\r
-\r
- case FORM_CON_MODE_ID:\r
- Status = Var_UpdateConMode (Private);\r
- break;\r
-\r
- case FORM_CON_COM_SETUP_ID:\r
- Index = (UINT16)Private->CurrentTerminal;\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
- ASSERT (NewMenuEntry != NULL);\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate[Index];\r
- ASSERT (CurrentFakeNVMap->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
- NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate[Index]].Value;\r
- NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate[Index];\r
- ASSERT (CurrentFakeNVMap->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
- NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate[Index]].Value;\r
- NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits[Index];\r
- ASSERT (CurrentFakeNVMap->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
- NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits[Index]].Value;\r
- NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity[Index];\r
- ASSERT (CurrentFakeNVMap->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
- NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity[Index]].Value;\r
- NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType[Index];\r
- NewTerminalContext->FlowControl = CurrentFakeNVMap->COMFlowControl[Index];\r
-\r
- ChangeTerminalDevicePath (\r
- &(NewTerminalContext->DevicePath),\r
- FALSE\r
- );\r
-\r
- Var_UpdateConsoleInpOption ();\r
- Var_UpdateConsoleOutOption ();\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_CON_IN_ID:\r
- for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleInCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleInpOption ();\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleOutCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleOutOption ();\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleErrCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_DESC_ID:\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->BmmHiiHandle,\r
- CurrentFakeNVMap->DriverAddHandleDesc,\r
- CurrentFakeNVMap->DriverAddHandleOptionalData,\r
- CurrentFakeNVMap->DriverAddForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
-Error:\r
- return Status;\r
-}\r
-\r
/**\r
Discard all changes done to the BMM pages such as Boot Order change,\r
Driver order change.\r
ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
+ CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE;\r
}\r
break;\r
\r
ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
+ CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE;\r
}\r
break;\r
\r
case FileExplorerStateAddDriverOptionState:\r
if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
+ if (!CallbackData->FeFakeNvData.BootOptionChanged) {\r
+ ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData));\r
+ ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData));\r
+ }\r
} else {\r
FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
+ if (!CallbackData->FeFakeNvData.DriverOptionChanged) {\r
+ ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData));\r
+ ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData));\r
+ }\r
}\r
\r
CallbackData->MenuEntry = NewMenuEntry;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
- //\r
- // Apply changes and exit formset\r
- //\r
- if (FileExplorerStateAddBootOption == Private->FeCurrentState) {\r
- Status = Var_UpdateBootOption (Private, NvRamMap);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetBootOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
- } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) {\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->FeHiiHandle,\r
- NvRamMap->DriverDescriptionData,\r
- NvRamMap->DriverOptionalData,\r
- NvRamMap->ForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
- }\r
-\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+ if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
+ NvRamMap->BootOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+ } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
+ NvRamMap->DriverOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
//\r
// Discard changes and exit formset\r
//\r
NvRamMap->DriverOptionalData[0] = 0x0000;\r
NvRamMap->DriverDescriptionData[0] = 0x0000;\r
+ NvRamMap->DriverOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
//\r
//\r
NvRamMap->BootOptionalData[0] = 0x0000;\r
NvRamMap->BootDescriptionData[0] = 0x0000;\r
+ NvRamMap->BootOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
- }else if (QuestionId < FILE_OPTION_OFFSET) {\r
+ } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
+ NvRamMap->BootOptionChanged = TRUE;\r
+ } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
+ NvRamMap->DriverOptionChanged = TRUE;\r
+ } else if (QuestionId < FILE_OPTION_OFFSET) {\r
//\r
// Exit File Explorer formset\r
//\r
}\r
}\r
\r
+ //\r
+ // Pass changed uncommitted data back to Form Browser\r
+ //\r
+ HiiSetBrowserData (&gFileExploreFormSetGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL);\r
+\r
return Status;\r
}\r