From be9304f33f78a645512e76e6d44a69198d5f3c06 Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Wed, 18 Jun 2014 02:19:50 +0000 Subject: Support RouteConfig function for BdsDxe driver. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong Reviewed-by: Gao, Liming git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15563 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/BdsDxe/BootMaint/BootMaint.c | 875 ++++++++++++++++----- 1 file changed, 665 insertions(+), 210 deletions(-) (limited to 'IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c') diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c index b974a67ea5..6f5b56ec8a 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.c @@ -74,6 +74,7 @@ HII_VENDOR_DEVICE_PATH mFeHiiVendorDevicePath = { CHAR16 mBootMaintStorageName[] = L"BmmData"; CHAR16 mFileExplorerStorageName[] = L"FeData"; +BMM_CALLBACK_DATA *mBmmCallbackInfo = NULL; /** Init all memu. @@ -95,6 +96,66 @@ FreeAllMenu ( VOID ); +/** + Initialize all of BMM configuration data in BmmFakeNvData and BmmOldFakeNVData member + in BMM context data and create all of dynamic OP code for BMM. + + @param CallbackData The BMM context data. + +**/ +VOID +InitializeBmmConfig ( + IN BMM_CALLBACK_DATA *CallbackData + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + UINT16 Index; + + ASSERT (CallbackData != NULL); + + // + // 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; + } + } + + CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut); + + // + // Initialize data which located in Boot Options Menu + // + GetBootOrder (CallbackData); + GetLegacyDeviceOrder (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)); +} + /** Create string tokens for a menu from its help strings and display strings @@ -241,6 +302,353 @@ BootMaintExtractConfig ( return Status; } +/** + 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 + 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 + 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 +BootMaintRouteConfig ( + 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; + 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; + BOOLEAN TerminalAttChange; + BMM_CALLBACK_DATA *Private; + + if (Progress == NULL) { + return EFI_INVALID_PARAMETER; + } + *Progress = Configuration; + + if (Configuration == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Check routing data in . + // Note: there is no name for Name/Value storage, only GUID will be checked + // + if (!HiiIsConfigHdrMatch (Configuration, &gBootMaintFormSetGuid, mBootMaintStorageName)) { + return EFI_NOT_FOUND; + } + + Status = gBS->LocateProtocol ( + &gEfiHiiConfigRoutingProtocolGuid, + NULL, + &ConfigRouting + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Private = BMM_CALLBACK_DATA_FROM_THIS (This); + // + // Get Buffer Storage data from EFI variable + // + BufferSize = sizeof (BMM_FAKE_NV_DATA); + OldBmmData = &Private->BmmOldFakeNVData; + NewBmmData = &Private->BmmFakeNvData; + // + // Convert to buffer data by helper function ConfigToBlock() + // + Status = ConfigRouting->ConfigToBlock ( + ConfigRouting, + Configuration, + (UINT8 *) NewBmmData, + &BufferSize, + Progress + ); + ASSERT_EFI_ERROR (Status); + // + // Compare new and old BMM configuration data and only do action for modified item to + // avoid setting unnecessary non-volatile variable + // + + // + // Check data which located in BMM main page and save the settings if need + // + if (CompareMem (NewBmmData->LegacyFD, OldBmmData->LegacyFD, sizeof (NewBmmData->LegacyFD)) != 0) { + Var_UpdateBBSOption (Private, FORM_SET_FD_ORDER_ID); + } + + if (CompareMem (NewBmmData->LegacyHD, OldBmmData->LegacyHD, sizeof (NewBmmData->LegacyHD)) != 0) { + Var_UpdateBBSOption (Private, FORM_SET_HD_ORDER_ID); + } + + if (CompareMem (NewBmmData->LegacyCD, OldBmmData->LegacyCD, sizeof (NewBmmData->LegacyCD)) != 0) { + Var_UpdateBBSOption (Private, FORM_SET_CD_ORDER_ID); + } + + if (CompareMem (NewBmmData->LegacyNET, OldBmmData->LegacyNET, sizeof (NewBmmData->LegacyNET)) != 0) { + Var_UpdateBBSOption (Private, FORM_SET_NET_ORDER_ID); + } + + if (CompareMem (NewBmmData->LegacyBEV, OldBmmData->LegacyBEV, sizeof (NewBmmData->LegacyBEV)) != 0) { + Var_UpdateBBSOption (Private, FORM_SET_BEV_ORDER_ID); + } + + // + // Check data which located in Boot Options Menu and save the settings if need + // + if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) { + for (Index = 0; + ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); + Index ++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index]; + } + + Var_DelBootOption (); + } + + // + // Check data which located in Driver Options Menu and save the settings if need + // + if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) { + for (Index = 0; + ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); + Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index]; + } + Var_DelDriverOption (); + } + + if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { + Status = Var_UpdateBootOrder (Private); + } + + if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { + Status = Var_UpdateDriverOrder (Private); + } + + if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0) { + Status = gRT->SetVariable ( + L"Timeout", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, + sizeof (UINT16), + &(NewBmmData->BootTimeOut) + ); + ASSERT_EFI_ERROR(Status); + + // + // Bugbug: code not exit in UiApp but in IntelFrameworkModulePkg, need do more check. + // + Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut; + } + + if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) { + Status = Var_UpdateBootNext (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]; + } + + 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]; + } + + 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]; + } + + Var_UpdateErrorOutOption (); + } + + // + // After user do the save action, need to update OldBmmData. + // + CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA)); + + return EFI_SUCCESS; +} + +/** + Create GoTo OP code into FORM_BOOT_LEGACY_DEVICE label for legacy boot option. + +**/ +EFI_STATUS +InitializeLegacyBootOption ( + VOID + ) +{ + RefreshUpdateData (); + mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID; + + // + // If LegacyBios Protocol is installed, add 3 tags about legacy boot option + // in BootOption form: legacy FD/HD/CD/NET/BEV + // + HiiCreateGotoOpCode ( + mStartOpCodeHandle, + FORM_SET_FD_ORDER_ID, + STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), + STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), + EFI_IFR_FLAG_CALLBACK, + FORM_SET_FD_ORDER_ID + ); + + HiiCreateGotoOpCode ( + mStartOpCodeHandle, + FORM_SET_HD_ORDER_ID, + STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), + STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), + EFI_IFR_FLAG_CALLBACK, + FORM_SET_HD_ORDER_ID + ); + + HiiCreateGotoOpCode ( + mStartOpCodeHandle, + FORM_SET_CD_ORDER_ID, + STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), + STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), + EFI_IFR_FLAG_CALLBACK, + FORM_SET_CD_ORDER_ID + ); + + HiiCreateGotoOpCode ( + mStartOpCodeHandle, + FORM_SET_NET_ORDER_ID, + STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), + STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), + EFI_IFR_FLAG_CALLBACK, + FORM_SET_NET_ORDER_ID + ); + + HiiCreateGotoOpCode ( + mStartOpCodeHandle, + FORM_SET_BEV_ORDER_ID, + STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), + STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), + EFI_IFR_FLAG_CALLBACK, + FORM_SET_BEV_ORDER_ID + ); + + HiiUpdateForm ( + mBmmCallbackInfo->BmmHiiHandle, + &gBootMaintFormSetGuid, + FORM_BOOT_SETUP_ID, + mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID + mEndOpCodeHandle // LABEL_END + ); + + return EFI_SUCCESS; +} + /** This function processes the results of changes in configuration. @@ -286,6 +694,20 @@ BootMaintCallback ( UINT8 *OldLegacyDev; UINT8 *NewLegacyDev; UINT8 *DisMap; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; + + Private = BMM_CALLBACK_DATA_FROM_THIS (This); + if (Action == EFI_BROWSER_ACTION_FORM_OPEN && QuestionId == FORM_BOOT_SETUP_ID) { + // + // Initilize Form for legacy boot option. + // + Status = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios); + if (!EFI_ERROR (Status)) { + InitializeLegacyBootOption (); + } + + return EFI_SUCCESS; + } if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) { // @@ -636,16 +1058,16 @@ ApplyChangeHandler ( case FORM_SET_CD_ORDER_ID: case FORM_SET_NET_ORDER_ID: case FORM_SET_BEV_ORDER_ID: - Var_UpdateBBSOption (Private); + Var_UpdateBBSOption (Private, FormId); break; case FORM_BOOT_DEL_ID: for (Index = 0; - ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[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->OptionDel[Index]; + NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index]; } Var_DelBootOption (); @@ -653,11 +1075,11 @@ ApplyChangeHandler ( case FORM_DRV_DEL_ID: for (Index = 0; - ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[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->OptionDel[Index]; + NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index]; } Var_DelDriverOption (); @@ -692,26 +1114,27 @@ ApplyChangeHandler ( break; case FORM_CON_COM_SETUP_ID: - NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal); + Index = (UINT16)Private->CurrentTerminal; + NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); 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; - NewTerminalContext->FlowControl = CurrentFakeNVMap->COMFlowControl; + 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), @@ -728,14 +1151,14 @@ ApplyChangeHandler ( NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index]; + 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->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber]; + NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber]; } Var_UpdateConsoleInpOption (); @@ -746,14 +1169,14 @@ ApplyChangeHandler ( NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index]; + 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->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber]; + NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber]; } Var_UpdateConsoleOutOption (); @@ -764,14 +1187,14 @@ ApplyChangeHandler ( NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index); NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; ASSERT (Index < MAX_MENU_NUMBER); - NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index]; + 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->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber]; + NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber]; } Var_UpdateErrorOutOption (); @@ -819,21 +1242,24 @@ DiscardChangeHandler ( switch (Private->BmmPreviousPageId) { case FORM_BOOT_CHG_ID: + CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder)); + break; + case FORM_DRV_CHG_ID: - CopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, sizeof (CurrentFakeNVMap->OptionOrder)); + CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder)); break; case FORM_BOOT_DEL_ID: - ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0]))); + ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0]))); for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { - CurrentFakeNVMap->OptionDel[Index] = FALSE; + CurrentFakeNVMap->BootOptionDel[Index] = FALSE; } break; case FORM_DRV_DEL_ID: - ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->OptionDel) / sizeof (CurrentFakeNVMap->OptionDel[0]))); + ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0]))); for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) { - CurrentFakeNVMap->OptionDel[Index] = FALSE; + CurrentFakeNVMap->DriverOptionDel[Index] = FALSE; } break; @@ -870,109 +1296,78 @@ InitializeBM ( VOID ) { - EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; BMM_CALLBACK_DATA *BmmCallbackInfo; EFI_STATUS Status; - UINT8 *Ptr; + EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; + UINT32 Length; + UINT8 *Data; Status = EFI_SUCCESS; + BmmCallbackInfo = mBmmCallbackInfo; + + BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID; + BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID; + BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive; + BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown; // - // Create CallbackData structures for Driver Callback + // Reinstall String packages to include more new strings. // - BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA)); - if (BmmCallbackInfo == NULL) { - return EFI_OUT_OF_RESOURCES; - } - + // - // Create LoadOption in BmmCallbackInfo for Driver Callback + // String package size // - Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY)); - if (Ptr == NULL) { - FreePool (BmmCallbackInfo); - return EFI_OUT_OF_RESOURCES; - } + Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32); // - // Initialize Bmm callback data. + // Add the length of the Package List Header and the terminating Package Header // - BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr; - Ptr += sizeof (BM_LOAD_CONTEXT); - - BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr; - Ptr += sizeof (BM_FILE_CONTEXT); - - BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr; - Ptr += sizeof (BM_HANDLE_CONTEXT); - - BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr; - - BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE; - BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig; - BmmCallbackInfo->BmmConfigAccess.RouteConfig = FakeRouteConfig; - BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback; - BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID; - BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID; - BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig; - BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig; - BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback; - BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive; - BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown; + Length += sizeof (EFI_HII_PACKAGE_LIST_HEADER) + sizeof (EFI_HII_PACKAGE_HEADER); + + // + // Allocate the storage for the entire Package List + // + PackageListHeader = AllocateZeroPool (Length); // - // Install Device Path Protocol and Config Access protocol to driver handle + // If the Package List can not be allocated, then return a NULL HII Handle // - Status = gBS->InstallMultipleProtocolInterfaces ( - &BmmCallbackInfo->BmmDriverHandle, - &gEfiDevicePathProtocolGuid, - &mBmmHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &BmmCallbackInfo->BmmConfigAccess, - NULL - ); - if (EFI_ERROR (Status)) { - goto Exit; + if (PackageListHeader == NULL) { + return EFI_OUT_OF_RESOURCES; } // - // Install Device Path Protocol and Config Access protocol to driver handle + // Fill in the GUID and Length of the Package List Header // - Status = gBS->InstallMultipleProtocolInterfaces ( - &BmmCallbackInfo->FeDriverHandle, - &gEfiDevicePathProtocolGuid, - &mFeHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &BmmCallbackInfo->FeConfigAccess, - NULL - ); - if (EFI_ERROR (Status)) { - goto Exit; - } + PackageListHeader->PackageLength = Length; // - // Post our Boot Maint VFR binary to the HII database. + // Copy String Data into Package list. // - BmmCallbackInfo->BmmHiiHandle = HiiAddPackages ( - &gBootMaintFormSetGuid, - BmmCallbackInfo->BmmDriverHandle, - BmBin, - BdsDxeStrings, - NULL - ); - ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL); + Data = (UINT8 *)(PackageListHeader + 1); + Length = ReadUnaligned32 ((UINT32 *) BdsDxeStrings) - sizeof (UINT32); + CopyMem (Data, (UINT8 *) BdsDxeStrings + sizeof (UINT32), Length); + + // + // Add End type HII package. + // + Data += Length; + ((EFI_HII_PACKAGE_HEADER *) Data)->Type = EFI_HII_PACKAGE_END; + ((EFI_HII_PACKAGE_HEADER *) Data)->Length = sizeof (EFI_HII_PACKAGE_HEADER); // - // Post our File Explorer VFR binary to the HII database. + // Update String package for BM // - BmmCallbackInfo->FeHiiHandle = HiiAddPackages ( - &gFileExploreFormSetGuid, - BmmCallbackInfo->FeDriverHandle, - FEBin, - BdsDxeStrings, - NULL - ); - ASSERT (BmmCallbackInfo->FeHiiHandle != NULL); + CopyGuid (&PackageListHeader->PackageListGuid, &gBootMaintFormSetGuid); + Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->BmmHiiHandle, PackageListHeader); + + // + // Update String package for FE. + // + CopyGuid (&PackageListHeader->PackageListGuid, &gFileExploreFormSetGuid); + Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, BmmCallbackInfo->FeHiiHandle, PackageListHeader); + + FreePool (PackageListHeader); // // Init OpCode Handle and Allocate space for creation of Buffer @@ -1013,77 +1408,8 @@ InitializeBM ( CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu); CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu); CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu); - - UpdateBootDelPage (BmmCallbackInfo); - UpdateDrvDelPage (BmmCallbackInfo); - - if (TerminalMenu.MenuNumber > 0) { - BmmCallbackInfo->CurrentTerminal = 0; - UpdateTerminalPage (BmmCallbackInfo); - } - - Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); - if (!EFI_ERROR (Status)) { - RefreshUpdateData (); - mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID; - - // - // If LegacyBios Protocol is installed, add 3 tags about legacy boot option - // in BootOption form: legacy FD/HD/CD/NET/BEV - // - HiiCreateGotoOpCode ( - mStartOpCodeHandle, - FORM_SET_FD_ORDER_ID, - STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), - STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), - EFI_IFR_FLAG_CALLBACK, - FORM_SET_FD_ORDER_ID - ); - - HiiCreateGotoOpCode ( - mStartOpCodeHandle, - FORM_SET_HD_ORDER_ID, - STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), - STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), - EFI_IFR_FLAG_CALLBACK, - FORM_SET_HD_ORDER_ID - ); - - HiiCreateGotoOpCode ( - mStartOpCodeHandle, - FORM_SET_CD_ORDER_ID, - STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), - STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), - EFI_IFR_FLAG_CALLBACK, - FORM_SET_CD_ORDER_ID - ); - - HiiCreateGotoOpCode ( - mStartOpCodeHandle, - FORM_SET_NET_ORDER_ID, - STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), - STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), - EFI_IFR_FLAG_CALLBACK, - FORM_SET_NET_ORDER_ID - ); - - HiiCreateGotoOpCode ( - mStartOpCodeHandle, - FORM_SET_BEV_ORDER_ID, - STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), - STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), - EFI_IFR_FLAG_CALLBACK, - FORM_SET_BEV_ORDER_ID - ); - - HiiUpdateForm ( - BmmCallbackInfo->BmmHiiHandle, - &gBootMaintFormSetGuid, - FORM_BOOT_SETUP_ID, - mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID - mEndOpCodeHandle // LABEL_END - ); - } + + InitializeBmmConfig (BmmCallbackInfo); // // Dispatch BMM main formset and File Explorer formset. @@ -1091,13 +1417,10 @@ InitializeBM ( FormSetDispatcher (BmmCallbackInfo); // - // Remove our IFR data from HII database + // Clean up. // - HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle); - HiiRemovePackages (BmmCallbackInfo->FeHiiHandle); - CleanUpStringDepository (); - + FreeAllMenu (); Exit: @@ -1109,34 +1432,10 @@ Exit: HiiFreeOpCodeHandle (mEndOpCodeHandle); } - if (BmmCallbackInfo->FeDriverHandle != NULL) { - gBS->UninstallMultipleProtocolInterfaces ( - BmmCallbackInfo->FeDriverHandle, - &gEfiDevicePathProtocolGuid, - &mFeHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &BmmCallbackInfo->FeConfigAccess, - NULL - ); - } - - if (BmmCallbackInfo->BmmDriverHandle != NULL) { - gBS->UninstallMultipleProtocolInterfaces ( - BmmCallbackInfo->BmmDriverHandle, - &gEfiDevicePathProtocolGuid, - &mBmmHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - &BmmCallbackInfo->BmmConfigAccess, - NULL - ); - } - - FreePool (BmmCallbackInfo->LoadContext); - FreePool (BmmCallbackInfo); - return Status; } + /** Initialized all Menu Option List. @@ -1415,3 +1714,159 @@ FormSetDispatcher ( return Status; } +/** + Intall BootMaint and FileExplorer HiiPackages. + +**/ +EFI_STATUS +InitBMPackage ( + VOID + ) +{ + BMM_CALLBACK_DATA *BmmCallbackInfo; + EFI_STATUS Status; + UINT8 *Ptr; + + // + // Create CallbackData structures for Driver Callback + // + BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA)); + if (BmmCallbackInfo == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Create LoadOption in BmmCallbackInfo for Driver Callback + // + Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY)); + if (Ptr == NULL) { + FreePool (BmmCallbackInfo); + BmmCallbackInfo = NULL; + return EFI_OUT_OF_RESOURCES; + } + // + // Initialize Bmm callback data. + // + BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr; + Ptr += sizeof (BM_LOAD_CONTEXT); + + BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr; + Ptr += sizeof (BM_FILE_CONTEXT); + + BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr; + Ptr += sizeof (BM_HANDLE_CONTEXT); + + BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr; + + BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE; + BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig; + BmmCallbackInfo->BmmConfigAccess.RouteConfig = BootMaintRouteConfig; + BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback; + BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig; + BmmCallbackInfo->FeConfigAccess.RouteConfig = FileExplorerRouteConfig; + BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback; + + // + // Install Device Path Protocol and Config Access protocol to driver handle + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &BmmCallbackInfo->BmmDriverHandle, + &gEfiDevicePathProtocolGuid, + &mBmmHiiVendorDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + &BmmCallbackInfo->BmmConfigAccess, + NULL + ); + ASSERT_EFI_ERROR (Status); + + // + // Install Device Path Protocol and Config Access protocol to driver handle + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &BmmCallbackInfo->FeDriverHandle, + &gEfiDevicePathProtocolGuid, + &mFeHiiVendorDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + &BmmCallbackInfo->FeConfigAccess, + NULL + ); + ASSERT_EFI_ERROR (Status); + + // + // Post our Boot Maint VFR binary to the HII database. + // + BmmCallbackInfo->BmmHiiHandle = HiiAddPackages ( + &gBootMaintFormSetGuid, + BmmCallbackInfo->BmmDriverHandle, + BmBin, + BdsDxeStrings, + NULL + ); + ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL); + + // + // Post our File Explorer VFR binary to the HII database. + // + BmmCallbackInfo->FeHiiHandle = HiiAddPackages ( + &gFileExploreFormSetGuid, + BmmCallbackInfo->FeDriverHandle, + FEBin, + BdsDxeStrings, + NULL + ); + ASSERT (BmmCallbackInfo->FeHiiHandle != NULL); + + mBmmCallbackInfo = BmmCallbackInfo; + + return EFI_SUCCESS; +} + +/** + Remvoe the intalled BootMaint and FileExplorer HiiPackages. + +**/ +VOID +FreeBMPackage ( + VOID + ) +{ + BMM_CALLBACK_DATA *BmmCallbackInfo; + + BmmCallbackInfo = mBmmCallbackInfo; + + // + // Remove our IFR data from HII database + // + HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle); + HiiRemovePackages (BmmCallbackInfo->FeHiiHandle); + + if (BmmCallbackInfo->FeDriverHandle != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + BmmCallbackInfo->FeDriverHandle, + &gEfiDevicePathProtocolGuid, + &mFeHiiVendorDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + &BmmCallbackInfo->FeConfigAccess, + NULL + ); + } + + if (BmmCallbackInfo->BmmDriverHandle != NULL) { + gBS->UninstallMultipleProtocolInterfaces ( + BmmCallbackInfo->BmmDriverHandle, + &gEfiDevicePathProtocolGuid, + &mBmmHiiVendorDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + &BmmCallbackInfo->BmmConfigAccess, + NULL + ); + } + + FreePool (BmmCallbackInfo->LoadContext); + FreePool (BmmCallbackInfo); + + mBmmCallbackInfo = NULL; + + return; +} + -- cgit v1.2.3