mirror of https://github.com/acidanthera/audk.git
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:
parent
dda74d6d62
commit
8acb3f7b54
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue