Reviewed-by: Eric Dong <[email protected]> -----Original Message----- From: Bi, Dandan Sent: Wednesday, August 19, 2015 7:59 PM To: Dong, Eric; Gao, Liming; [email protected] Subject: [PATCH v2] MdeModulePkg:Full support F10 hot key in UiApp.
In current UiApp/Boot Maintenance manager,some pages don't support F10, they use Commit Changes and Exit menu to save changes.Now support F10 in these pages.Compared with previous patch,mainly update the console page. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Dandan Bi <[email protected]> --- .../Application/UiApp/BootMaint/Bmstring.uni | Bin 41522 -> 42370 bytes .../Application/UiApp/BootMaint/BootMaint.c | 433 ++++++++++----------- .../Application/UiApp/BootMaint/BootMaint.h | 123 +++++- .../Application/UiApp/BootMaint/ConsoleOption.c | 147 +++++++ MdeModulePkg/Application/UiApp/BootMaint/Data.c | 13 + MdeModulePkg/Application/UiApp/BootMaint/FE.vfr | 24 +- .../Application/UiApp/BootMaint/FileExplorer.c | 187 +++++++-- .../Application/UiApp/BootMaint/FormGuid.h | 32 +- .../Application/UiApp/BootMaint/UpdatePage.c | 176 ++++++--- .../Application/UiApp/BootMaint/Variable.c | 26 +- 10 files changed, 804 insertions(+), 357 deletions(-) diff --git a/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni b/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni index 8d9544db450322835972597234a07d76207e1102..f64837b7735f247eb0704c7d21d6639e4eac181b 100644 GIT binary patch delta 272 zcmdmVgsJH?(}o2p;%*E+4E_w^4Dk%kK-!NXgdqq>`%F$`6Q4YRO=WU|0>|XKBo3gu z9EN;`as~yUx_pK_h7yJ%Ae}S$p;;qd`M_Mu$y3~<CI=*$O`ek~u~{m$%Vsi%k%XoP zgCo!?7ogQ3+7;*koKE30<n>@k1X`E^bO4Z^ESQ=-c>}8eKZ+<r>g2*`Wm!MGW(CG+ WPCmdTFuAOu0AvD?=9|1^VIKf3g+yrp delta 18 acmZoV&9vzV(}o2pn;)dI*iQbkqz?dBZV7Gx diff --git a/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c b/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c index 0a6eb6c..0a187f5 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c @@ -294,13 +294,16 @@ BootMaintRouteConfig ( EFI_STATUS Status; UINTN BufferSize; EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; BMM_FAKE_NV_DATA *NewBmmData; BMM_FAKE_NV_DATA *OldBmmData; + BM_CONSOLE_CONTEXT *NewConsoleContext; + BM_TERMINAL_CONTEXT *NewTerminalContext; BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; - UINT16 Index; + UINT16 Index; + BOOLEAN TerminalAttChange; BMM_CALLBACK_DATA *Private; if (Progress == NULL) { return EFI_INVALID_PARAMETER; } @@ -366,18 +369,32 @@ BootMaintRouteConfig ( Index ++) { 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 (); } if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { Status = Var_UpdateBootOrder (Private); - } + } + + if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){ + Status = gRT->SetVariable( + L"Timeout", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, + sizeof(UINT16), + &(NewBmmData->BootTimeOut) + ); + ASSERT_EFI_ERROR(Status); + + Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut; + } // // Check data which located in Driver Options Menu and save the settings if need // if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) { @@ -386,17 +403,116 @@ BootMaintRouteConfig ( Index++) { 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->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { Status = Var_UpdateDriverOrder (Private); - } + } + + if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){ + Var_UpdateConMode(Private); + } + + TerminalAttChange = FALSE; + for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { + + // + // only need update modified items + // + if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 && + CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 && + CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 && + CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 && + CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 && + CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) { + continue; + } + + NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); + ASSERT (NewMenuEntry != NULL); + NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; + NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index]; + ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0]))); + NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value; + NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index]; + ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0]))); + NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value; + NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index]; + ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0]))); + NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value; + NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index]; + ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0]))); + NewTerminalContext->Parity = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value; + NewTerminalContext->TerminalType = NewBmmData->COMTerminalType[Index]; + NewTerminalContext->FlowControl = NewBmmData->COMFlowControl[Index]; + ChangeTerminalDevicePath ( + NewTerminalContext->DevicePath, + FALSE + ); + TerminalAttChange = TRUE; + } + if (TerminalAttChange) { + Var_UpdateConsoleInpOption (); + Var_UpdateConsoleOutOption (); + Var_UpdateErrorOutOption (); + } + // + // Check data which located in Console Options Menu and save the settings if need + // + if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){ + 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 = NewBmmData->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 = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber]; + } + Var_UpdateConsoleInpOption(); + } + + if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){ + 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 = NewBmmData->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 = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber]; + } + Var_UpdateConsoleOutOption(); + } + + if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){ + 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 = NewBmmData->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 = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber]; + } + Var_UpdateErrorOutOption(); + } // // After user do the save action, need to update OldBmmData. // CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA)); @@ -434,11 +550,10 @@ BootMaintCallback ( ) { BMM_CALLBACK_DATA *Private; BM_MENU_ENTRY *NewMenuEntry; BMM_FAKE_NV_DATA *CurrentFakeNVMap; - EFI_STATUS Status; UINTN OldValue; UINTN NewValue; UINTN Number; UINTN Index; @@ -581,36 +696,48 @@ BootMaintCallback ( } else if (Action == EFI_BROWSER_ACTION_CHANGED) { if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } - 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); + 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 { + switch (QuestionId) { + case KEY_VALUE_SAVE_AND_EXIT: + case KEY_VALUE_NO_SAVE_AND_EXIT: + if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) { + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; + } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) { + DiscardChangeHandler (Private, CurrentFakeNVMap); + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT; + } - // - // 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; + break; - case FORM_RESET: - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); - return EFI_UNSUPPORTED; + case FORM_RESET: + gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); + return EFI_UNSUPPORTED; - default: - break; + default: + break; + } } } // // Pass changed uncommitted data back to Form Browser @@ -619,202 +746,10 @@ 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_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]; - CurrentFakeNVMap->BootOptionDel[Index] = FALSE; - } - - 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]; - CurrentFakeNVMap->DriverOptionDel[Index] = FALSE; - } - - 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: - Status = gRT->SetVariable ( - L"Timeout", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, - sizeof (UINT16), - &(CurrentFakeNVMap->BootTimeOut) - ); - ASSERT_EFI_ERROR(Status); - - 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: - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal); - - ASSERT (NewMenuEntry != NULL); - - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - - NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate; - ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0]))); - NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value; - NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate; - ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0]))); - NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value; - NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits; - ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0]))); - NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value; - NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity; - ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0]))); - NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value; - NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType; - - 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->ConsoleCheck[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->ConsoleCheck[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->ConsoleCheck[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->ConsoleCheck[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->ConsoleCheck[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->ConsoleCheck[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. @param Private The BMM context data. @param CurrentFakeNVMap The current Fack NV Map. @@ -993,31 +928,69 @@ InitializeDrivers( HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); FreePool (HiiHandles); } - /** - Create dynamic code for BMM. + Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and + BmmOldFakeNVData member in BMM context data. - @param BmmCallbackInfo The BMM context data. + @param CallbackData The BMM context data. **/ VOID -InitializeBmmConfig( - IN BMM_CALLBACK_DATA *BmmCallbackInfo +InitializeBmmConfig ( + IN BMM_CALLBACK_DATA *CallbackData ) { - UpdateBootDelPage (BmmCallbackInfo); - UpdateDrvDelPage (BmmCallbackInfo); + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + UINT16 Index; - if (TerminalMenu.MenuNumber > 0) { - BmmCallbackInfo->CurrentTerminal = 0; - UpdateTerminalPage (BmmCallbackInfo); + ASSERT (CallbackData != NULL); + + InitializeDrivers (CallbackData); + + // + // Initialize data which located in BMM main page + // + CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber); + for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + + if (NewLoadContext->IsBootNext) { + CallbackData->BmmFakeNvData.BootNext = Index; + break; + } } - InitializeDrivers (BmmCallbackInfo); + CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut); + + // + // Initialize data which located in Boot Options Menu + // + GetBootOrder (CallbackData); + + // + // Initialize data which located in Driver Options Menu + // + GetDriverOrder (CallbackData); + + // + // Initialize data which located in Console Options Menu + // + GetConsoleOutMode (CallbackData); + GetConsoleInCheck (CallbackData); + GetConsoleOutCheck (CallbackData); + GetConsoleErrCheck (CallbackData); + GetTerminalAttribute (CallbackData); + + // + // Backup Initialize BMM configuartion data to BmmOldFakeNVData + // + CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA)); } /** Initialize the Boot Maintenance Utitliy. @@ -1271,11 +1244,11 @@ InitBootMaintenance( BmmCallbackInfo->BmmConfigAccess.RouteConfig = BootMaintRouteConfig; BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback; BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID; BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID; BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig; - BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig; + BmmCallbackInfo->FeConfigAccess.RouteConfig = FileExplorerRouteConfig; BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback; BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive; BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown; // diff --git a/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h b/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h index 69cf760..2427c0d 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h +++ b/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h @@ -175,20 +175,24 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT { #define CON_OUT_COM2_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM2) #define CON_ERR_COM1_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM1) #define CON_ERR_COM2_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM2) #define CON_MODE_VAR_OFFSET VAR_OFFSET (ConsoleOutMode) #define CON_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleCheck) +#define CON_IN_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleInCheck) +#define CON_OUT_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleOutCheck) +#define CON_ERR_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleErrCheck) #define BOOT_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (BootOptionOrder) #define DRIVER_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (DriverOptionOrder) #define BOOT_OPTION_DEL_VAR_OFFSET VAR_OFFSET (BootOptionDel) #define DRIVER_OPTION_DEL_VAR_OFFSET VAR_OFFSET (DriverOptionDel) #define DRIVER_ADD_OPTION_VAR_OFFSET VAR_OFFSET (DriverAddHandleOptionalData) #define COM_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COMBaudRate) #define COM_DATA_RATE_VAR_OFFSET VAR_OFFSET (COMDataRate) #define COM_STOP_BITS_VAR_OFFSET VAR_OFFSET (COMStopBits) #define COM_PARITY_VAR_OFFSET VAR_OFFSET (COMParity) #define COM_TERMINAL_VAR_OFFSET VAR_OFFSET (COMTerminalType) +#define COM_FLOWCONTROL_VAR_OFFSET VAR_OFFSET (COMFlowControl) #define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut) #define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext) #define COM1_BAUD_RATE_QUESTION_ID QUESTION_ID (COM1BaudRate) #define COM1_DATA_RATE_QUESTION_ID QUESTION_ID (COM1DataRate) @@ -209,20 +213,24 @@ typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT { #define CON_OUT_COM2_QUESTION_ID QUESTION_ID (ConsoleOutputCOM2) #define CON_ERR_COM1_QUESTION_ID QUESTION_ID (ConsoleErrorCOM1) #define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2) #define CON_MODE_QUESTION_ID QUESTION_ID (ConsoleOutMode) #define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck) +#define CON_IN_DEVICE_QUESTION_ID QUESTION_ID (ConsoleInCheck) +#define CON_OUT_DEVICE_QUESTION_ID QUESTION_ID (ConsoleOutCheck) +#define CON_ERR_DEVICE_QUESTION_ID QUESTION_ID (ConsoleErrCheck) #define BOOT_OPTION_ORDER_QUESTION_ID QUESTION_ID (BootOptionOrder) #define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder) #define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel) #define DRIVER_OPTION_DEL_QUESTION_ID QUESTION_ID (DriverOptionDel) #define DRIVER_ADD_OPTION_QUESTION_ID QUESTION_ID (DriverAddHandleOptionalData) #define COM_BAUD_RATE_QUESTION_ID QUESTION_ID (COMBaudRate) #define COM_DATA_RATE_QUESTION_ID QUESTION_ID (COMDataRate) #define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits) #define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity) #define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType) +#define COM_FLOWCONTROL_QUESTION_ID QUESTION_ID (COMFlowControl) #define STRING_DEPOSITORY_NUMBER 8 /// /// Serial Ports attributes, first one is the value for @@ -243,10 +251,12 @@ typedef struct { UINT8 BaudRateIndex; UINT8 DataBitsIndex; UINT8 ParityIndex; UINT8 StopBitsIndex; + UINT8 FlowControl; + UINT8 IsConIn; UINT8 IsConOut; UINT8 IsStdErr; UINT8 TerminalType; @@ -1306,28 +1316,10 @@ VOID CleanUpStringDepository ( VOID ); /** - 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 - ); - -/** Discard all changes done to the BMM pages such as Boot Order change, Driver order change. @param Private The BMM context data. @param CurrentFakeNVMap The current Fack NV Map. @@ -1383,10 +1375,51 @@ UpdateFileExplorer ( IN BMM_CALLBACK_DATA *CallbackData, IN UINT16 KeyValue ); /** + This function applies changes in a driver's configuration. + Input is a Configuration, which has the routing data for this + driver followed by name / value configuration pairs. The driver + must apply those pairs to its configurable storage. If the + driver's configuration is stored in a linear block of data + and the driver's name / value pairs are in <BlockConfig> + format, it may use the ConfigToBlock helper function (above) to + simplify the job. Currently not implemented. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Configuration A null-terminated Unicode string in + <ConfigString> format. + @param[out] Progress A pointer to a string filled in with the + offset of the most recent '&' before the + first failing name / value pair (or the + beginn ing of the string if the failure + is in the first name / value pair) or + the terminating NULL if all was + successful. + + @retval EFI_SUCCESS The results have been distributed or are + awaiting distribution. + @retval EFI_OUT_OF_RESOURCES Not enough memory to store the + parts of the results that must be + stored awaiting possible future + protocols. + @retval EFI_INVALID_PARAMETERS Passing in a NULL for the + Results parameter would result + in this type of error. + @retval EFI_NOT_FOUND Target for the specified routing data + was not found. +**/ +EFI_STATUS +EFIAPI +FileExplorerRouteConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Configuration, + OUT EFI_STRING *Progress + ); + +/** This function processes the results of changes in configuration. When user select a interactive opcode, this callback will be triggered. Based on the Question(QuestionId) that triggers the callback, the corresponding actions is performed. It handles: @@ -1438,10 +1471,62 @@ FreeBMPackage( VOID InitBootMaintenance( VOID ); +/** + + Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleInCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ); + +/** + + Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleOutCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ); + +/** + + Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleErrCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ); + +/** + + Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type) + to BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetTerminalAttribute ( + IN BMM_CALLBACK_DATA *CallbackData + ); + // // Global variable in this program (defined in data.c) // extern BM_MENU_OPTION BootOptionMenu; extern BM_MENU_OPTION DriverOptionMenu; @@ -1464,10 +1549,12 @@ extern STRING_DEPOSITORY *BootOptionStrDepository; extern STRING_DEPOSITORY *BootOptionHelpStrDepository; extern STRING_DEPOSITORY *DriverOptionStrDepository; extern STRING_DEPOSITORY *DriverOptionHelpStrDepository; extern STRING_DEPOSITORY *TerminalStrDepository; extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[]; +extern UINT16 mFlowControlType[2]; +extern UINT32 mFlowControlValue[2]; // // Shared IFR form update data // extern VOID *mStartOpCodeHandle; diff --git a/MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c b/MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c index d86c733..e8da72c 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c @@ -991,5 +991,152 @@ GetConsoleOutMode ( break; } } } } + +/** + + Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleInCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT16 Index; + BM_MENU_ENTRY *NewMenuEntry; + UINT8 *ConInCheck; + BM_CONSOLE_CONTEXT *NewConsoleContext; + + ASSERT (CallbackData != NULL); + + ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0]; + for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \ + (Index < MAX_MENU_NUMBER)) ; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index); + NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; + ConInCheck[Index] = NewConsoleContext->IsActive; + } +} + +/** + + Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleOutCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT16 Index; + BM_MENU_ENTRY *NewMenuEntry; + UINT8 *ConOutCheck; + BM_CONSOLE_CONTEXT *NewConsoleContext; + + ASSERT (CallbackData != NULL); + ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0]; + for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \ + (Index < MAX_MENU_NUMBER)) ; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index); + NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; + ConOutCheck[Index] = NewConsoleContext->IsActive; + } +} + +/** + + Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER] + in BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetConsoleErrCheck ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + UINT16 Index; + BM_MENU_ENTRY *NewMenuEntry; + UINT8 *ConErrCheck; + BM_CONSOLE_CONTEXT *NewConsoleContext; + + ASSERT (CallbackData != NULL); + ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0]; + for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \ + (Index < MAX_MENU_NUMBER)) ; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index); + NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; + ConErrCheck[Index] = NewConsoleContext->IsActive; + } +} + +/** + + Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type) + to BMM_FAKE_NV_DATA structure. + + @param CallbackData The BMM context data. + +**/ +VOID +GetTerminalAttribute ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BMM_FAKE_NV_DATA *CurrentFakeNVMap; + BM_MENU_ENTRY *NewMenuEntry; + BM_TERMINAL_CONTEXT *NewTerminalContext; + UINT16 TerminalIndex; + UINT8 AttributeIndex; + + ASSERT (CallbackData != NULL); + + CurrentFakeNVMap = &CallbackData->BmmFakeNvData; + for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \ + (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) { + NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex); + NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; + for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) { + if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) { + NewTerminalContext->BaudRateIndex = AttributeIndex; + break; + } + } + for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) { + if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) { + NewTerminalContext->DataBitsIndex = AttributeIndex; + break; + } + } + + for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) { + if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) { + NewTerminalContext->ParityIndex = AttributeIndex; + break; + } + } + + for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) { + if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) { + NewTerminalContext->StopBitsIndex = AttributeIndex; + break; + } + } + CurrentFakeNVMap->COMBaudRate[TerminalIndex] = NewTerminalContext->BaudRateIndex; + CurrentFakeNVMap->COMDataRate[TerminalIndex] = NewTerminalContext->DataBitsIndex; + CurrentFakeNVMap->COMStopBits[TerminalIndex] = NewTerminalContext->StopBitsIndex; + CurrentFakeNVMap->COMParity[TerminalIndex] = NewTerminalContext->ParityIndex; + CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType; + CurrentFakeNVMap->COMFlowControl[TerminalIndex] = NewTerminalContext->FlowControl; + } +} + diff --git a/MdeModulePkg/Application/UiApp/BootMaint/Data.c b/MdeModulePkg/Application/UiApp/BootMaint/Data.c index 7e86211..eae80d2 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/Data.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/Data.c @@ -36,10 +36,23 @@ UINT16 TerminalType[] = { STRING_TOKEN(STR_COM_TYPE_2), STRING_TOKEN(STR_COM_TYPE_3), }; /// +/// Flow Control type string token storage +/// +UINT16 mFlowControlType[2] = { + STRING_TOKEN(STR_NONE_FLOW_CONTROL), + STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL) +}; + +UINT32 mFlowControlValue[2] = { + 0, + UART_FLOW_CONTROL_HARDWARE +}; + +/// /// File system selection menu /// BM_MENU_OPTION FsOptionMenu = { BM_MENU_OPTION_SIGNATURE, {NULL}, diff --git a/MdeModulePkg/Application/UiApp/BootMaint/FE.vfr b/MdeModulePkg/Application/UiApp/BootMaint/FE.vfr index 0a9bb3e..1401d21 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/FE.vfr +++ b/MdeModulePkg/Application/UiApp/BootMaint/FE.vfr @@ -39,22 +39,26 @@ formset label FORM_BOOT_ADD_DESCRIPTION_ID; label LABEL_END; subtitle text = STRING_TOKEN(STR_NULL_STRING); - string varid = FeData.DescriptionData, + 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.OptionalData, - prompt = STRING_TOKEN(STR_OPTIONAL_DATA), - help = STRING_TOKEN(STR_NULL_STRING), - minsize = 0, - maxsize = 120, + string varid = FeData.BootOptionalData, + 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); text @@ -79,20 +83,24 @@ formset label FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; label LABEL_END; subtitle text = STRING_TOKEN(STR_NULL_STRING); - string varid = FeData.DescriptionData, + 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.OptionalData, + 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; checkbox varid = FeData.ForceReconnect, diff --git a/MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c b/MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c index e2e6b03..e4a68ef 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c @@ -166,12 +166,20 @@ UpdateFileExplorer ( case FileExplorerStateAddBootOption: case FileExplorerStateAddDriverOptionState: if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; + if (!CallbackData->FeFakeNvData.BootOptionChanged) { + ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData)); + ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData)); + } } else { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; + if (!CallbackData->FeFakeNvData.DriverOptionChanged) { + ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData)); + ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData)); + } } CallbackData->MenuEntry = NewMenuEntry; CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath; @@ -206,10 +214,133 @@ UpdateFileExplorer ( exit: return ExitFileExplorer; } /** + This function applies changes in a driver's configuration. + Input is a Configuration, which has the routing data for this + driver followed by name / value configuration pairs. The driver + must apply those pairs to its configurable storage. If the + driver's configuration is stored in a linear block of data + and the driver's name / value pairs are in <BlockConfig> + format, it may use the ConfigToBlock helper function (above) to + simplify the job. Currently not implemented. + + @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. + @param[in] Configuration A null-terminated Unicode string in + <ConfigString> format. + @param[out] Progress A pointer to a string filled in with the + offset of the most recent '&' before the + first failing name / value pair (or the + beginn ing of the string if the failure + is in the first name / value pair) or + the terminating NULL if all was + successful. + + @retval EFI_SUCCESS The results have been distributed or are + awaiting distribution. + @retval EFI_OUT_OF_RESOURCES Not enough memory to store the + parts of the results that must be + stored awaiting possible future + protocols. + @retval EFI_INVALID_PARAMETERS Passing in a NULL for the + Results parameter would result + in this type of error. + @retval EFI_NOT_FOUND Target for the specified routing data + was not found. +**/ +EFI_STATUS +EFIAPI +FileExplorerRouteConfig ( + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Configuration, + OUT EFI_STRING *Progress + ) +{ + EFI_STATUS Status; + UINTN BufferSize; + EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting; + FILE_EXPLORER_NV_DATA *FeData; + BMM_CALLBACK_DATA *Private; + + if (Progress == NULL) { + return EFI_INVALID_PARAMETER; + } + *Progress = Configuration; + + if (Configuration == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Check routing data in <ConfigHdr>. + // Note: there is no name for Name/Value storage, only GUID will be checked + // + if (!HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) { + return EFI_NOT_FOUND; + } + + Status = gBS->LocateProtocol ( + &gEfiHiiConfigRoutingProtocolGuid, + NULL, + (VOID**) &ConfigRouting + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Private = FE_CALLBACK_DATA_FROM_THIS (This); + // + // Get Buffer Storage data from EFI variable + // + BufferSize = sizeof (FILE_EXPLORER_NV_DATA ); + FeData = &Private->FeFakeNvData; + + // + // Convert <ConfigResp> to buffer data by helper function ConfigToBlock() + // + Status = ConfigRouting->ConfigToBlock ( + ConfigRouting, + Configuration, + (UINT8 *) FeData, + &BufferSize, + Progress + ); + ASSERT_EFI_ERROR (Status); + + if (FeData->BootDescriptionData[0] != 0x00 || FeData->BootOptionalData[0] != 0x00) { + Status = Var_UpdateBootOption (Private, FeData); + Private->FeFakeNvData.BootOptionChanged = FALSE; + if (EFI_ERROR (Status)) { + return Status; + } + + BOpt_GetBootOptions (Private); + CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu); + } + + if (FeData->DriverDescriptionData[0] != 0x00 || FeData->DriverOptionalData[0] != 0x00) { + Status = Var_UpdateDriverOption ( + Private, + Private->FeHiiHandle, + FeData->DriverDescriptionData, + FeData->DriverOptionalData, + FeData->ForceReconnect + ); + Private->FeFakeNvData.DriverOptionChanged = FALSE; + if (EFI_ERROR (Status)) { + return Status; + } + + BOpt_GetDriverOptions (Private); + CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu); + } + + return EFI_SUCCESS; +} + +/** This function processes the results of changes in configuration. When user select a interactive opcode, this callback will be triggered. Based on the Question(QuestionId) that triggers the callback, the corresponding actions is performed. It handles: @@ -267,47 +398,34 @@ FileExplorerCallback ( if (Action == EFI_BROWSER_ACTION_CHANGED) { if ((Value == NULL) || (ActionRequest == NULL)) { 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->DescriptionData, - NvRamMap->OptionalData, - 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_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) { + 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_BOOT) { // // Discard changes and exit formset // - NvRamMap->OptionalData[0] = 0x0000; - NvRamMap->DescriptionData[0] = 0x0000; + NvRamMap->BootOptionalData[0] = 0x0000; + NvRamMap->BootDescriptionData[0] = 0x0000; + NvRamMap->BootOptionChanged = FALSE; + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; + } else if ( QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER){ + NvRamMap->BootOptionalData[0] = 0x0000; + NvRamMap->BootDescriptionData[0] = 0x0000; + NvRamMap->DriverOptionChanged = FALSE; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; + } 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 // *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; @@ -320,7 +438,12 @@ FileExplorerCallback ( if (QuestionId >= FILE_OPTION_OFFSET) { UpdateFileExplorer (Private, QuestionId); } } + // + // Pass changed uncommitted data back to Form Browser + // + HiiSetBrowserData (&mFileExplorerGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL); + return Status; } diff --git a/MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h b/MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h index ab3d9c9..257c1fd 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h +++ b/MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h @@ -68,10 +68,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define KEY_VALUE_DRIVER_ADD_OPT_DATA 0x110A #define KEY_VALUE_SAVE_AND_EXIT 0x110B #define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C #define KEY_VALUE_BOOT_FROM_FILE 0x110D #define FORM_RESET 0x110E +#define KEY_VALUE_BOOT_DESCRIPTION 0x110F +#define KEY_VALUE_BOOT_OPTION 0x1110 +#define KEY_VALUE_DRIVER_DESCRIPTION 0x1111 +#define KEY_VALUE_DRIVER_OPTION 0x1112 #define MAXIMUM_NORMAL_KEY_VALUE 0x11FF // // Varstore ID defined for Buffer Storage @@ -140,10 +144,17 @@ typedef struct { // // At most 100 input/output/errorout device for console storage // UINT8 ConsoleCheck[MAX_MENU_NUMBER]; + + // + // At most 100 input/output/errorout device for console storage + // + UINT8 ConsoleInCheck[MAX_MENU_NUMBER]; + UINT8 ConsoleOutCheck[MAX_MENU_NUMBER]; + UINT8 ConsoleErrCheck[MAX_MENU_NUMBER]; // // Boot or Driver Option Order storage // The value is the OptionNumber+1 because the order list value cannot be 0 // Use UINT32 to hold the potential value 0xFFFF+1=0x10000 @@ -153,19 +164,22 @@ typedef struct { // // Boot or Driver Option Delete storage // BOOLEAN BootOptionDel[MAX_MENU_NUMBER]; BOOLEAN DriverOptionDel[MAX_MENU_NUMBER]; + BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER]; + BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER]; // // This is the Terminal Attributes value storage // - UINT8 COMBaudRate; - UINT8 COMDataRate; - UINT8 COMStopBits; - UINT8 COMParity; - UINT8 COMTerminalType; + UINT8 COMBaudRate[MAX_MENU_NUMBER]; + UINT8 COMDataRate[MAX_MENU_NUMBER]; + UINT8 COMStopBits[MAX_MENU_NUMBER]; + UINT8 COMParity[MAX_MENU_NUMBER]; + UINT8 COMTerminalType[MAX_MENU_NUMBER]; + UINT8 COMFlowControl[MAX_MENU_NUMBER]; // // We use DisableMap array to record the enable/disable state of each boot device // It should be taken as a bit array, from left to right there are totally 256 bits // the most left one stands for BBS table item 0, and the most right one stands for item 256 @@ -193,12 +207,16 @@ typedef struct { /// /// This is the data structure used by File Explorer formset /// typedef struct { - UINT16 DescriptionData[MAX_MENU_NUMBER]; - UINT16 OptionalData[127]; + UINT16 BootDescriptionData[MAX_MENU_NUMBER]; + UINT16 BootOptionalData[127]; + UINT16 DriverDescriptionData[MAX_MENU_NUMBER]; + UINT16 DriverOptionalData[127]; + BOOLEAN BootOptionChanged; + BOOLEAN DriverOptionChanged; UINT8 Active; UINT8 ForceReconnect; } FILE_EXPLORER_NV_DATA; #endif diff --git a/MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c b/MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c index 0e85a83..9f314dc 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c @@ -212,10 +212,12 @@ UpdateConCOMPage ( ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; + CallbackData->BmmAskSaveOrNot = TRUE; + UpdatePageStart (CallbackData); for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); @@ -247,11 +249,11 @@ UpdateBootDelPage ( { BM_MENU_ENTRY *NewMenuEntry; BM_LOAD_CONTEXT *NewLoadContext; UINT16 Index; - //CallbackData->BmmAskSaveOrNot = TRUE; + CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu); ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0]))); @@ -260,10 +262,22 @@ UpdateBootDelPage ( NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; if (NewLoadContext->IsLegacy) { continue; } + NewLoadContext->Deleted = 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; + } + // // Check to see if the current boot option devicepath is the ShellDevice // path. If it is keep only UEFI Shell in the delete boot option list // or else continue // @@ -276,11 +290,11 @@ UpdateBootDelPage ( (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, - 0, + EFI_IFR_FLAG_CALLBACK, 0, NULL ); //} else { // continue; @@ -349,20 +363,28 @@ UpdateDrvDelPage ( for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); 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, (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index), VARSTORE_ID_BOOT_MAINT, (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, - 0, + EFI_IFR_FLAG_CALLBACK, 0, NULL ); } @@ -460,72 +482,108 @@ UpdateConsolePage ( BM_CONSOLE_CONTEXT *NewConsoleContext; BM_TERMINAL_CONTEXT *NewTerminalContext; UINT16 Index; UINT16 Index2; UINT8 CheckFlags; - + UINT8 *ConsoleCheck; + UINT8 *OldConsoleCheck; + UINTN ConsoleCheckSize; + EFI_QUESTION_ID QuestionIdBase; + UINT16 VariableOffsetBase; + CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); + ConsoleCheck = NULL; + QuestionIdBase = 0; + VariableOffsetBase = 0; + + switch (UpdatePageId) { + case FORM_CON_IN_ID: + ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0]; + OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0]; + ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck); + QuestionIdBase = CON_IN_DEVICE_QUESTION_ID; + VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET; + break; + + case FORM_CON_OUT_ID: + ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0]; + OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0]; + ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck); + QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID; + VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET; + break; + + case FORM_CON_ERR_ID: + ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0]; + OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0]; + ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck); + QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID; + VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET; + break; + } + ASSERT (ConsoleCheck != NULL); + for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \ - (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) { - NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); + (Index < MAX_MENU_NUMBER)) ; Index++) { + CheckFlags = 0; + NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; - CheckFlags = 0; if (NewConsoleContext->IsActive) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; - CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; + ConsoleCheck[Index] = TRUE; } else { - CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; + ConsoleCheck[Index] = FALSE; } - HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index), + (EFI_QUESTION_ID) (QuestionIdBase + Index), VARSTORE_ID_BOOT_MAINT, - (UINT16) (CON_DEVICE_VAR_OFFSET + Index), + (UINT16) (VariableOffsetBase + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); } for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \ - (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) { + (Index2 < MAX_MENU_NUMBER)); Index2++) { CheckFlags = 0; NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2); NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) || ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) || ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID)) ) { CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT; - CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE; + ConsoleCheck[Index] = TRUE; } else { - CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE; + ConsoleCheck[Index] = FALSE; } - HiiCreateCheckBoxOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index), + (EFI_QUESTION_ID) (QuestionIdBase + Index), VARSTORE_ID_BOOT_MAINT, - (UINT16) (CON_DEVICE_VAR_OFFSET + Index), + (UINT16) (VariableOffsetBase + Index), NewMenuEntry->DisplayStringToken, NewMenuEntry->HelpStringToken, 0, CheckFlags, NULL ); Index++; } + CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize); + UpdatePageEnd (CallbackData); } /** Update the page's NV Map if user has changed the order @@ -881,11 +939,11 @@ UpdateConModePage ( FreePool (ModeToken); UpdatePageEnd (CallbackData); } -/** + /** Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits, Parity, Stop Bits, Terminal Type. @param CallbackData The BMM context data. @@ -896,39 +954,35 @@ UpdateTerminalPage ( ) { UINT8 Index; UINT8 CheckFlags; BM_MENU_ENTRY *NewMenuEntry; - BM_TERMINAL_CONTEXT *NewTerminalContext; VOID *OptionsOpCodeHandle; + UINTN CurrentTerminal; CallbackData->BmmAskSaveOrNot = TRUE; UpdatePageStart (CallbackData); + CurrentTerminal = CallbackData->CurrentTerminal; NewMenuEntry = BOpt_GetMenuEntry ( &TerminalMenu, - CallbackData->CurrentTerminal + CurrentTerminal ); if (NewMenuEntry == NULL) { return ; } - NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext; - OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) { CheckFlags = 0; - if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) { + if (BaudRateList[Index].Value == 115200) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; - NewTerminalContext->BaudRateIndex = Index; - CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex; } - HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, BaudRateList[Index].StringToken, CheckFlags, EFI_IFR_TYPE_NUM_SIZE_8, @@ -936,13 +990,13 @@ UpdateTerminalPage ( ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID, + (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, - COM_BAUD_RATE_VAR_OFFSET, + (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_BAUD_RATE), STRING_TOKEN (STR_COM_BAUD_RATE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, @@ -954,13 +1008,11 @@ UpdateTerminalPage ( ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) { CheckFlags = 0; - if (NewTerminalContext->DataBits == DataBitsList[Index].Value) { - NewTerminalContext->DataBitsIndex = Index; - CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex; + if (DataBitsList[Index].Value == 8) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, @@ -971,13 +1023,13 @@ UpdateTerminalPage ( ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID, + (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, - COM_DATA_RATE_VAR_OFFSET, + (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_DATA_BITS), STRING_TOKEN (STR_COM_DATA_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, @@ -988,14 +1040,12 @@ UpdateTerminalPage ( OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) { CheckFlags = 0; - if (NewTerminalContext->Parity == ParityList[Index].Value) { + if (ParityList[Index].Value == NoParity) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; - NewTerminalContext->ParityIndex = (UINT8) Index; - CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, ParityList[Index].StringToken, @@ -1005,13 +1055,13 @@ UpdateTerminalPage ( ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID, + (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, - COM_PARITY_VAR_OFFSET, + (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_PARITY), STRING_TOKEN (STR_COM_PARITY), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, @@ -1022,14 +1072,12 @@ UpdateTerminalPage ( OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) { CheckFlags = 0; - if (NewTerminalContext->StopBits == StopBitsList[Index].Value) { + if (StopBitsList[Index].Value == OneStopBit) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; - NewTerminalContext->StopBitsIndex = (UINT8) Index; - CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, StopBitsList[Index].StringToken, @@ -1039,13 +1087,13 @@ UpdateTerminalPage ( ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID, + (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, - COM_STOP_BITS_VAR_OFFSET, + (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_STOP_BITS), STRING_TOKEN (STR_COM_STOP_BITS), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, @@ -1056,13 +1104,12 @@ UpdateTerminalPage ( OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (OptionsOpCodeHandle != NULL); for (Index = 0; Index < 4; Index++) { CheckFlags = 0; - if (NewTerminalContext->TerminalType == Index) { + if (Index == 0) { CheckFlags |= EFI_IFR_OPTION_DEFAULT; - CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType; } HiiCreateOneOfOptionOpCode ( OptionsOpCodeHandle, (EFI_STRING_ID) TerminalType[Index], @@ -1072,22 +1119,53 @@ UpdateTerminalPage ( ); } HiiCreateOneOfOpCode ( mStartOpCodeHandle, - (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID, + (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal), VARSTORE_ID_BOOT_MAINT, - COM_TERMINAL_VAR_OFFSET, + (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal), STRING_TOKEN (STR_COM_TERMI_TYPE), STRING_TOKEN (STR_COM_TERMI_TYPE), 0, EFI_IFR_NUMERIC_SIZE_1, OptionsOpCodeHandle, NULL ); HiiFreeOpCodeHandle (OptionsOpCodeHandle); + OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (OptionsOpCodeHandle != NULL); + + for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) { + CheckFlags = 0; + if (Index == 0) { + CheckFlags |= EFI_IFR_OPTION_DEFAULT; + } + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + (EFI_STRING_ID) mFlowControlType[Index], + CheckFlags, + EFI_IFR_TYPE_NUM_SIZE_8, + mFlowControlValue[Index] + ); + } + + HiiCreateOneOfOpCode ( + mStartOpCodeHandle, + (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal), + VARSTORE_ID_BOOT_MAINT, + (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal), + STRING_TOKEN (STR_COM_FLOW_CONTROL), + STRING_TOKEN (STR_COM_FLOW_CONTROL), + 0, + EFI_IFR_NUMERIC_SIZE_1, + OptionsOpCodeHandle, + NULL + ); + + HiiFreeOpCodeHandle (OptionsOpCodeHandle); UpdatePageEnd (CallbackData); } /** diff --git a/MdeModulePkg/Application/UiApp/BootMaint/Variable.c b/MdeModulePkg/Application/UiApp/BootMaint/Variable.c index 2b594fc..c80fada 100644 --- a/MdeModulePkg/Application/UiApp/BootMaint/Variable.c +++ b/MdeModulePkg/Application/UiApp/BootMaint/Variable.c @@ -726,20 +726,20 @@ Var_UpdateBootOption ( OptionalDataExist = FALSE; Index = BOpt_GetBootOptionNumber () ; UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index); - if (NvRamMap->DescriptionData[0] == 0x0000) { - StrCpyS (NvRamMap->DescriptionData, sizeof (NvRamMap->DescriptionData) / sizeof (NvRamMap->DescriptionData[0]), BootString); + if (NvRamMap->BootDescriptionData[0] == 0x0000) { + StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString); } - BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData); + BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData); BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList); - if (NvRamMap->OptionalData[0] != 0x0000) { + if (NvRamMap->BootOptionalData[0] != 0x0000) { OptionalDataExist = TRUE; - BufferSize += StrSize (NvRamMap->OptionalData); + BufferSize += StrSize (NvRamMap->BootOptionalData); } Buffer = AllocateZeroPool (BufferSize); if (NULL == Buffer) { return EFI_OUT_OF_RESOURCES; @@ -765,25 +765,25 @@ Var_UpdateBootOption ( NewLoadContext->FilePathListLength = *((UINT16 *) Ptr); Ptr += sizeof (UINT16); CopyMem ( Ptr, - NvRamMap->DescriptionData, - StrSize (NvRamMap->DescriptionData) + NvRamMap->BootDescriptionData, + StrSize (NvRamMap->BootDescriptionData) ); - NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData)); + NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData)); ASSERT (NewLoadContext->Description != NULL); NewMenuEntry->DisplayString = NewLoadContext->Description; CopyMem ( NewLoadContext->Description, (VOID *) Ptr, - StrSize (NvRamMap->DescriptionData) + StrSize (NvRamMap->BootDescriptionData) ); - Ptr += StrSize (NvRamMap->DescriptionData); + Ptr += StrSize (NvRamMap->BootDescriptionData); CopyMem ( Ptr, CallbackData->LoadContext->FilePathList, GetDevicePathSize (CallbackData->LoadContext->FilePathList) ); @@ -812,11 +812,11 @@ Var_UpdateBootOption ( NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->FeHiiHandle, 0, NewMenuEntry->HelpString, NULL); if (OptionalDataExist) { Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList); - CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData)); + CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData)); } Status = gRT->SetVariable ( BootString, &gEfiGlobalVariableGuid, @@ -850,12 +850,12 @@ Var_UpdateBootOption ( FreePool (NewBootOrderList); NewBootOrderList = NULL; InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); BootOptionMenu.MenuNumber++; - NvRamMap->DescriptionData[0] = 0x0000; - NvRamMap->OptionalData[0] = 0x0000; + NvRamMap->BootDescriptionData[0] = 0x0000; + NvRamMap->BootOptionalData[0] = 0x0000; return EFI_SUCCESS; } /** This function update the "BootNext" EFI Variable. If there is -- 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

