Refine the save action for the BdsDxe.

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


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15616 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Eric Dong 2014-07-04 01:58:48 +00:00 committed by ydong10
parent dda74d6d62
commit 8acb3f7b54
6 changed files with 148 additions and 266 deletions

View File

@ -428,6 +428,22 @@ BootMaintRouteConfig (
Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID); 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 // Check data which located in Boot Options Menu and save the settings if need
// //
@ -438,6 +454,8 @@ BootMaintRouteConfig (
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index]; NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];
NewBmmData->BootOptionDel[Index] = FALSE;
NewBmmData->BootOptionDelMark[Index] = FALSE;
} }
Var_DelBootOption (); Var_DelBootOption ();
@ -453,18 +471,12 @@ BootMaintRouteConfig (
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index]; NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];
NewBmmData->DriverOptionDel[Index] = FALSE;
NewBmmData->DriverOptionDelMark[Index] = FALSE;
} }
Var_DelDriverOption (); 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) { if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) {
Status = gRT->SetVariable ( Status = gRT->SetVariable (
L"Timeout", L"Timeout",
@ -837,13 +849,28 @@ BootMaintCallback (
if ((Value == NULL) || (ActionRequest == NULL)) { if ((Value == NULL) || (ActionRequest == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {
if (Value->b){
// //
// need to be subtituded. // 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 // Update Select FD/HD/CD/NET/BEV Order Form
// //
if ((QuestionId >= LEGACY_FD_QUESTION_ID) && (QuestionId < LEGACY_BEV_QUESTION_ID + MAX_MENU_NUMBER)) {
DisMap = Private->BmmOldFakeNVData.DisableMap; DisMap = Private->BmmOldFakeNVData.DisableMap;
@ -991,23 +1018,17 @@ BootMaintCallback (
} else { } else {
switch (QuestionId) { switch (QuestionId) {
case KEY_VALUE_SAVE_AND_EXIT: 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; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
break; 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: case FORM_RESET:
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
@ -1025,205 +1046,6 @@ BootMaintCallback (
return EFI_SUCCESS; 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, Discard all changes done to the BMM pages such as Boot Order change,
Driver order change. Driver order change.
@ -1253,6 +1075,7 @@ DiscardChangeHandler (
ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0]))); ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
CurrentFakeNVMap->BootOptionDel[Index] = FALSE; CurrentFakeNVMap->BootOptionDel[Index] = FALSE;
CurrentFakeNVMap->BootOptionDelMark[Index] = FALSE;
} }
break; break;
@ -1260,6 +1083,7 @@ DiscardChangeHandler (
ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0]))); ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) { for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
CurrentFakeNVMap->DriverOptionDel[Index] = FALSE; CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;
CurrentFakeNVMap->DriverOptionDelMark[Index] = FALSE;
} }
break; break;

View File

@ -44,15 +44,19 @@ formset
subtitle text = STRING_TOKEN(STR_NULL_STRING); subtitle text = STRING_TOKEN(STR_NULL_STRING);
string varid = FeData.BootDescriptionData, string varid = FeData.BootDescriptionData,
questionid = KEY_VALUE_BOOT_DESCRIPTION,
prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC), prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),
help = STRING_TOKEN(STR_NULL_STRING), help = STRING_TOKEN(STR_NULL_STRING),
flags = INTERACTIVE,
minsize = 6, minsize = 6,
maxsize = 75, maxsize = 75,
endstring; endstring;
string varid = FeData.BootOptionalData, string varid = FeData.BootOptionalData,
questionid = KEY_VALUE_BOOT_OPTION,
prompt = STRING_TOKEN(STR_OPTIONAL_DATA), prompt = STRING_TOKEN(STR_OPTIONAL_DATA),
help = STRING_TOKEN(STR_NULL_STRING), help = STRING_TOKEN(STR_NULL_STRING),
flags = INTERACTIVE,
minsize = 0, minsize = 0,
maxsize = 120, maxsize = 120,
endstring; endstring;
@ -84,15 +88,19 @@ formset
subtitle text = STRING_TOKEN(STR_NULL_STRING); subtitle text = STRING_TOKEN(STR_NULL_STRING);
string varid = FeData.DriverDescriptionData, string varid = FeData.DriverDescriptionData,
questionid = KEY_VALUE_DRIVER_DESCRIPTION,
prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC), prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),
help = STRING_TOKEN(STR_NULL_STRING), help = STRING_TOKEN(STR_NULL_STRING),
flags = INTERACTIVE,
minsize = 6, minsize = 6,
maxsize = 75, maxsize = 75,
endstring; endstring;
string varid = FeData.DriverOptionalData, string varid = FeData.DriverOptionalData,
questionid = KEY_VALUE_DRIVER_OPTION,
prompt = STRING_TOKEN(STR_OPTIONAL_DATA), prompt = STRING_TOKEN(STR_OPTIONAL_DATA),
help = STRING_TOKEN(STR_NULL_STRING), help = STRING_TOKEN(STR_NULL_STRING),
flags = INTERACTIVE,
minsize = 0, minsize = 0,
maxsize = 120, maxsize = 120,
endstring; endstring;

View File

@ -177,8 +177,16 @@ UpdateFileExplorer (
case FileExplorerStateAddDriverOptionState: case FileExplorerStateAddDriverOptionState:
if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {
FormId = FORM_BOOT_ADD_DESCRIPTION_ID; 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 { } else {
FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; 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; CallbackData->MenuEntry = NewMenuEntry;
@ -400,41 +408,19 @@ FileExplorerCallback (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) { if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {
// NvRamMap->BootOptionChanged = FALSE;
// Apply changes and exit formset *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
// } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {
if (FileExplorerStateAddBootOption == Private->FeCurrentState) { NvRamMap->DriverOptionChanged = FALSE;
Status = Var_UpdateBootOption (Private, NvRamMap); *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
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;
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) { } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {
// //
// Discard changes and exit formset // Discard changes and exit formset
// //
NvRamMap->DriverOptionalData[0] = 0x0000; NvRamMap->DriverOptionalData[0] = 0x0000;
NvRamMap->DriverDescriptionData[0] = 0x0000; NvRamMap->DriverDescriptionData[0] = 0x0000;
NvRamMap->DriverOptionChanged = FALSE;
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
} else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) { } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {
// //
@ -442,8 +428,13 @@ FileExplorerCallback (
// //
NvRamMap->BootOptionalData[0] = 0x0000; NvRamMap->BootOptionalData[0] = 0x0000;
NvRamMap->BootDescriptionData[0] = 0x0000; NvRamMap->BootDescriptionData[0] = 0x0000;
NvRamMap->BootOptionChanged = FALSE;
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; *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 // 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; return Status;
} }

View File

@ -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_SAVE_AND_EXIT 0x110B
#define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C #define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C
#define KEY_VALUE_BOOT_FROM_FILE 0x110D #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 #define MAXIMUM_NORMAL_KEY_VALUE 0x11FF
@ -162,11 +166,13 @@ typedef struct {
// Boot Option Delete storage // Boot Option Delete storage
// //
BOOLEAN BootOptionDel[MAX_MENU_NUMBER]; BOOLEAN BootOptionDel[MAX_MENU_NUMBER];
BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];
// //
// Driver Option Delete storage // Driver Option Delete storage
// //
BOOLEAN DriverOptionDel[MAX_MENU_NUMBER]; BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];
BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];
// //
// This is the Terminal Attributes value storage // This is the Terminal Attributes value storage
@ -221,6 +227,8 @@ typedef struct {
UINT16 BootOptionalData[127]; UINT16 BootOptionalData[127];
UINT16 DriverDescriptionData[75]; UINT16 DriverDescriptionData[75];
UINT16 DriverOptionalData[127]; UINT16 DriverOptionalData[127];
BOOLEAN BootOptionChanged;
BOOLEAN DriverOptionChanged;
UINT8 Active; UINT8 Active;
UINT8 ForceReconnect; UINT8 ForceReconnect;
} FILE_EXPLORER_NV_DATA; } FILE_EXPLORER_NV_DATA;

View File

@ -263,7 +263,16 @@ UpdateBootDelPage (
} }
NewLoadContext->Deleted = FALSE; 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 ( HiiCreateCheckBoxOpCode (
mStartOpCodeHandle, mStartOpCodeHandle,
@ -272,7 +281,7 @@ UpdateBootDelPage (
(UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index), (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),
NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken, NewMenuEntry->HelpStringToken,
0, EFI_IFR_FLAG_CALLBACK,
0, 0,
NULL NULL
); );
@ -343,7 +352,16 @@ UpdateDrvDelPage (
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = FALSE; 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 ( HiiCreateCheckBoxOpCode (
mStartOpCodeHandle, mStartOpCodeHandle,
@ -352,7 +370,7 @@ UpdateDrvDelPage (
(UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index), (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),
NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken, NewMenuEntry->HelpStringToken,
0, EFI_IFR_FLAG_CALLBACK,
0, 0,
NULL NULL
); );
@ -1349,6 +1367,14 @@ UpdatePageId (
UINT16 NewPageId 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 ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {
// //
// If we select a handle to add driver option, advance to the add handle description page. // If we select a handle to add driver option, advance to the add handle description page.

View File

@ -708,6 +708,16 @@ Var_UpdateDriverOption (
InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link); InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);
DriverOptionMenu.MenuNumber++; 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; *DescriptionData = 0x0000;
*OptionalData = 0x0000; *OptionalData = 0x0000;
} }
@ -879,6 +889,16 @@ Var_UpdateBootOption (
InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);
BootOptionMenu.MenuNumber++; 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->BootDescriptionData[0] = 0x0000;
NvRamMap->BootOptionalData[0] = 0x0000; NvRamMap->BootOptionalData[0] = 0x0000;
} }