+++ /dev/null
-/** @file\r
-Utility routines used by boot maintenance modules.\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
- Function deletes the variable specified by VarName and VarGuid.\r
-\r
- @param VarName A Null-terminated Unicode string that is\r
- the name of the vendor's variable.\r
-\r
- @param VarGuid A unique identifier for the vendor.\r
-\r
- @retval EFI_SUCCESS The variable was found and removed\r
- @retval EFI_UNSUPPORTED The variable store was inaccessible\r
- @retval EFI_NOT_FOUND The variable was not found\r
-\r
-**/\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
- IN CHAR16 *VarName,\r
- IN EFI_GUID *VarGuid\r
- )\r
-{\r
- return gRT->SetVariable (\r
- VarName,\r
- VarGuid,\r
- 0,\r
- 0,\r
- NULL\r
- );\r
-}\r
-\r
-/**\r
- Function is used to determine the number of device path instances\r
- that exist in a device path.\r
-\r
-\r
- @param DevicePath A pointer to a device path data structure.\r
-\r
- @return This function counts and returns the number of device path instances\r
- in DevicePath.\r
-\r
-**/\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- UINTN Count;\r
- UINTN Size;\r
-\r
- Count = 0;\r
- while (GetNextDevicePathInstance (&DevicePath, &Size) != NULL) {\r
- Count += 1;\r
- }\r
-\r
- return Count;\r
-}\r
-\r
-/**\r
- Get a string from the Data Hub record based on \r
- a device path.\r
-\r
- @param DevPath The device Path.\r
-\r
- @return A string located from the Data Hub records based on\r
- the device path.\r
- @retval NULL If failed to get the String from Data Hub.\r
-\r
-**/\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-{\r
- return NULL;\r
-}\r
+++ /dev/null
-/** @file\r
-The functions for Boot Maintainence Main menu.\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-#define FRONT_PAGE_KEY_OFFSET 0x4000\r
-//\r
-// Boot video resolution and text mode.\r
-//\r
-UINT32 mBmmBootHorizontalResolution = 0;\r
-UINT32 mBmmBootVerticalResolution = 0;\r
-UINT32 mBmmBootTextModeColumn = 0;\r
-UINT32 mBmmBootTextModeRow = 0;\r
-//\r
-// BIOS setup video resolution and text mode.\r
-//\r
-UINT32 mBmmSetupTextModeColumn = 0;\r
-UINT32 mBmmSetupTextModeRow = 0;\r
-UINT32 mBmmSetupHorizontalResolution = 0;\r
-UINT32 mBmmSetupVerticalResolution = 0;\r
-\r
-EFI_DEVICE_PATH_PROTOCOL EndDevicePath[] = {\r
- {\r
- END_DEVICE_PATH_TYPE,\r
- END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- {\r
- END_DEVICE_PATH_LENGTH,\r
- 0\r
- }\r
- }\r
-};\r
-\r
-HII_VENDOR_DEVICE_PATH mBmmHiiVendorDevicePath = {\r
- {\r
- {\r
- HARDWARE_DEVICE_PATH,\r
- HW_VENDOR_DP,\r
- {\r
- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
- }\r
- },\r
- //\r
- // {165A028F-0BB2-4b5f-8747-77592E3F6499}\r
- //\r
- { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 0x99 } }\r
- },\r
- {\r
- END_DEVICE_PATH_TYPE,\r
- END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
- { \r
- (UINT8) (END_DEVICE_PATH_LENGTH),\r
- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
- }\r
- }\r
-};\r
-\r
-EFI_GUID mBootMaintGuid = BOOT_MAINT_FORMSET_GUID;\r
-\r
-CHAR16 mBootMaintStorageName[] = L"BmmData";\r
-BMM_CALLBACK_DATA gBootMaintenancePrivate = {\r
- BMM_CALLBACK_DATA_SIGNATURE,\r
- NULL,\r
- NULL,\r
- {\r
- BootMaintExtractConfig,\r
- BootMaintRouteConfig,\r
- BootMaintCallback\r
- }\r
-};\r
-\r
-BMM_CALLBACK_DATA *mBmmCallbackInfo = &gBootMaintenancePrivate;\r
-BOOLEAN mAllMenuInit = FALSE;\r
-\r
-/**\r
- Init all memu.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitAllMenu (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Free up all Menu Option list.\r
-\r
-**/\r
-VOID\r
-FreeAllMenu (\r
- VOID\r
- );\r
-\r
-/**\r
- This function will change video resolution and text mode\r
- according to defined setup mode or defined boot mode \r
-\r
- @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
-\r
- @retval EFI_SUCCESS Mode is changed successfully.\r
- @retval Others Mode failed to be changed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BmmBdsSetConsoleMode (\r
- BOOLEAN IsSetupMode\r
- )\r
-{\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
- UINTN SizeOfInfo;\r
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
- UINT32 MaxGopMode;\r
- UINT32 MaxTextMode;\r
- UINT32 ModeNumber;\r
- UINT32 NewHorizontalResolution;\r
- UINT32 NewVerticalResolution;\r
- UINT32 NewColumns;\r
- UINT32 NewRows;\r
- UINTN HandleCount;\r
- EFI_HANDLE *HandleBuffer;\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN CurrentColumn;\r
- UINTN CurrentRow; \r
-\r
- MaxGopMode = 0;\r
- MaxTextMode = 0;\r
-\r
- //\r
- // Get current video resolution and text mode \r
- //\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- (VOID**)&GraphicsOutput\r
- );\r
- if (EFI_ERROR (Status)) {\r
- GraphicsOutput = NULL;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- gST->ConsoleOutHandle,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- (VOID**)&SimpleTextOut\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SimpleTextOut = NULL;\r
- } \r
-\r
- if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (IsSetupMode) {\r
- //\r
- // The requried resolution and text mode is setup mode.\r
- //\r
- NewHorizontalResolution = mBmmSetupHorizontalResolution;\r
- NewVerticalResolution = mBmmSetupVerticalResolution;\r
- NewColumns = mBmmSetupTextModeColumn;\r
- NewRows = mBmmSetupTextModeRow;\r
- } else {\r
- //\r
- // The required resolution and text mode is boot mode.\r
- //\r
- NewHorizontalResolution = mBmmBootHorizontalResolution;\r
- NewVerticalResolution = mBmmBootVerticalResolution;\r
- NewColumns = mBmmBootTextModeColumn;\r
- NewRows = mBmmBootTextModeRow; \r
- }\r
-\r
- if (GraphicsOutput != NULL) {\r
- MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
- } \r
-\r
- if (SimpleTextOut != NULL) {\r
- MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
- }\r
-\r
- //\r
- // 1. If current video resolution is same with required video resolution,\r
- // video resolution need not be changed.\r
- // 1.1. If current text mode is same with required text mode, text mode need not be changed.\r
- // 1.2. If current text mode is different from required text mode, text mode need be changed.\r
- // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
- //\r
- for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
- Status = GraphicsOutput->QueryMode (\r
- GraphicsOutput,\r
- ModeNumber,\r
- &SizeOfInfo,\r
- &Info\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
- (Info->VerticalResolution == NewVerticalResolution)) {\r
- if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
- (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
- //\r
- // Current resolution is same with required resolution, check if text mode need be set\r
- //\r
- Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
- ASSERT_EFI_ERROR (Status);\r
- if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
- //\r
- // If current text mode is same with required text mode. Do nothing\r
- //\r
- FreePool (Info);\r
- return EFI_SUCCESS;\r
- } else {\r
- //\r
- // If current text mode is different from requried text mode. Set new video mode\r
- //\r
- for (Index = 0; Index < MaxTextMode; Index++) {\r
- Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
- if (!EFI_ERROR(Status)) {\r
- if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
- //\r
- // Required text mode is supported, set it.\r
- //\r
- Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
- ASSERT_EFI_ERROR (Status);\r
- //\r
- // Update text mode PCD.\r
- //\r
- Status = PcdSet32S (PcdConOutColumn, mBmmSetupTextModeColumn);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = PcdSet32S (PcdConOutRow, mBmmSetupTextModeRow);\r
- ASSERT_EFI_ERROR (Status);\r
- FreePool (Info);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- }\r
- if (Index == MaxTextMode) {\r
- //\r
- // If requried text mode is not supported, return error.\r
- //\r
- FreePool (Info);\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
- } else {\r
- //\r
- // If current video resolution is not same with the new one, set new video resolution.\r
- // In this case, the driver which produces simple text out need be restarted.\r
- //\r
- Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
- if (!EFI_ERROR (Status)) {\r
- FreePool (Info);\r
- break;\r
- }\r
- }\r
- }\r
- FreePool (Info);\r
- }\r
- }\r
-\r
- if (ModeNumber == MaxGopMode) {\r
- //\r
- // If the resolution is not supported, return error.\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- //\r
- // Set PCD to Inform GraphicsConsole to change video resolution.\r
- // Set PCD to Inform Consplitter to change text mode.\r
- //\r
- Status = PcdSet32S (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = PcdSet32S (PcdVideoVerticalResolution, NewVerticalResolution);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = PcdSet32S (PcdConOutColumn, NewColumns);\r
- ASSERT_EFI_ERROR (Status);\r
- Status = PcdSet32S (PcdConOutRow, NewRows);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Video mode is changed, so restart graphics console driver and higher level driver.\r
- // Reconnect graphics console driver and higher level driver.\r
- // Locate all the handles with GOP protocol and reconnect it.\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &HandleBuffer\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
- }\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
- }\r
- if (HandleBuffer != NULL) {\r
- FreePool (HandleBuffer);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function converts an input device structure to a Unicode string.\r
-\r
- @param DevPath A pointer to the device path structure.\r
-\r
- @return A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 *ToText;\r
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
-\r
- if (DevPath == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDevicePathToTextProtocolGuid,\r
- NULL,\r
- (VOID **) &DevPathToText\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- ToText = DevPathToText->ConvertDevicePathToText (\r
- DevPath,\r
- FALSE,\r
- TRUE\r
- );\r
- ASSERT (ToText != NULL);\r
- return ToText;\r
-}\r
-\r
-/**\r
- Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
- The caller is responsible for freeing the allocated buffer using FreePool().\r
-\r
- @param DevicePath Device path.\r
-\r
- @return A new allocated string that represents the file name.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractFileNameFromDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- CHAR16 *String;\r
- CHAR16 *MatchString;\r
- CHAR16 *LastMatch;\r
- CHAR16 *FileName;\r
- UINTN Length;\r
-\r
- ASSERT(DevicePath != NULL);\r
-\r
- String = UiDevicePathToStr(DevicePath);\r
- MatchString = String;\r
- LastMatch = String;\r
-\r
- while(MatchString != NULL){\r
- LastMatch = MatchString + 1;\r
- MatchString = StrStr(LastMatch,L"\\");\r
- }\r
-\r
- Length = StrLen(LastMatch);\r
- FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);\r
- *(FileName + Length) = 0;\r
-\r
- FreePool(String);\r
-\r
- return FileName;\r
-}\r
-\r
-/**\r
- Extract device path for given HII handle and class guid.\r
-\r
- @param Handle The HII handle.\r
-\r
- @retval NULL Fail to get the device path string.\r
- @return PathString Get the device path string.\r
-\r
-**/\r
-CHAR16 *\r
-BmmExtractDevicePathFromHiiHandle (\r
- IN EFI_HII_HANDLE Handle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE DriverHandle;\r
-\r
- ASSERT (Handle != NULL);\r
-\r
- if (Handle == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Get device path string.\r
- //\r
- return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
-\r
-}\r
-\r
-/**\r
- This function allows a caller to extract the current configuration for one\r
- or more named elements from the target driver.\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
- @param Progress On return, points to a character in the Request string.\r
- Points to the string's null terminator if request was successful.\r
- Points to the most recent '&' before the first failing name/value\r
- pair (or the beginning of the string if the failure is in the\r
- first name/value pair) if the request was not successful.\r
- @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
- has all values filled in for the names in the Request string.\r
- String to be allocated by the called function.\r
-\r
- @retval EFI_SUCCESS The Results is filled with the requested values.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
- @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
- @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintExtractConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Request,\r
- OUT EFI_STRING *Progress,\r
- OUT EFI_STRING *Results\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- BMM_CALLBACK_DATA *Private;\r
- EFI_STRING ConfigRequestHdr;\r
- EFI_STRING ConfigRequest;\r
- BOOLEAN AllocatedRequest;\r
- UINTN Size;\r
-\r
- if (Progress == NULL || Results == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *Progress = Request;\r
- if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mBootMaintGuid, mBootMaintStorageName)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- ConfigRequestHdr = NULL;\r
- ConfigRequest = NULL;\r
- AllocatedRequest = FALSE;\r
- Size = 0;\r
-\r
- Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
- //\r
- // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
- //\r
- BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
- ConfigRequest = Request;\r
- if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
- //\r
- // Request has no request element, construct full request string.\r
- // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
- // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
- //\r
- ConfigRequestHdr = HiiConstructConfigHdr (&mBootMaintGuid, mBootMaintStorageName, Private->BmmDriverHandle);\r
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
- ConfigRequest = AllocateZeroPool (Size);\r
- ASSERT (ConfigRequest != NULL);\r
- AllocatedRequest = TRUE;\r
- UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
- FreePool (ConfigRequestHdr);\r
- }\r
-\r
- Status = gHiiConfigRouting->BlockToConfig (\r
- gHiiConfigRouting,\r
- ConfigRequest,\r
- (UINT8 *) &Private->BmmFakeNvData,\r
- BufferSize,\r
- Results,\r
- Progress\r
- );\r
- //\r
- // Free the allocated config request string.\r
- //\r
- if (AllocatedRequest) {\r
- FreePool (ConfigRequest);\r
- ConfigRequest = NULL;\r
- }\r
- //\r
- // Set Progress string to the original request string.\r
- //\r
- if (Request == NULL) {\r
- *Progress = NULL;\r
- } else if (StrStr (Request, L"OFFSET") == NULL) {\r
- *Progress = Request + StrLen (Request);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- This function applies changes in a driver's configuration.\r
- Input is a Configuration, which has the routing data for this\r
- driver followed by name / value configuration pairs. The driver\r
- must apply those pairs to its configurable storage. If the\r
- driver's configuration is stored in a linear block of data\r
- and the driver's name / value pairs are in <BlockConfig>\r
- format, it may use the ConfigToBlock helper function (above) to\r
- simplify the job. Currently not implemented.\r
-\r
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param[in] Configuration A null-terminated Unicode string in\r
- <ConfigString> format. \r
- @param[out] Progress A pointer to a string filled in with the\r
- offset of the most recent '&' before the\r
- first failing name / value pair (or the\r
- beginn ing of the string if the failure\r
- is in the first name / value pair) or\r
- the terminating NULL if all was\r
- successful.\r
-\r
- @retval EFI_SUCCESS The results have been distributed or are\r
- awaiting distribution. \r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
- parts of the results that must be\r
- stored awaiting possible future\r
- protocols.\r
- @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
- Results parameter would result\r
- in this type of error.\r
- @retval EFI_NOT_FOUND Target for the specified routing data\r
- was not found.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintRouteConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Configuration,\r
- OUT EFI_STRING *Progress\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
- BMM_FAKE_NV_DATA *NewBmmData;\r
- BMM_FAKE_NV_DATA *OldBmmData;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
- BOOLEAN TerminalAttChange;\r
- BMM_CALLBACK_DATA *Private; \r
-\r
- if (Progress == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- *Progress = Configuration;\r
-\r
- if (Configuration == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Check routing data in <ConfigHdr>.\r
- // Note: there is no name for Name/Value storage, only GUID will be checked\r
- //\r
- if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiHiiConfigRoutingProtocolGuid, \r
- NULL, \r
- (VOID **)&ConfigRouting\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Private = BMM_CALLBACK_DATA_FROM_THIS (This); \r
- //\r
- // Get Buffer Storage data from EFI variable\r
- //\r
- BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
- OldBmmData = &Private->BmmOldFakeNVData;\r
- NewBmmData = &Private->BmmFakeNvData;\r
- //\r
- // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
- //\r
- Status = ConfigRouting->ConfigToBlock (\r
- ConfigRouting,\r
- Configuration,\r
- (UINT8 *) NewBmmData,\r
- &BufferSize,\r
- Progress\r
- );\r
- ASSERT_EFI_ERROR (Status); \r
- //\r
- // Compare new and old BMM configuration data and only do action for modified item to \r
- // avoid setting unnecessary non-volatile variable\r
- //\r
-\r
- //\r
- // Check data which located in BMM main page and save the settings if need\r
- // \r
- if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
- Status = Var_UpdateBootNext (Private);\r
- }\r
-\r
- //\r
- // Check data which located in Boot Options Menu and save the settings if need\r
- // \r
- if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) { \r
- for (Index = 0; \r
- ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); \r
- Index ++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
- NewBmmData->BootOptionDel[Index] = FALSE;\r
- NewBmmData->BootOptionDelMark[Index] = FALSE;\r
- }\r
-\r
- Var_DelBootOption ();\r
- }\r
-\r
- if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {\r
- Status = Var_UpdateBootOrder (Private);\r
- }\r
-\r
- if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
- Status = gRT->SetVariable(\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof(UINT16),\r
- &(NewBmmData->BootTimeOut)\r
- );\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
- }\r
-\r
- //\r
- // Check data which located in Driver Options Menu and save the settings if need\r
- // \r
- if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) { \r
- for (Index = 0; \r
- ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); \r
- Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
- NewBmmData->DriverOptionDel[Index] = FALSE;\r
- NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
- }\r
- Var_DelDriverOption (); \r
- }\r
-\r
- if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
- Status = Var_UpdateDriverOrder (Private);\r
- }\r
-\r
- if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
- Var_UpdateConMode(Private);\r
- }\r
-\r
- TerminalAttChange = FALSE;\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-\r
- //\r
- // only need update modified items\r
- //\r
- if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
- CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
- CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
- CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
- CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
- CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\r
- continue;\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- ASSERT (NewMenuEntry != NULL);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
- ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
- NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
- NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
- ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
- NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
- NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
- ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
- NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
- NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index];\r
- ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
- NewTerminalContext->Parity = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
- NewTerminalContext->TerminalType = NewBmmData->COMTerminalType[Index];\r
- NewTerminalContext->FlowControl = NewBmmData->COMFlowControl[Index];\r
- ChangeTerminalDevicePath (\r
- NewTerminalContext->DevicePath,\r
- FALSE\r
- );\r
- TerminalAttChange = TRUE;\r
- }\r
- if (TerminalAttChange) {\r
- Var_UpdateConsoleInpOption ();\r
- Var_UpdateConsoleOutOption ();\r
- Var_UpdateErrorOutOption ();\r
- }\r
- //\r
- // Check data which located in Console Options Menu and save the settings if need\r
- //\r
- if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
- for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
- }\r
- Var_UpdateConsoleInpOption();\r
- }\r
-\r
- if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
- for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
- }\r
- Var_UpdateConsoleOutOption();\r
- }\r
-\r
- if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
- for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
- NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
- }\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
- }\r
- Var_UpdateErrorOutOption();\r
- }\r
-\r
- if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0 ||\r
- CompareMem (NewBmmData->BootOptionalData, OldBmmData->BootOptionalData, sizeof (NewBmmData->BootOptionalData)) != 0) {\r
- Status = Var_UpdateBootOption (Private);\r
- NewBmmData->BootOptionChanged = FALSE;\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- BOpt_GetBootOptions (Private);\r
- }\r
-\r
- if (CompareMem (NewBmmData->DriverDescriptionData, OldBmmData->DriverDescriptionData, sizeof (NewBmmData->DriverDescriptionData)) != 0 ||\r
- CompareMem (NewBmmData->DriverOptionalData, OldBmmData->DriverOptionalData, sizeof (NewBmmData->DriverOptionalData)) != 0) {\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->BmmHiiHandle,\r
- NewBmmData->DriverDescriptionData,\r
- NewBmmData->DriverOptionalData,\r
- NewBmmData->ForceReconnect\r
- );\r
- NewBmmData->DriverOptionChanged = FALSE;\r
- NewBmmData->ForceReconnect = TRUE;\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- }\r
-\r
- //\r
- // After user do the save action, need to update OldBmmData.\r
- //\r
- CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function processes the results of changes in configuration.\r
-\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Action Specifies the type of action taken by the browser.\r
- @param QuestionId A unique value which is sent to the original exporting driver\r
- so that it can identify the type of data to expect.\r
- @param Type The type of value for the question.\r
- @param Value A pointer to the data being sent to the original exporting driver.\r
- @param ActionRequest On return, points to the action requested by the callback function.\r
-\r
- @retval EFI_SUCCESS The callback successfully handled the action.\r
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
- @retval EFI_DEVICE_ERROR The variable could not be saved.\r
- @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
- @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintCallback (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN EFI_BROWSER_ACTION Action,\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN UINT8 Type,\r
- IN EFI_IFR_TYPE_VALUE *Value,\r
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
- )\r
-{\r
- BMM_CALLBACK_DATA *Private;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- UINTN OldValue;\r
- UINTN NewValue;\r
- UINTN Number;\r
- UINTN Index;\r
- EFI_DEVICE_PATH_PROTOCOL * File;\r
-\r
- if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
- //\r
- // Do nothing for other UEFI Action. Only do call back when data is changed.\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
- OldValue = 0;\r
- NewValue = 0;\r
- Number = 0;\r
-\r
- Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
- //\r
- // Retrive uncommitted data from Form Browser\r
- //\r
- CurrentFakeNVMap = &Private->BmmFakeNvData;\r
- HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
-\r
- if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
- if (Value == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- \r
- UpdatePageId (Private, QuestionId);\r
-\r
- if (QuestionId < FILE_OPTION_OFFSET) {\r
- if (QuestionId < CONFIG_OPTION_OFFSET) {\r
- switch (QuestionId) {\r
- case FORM_BOOT_ADD_ID:\r
- // Leave BMM and enter FileExplorer. \r
- ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateBootOptionFromFile, &File);\r
- break;\r
-\r
- case FORM_DRV_ADD_FILE_ID:\r
- // Leave BMM and enter FileExplorer.\r
- ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateDriverOptionFromFile, &File);\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_ID:\r
- CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
- UpdateDrvAddHandlePage (Private);\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
- UpdateBootDelPage (Private);\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- case FORM_DRV_CHG_ID:\r
- UpdatePageBody (QuestionId, Private);\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- CleanUpPage (FORM_DRV_DEL_ID, Private);\r
- UpdateDrvDelPage (Private);\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
- UpdateBootNextPage (Private);\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- CleanUpPage (FORM_TIME_OUT_ID, Private);\r
- UpdateTimeOutPage (Private);\r
- break;\r
-\r
- case FORM_CON_IN_ID:\r
- case FORM_CON_OUT_ID:\r
- case FORM_CON_ERR_ID:\r
- UpdatePageBody (QuestionId, Private);\r
- break;\r
-\r
- case FORM_CON_MODE_ID:\r
- CleanUpPage (FORM_CON_MODE_ID, Private);\r
- UpdateConModePage (Private);\r
- break;\r
-\r
- case FORM_CON_COM_ID:\r
- CleanUpPage (FORM_CON_COM_ID, Private);\r
- UpdateConCOMPage (Private);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
- Index = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
- Private->CurrentTerminal = Index;\r
-\r
- CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
- UpdateTerminalPage (Private);\r
-\r
- } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
- Index = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
- ASSERT (NewMenuEntry != NULL);\r
- Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
-\r
- Private->MenuEntry = NewMenuEntry;\r
- Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;\r
-\r
- UpdateDriverAddHandleDescPage (Private);\r
- }\r
- }\r
- if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){\r
- // Leave BMM and enter FileExplorer.\r
- ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) BootFromFile, &File);\r
- }\r
- } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
- if ((Value == NULL) || (ActionRequest == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- \r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
- CurrentFakeNVMap->BootOptionChanged = FALSE;\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
- } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
- CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
- //\r
- // Discard changes and exit formset\r
- //\r
- CurrentFakeNVMap->DriverOptionalData[0] = 0x0000;\r
- CurrentFakeNVMap->DriverDescriptionData[0] = 0x0000;\r
- CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
- CurrentFakeNVMap->ForceReconnect = TRUE;\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
- //\r
- // Discard changes and exit formset\r
- //\r
- CurrentFakeNVMap->BootOptionalData[0] = 0x0000;\r
- CurrentFakeNVMap->BootDescriptionData[0] = 0x0000;\r
- CurrentFakeNVMap->BootOptionChanged = FALSE;\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
- } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
- CurrentFakeNVMap->BootOptionChanged = TRUE;\r
- } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
- CurrentFakeNVMap->DriverOptionChanged = TRUE;\r
- } \r
-\r
- if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
- if (Value->b){\r
- //\r
- // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
- //\r
- CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
- } else {\r
- //\r
- // Means user remove the old check status.\r
- //\r
- CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
- }\r
- } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
- if (Value->b){\r
- CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
- } else {\r
- CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
- }\r
- } else {\r
- switch (QuestionId) {\r
- case KEY_VALUE_SAVE_AND_EXIT:\r
- case KEY_VALUE_NO_SAVE_AND_EXIT:\r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
- DiscardChangeHandler (Private, CurrentFakeNVMap);\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
- }\r
-\r
- break;\r
-\r
- case FORM_RESET:\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- return EFI_UNSUPPORTED;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Pass changed uncommitted data back to Form Browser\r
- //\r
- HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Discard all changes done to the BMM pages such as Boot Order change,\r
- Driver order change.\r
-\r
- @param Private The BMM context data.\r
- @param CurrentFakeNVMap The current Fack NV Map.\r
-\r
-**/\r
-VOID\r
-DiscardChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
- )\r
-{\r
- UINT16 Index;\r
-\r
- switch (Private->BmmPreviousPageId) {\r
- case FORM_BOOT_CHG_ID:\r
- CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder));\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder));\r
- break;\r
-\r
- case FORM_BOOT_DEL_ID:\r
- ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
- }\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
- }\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_DESC_ID:\r
- case FORM_DRV_ADD_FILE_ID:\r
- case FORM_DRV_ADD_HANDLE_ID:\r
- CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
- CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-/**\r
- Create dynamic code for BMM.\r
-\r
- @param BmmCallbackInfo The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitializeDrivers(\r
- IN BMM_CALLBACK_DATA *BmmCallbackInfo\r
- )\r
-{\r
- EFI_HII_HANDLE HiiHandle;\r
- VOID *StartOpCodeHandle;\r
- VOID *EndOpCodeHandle;\r
- EFI_IFR_GUID_LABEL *StartLabel;\r
- EFI_IFR_GUID_LABEL *EndLabel;\r
- UINTN Index; \r
- EFI_STRING String;\r
- EFI_STRING_ID Token;\r
- EFI_STRING_ID TokenHelp; \r
- EFI_HII_HANDLE *HiiHandles;\r
- EFI_GUID FormSetGuid;\r
- CHAR16 *DevicePathStr;\r
- EFI_STRING_ID DevicePathId;\r
- EFI_IFR_FORM_SET *Buffer; \r
- UINTN BufferSize; \r
- UINT8 ClassGuidNum; \r
- EFI_GUID *ClassGuid; \r
- UINTN TempSize;\r
- UINT8 *Ptr;\r
- EFI_STATUS Status;\r
-\r
- TempSize =0;\r
- BufferSize = 0;\r
- Buffer = NULL;\r
-\r
- HiiHandle = BmmCallbackInfo->BmmHiiHandle;\r
- //\r
- // Allocate space for creation of UpdateData Buffer\r
- //\r
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (StartOpCodeHandle != NULL);\r
-\r
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (EndOpCodeHandle != NULL);\r
-\r
- //\r
- // Create Hii Extend Label OpCode as the start opcode\r
- //\r
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- StartLabel->Number = LABEL_BMM_PLATFORM_INFORMATION;\r
-\r
- //\r
- // Create Hii Extend Label OpCode as the end opcode\r
- //\r
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- EndLabel->Number = LABEL_END;\r
-\r
- //\r
- // Get all the Hii handles\r
- //\r
- HiiHandles = HiiGetHiiHandles (NULL);\r
- ASSERT (HiiHandles != NULL);\r
-\r
- //\r
- // Search for formset of each class type\r
- //\r
- for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
- Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
-\r
- Ptr = (UINT8 *)Buffer;\r
- while(TempSize < BufferSize) {\r
- TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
-\r
- if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
- Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
- continue;\r
- }\r
-\r
- //\r
- // Find FormSet OpCode\r
- //\r
- ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
- ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
- while (ClassGuidNum-- > 0) {\r
- if (CompareGuid (&gEfiIfrBootMaintenanceGuid, ClassGuid) == 0){\r
- ClassGuid ++;\r
- continue;\r
- }\r
-\r
- String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
- if (String == NULL) {\r
- String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
- ASSERT (String != NULL);\r
- }\r
- Token = HiiSetString (HiiHandle, 0, String, NULL);\r
- FreePool (String);\r
-\r
- String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
- if (String == NULL) {\r
- String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
- ASSERT (String != NULL);\r
- }\r
- TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
- FreePool (String);\r
-\r
- FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
-\r
- DevicePathStr = BmmExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
- DevicePathId = 0;\r
- if (DevicePathStr != NULL){\r
- DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
- FreePool (DevicePathStr);\r
- }\r
- HiiCreateGotoExOpCode (\r
- StartOpCodeHandle,\r
- 0,\r
- Token,\r
- TokenHelp,\r
- 0,\r
- (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
- 0,\r
- &FormSetGuid,\r
- DevicePathId\r
- );\r
- break;\r
- }\r
- Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
- }\r
-\r
- FreePool(Buffer);\r
- Buffer = NULL;\r
- TempSize = 0;\r
- BufferSize = 0;\r
- } \r
- \r
- HiiUpdateForm (\r
- HiiHandle,\r
- &mBootMaintGuid,\r
- FORM_MAIN_ID,\r
- StartOpCodeHandle,\r
- EndOpCodeHandle\r
- );\r
-\r
- HiiFreeOpCodeHandle (StartOpCodeHandle);\r
- HiiFreeOpCodeHandle (EndOpCodeHandle); \r
- FreePool (HiiHandles);\r
-}\r
-\r
-/**\r
- Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
- BmmOldFakeNVData member in BMM context data.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitializeBmmConfig (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
-\r
- ASSERT (CallbackData != NULL);\r
-\r
- InitializeDrivers (CallbackData);\r
-\r
- //\r
- // Initialize data which located in BMM main page\r
- //\r
- CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewLoadContext->IsBootNext) {\r
- CallbackData->BmmFakeNvData.BootNext = Index;\r
- break;\r
- }\r
- }\r
-\r
- CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
-\r
- //\r
- // Initialize data which located in Boot Options Menu\r
- //\r
- GetBootOrder (CallbackData);\r
-\r
- //\r
- // Initialize data which located in Driver Options Menu\r
- //\r
- GetDriverOrder (CallbackData);\r
-\r
- //\r
- // Initialize data which located in Console Options Menu\r
- //\r
- GetConsoleOutMode (CallbackData);\r
- GetConsoleInCheck (CallbackData);\r
- GetConsoleOutCheck (CallbackData);\r
- GetConsoleErrCheck (CallbackData);\r
- GetTerminalAttribute (CallbackData);\r
-\r
- CallbackData->BmmFakeNvData.ForceReconnect = TRUE;\r
-\r
- //\r
- // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
- //\r
- CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
-}\r
-\r
-/**\r
- Initialized all Menu Option List.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-InitAllMenu (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- InitializeListHead (&BootOptionMenu.Head);\r
- InitializeListHead (&DriverOptionMenu.Head);\r
- BOpt_GetBootOptions (CallbackData);\r
- BOpt_GetDriverOptions (CallbackData);\r
- BOpt_FindDrivers ();\r
- InitializeListHead (&ConsoleInpMenu.Head);\r
- InitializeListHead (&ConsoleOutMenu.Head);\r
- InitializeListHead (&ConsoleErrMenu.Head);\r
- InitializeListHead (&TerminalMenu.Head);\r
- LocateSerialIo ();\r
- GetAllConsoles ();\r
- mAllMenuInit = TRUE;\r
-}\r
-\r
-/**\r
- Free up all Menu Option list.\r
-\r
-**/\r
-VOID\r
-FreeAllMenu (\r
- VOID\r
- )\r
-{\r
- if (!mAllMenuInit){\r
- return;\r
- }\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_FreeMenu (&DriverMenu);\r
- FreeAllConsoles ();\r
- mAllMenuInit = FALSE;\r
-}\r
-\r
-/**\r
-\r
- Install Boot Maintenance Manager Menu driver.\r
-\r
- @param ImageHandle The image handle.\r
- @param SystemTable The system table.\r
-\r
- @retval EFI_SUCEESS Install Boot manager menu success.\r
- @retval Other Return error status.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintenanceManagerLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *Ptr;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- //\r
- // Install Device Path Protocol and Config Access protocol to driver handle\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &mBmmCallbackInfo->BmmDriverHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- &mBmmHiiVendorDevicePath,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- &mBmmCallbackInfo->BmmConfigAccess,\r
- NULL\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Post our Boot Maint VFR binary to the HII database.\r
- //\r
- mBmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
- &mBootMaintGuid,\r
- mBmmCallbackInfo->BmmDriverHandle,\r
- BootMaintenanceManagerBin,\r
- BootMaintenanceManagerLibStrings,\r
- NULL\r
- );\r
- ASSERT (mBmmCallbackInfo->BmmHiiHandle != NULL);\r
-\r
- //\r
- // Locate Formbrowser2 protocol\r
- //\r
- Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mBmmCallbackInfo->FormBrowser2);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- EfiBootManagerRefreshAllBootOption ();\r
-\r
- //\r
- // Create LoadOption in BmmCallbackInfo for Driver Callback\r
- //\r
- Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
- ASSERT (Ptr != NULL);\r
-\r
- //\r
- // Initialize Bmm callback data.\r
- //\r
- mBmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_LOAD_CONTEXT);\r
-\r
- mBmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_FILE_CONTEXT);\r
-\r
- mBmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
- Ptr += sizeof (BM_HANDLE_CONTEXT);\r
-\r
- mBmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
-\r
- mBmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
- mBmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
-\r
- InitAllMenu (mBmmCallbackInfo);\r
-\r
- CreateUpdateData();\r
- //\r
- // Update boot maintenance manager page \r
- //\r
- InitializeBmmConfig(mBmmCallbackInfo);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Unloads the application and its installed protocol.\r
-\r
- @param ImageHandle Handle that identifies the image to be unloaded.\r
- @param SystemTable The system table.\r
-\r
- @retval EFI_SUCCESS The image has been unloaded.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintenanceManagerLibDestructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-\r
-{\r
- if (mStartOpCodeHandle != NULL) {\r
- HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
- }\r
-\r
- if (mEndOpCodeHandle != NULL) {\r
- HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
- }\r
-\r
- FreeAllMenu ();\r
-\r
- //\r
- // Remove our IFR data from HII database\r
- //\r
- HiiRemovePackages (mBmmCallbackInfo->BmmHiiHandle);\r
-\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- mBmmCallbackInfo->BmmDriverHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- &mBmmHiiVendorDevicePath,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- &mBmmCallbackInfo->BmmConfigAccess,\r
- NULL\r
- );\r
-\r
- FreePool (mBmmCallbackInfo->LoadContext);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
+++ /dev/null
-/** @file\r
-Header file for boot maintenance module.\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef _BOOT_MAINT_H_\r
-#define _BOOT_MAINT_H_\r
-\r
-#include "FormGuid.h"\r
-\r
-#include <Guid/TtyTerm.h>\r
-#include <Guid/MdeModuleHii.h>\r
-#include <Guid/FileSystemVolumeLabelInfo.h>\r
-#include <Guid/GlobalVariable.h>\r
-#include <Guid/HiiBootMaintenanceFormset.h>\r
-\r
-#include <Protocol/LoadFile.h>\r
-#include <Protocol/HiiConfigAccess.h>\r
-#include <Protocol/SimpleFileSystem.h>\r
-#include <Protocol/SerialIo.h>\r
-#include <Protocol/DevicePathToText.h>\r
-\r
-#include <Library/PrintLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/UefiHiiServicesLib.h>\r
-#include <Library/UefiBootManagerLib.h>\r
-#include <Library/FileExplorerLib.h>\r
-\r
-#pragma pack(1)\r
-\r
-///\r
-/// HII specific Vendor Device Path definition.\r
-///\r
-typedef struct {\r
- VENDOR_DEVICE_PATH VendorDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL End;\r
-} HII_VENDOR_DEVICE_PATH;\r
-#pragma pack()\r
-\r
-//\r
-// Constants which are variable names used to access variables\r
-//\r
-\r
-#define VAR_CON_OUT_MODE L"ConOutMode"\r
-\r
-//\r
-// Variable created with this flag will be "Efi:...."\r
-//\r
-#define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
-\r
-extern EFI_GUID mBootMaintGuid;\r
-extern CHAR16 mBootMaintStorageName[];\r
-//\r
-// These are the VFR compiler generated data representing our VFR data.\r
-//\r
-extern UINT8 BootMaintenanceManagerBin[];\r
-\r
-//\r
-// Below are the number of options in Baudrate, Databits,\r
-// Parity and Stopbits selection for serial ports.\r
-//\r
-#define BM_COM_ATTR_BUADRATE 19\r
-#define BM_COM_ATTR_DATABITS 4\r
-#define BM_COM_ATTR_PARITY 5\r
-#define BM_COM_ATTR_STOPBITS 3\r
-\r
-//\r
-// Callback function helper\r
-//\r
-#define BMM_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('C', 'b', 'c', 'k')\r
-#define BMM_CALLBACK_DATA_FROM_THIS(a) CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
-\r
-//\r
-// Enumeration type definition\r
-//\r
-typedef UINT8 BBS_TYPE;\r
-\r
-typedef enum _TYPE_OF_TERMINAL {\r
- TerminalTypePcAnsi = 0,\r
- TerminalTypeVt100,\r
- TerminalTypeVt100Plus,\r
- TerminalTypeVtUtf8,\r
- TerminalTypeTtyTerm\r
-} TYPE_OF_TERMINAL;\r
-\r
-//\r
-// All of the signatures that will be used in list structure\r
-//\r
-#define BM_MENU_OPTION_SIGNATURE SIGNATURE_32 ('m', 'e', 'n', 'u')\r
-#define BM_LOAD_OPTION_SIGNATURE SIGNATURE_32 ('l', 'o', 'a', 'd')\r
-#define BM_CONSOLE_OPTION_SIGNATURE SIGNATURE_32 ('c', 'n', 's', 'l')\r
-#define BM_FILE_OPTION_SIGNATURE SIGNATURE_32 ('f', 'i', 'l', 'e')\r
-#define BM_HANDLE_OPTION_SIGNATURE SIGNATURE_32 ('h', 'n', 'd', 'l')\r
-#define BM_TERMINAL_OPTION_SIGNATURE SIGNATURE_32 ('t', 'r', 'm', 'l')\r
-#define BM_MENU_ENTRY_SIGNATURE SIGNATURE_32 ('e', 'n', 't', 'r')\r
-\r
-#define BM_LOAD_CONTEXT_SELECT 0x0\r
-#define BM_CONSOLE_CONTEXT_SELECT 0x1\r
-#define BM_FILE_CONTEXT_SELECT 0x2\r
-#define BM_HANDLE_CONTEXT_SELECT 0x3\r
-#define BM_TERMINAL_CONTEXT_SELECT 0x5\r
-\r
-#define BM_CONSOLE_IN_CONTEXT_SELECT 0x6\r
-#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
-#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
-\r
-//\r
-// Buffer size for update data\r
-//\r
-#define UPDATE_DATA_SIZE 0x100000\r
-\r
-//\r
-// Namespace of callback keys used in display and file system navigation\r
-//\r
-#define MAX_BBS_OFFSET 0xE000\r
-#define NET_OPTION_OFFSET 0xD800\r
-#define BEV_OPTION_OFFSET 0xD000\r
-#define FD_OPTION_OFFSET 0xC000\r
-#define HD_OPTION_OFFSET 0xB000\r
-#define CD_OPTION_OFFSET 0xA000\r
-#define FILE_OPTION_OFFSET 0x8000\r
-#define FILE_OPTION_MASK 0x7FFF\r
-#define HANDLE_OPTION_OFFSET 0x7000\r
-#define CONSOLE_OPTION_OFFSET 0x6000\r
-#define TERMINAL_OPTION_OFFSET 0x5000\r
-#define CONFIG_OPTION_OFFSET 0x1200\r
-#define KEY_VALUE_OFFSET 0x1100\r
-#define FORM_ID_OFFSET 0x1000\r
-\r
-//\r
-// VarOffset that will be used to create question\r
-// all these values are computed from the structure\r
-// defined below\r
-//\r
-#define VAR_OFFSET(Field) ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))\r
-\r
-//\r
-// Question Id of Zero is invalid, so add an offset to it\r
-//\r
-#define QUESTION_ID(Field) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)\r
-\r
-#define BOOT_TIME_OUT_VAR_OFFSET VAR_OFFSET (BootTimeOut)\r
-#define BOOT_NEXT_VAR_OFFSET VAR_OFFSET (BootNext)\r
-#define COM1_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM1BaudRate)\r
-#define COM1_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM1DataRate)\r
-#define COM1_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM1StopBits)\r
-#define COM1_PARITY_VAR_OFFSET VAR_OFFSET (COM1Parity)\r
-#define COM1_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)\r
-#define COM2_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM2BaudRate)\r
-#define COM2_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM2DataRate)\r
-#define COM2_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM2StopBits)\r
-#define COM2_PARITY_VAR_OFFSET VAR_OFFSET (COM2Parity)\r
-#define COM2_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)\r
-#define DRV_ADD_HANDLE_DESC_VAR_OFFSET VAR_OFFSET (DriverAddHandleDesc)\r
-#define DRV_ADD_ACTIVE_VAR_OFFSET VAR_OFFSET (DriverAddActive)\r
-#define DRV_ADD_RECON_VAR_OFFSET VAR_OFFSET (DriverAddForceReconnect)\r
-#define CON_IN_COM1_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM1)\r
-#define CON_IN_COM2_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM2)\r
-#define CON_OUT_COM1_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM1)\r
-#define CON_OUT_COM2_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM2)\r
-#define CON_ERR_COM1_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM1)\r
-#define CON_ERR_COM2_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM2)\r
-#define CON_MODE_VAR_OFFSET VAR_OFFSET (ConsoleOutMode)\r
-#define CON_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleCheck)\r
-#define CON_IN_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleInCheck)\r
-#define CON_OUT_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleOutCheck)\r
-#define CON_ERR_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleErrCheck)\r
-#define BOOT_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (BootOptionOrder)\r
-#define DRIVER_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (DriverOptionOrder)\r
-#define BOOT_OPTION_DEL_VAR_OFFSET VAR_OFFSET (BootOptionDel)\r
-#define DRIVER_OPTION_DEL_VAR_OFFSET VAR_OFFSET (DriverOptionDel)\r
-#define DRIVER_ADD_OPTION_VAR_OFFSET VAR_OFFSET (DriverAddHandleOptionalData)\r
-#define COM_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COMBaudRate)\r
-#define COM_DATA_RATE_VAR_OFFSET VAR_OFFSET (COMDataRate)\r
-#define COM_STOP_BITS_VAR_OFFSET VAR_OFFSET (COMStopBits)\r
-#define COM_PARITY_VAR_OFFSET VAR_OFFSET (COMParity)\r
-#define COM_TERMINAL_VAR_OFFSET VAR_OFFSET (COMTerminalType)\r
-#define COM_FLOWCONTROL_VAR_OFFSET VAR_OFFSET (COMFlowControl)\r
-\r
-#define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut)\r
-#define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext)\r
-#define COM1_BAUD_RATE_QUESTION_ID QUESTION_ID (COM1BaudRate)\r
-#define COM1_DATA_RATE_QUESTION_ID QUESTION_ID (COM1DataRate)\r
-#define COM1_STOP_BITS_QUESTION_ID QUESTION_ID (COM1StopBits)\r
-#define COM1_PARITY_QUESTION_ID QUESTION_ID (COM1Parity)\r
-#define COM1_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
-#define COM2_BAUD_RATE_QUESTION_ID QUESTION_ID (COM2BaudRate)\r
-#define COM2_DATA_RATE_QUESTION_ID QUESTION_ID (COM2DataRate)\r
-#define COM2_STOP_BITS_QUESTION_ID QUESTION_ID (COM2StopBits)\r
-#define COM2_PARITY_QUESTION_ID QUESTION_ID (COM2Parity)\r
-#define COM2_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
-#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
-#define DRV_ADD_ACTIVE_QUESTION_ID QUESTION_ID (DriverAddActive)\r
-#define DRV_ADD_RECON_QUESTION_ID QUESTION_ID (DriverAddForceReconnect)\r
-#define CON_IN_COM1_QUESTION_ID QUESTION_ID (ConsoleInputCOM1)\r
-#define CON_IN_COM2_QUESTION_ID QUESTION_ID (ConsoleInputCOM2)\r
-#define CON_OUT_COM1_QUESTION_ID QUESTION_ID (ConsoleOutputCOM1)\r
-#define CON_OUT_COM2_QUESTION_ID QUESTION_ID (ConsoleOutputCOM2)\r
-#define CON_ERR_COM1_QUESTION_ID QUESTION_ID (ConsoleErrorCOM1)\r
-#define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2)\r
-#define CON_MODE_QUESTION_ID QUESTION_ID (ConsoleOutMode)\r
-#define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck)\r
-#define CON_IN_DEVICE_QUESTION_ID QUESTION_ID (ConsoleInCheck)\r
-#define CON_OUT_DEVICE_QUESTION_ID QUESTION_ID (ConsoleOutCheck)\r
-#define CON_ERR_DEVICE_QUESTION_ID QUESTION_ID (ConsoleErrCheck)\r
-#define BOOT_OPTION_ORDER_QUESTION_ID QUESTION_ID (BootOptionOrder)\r
-#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
-#define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel)\r
-#define DRIVER_OPTION_DEL_QUESTION_ID QUESTION_ID (DriverOptionDel)\r
-#define DRIVER_ADD_OPTION_QUESTION_ID QUESTION_ID (DriverAddHandleOptionalData)\r
-#define COM_BAUD_RATE_QUESTION_ID QUESTION_ID (COMBaudRate)\r
-#define COM_DATA_RATE_QUESTION_ID QUESTION_ID (COMDataRate)\r
-#define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits)\r
-#define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity)\r
-#define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType)\r
-#define COM_FLOWCONTROL_QUESTION_ID QUESTION_ID (COMFlowControl)\r
-\r
-#define STRING_DEPOSITORY_NUMBER 8\r
-\r
-#define NONE_BOOTNEXT_VALUE (0xFFFF + 1)\r
-\r
-///\r
-/// Serial Ports attributes, first one is the value for\r
-/// return from callback function, stringtoken is used to\r
-/// display the value properly\r
-///\r
-typedef struct {\r
- UINTN Value;\r
- UINT16 StringToken;\r
-} COM_ATTR;\r
-\r
-typedef struct {\r
- UINT64 BaudRate;\r
- UINT8 DataBits;\r
- UINT8 Parity;\r
- UINT8 StopBits;\r
-\r
- UINT8 BaudRateIndex;\r
- UINT8 DataBitsIndex;\r
- UINT8 ParityIndex;\r
- UINT8 StopBitsIndex;\r
-\r
- UINT8 FlowControl;\r
-\r
- UINT8 IsConIn;\r
- UINT8 IsConOut;\r
- UINT8 IsStdErr;\r
- UINT8 TerminalType;\r
-\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_TERMINAL_CONTEXT;\r
-\r
-typedef struct {\r
- BOOLEAN IsBootNext;\r
- BOOLEAN LoadOptionModified;\r
- BOOLEAN Deleted;\r
-\r
- BOOLEAN IsLegacy;\r
- BOOLEAN IsActive;\r
- BOOLEAN ForceReconnect;\r
- UINTN OptionalDataSize;\r
-\r
- UINTN LoadOptionSize;\r
- UINT8 *LoadOption;\r
-\r
- UINT32 Attributes;\r
- UINT16 FilePathListLength;\r
- UINT16 *Description;\r
- EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
- UINT8 *OptionalData;\r
-\r
- UINT16 BbsIndex;\r
-} BM_LOAD_CONTEXT;\r
-\r
-typedef struct {\r
-\r
- BOOLEAN IsActive;\r
-\r
- BOOLEAN IsTerminal;\r
-\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_CONSOLE_CONTEXT;\r
-\r
-typedef struct {\r
- UINTN Column;\r
- UINTN Row;\r
-} CONSOLE_OUT_MODE;\r
-\r
-typedef struct {\r
- EFI_HANDLE Handle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_FILE_HANDLE FHandle;\r
- UINT16 *FileName;\r
- EFI_FILE_SYSTEM_VOLUME_LABEL *Info;\r
-\r
- BOOLEAN IsRoot;\r
- BOOLEAN IsDir;\r
- BOOLEAN IsRemovableMedia;\r
- BOOLEAN IsLoadFile;\r
- BOOLEAN IsBootLegacy;\r
-} BM_FILE_CONTEXT;\r
-\r
-typedef struct {\r
- EFI_HANDLE Handle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-} BM_HANDLE_CONTEXT;\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Head;\r
- UINTN MenuNumber;\r
-} BM_MENU_OPTION;\r
-\r
-typedef struct {\r
- UINTN Signature;\r
- LIST_ENTRY Link;\r
- UINTN OptionNumber;\r
- UINT16 *DisplayString;\r
- UINT16 *HelpString;\r
- EFI_STRING_ID DisplayStringToken;\r
- EFI_STRING_ID HelpStringToken;\r
- UINTN ContextSelection;\r
- VOID *VariableContext;\r
-} BM_MENU_ENTRY;\r
-\r
-typedef struct {\r
- \r
- UINTN Signature;\r
-\r
- EFI_HII_HANDLE BmmHiiHandle;\r
- EFI_HANDLE BmmDriverHandle;\r
- ///\r
- /// Boot Maintenance Manager Produced protocols\r
- ///\r
- EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;\r
- EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
-\r
- BM_MENU_ENTRY *MenuEntry;\r
- BM_HANDLE_CONTEXT *HandleContext;\r
- BM_FILE_CONTEXT *FileContext;\r
- BM_LOAD_CONTEXT *LoadContext;\r
- BM_TERMINAL_CONTEXT *TerminalContext;\r
- UINTN CurrentTerminal;\r
- BBS_TYPE BbsType;\r
-\r
- //\r
- // BMM main formset callback data.\r
- //\r
- \r
- EFI_FORM_ID BmmCurrentPageId;\r
- EFI_FORM_ID BmmPreviousPageId;\r
- BOOLEAN BmmAskSaveOrNot;\r
- BMM_FAKE_NV_DATA BmmFakeNvData;\r
- BMM_FAKE_NV_DATA BmmOldFakeNVData;\r
-\r
-} BMM_CALLBACK_DATA;\r
-\r
-/**\r
-\r
- Find drivers that will be added as Driver#### variables from handles\r
- in current system environment\r
- All valid handles in the system except those consume SimpleFs, LoadFile\r
- are stored in DriverMenu for future use.\r
-\r
- @retval EFI_SUCCESS The function complets successfully.\r
- @return Other value if failed to build the DriverMenu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
- VOID\r
- );\r
-\r
-/**\r
-\r
- Build the BootOptionMenu according to BootOrder Variable.\r
- This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @return The number of the Var Boot####.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
-\r
- Build up all DriverOptionMenu\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @return EFI_SUCESS The functin completes successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
- \r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Free resources allocated in Allocate Rountine.\r
-\r
- @param FreeMenu Menu to be freed\r
-\r
-**/\r
-VOID\r
-BOpt_FreeMenu (\r
- BM_MENU_OPTION *FreeMenu\r
- );\r
-\r
-/**\r
-\r
- Get the Option Number that has not been allocated for use.\r
-\r
- @param Type The type of Option.\r
-\r
- @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetOptionNumber (\r
- CHAR16 *Type\r
- );\r
-\r
-/**\r
-\r
- Get the Option Number for Boot#### that does not used.\r
-\r
- @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetBootOptionNumber (\r
- VOID\r
- );\r
-\r
-/**\r
-\r
-Get the Option Number for Driver#### that does not used.\r
-\r
-@return The unused Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetDriverOptionNumber (\r
- VOID\r
- );\r
-\r
-/**\r
- Create a menu entry give a Menu type.\r
-\r
- @param MenuType The Menu type to be created.\r
-\r
-\r
- @retval NULL If failed to create the menu.\r
- @return The menu.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_CreateMenuEntry (\r
- UINTN MenuType\r
- );\r
-\r
-/**\r
- Free up all resource allocated for a BM_MENU_ENTRY.\r
-\r
- @param MenuEntry A pointer to BM_MENU_ENTRY.\r
-\r
-**/\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
- BM_MENU_ENTRY *MenuEntry\r
- );\r
-\r
-/**\r
- Get the Menu Entry from the list in Menu Entry List.\r
-\r
- If MenuNumber is great or equal to the number of Menu\r
- Entry in the list, then ASSERT.\r
-\r
- @param MenuOption The Menu Entry List to read the menu entry.\r
- @param MenuNumber The index of Menu Entry.\r
-\r
- @return The Menu Entry.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_GetMenuEntry (\r
- BM_MENU_OPTION *MenuOption,\r
- UINTN MenuNumber\r
- );\r
-\r
-/**\r
- Get option number according to Boot#### and BootOrder variable. \r
- The value is saved as #### + 1.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID \r
-GetBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Get driver option order from globalc DriverOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- \r
-**/\r
-VOID \r
-GetDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// Locate all serial io devices for console\r
-//\r
-/**\r
- Build a list containing all serial devices.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_UNSUPPORTED No serial ports present.\r
-\r
-**/\r
-EFI_STATUS\r
-LocateSerialIo (\r
- VOID\r
- );\r
-\r
-//\r
-// Initializing Console menu\r
-//\r
-/**\r
- Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
- @retval EFI_SUCCESS The function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAllConsoles(\r
- VOID\r
- );\r
-\r
-//\r
-// Get current mode information\r
-//\r
-/**\r
- Get mode number according to column and row\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-GetConsoleOutMode (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// Cleaning up console menu\r
-//\r
-/**\r
- Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
- @retval EFI_SUCCESS The function always complete successfully.\r
-**/\r
-EFI_STATUS\r
-FreeAllConsoles (\r
- VOID\r
- );\r
-\r
-/**\r
- Update the device path that describing a terminal device\r
- based on the new BaudRate, Data Bits, parity and Stop Bits\r
- set.\r
-\r
- @param DevicePath The devicepath protocol instance wanted to be updated.\r
-\r
-**/\r
-VOID\r
-ChangeVariableDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-/**\r
- Update the multi-instance device path of Terminal Device based on\r
- the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
- device path in the Terminal Device in TerminalMenu is also updated.\r
-\r
- @param DevicePath The multi-instance device path.\r
- @param ChangeTerminal TRUE, then device path in the Terminal Device \r
- in TerminalMenu is also updated; FALSE, no update.\r
-\r
- @return EFI_SUCCESS The function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN BOOLEAN ChangeTerminal\r
- );\r
-\r
-//\r
-// Variable operation by menu selection\r
-//\r
-/**\r
- This function create a currently loaded Boot Option from \r
- the BMM. It then appends this Boot Option to the end of \r
- the "BootOrder" list. It also append this Boot Opotion to the end\r
- of BootOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this boot option, call Var_ChangeBootOrder to\r
- make sure BootOrder is in valid state.\r
-\r
- @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to \r
- BM_LOAD_CONTEXT marked for deletion is deleted\r
- @return Others If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
- VOID\r
- );\r
-\r
-/**\r
- After any operation on Boot####, there will be a discrepancy in BootOrder.\r
- Since some are missing but in BootOrder, while some are present but are\r
- not reflected by BootOrder. Then a function rebuild BootOrder from\r
- scratch by content from BootOptionMenu is needed.\r
-\r
- @retval EFI_SUCCESS The boot order is updated successfully.\r
- @return other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
- VOID\r
- );\r
-\r
-/**\r
- This function create a currently loaded Drive Option from \r
- the BMM. It then appends this Driver Option to the end of \r
- the "DriverOrder" list. It append this Driver Opotion to the end\r
- of DriverOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- @param HiiHandle The HII handle associated with the BMM formset.\r
- @param DescriptionData The description of this driver option.\r
- @param OptionalData The optional load option.\r
- @param ForceReconnect If to force reconnect.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN UINT16 *DescriptionData,\r
- IN UINT16 *OptionalData,\r
- IN UINT8 ForceReconnect\r
- );\r
-\r
-/**\r
- Delete Load Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this Driver option, call Var_ChangeDriverOrder to\r
- make sure DriverOrder is in valid state.\r
-\r
- @retval EFI_SUCCESS Load Option is successfully updated.\r
- @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
- Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
- VOID\r
- );\r
-\r
-/**\r
- After any operation on Driver####, there will be a discrepancy in\r
- DriverOrder. Since some are missing but in DriverOrder, while some\r
- are present but are not reflected by DriverOrder. Then a function\r
- rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
- needed.\r
-\r
- @retval EFI_SUCCESS The driver order is updated successfully.\r
- @return other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
- VOID\r
- );\r
-\r
-/**\r
- This function delete and build multi-instance device path ConIn\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
- VOID\r
- );\r
-\r
-/**\r
- This function delete and build multi-instance device path ConOut console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
- VOID\r
- );\r
-\r
-/**\r
- This function delete and build multi-instance device path ErrOut console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
- VOID\r
- );\r
-\r
-/**\r
- This function delete and build Out of Band console device.\r
- \r
- @param MenuIndex Menu index which user select in the terminal menu list.\r
- \r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information. \r
-**/\r
-EFI_STATUS\r
-Var_UpdateOutOfBandOption (\r
- IN UINT16 MenuIndex\r
- );\r
-\r
-/**\r
- Update the device path of "ConOut", "ConIn" and "ErrOut" based on the new BaudRate, Data Bits, \r
- parity and stop Bits set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
- VOID\r
- );\r
-\r
-/**\r
- This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM, \r
- this EFI Variable is deleted.\r
- It also update the BMM context data specified the "BootNext" value.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh \r
- BootOptionMenu with the new "BootOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- This function update the "DriverOrder" EFI Variable based on\r
- BMM Formset's NV map. It then refresh DriverOptionMenu\r
- with the new "DriverOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Update the Text Mode of Console.\r
-\r
- @param CallbackData The context data for BMM.\r
-\r
- @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
- @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-//\r
-// Following are page create and refresh functions\r
-//\r
-/**\r
- Create the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-CreateUpdateData (\r
- VOID\r
- );\r
-\r
-/**\r
- Refresh the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-RefreshUpdateData (\r
- VOID\r
- );\r
-\r
-/**\r
- Clean up the dynamic opcode at label and form specified by\r
- both LabelId. \r
-\r
- @param LabelId It is both the Form ID and Label ID for\r
- opcode deletion.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-CleanUpPage (\r
- IN UINT16 LabelId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create a lit of boot option from global BootOptionMenu. It\r
- allow user to delete the boot option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create a lit of driver option from global DriverMenu.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateDrvAddHandlePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create a lit of driver option from global DriverOptionMenu. It\r
- allow user to delete the driver option.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateDrvDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Prepare the page to allow user to add description for a Driver Option.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Dispatch the correct update page function to call based on the UpdatePageId.\r
-\r
- @param UpdatePageId The form ID.\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdatePageBody (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create the dynamic page to allow user to set the "BootNext" vaule.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateBootNextPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create the dynamic page to allow user to set the "TimeOut" vaule.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateTimeOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
- Parity, Stop Bits, Terminal Type.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateTerminalPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Refresh the text mode page\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateConModePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Create a list of Goto Opcode for all terminal devices logged\r
- by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateConCOMPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- Update add boot/driver option page.\r
-\r
- @param CallbackData The BMM context data.\r
- @param FormId The form ID to be updated.\r
- @param DevicePath Device path.\r
-\r
-**/\r
-VOID\r
-UpdateOptionPage(\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_FORM_ID FormId,\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-/**\r
- Function deletes the variable specified by VarName and VarGuid.\r
-\r
-\r
- @param VarName A Null-terminated Unicode string that is\r
- the name of the vendor's variable.\r
- \r
- @param VarGuid A unique identifier for the vendor.\r
-\r
- @retval EFI_SUCCESS The variable was found and removed\r
- @retval EFI_UNSUPPORTED The variable store was inaccessible\r
- @retval EFI_OUT_OF_RESOURCES The temporary buffer was not available\r
- @retval EFI_NOT_FOUND The variable was not found\r
-\r
-**/\r
-EFI_STATUS\r
-EfiLibDeleteVariable (\r
- IN CHAR16 *VarName,\r
- IN EFI_GUID *VarGuid\r
- );\r
-\r
-/**\r
- Function is used to determine the number of device path instances\r
- that exist in a device path.\r
-\r
-\r
- @param DevicePath A pointer to a device path data structure.\r
-\r
- @return This function counts and returns the number of device path instances\r
- in DevicePath.\r
-\r
-**/\r
-UINTN\r
-EfiDevicePathInstanceCount (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-/**\r
- Get a string from the Data Hub record based on \r
- a device path.\r
-\r
- @param DevPath The device Path.\r
-\r
- @return A string located from the Data Hub records based on\r
- the device path.\r
- @retval NULL If failed to get the String from Data Hub.\r
-\r
-**/\r
-UINT16 *\r
-EfiLibStrFromDatahub (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-/**\r
- Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
- specified by DeviceType.\r
-\r
- @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,\r
- etc.\r
- @param OptionIndex Returns the index number (#### in Boot####).\r
- @param OptionSize Return the size of the Boot### variable.\r
-\r
-**/\r
-VOID *\r
-GetLegacyBootOptionVar (\r
- IN UINTN DeviceType,\r
- OUT UINTN *OptionIndex,\r
- OUT UINTN *OptionSize\r
- );\r
-\r
-/**\r
- Discard all changes done to the BMM pages such as Boot Order change,\r
- Driver order change.\r
-\r
- @param Private The BMM context data.\r
- @param CurrentFakeNVMap The current Fack NV Map.\r
-\r
-**/\r
-VOID\r
-DiscardChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
- );\r
-\r
-/**\r
- Dispatch the display to the next page based on NewPageId.\r
-\r
- @param Private The BMM context data.\r
- @param NewPageId The original page ID.\r
-\r
-**/\r
-VOID\r
-UpdatePageId (\r
- BMM_CALLBACK_DATA *Private,\r
- UINT16 NewPageId\r
- );\r
-\r
-/**\r
- Remove the installed BootMaint and FileExplorer HiiPackages.\r
-\r
-**/\r
-VOID\r
-FreeBMPackage(\r
- VOID\r
- );\r
-\r
-/**\r
- Install BootMaint and FileExplorer HiiPackages.\r
-\r
-**/\r
-VOID\r
-InitBootMaintenance(\r
- VOID\r
- );\r
-\r
-/**\r
-\r
- Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/ \r
-VOID \r
-GetConsoleInCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
-\r
- Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-GetConsoleOutCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
-\r
- Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/ \r
-VOID\r
-GetConsoleErrCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
-\r
- Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
- to BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-GetTerminalAttribute (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- );\r
-\r
-/**\r
- This function will change video resolution and text mode\r
- according to defined setup mode or defined boot mode \r
-\r
- @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
-\r
- @retval EFI_SUCCESS Mode is changed successfully.\r
- @retval Others Mode failed to be changed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BmmBdsSetConsoleMode (\r
- BOOLEAN IsSetupMode\r
- );\r
-\r
-\r
-/**\r
- This function converts an input device structure to a Unicode string.\r
-\r
- @param DevPath A pointer to the device path structure.\r
-\r
- @return A new allocated Unicode string that represents the device path.\r
-\r
-**/\r
-CHAR16 *\r
-UiDevicePathToStr (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
- );\r
-\r
-/**\r
- Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
- The caller is responsible for freeing the allocated buffer using FreePool().\r
-\r
- @param DevicePath Device path.\r
-\r
- @return A new allocated string that represents the file name.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractFileNameFromDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-/**\r
- This function allows a caller to extract the current configuration for one\r
- or more named elements from the target driver.\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
- @param Progress On return, points to a character in the Request string.\r
- Points to the string's null terminator if request was successful.\r
- Points to the most recent '&' before the first failing name/value\r
- pair (or the beginning of the string if the failure is in the\r
- first name/value pair) if the request was not successful.\r
- @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
- has all values filled in for the names in the Request string.\r
- String to be allocated by the called function.\r
-\r
- @retval EFI_SUCCESS The Results is filled with the requested values.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
- @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
- @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintExtractConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Request,\r
- OUT EFI_STRING *Progress,\r
- OUT EFI_STRING *Results\r
- );\r
-\r
-/**\r
- This function applies changes in a driver's configuration.\r
- Input is a Configuration, which has the routing data for this\r
- driver followed by name / value configuration pairs. The driver\r
- must apply those pairs to its configurable storage. If the\r
- driver's configuration is stored in a linear block of data\r
- and the driver's name / value pairs are in <BlockConfig>\r
- format, it may use the ConfigToBlock helper function (above) to\r
- simplify the job. Currently not implemented.\r
-\r
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param[in] Configuration A null-terminated Unicode string in\r
- <ConfigString> format. \r
- @param[out] Progress A pointer to a string filled in with the\r
- offset of the most recent '&' before the\r
- first failing name / value pair (or the\r
- beginn ing of the string if the failure\r
- is in the first name / value pair) or\r
- the terminating NULL if all was\r
- successful.\r
-\r
- @retval EFI_SUCCESS The results have been distributed or are\r
- awaiting distribution. \r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
- parts of the results that must be\r
- stored awaiting possible future\r
- protocols.\r
- @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
- Results parameter would result\r
- in this type of error.\r
- @retval EFI_NOT_FOUND Target for the specified routing data\r
- was not found.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintRouteConfig (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN CONST EFI_STRING Configuration,\r
- OUT EFI_STRING *Progress\r
- );\r
-\r
-/**\r
- This function processes the results of changes in configuration.\r
-\r
-\r
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
- @param Action Specifies the type of action taken by the browser.\r
- @param QuestionId A unique value which is sent to the original exporting driver\r
- so that it can identify the type of data to expect.\r
- @param Type The type of value for the question.\r
- @param Value A pointer to the data being sent to the original exporting driver.\r
- @param ActionRequest On return, points to the action requested by the callback function.\r
-\r
- @retval EFI_SUCCESS The callback successfully handled the action.\r
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
- @retval EFI_DEVICE_ERROR The variable could not be saved.\r
- @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
- @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BootMaintCallback (\r
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
- IN EFI_BROWSER_ACTION Action,\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN UINT8 Type,\r
- IN EFI_IFR_TYPE_VALUE *Value,\r
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
- );\r
-\r
-/**\r
- Create boot option base on the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
-\r
-**/\r
-BOOLEAN \r
-CreateBootOptionFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- );\r
-\r
-/**\r
- Create driver option base on the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
-**/\r
-BOOLEAN \r
-CreateDriverOptionFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- );\r
-\r
-/**\r
- Boot the file specified by the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
- \r
-**/\r
-BOOLEAN \r
-BootFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- );\r
-\r
-//\r
-// Global variable in this program (defined in data.c)\r
-//\r
-extern BM_MENU_OPTION BootOptionMenu;\r
-extern BM_MENU_OPTION DriverOptionMenu;\r
-extern BM_MENU_OPTION ConsoleInpMenu;\r
-extern BM_MENU_OPTION ConsoleOutMenu;\r
-extern BM_MENU_OPTION ConsoleErrMenu;\r
-extern BM_MENU_OPTION DriverMenu;\r
-extern BM_MENU_OPTION TerminalMenu;\r
-extern UINT16 TerminalType[5];\r
-extern COM_ATTR BaudRateList[19];\r
-extern COM_ATTR DataBitsList[4];\r
-extern COM_ATTR ParityList[5];\r
-extern COM_ATTR StopBitsList[3];\r
-extern EFI_GUID TerminalTypeGuid[5];\r
-extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];\r
-extern UINT16 mFlowControlType[2];\r
-extern UINT32 mFlowControlValue[2];\r
-\r
-//\r
-// Shared IFR form update data\r
-//\r
-extern VOID *mStartOpCodeHandle;\r
-extern VOID *mEndOpCodeHandle;\r
-extern EFI_IFR_GUID_LABEL *mStartLabel;\r
-extern EFI_IFR_GUID_LABEL *mEndLabel;\r
-extern BMM_CALLBACK_DATA gBootMaintenancePrivate;\r
-extern BMM_CALLBACK_DATA *mBmmCallbackInfo;\r
-\r
-#endif\r
+++ /dev/null
-///** @file\r
-// Boot Maintenance Utility Formset\r
-//\r
-// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-// This program and the accompanying materials\r
-// are licensed and made available under the terms and conditions of the BSD License\r
-// which accompanies this distribution. The full text of the license may be found at\r
-// http://opensource.org/licenses/bsd-license.php\r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-// \r
-//**/\r
-\r
-#include "FormGuid.h"\r
-\r
-formset\r
- guid = BOOT_MAINT_FORMSET_GUID,\r
- title = STRING_TOKEN(STR_FORM_MAIN_TITLE),\r
- help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP),\r
- classguid = gEfiIfrFrontPageGuid,\r
-\r
- varstore BMM_FAKE_NV_DATA,\r
- varid = VARSTORE_ID_BOOT_MAINT,\r
- name = BmmData,\r
- guid = BOOT_MAINT_FORMSET_GUID;\r
-\r
- form formid = FORM_MAIN_ID,\r
- title = STRING_TOKEN(STR_FORM_MAIN_TITLE);\r
-\r
- goto FORM_BOOT_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_BOOT_SETUP_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_DRIVER_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_DRIVER_SETUP_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_CON_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_MAIN_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_BOOT_FROM_FILE),\r
- help = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP),\r
- flags = INTERACTIVE,\r
- key = KEY_VALUE_BOOT_FROM_FILE;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
-// label FORM_MAIN_ID;\r
-\r
- goto FORM_BOOT_NEXT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_BOOT_NEXT_ID;\r
-\r
- goto FORM_TIME_OUT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_TIME_OUT_ID;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- text\r
- help = STRING_TOKEN(STR_RESET),\r
- text = STRING_TOKEN(STR_RESET),\r
- flags = INTERACTIVE,\r
- key = FORM_RESET;\r
- \r
- label LABEL_BMM_PLATFORM_INFORMATION;\r
- //\r
- // This is where we will dynamically add a Action type op-code to show \r
- // the platform information.\r
- //\r
- \r
- //\r
- // This is where we will dynamically add a Action type op-code to show \r
- // the advanced menu.\r
- //\r
- \r
- //\r
- // This is where we will dynamically add a Action type op-code to show \r
- // the intel test menu.\r
- //\r
- label LABEL_END; \r
- endform;\r
-\r
- form formid = FORM_BOOT_SETUP_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
- //flags = INTERACTIVE,\r
- //key = FORM_MAIN_ID;\r
-\r
- goto FORM_BOOT_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_BOOT_ADD_ID;\r
-\r
- goto FORM_BOOT_DEL_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_BOOT_DEL_ID;\r
-\r
- goto FORM_BOOT_CHG_ID,\r
- prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_BOOT_CHG_ID;\r
- endform;\r
-\r
- form formid = FORM_DRIVER_SETUP_ID,\r
- title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
- //help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- //flags = INTERACTIVE,\r
- //key = FORM_MAIN_ID;\r
-\r
- goto FORM_DRV_ADD_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_DRV_ADD_ID;\r
-\r
- goto FORM_DRV_DEL_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_DRV_DEL_ID;\r
-\r
- goto FORM_DRV_CHG_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
- help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_DRV_CHG_ID;\r
- endform;\r
-\r
- form formid = FORM_BOOT_ADD_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);\r
-\r
- label FORM_BOOT_ADD_ID;\r
- label LABEL_END;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- string varid = BmmData.BootDescriptionData,\r
- questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE,\r
- minsize = 6,\r
- maxsize = 75,\r
- endstring;\r
-\r
- string varid = BmmData.BootOptionalData,\r
- questionid = KEY_VALUE_BOOT_OPTION,\r
- prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE,\r
- minsize = 0,\r
- maxsize = 120,\r
- endstring;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- text\r
- help = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
- text = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
- flags = INTERACTIVE,\r
- key = KEY_VALUE_SAVE_AND_EXIT_BOOT;\r
-\r
- text\r
- help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
- text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
- flags = INTERACTIVE,\r
- key = KEY_VALUE_NO_SAVE_AND_EXIT_BOOT;\r
- \r
- endform;\r
-\r
- form formid = FORM_BOOT_DEL_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);\r
-\r
- label FORM_BOOT_DEL_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_BOOT_CHG_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);\r
-\r
- label FORM_BOOT_CHG_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_BOOT_NEXT_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);\r
-\r
- label FORM_BOOT_NEXT_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_TIME_OUT_ID,\r
- title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);\r
-\r
- label FORM_TIME_OUT_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_MEMORY_CHECK_ID,\r
- title = STRING_TOKEN(STR_FORM_MEMORY_CHECK_TITLE);\r
-\r
- label FORM_MEMORY_CHECK_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_UEFI_OPTIMIZED_BOOT_ID,\r
- title = STRING_TOKEN(STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE);\r
-\r
- label FORM_UEFI_OPTIMIZED_BOOT_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
- //flags = INTERACTIVE,\r
- //key = FORM_MAIN_ID;\r
-\r
- goto FORM_DRIVER_SETUP_ID,\r
- prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
- help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
- flags = INTERACTIVE,\r
- key = FORM_DRV_ADD_FILE_ID;\r
-\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_FILE_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
- \r
- label FORM_DRV_ADD_FILE_ID;\r
- label LABEL_END;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- string varid = BmmData.DriverDescriptionData,\r
- questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE,\r
- minsize = 6,\r
- maxsize = 75,\r
- endstring;\r
-\r
- string varid = BmmData.DriverOptionalData,\r
- questionid = KEY_VALUE_DRIVER_OPTION,\r
- prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- flags = INTERACTIVE,\r
- minsize = 0,\r
- maxsize = 120,\r
- endstring;\r
-\r
- checkbox varid = BmmData.ForceReconnect,\r
- prompt = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
- help = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
- flags = CHECKBOX_DEFAULT,\r
- key = 0,\r
- endcheckbox;\r
-\r
- subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
-\r
- text\r
- help = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
- text = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
- flags = INTERACTIVE,\r
- key = KEY_VALUE_SAVE_AND_EXIT_DRIVER; //BUGBUB: allow duplicate key in one formset???\r
-\r
- text\r
- help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
- text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
- flags = INTERACTIVE,\r
- key = KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER;\r
- endform;\r
-\r
- form formid = FORM_DRV_DEL_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);\r
-\r
- label FORM_DRV_DEL_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_DRV_CHG_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);\r
-\r
- label FORM_DRV_CHG_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_MAIN_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);\r
-\r
- goto FORM_MAIN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
- help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
- //flags = INTERACTIVE,\r
- //key = FORM_MAIN_ID;\r
-\r
- goto FORM_CON_IN_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_IN_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_IN_ID;\r
-\r
- goto FORM_CON_OUT_ID,\r
- prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),\r
- help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_OUT_ID;\r
-\r
- goto FORM_CON_ERR_ID,\r
- prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),\r
- help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_ERR_ID;\r
-\r
- goto FORM_CON_MODE_ID,\r
- prompt = STRING_TOKEN(STR_FORM_MODE_TITLE),\r
- help = STRING_TOKEN(STR_FORM_MODE_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_MODE_ID;\r
-\r
- goto FORM_CON_COM_ID,\r
- prompt = STRING_TOKEN(STR_FORM_COM_TITLE),\r
- help = STRING_TOKEN(STR_FORM_COM_HELP),\r
- flags = INTERACTIVE,\r
- key = FORM_CON_COM_ID;\r
- endform;\r
-\r
- form formid = FORM_CON_MODE_ID,\r
- title = STRING_TOKEN(STR_FORM_MODE_TITLE);\r
-\r
- label FORM_CON_MODE_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_CON_COM_ID,\r
- title = STRING_TOKEN(STR_FORM_COM_TITLE);\r
-\r
- label FORM_CON_COM_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_CON_COM_SETUP_ID,\r
- title = STRING_TOKEN(STR_CON_COM_SETUP);\r
-\r
- label FORM_CON_COM_SETUP_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_FILE_SEEK_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
- label FORM_FILE_SEEK_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_FILE_NEW_SEEK_ID,\r
- title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
-\r
- label FORM_FILE_NEW_SEEK_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_HANDLE_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);\r
-\r
- label FORM_DRV_ADD_HANDLE_ID;\r
- label LABEL_END;\r
- endform;\r
-\r
- form formid = FORM_DRV_ADD_HANDLE_DESC_ID,\r
- title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
-\r
- label FORM_DRV_ADD_HANDLE_DESC_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_IN_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);\r
-\r
- label FORM_CON_IN_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_OUT_ID,\r
- title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);\r
-\r
- label FORM_CON_OUT_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
- form formid = FORM_CON_ERR_ID,\r
- title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);\r
-\r
- label FORM_CON_ERR_ID;\r
- label LABEL_END;\r
-\r
- endform;\r
-\r
-endformset;\r
+++ /dev/null
-## @file\r
-# Boot Maintenance Manager Library used by UiApp.\r
-#\r
-# Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
-# This program and the accompanying materials are licensed and made available under\r
-# the terms and conditions of the BSD License that accompanies this distribution.\r
-# The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php.\r
-# \r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-# \r
-##\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = BootMaintenanceManagerLib\r
- MODULE_UNI_FILE = BootMaintenanceManagerLib.uni\r
- FILE_GUID = CA9E4824-4198-4715-AA22-E2935E703A07\r
- MODULE_TYPE = DXE_DRIVER\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = NULL|DXE_DRIVER UEFI_APPLICATION\r
- CONSTRUCTOR = BootMaintenanceManagerLibConstructor\r
- DESTRUCTOR = BootMaintenanceManagerLibDestructor\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources]\r
- BootMaintenanceManager.h\r
- BootMaintenanceManager.vfr\r
- BootMaintenanceManagerStrings.uni\r
- BootMaintenance.c\r
- FormGuid.h\r
- BootOption.c\r
- ConsoleOption.c\r
- Data.c\r
- Variable.c\r
- UpdatePage.c\r
- BmLib.c\r
-\r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
-\r
-[LibraryClasses]\r
- DevicePathLib\r
- BaseLib\r
- UefiRuntimeServicesTableLib\r
- MemoryAllocationLib\r
- UefiLib\r
- UefiBootServicesTableLib\r
- BaseMemoryLib\r
- DebugLib\r
- PrintLib\r
- HiiLib\r
- UefiHiiServicesLib\r
- UefiBootManagerLib\r
- FileExplorerLib\r
- \r
-[Guids]\r
- gEfiGlobalVariableGuid ## SOMETIMES_PRODUCES ## Variable:L"BootNext" (The number of next boot option)\r
- ## SOMETIMES_PRODUCES ## Variable:L"BootXX" (Boot option variable)\r
- ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" (Platform supported languange in Rfc4646 format)\r
- ## SOMETIMES_PRODUCES ## Variable:L"Lang" (Platform supported languange in Iso639 format)\r
- ## SOMETIMES_PRODUCES ## Variable:L"KeyXX" (Hotkey option variable)\r
- ## PRODUCES ## Variable:L"HwErrRecSupport" (The level of platform supported hardware Error Record Persistence)\r
- ## SOMETIMES_PRODUCES ## Variable:L"BootOptionSupport" (The feature supported in boot option menu, value could be: EFI_BOOT_OPTION_SUPPORT_KEY, EFI_BOOT_OPTION_SUPPORT_APP\r
- ## SOMETIMES_PRODUCES (not PcdUefiVariableDefaultLangDeprecate)## Variable:L"LangCodes" (Value of PcdUefiVariableDefaultLangCodes)\r
- ## PRODUCES ## Variable:L"PlatformLangCodes" (Value of PcdUefiVariableDefaultPlatformLangCodes)\r
- ## PRODUCES ## Variable:L"Timeout" (The time out value in second of showing progress bar)\r
- ## SOMETIMES_PRODUCES ## Variable:L"BootOrder" (The boot option array)\r
- ## SOMETIMES_PRODUCES ## Variable:L"DriverOrder" (The driver order list)\r
- ## SOMETIMES_CONSUMES ## Variable:L"ConIn" (The device path of console in device)\r
- ## SOMETIMES_CONSUMES ## Variable:L"ConOut" (The device path of console out device)\r
- ## SOMETIMES_CONSUMES ## Variable:L"ErrOut" (The device path of error out device)\r
- gEfiFileSystemVolumeLabelInfoIdGuid ## CONSUMES ## GUID (Indicate the information type is volume)\r
- gEfiFileInfoGuid ## CONSUMES ## GUID (Indicate the information type is file)\r
- gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode)\r
- gEfiIfrFrontPageGuid ## CONSUMES ## GUID\r
- gEfiIfrBootMaintenanceGuid ## CONSUMES ## GUID\r
- \r
-[Protocols]\r
- gEfiSimpleFileSystemProtocolGuid ## CONSUMES\r
- gEfiLoadFileProtocolGuid ## CONSUMES\r
- gEfiHiiConfigAccessProtocolGuid ## CONSUMES\r
- gEfiSerialIoProtocolGuid ## CONSUMES\r
- gEfiDevicePathToTextProtocolGuid ## CONSUMES\r
-\r
-[FeaturePcd]\r
-\r
-[Pcd]\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## CONSUMES\r
- gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CONSUMES\r
- gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CONSUMES
\ No newline at end of file
+++ /dev/null
-// /** @file\r
-// Boot Maintenance Manager Library used by UiApp.\r
-//\r
-// Boot Maintenance Manager Library used by UiApp.\r
-//\r
-// Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
-//\r
-// This program and the accompanying materials are licensed and made available under\r
-// the terms and conditions of the BSD License that accompanies this distribution.\r
-// The full text of the license may be found at\r
-// http://opensource.org/licenses/bsd-license.php.\r
-//\r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-//\r
-// **/\r
-\r
-#string STR_MODULE_ABSTRACT\r
-#language en-US\r
-"Boot Maintenance Manager Library used by UiApp."\r
-\r
-#string STR_MODULE_DESCRIPTION\r
-#language en-US\r
-"Boot Maintenance Manager Library used by UiApp."\r
-\r
-\r
+++ /dev/null
-///** @file\r
-// String definitions for Boot Maintenance Utility.\r
-//\r
-// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-// This program and the accompanying materials\r
-// are licensed and made available under the terms and conditions of the BSD License\r
-// which accompanies this distribution. The full text of the license may be found at\r
-// http://opensource.org/licenses/bsd-license.php\r
-// \r
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-// \r
-//**/\r
-\r
-/=#\r
-\r
-#langdef en-US "English"\r
-#langdef fr-FR "Français"\r
-\r
-#string STR_NULL_STRING #language en-US " "\r
- #language fr-FR " "\r
-#string STR_NONE #language en-US "NONE"\r
- #language fr-FR "NONE"\r
-#string STR_MISSING_STRING #language en-US "Missing String"\r
- #language fr-FR "Missing String"\r
-#string STR_FORM_MAIN_TITLE #language en-US "Boot Maintenance Manager"\r
- #language fr-FR "Boot Maintenance Manager"\r
-#string STR_FORM_BOOT_SETUP_TITLE #language en-US "Boot Options"\r
- #language fr-FR "Boot Options"\r
-#string STR_BOOT_MAINT_MANAGER_HELP #language en-US "This selection will take you to the Boot Maintenance Manager"\r
- #language fr-FR "This selection will take you to the Boot Maintenance Manager"\r
-#string STR_FORM_BOOT_SETUP_HELP #language en-US "Modify system boot options"\r
- #language fr-FR "Modify system boot options"\r
-#string STR_FORM_DRIVER_SETUP_TITLE #language en-US "Driver Options"\r
- #language fr-FR "Driver Options"\r
-#string STR_FORM_DRIVER_SETUP_HELP #language en-US "Modify boot driver options"\r
- #language fr-FR "Modify boot driver options"\r
-#string STR_FORM_BOOT_ADD_TITLE #language en-US "Add Boot Option"\r
- #language fr-FR "Add Boot Option"\r
-#string STR_FORM_BOOT_ADD_HELP #language en-US "Add EFI Application or Removable Fs as Boot Option"\r
- #language fr-FR "Add EFI Application or Removable Fs as Boot Option"\r
-#string STR_FORM_BOOT_DEL_TITLE #language en-US "Delete Boot Option"\r
- #language fr-FR "Delete Boot Option"\r
-#string STR_FORM_BOOT_IMMEDIATE_HELP #language en-US "Will be valid immediately"\r
- #language fr-FR "Will be valid immediately"\r
-#string STR_FORM_BOOT_CHG_TITLE #language en-US "Change Boot Order"\r
- #language fr-FR "Change Boot Order"\r
-#string STR_FORM_DRV_ADD_TITLE #language en-US "Add Driver Option"\r
- #language fr-FR "Add Driver Option"\r
-#string STR_FORM_DRV_ADD_HELP #language en-US "Add .EFI Driver as Driver Option"\r
- #language fr-FR "Add .EFI Driver as Driver Option"\r
-#string STR_FORM_DRV_DEL_TITLE #language en-US "Delete Driver Option"\r
- #language fr-FR "Delete Driver Option"\r
-#string STR_FORM_DRV_CHG_TITLE #language en-US "Change Driver Order"\r
- #language fr-FR "Change Driver Order"\r
-#string STR_FORM_NEXT_BOOT_HELP #language en-US "Will be valid on next boot"\r
- #language fr-FR "Will be valid on next boot"\r
-#string STR_FORM_BOOT_NEXT_TITLE #language en-US "Set Boot Next Value"\r
- #language fr-FR "Set Boot Next Value"\r
-#string STR_FORM_BOOT_NEXT_HELP #language en-US "Modify next boot behavior"\r
- #language fr-FR "Modify next boot behavior"\r
-#string STR_FORM_TIME_OUT_TITLE #language en-US "Set Time Out Value"\r
- #language fr-FR "Set Time Out Value"\r
-#string STR_FORM_TIME_OUT_HELP #language en-US "Modify automatic boot time-out value"\r
- #language fr-FR "Modify automatic boot time-out value"\r
-#string STR_FORM_MEMORY_CHECK_TITLE #language en-US "Set Memory Check Type"\r
- #language fr-FR "Set Memory Check Type"\r
-#string STR_FORM_MEMORY_CHECK_HELP #language en-US "Modify the type of memory checking"\r
- #language fr-FR "Modify the type of memory checking"\r
-#string STR_MEMORY_CHECK_SETUP #language en-US "Memory Check Type"\r
- #language fr-FR "Memory Check Type"\r
-#string STR_MEMORY_CHECK_SETUP_HELP #language en-US "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
- #language fr-FR "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
-#string STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE #language en-US "UEFI Optimized Boot"\r
- #language fr-FR "UEFI Optimized Boot"\r
-#string STR_FORM_UEFI_OPTIMIZED_BOOT_HELP #language en-US "Modify the UEFI Optimized Boot setting"\r
- #language fr-FR "Modify the UEFI Optimized Boot setting"\r
-#string UEFI_OPTIMIZED_BOOT_DESCRIPTION #language en-US "UEFI Optimized Boot"\r
- #language fr-FR "UEFI Optimized Boot"\r
-#string UEFI_OPTIMIZED_BOOT_HELP #language en-US "Check to enable UEFI Optimized Boot"\r
- #language fr-FR "Check to enable UEFI Optimized Boot"\r
-#string STR_FORM_CON_MAIN_TITLE #language en-US "Console Options"\r
- #language fr-FR "Console Options"\r
-#string STR_FORM_CON_MAIN_HELP #language en-US "Modify system console options"\r
- #language fr-FR "Modify system console options"\r
-#string STR_FORM_CON_IN_TITLE #language en-US "Console Input Device Select"\r
- #language fr-FR "Console Input Device Select"\r
-#string STR_FORM_CON_IN_HELP #language en-US "Enable console device as ConIn"\r
- #language fr-FR "Enable console device as ConIn"\r
-#string STR_FORM_SET_FD_ORDER_TITLE #language en-US "Set Legacy Floppy Drive Order"\r
- #language fr-FR "Set Legacy Floppy Drive Order"\r
-#string STR_FORM_SET_HD_ORDER_TITLE #language en-US "Set Legacy HardDisk Drive Order"\r
- #language fr-FR "Set Legacy HardDisk Drive Order"\r
-#string STR_FORM_SET_CD_ORDER_TITLE #language en-US "Set Legacy CD-ROM Drive Order"\r
- #language fr-FR "Set Legacy CD-ROM Drive Order"\r
-#string STR_FORM_SET_NET_ORDER_TITLE #language en-US "Set Legacy NET Drive Order"\r
- #language fr-FR "Set Legacy NET Drive Order"\r
-#string STR_FORM_SET_BEV_ORDER_TITLE #language en-US "Set Legacy BEV Drive Order"\r
- #language fr-FR "Set Legacy BEV Drive Order"\r
-#string STR_FORM_GOTO_SETTING #language en-US "Go Back To Setting Page"\r
- #language fr-FR "Go Back To Setting Page"\r
-#string STR_COM1 #language en-US "COM1"\r
- #language fr-FR "COM1"\r
-#string STR_COM2 #language en-US "COM2"\r
- #language fr-FR "COM2"\r
-#string STR_COM_AS_CONSOLE_OPTION #language en-US "Select this COM port as Console"\r
- #language fr-FR "Select this COM port as Console"\r
-#string STR_FORM_CON_OUT_TITLE #language en-US "Console Output Device Select"\r
- #language fr-FR "Console Output Device Select"\r
-#string STR_FORM_CON_OUT_HELP #language en-US "Enable console device as ConOut"\r
- #language fr-FR "Enable console device as ConOut"\r
-#string STR_FORM_STD_ERR_TITLE #language en-US "Console Standard Error Device Select"\r
- #language fr-FR "Console Standard Error Device Select"\r
-#string STR_FORM_STD_ERR_HELP #language en-US "Enable console device as StdErr"\r
- #language fr-FR "Enable console device as StdErr"\r
-#string STR_FORM_MODE_TITLE #language en-US "Console Output Mode Select"\r
- #language fr-FR "Console Output Mode Select"\r
-#string STR_FORM_MODE_HELP #language en-US "Select Console Output Mode: 80x25, 100x31, etc."\r
- #language fr-FR "Select Console Output Mode: 80x25, 100x31, etc."\r
-#string STR_FORM_COM_TITLE #language en-US "COM Attribute Setup Page"\r
- #language fr-FR "COM Attribute Setup Page"\r
-#string STR_FORM_COM_HELP #language en-US "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
- #language fr-FR "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
-#string STR_FORM_DRV_ADD_FILE_TITLE #language en-US "Add Driver Option Using File"\r
- #language fr-FR "Add Driver Option Using File"\r
-#string STR_FORM_DRV_ADD_HANDLE_TITLE #language en-US "Add Driver Option Using Handle"\r
- #language fr-FR "Add Driver Option Using Handle"\r
-#string STR_FORM_BOOT_ADD_DESC_TITLE #language en-US "Modify Boot Option Description"\r
- #language fr-FR "Modify Boot Option Description"\r
-#string STR_FORM_DRV_ADD_DESC_TITLE #language en-US "Modify Driver Option Description"\r
- #language fr-FR "Modify Driver Option Description"\r
-#string STR_NUM_AUTO_BOOT #language en-US "Auto Boot Time-out"\r
- #language fr-FR "Auto Boot Time-out"\r
-#string STR_HLP_AUTO_BOOT #language en-US "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
- #language fr-FR "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
-#string STR_BOOT_NEXT #language en-US "Boot Next Value"\r
- #language fr-FR "Boot Next Value"\r
-#string STR_BOOT_NEXT_HELP #language en-US "Next boot use this boot option"\r
- #language fr-FR "Next boot use this boot option"\r
-#string STR_LOAD_OPTION_DEVPATH #language en-US "This is the devicepath"\r
- #language fr-FR "This is the devicepath"\r
-#string STR_LOAD_OPTION_DESC #language en-US "Input the description"\r
- #language fr-FR "Input the description"\r
-#string STR_LOAD_OPTION_ACTIVE #language en-US "Load Option Active"\r
- #language fr-FR "Load Option Active"\r
-#string STR_LOAD_OPTION_FORCE_RECON #language en-US "Load Option Reconnect"\r
- #language fr-FR "Load Option Reconnect"\r
-#string STR_SAVE_AND_EXIT #language en-US "Commit Changes and Exit"\r
- #language fr-FR "Commit Changes and Exit"\r
-#string STR_NO_SAVE_AND_EXIT #language en-US "Discard Changes and Exit"\r
- #language fr-FR "Discard Changes and Exit"\r
-#string STR_CON_IN_SETUP #language en-US "Set Console Input Device"\r
- #language fr-FR "Set Console Input Device"\r
-#string STR_CON_OUT_SETUP #language en-US "Set Console Output Device"\r
- #language fr-FR "Set Console Output Device"\r
-#string STR_CON_ERR_SETUP #language en-US "Set Error Output Device"\r
- #language fr-FR "Set Error Output Device"\r
-#string STR_CON_MODE_SETUP #language en-US "Set Console Output Mode"\r
- #language fr-FR "Set Console Output Mode"\r
-#string STR_CON_COM_SETUP #language en-US "Set COM Attributes"\r
- #language fr-FR "Set COM Attributes"\r
-#string STR_COM_TERMI_TYPE #language en-US "Set COM Terminal Type"\r
- #language fr-FR "Set COM Terminal Type"\r
-#string STR_COM_FLOW_CONTROL #language en-US "Set COM Flow Control"\r
- #language fr-FR "Set COM Flow Control"\r
-#string STR_COM_BAUD_RATE #language en-US "Set COM Baud Rate"\r
- #language fr-FR "Set COM Baud Rate"\r
-#string STR_COM_DATA_BITS #language en-US "Set COM Data Bits"\r
- #language fr-FR "Set COM Data Bits"\r
-#string STR_COM_PARITY #language en-US "Set COM Parity"\r
- #language fr-FR "Set COM Parity"\r
-#string STR_COM_STOP_BITS #language en-US "Set COM Stop Bits"\r
- #language fr-FR "Set COM Stop Bits"\r
-#string STR_COM_BAUD_RATE_0 #language en-US "115200"\r
- #language fr-FR "115200"\r
-#string STR_COM_BAUD_RATE_1 #language en-US "57600"\r
- #language fr-FR "57600"\r
-#string STR_COM_BAUD_RATE_2 #language en-US "38400"\r
- #language fr-FR "38400"\r
-#string STR_COM_BAUD_RATE_3 #language en-US "19200"\r
- #language fr-FR "19200"\r
-#string STR_COM_BAUD_RATE_4 #language en-US "9600"\r
- #language fr-FR "9600"\r
-#string STR_COM_BAUD_RATE_5 #language en-US "7200"\r
- #language fr-FR "7200"\r
-#string STR_COM_BAUD_RATE_6 #language en-US "4800"\r
- #language fr-FR "4800"\r
-#string STR_COM_BAUD_RATE_7 #language en-US "3600"\r
- #language fr-FR "3600"\r
-#string STR_COM_BAUD_RATE_8 #language en-US "2400"\r
- #language fr-FR "2400"\r
-#string STR_COM_BAUD_RATE_9 #language en-US "2000"\r
- #language fr-FR "2000"\r
-#string STR_COM_BAUD_RATE_10 #language en-US "1800"\r
- #language fr-FR "1800"\r
-#string STR_COM_BAUD_RATE_11 #language en-US "1200"\r
- #language fr-FR "1200"\r
-#string STR_COM_BAUD_RATE_12 #language en-US "600"\r
- #language fr-FR "600"\r
-#string STR_COM_BAUD_RATE_13 #language en-US "300"\r
- #language fr-FR "300"\r
-#string STR_COM_BAUD_RATE_14 #language en-US "150"\r
- #language fr-FR "150"\r
-#string STR_COM_BAUD_RATE_15 #language en-US "134"\r
- #language fr-FR "134"\r
-#string STR_COM_BAUD_RATE_16 #language en-US "110"\r
- #language fr-FR "110"\r
-#string STR_COM_BAUD_RATE_17 #language en-US "75"\r
- #language fr-FR "75"\r
-#string STR_COM_BAUD_RATE_18 #language en-US "50"\r
- #language fr-FR "50"\r
-#string STR_COM_DATA_BITS_0 #language en-US "5"\r
- #language fr-FR "5"\r
-#string STR_COM_DATA_BITS_1 #language en-US "6"\r
- #language fr-FR "6"\r
-#string STR_COM_DATA_BITS_2 #language en-US "7"\r
- #language fr-FR "7"\r
-#string STR_COM_DATA_BITS_3 #language en-US "8"\r
- #language fr-FR "8"\r
-#string STR_COM_PAR_0 #language en-US "None"\r
- #language fr-FR "None"\r
-#string STR_COM_PAR_1 #language en-US "Even"\r
- #language fr-FR "Even"\r
-#string STR_COM_PAR_2 #language en-US "Odd"\r
- #language fr-FR "Odd"\r
-#string STR_COM_PAR_3 #language en-US "Mark"\r
- #language fr-FR "Mark"\r
-#string STR_COM_PAR_4 #language en-US "Space"\r
- #language fr-FR "Space"\r
-#string STR_COM_STOP_BITS_0 #language en-US "One"\r
- #language fr-FR "One"\r
-#string STR_COM_STOP_BITS_1 #language en-US "One And A Half"\r
- #language fr-FR "One And A Half"\r
-#string STR_COM_STOP_BITS_2 #language en-US "Two"\r
- #language fr-FR "Two"\r
-#string STR_COM_TYPE_0 #language en-US "PC_ANSI"\r
- #language fr-FR "PC_ANSI"\r
-#string STR_COM_TYPE_1 #language en-US "VT_100"\r
- #language fr-FR "VT_100"\r
-#string STR_COM_TYPE_2 #language en-US "VT_100_PLUS"\r
- #language fr-FR "VT_100_PLUS"\r
-#string STR_COM_TYPE_3 #language en-US "VT_UTF8"\r
- #language fr-FR "VT_UTF8"\r
-#string STR_COM_TYPE_4 #language en-US "TTY_TERM"\r
- #language fr-FR "TTY_TERM"\r
-#string STR_RESET #language en-US "Reset System"\r
- #language fr-FR "Reset System"\r
-#string STR_FORM_GOTO_MAIN #language en-US "Go Back To Main Page"\r
- #language fr-FR "Go Back To Main Page"\r
-#string STR_BOOT_FROM_FILE #language en-US "Boot From File"\r
- #language fr-FR "Boot From File"\r
-#string STR_BOOT_FROM_FILE_HELP #language en-US "Boot system from a file or device"\r
- #language fr-FR "Boot system from a file or device"\r
-#string STR_OPTIONAL_DATA #language en-US "Input Optional Data"\r
- #language fr-FR "Input Optional Data"\r
-#string STR_CHANGE_ORDER #language en-US "Change the order"\r
- #language fr-FR "Change the order"\r
-#string STR_BOOT_LEGACY #language en-US "Boot Legacy System"\r
- #language fr-FR "Boot Legacy System"\r
-#string STR_BOOT_LEGACY_HELP #language en-US "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
- #language fr-FR "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
-#string STR_BOOT_LEGACY_FLOPPY #language en-US "Boot From Floppy"\r
- #language fr-FR "Boot From Floppy"\r
-#string STR_BOOT_LEGACY_HARDDRIVE #language en-US "Boot From Hard Drive"\r
- #language fr-FR "Boot From Hard Drive"\r
-#string STR_BOOT_LEGACY_CDROM #language en-US "Boot From CD Rom"\r
- #language fr-FR "Boot From CD Rom"\r
-#string STR_BOOT_LEGACY_PCMCIA #language en-US "Boot From PCMCIA"\r
- #language fr-FR "Boot From PCMCIA"\r
-#string STR_BOOT_LEGACY_USB #language en-US "Boot From USB Device"\r
- #language fr-FR "Boot From USB Device"\r
-#string STR_BOOT_LEGACY_NETWORK #language en-US "Boot From Network"\r
- #language fr-FR "Boot From Network"\r
-#string STR_DISABLE_LEGACY_DEVICE #language en-US "Disabled"\r
- #language fr-FR "Disabled"\r
-#string STR_FILE_EXPLORER_TITLE #language en-US "File Explorer"\r
- #language fr-FR "File Explorer"\r
-#string STR_OUT_OF_BAND_PORT #language fr-FR "Out-Of-Band Mgmt Port"\r
- #language en-US "Out-Of-Band Mgmt Port"\r
-#string STR_HARDWARE_FLOW_CONTROL #language fr-FR "Hardware"\r
- #language en-US "Hardware"\r
-#string STR_NONE_FLOW_CONTROL #language fr-FR "None"\r
- #language en-US "None"\r
-//\r
-// BugBug : need someone to translate these strings to french\r
-//\r
+++ /dev/null
-/** @file\r
- Provide boot option support for Application "BootMaint"\r
-\r
- Include file system navigation, system handle selection\r
-\r
- Boot option manipulation\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-///\r
-/// Define the maximum characters that will be accepted.\r
-///\r
-#define MAX_CHAR 480\r
-\r
-/**\r
- Create a menu entry by given menu type.\r
-\r
- @param MenuType The Menu type to be created.\r
-\r
- @retval NULL If failed to create the menu.\r
- @return the new menu entry.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_CreateMenuEntry (\r
- UINTN MenuType\r
- )\r
-{\r
- BM_MENU_ENTRY *MenuEntry;\r
- UINTN ContextSize;\r
-\r
- //\r
- // Get context size according to menu type\r
- //\r
- switch (MenuType) {\r
- case BM_LOAD_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_LOAD_CONTEXT);\r
- break;\r
-\r
- case BM_FILE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_FILE_CONTEXT);\r
- break;\r
-\r
- case BM_CONSOLE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_CONSOLE_CONTEXT);\r
- break;\r
-\r
- case BM_TERMINAL_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_TERMINAL_CONTEXT);\r
- break;\r
-\r
- case BM_HANDLE_CONTEXT_SELECT:\r
- ContextSize = sizeof (BM_HANDLE_CONTEXT);\r
- break;\r
-\r
- default:\r
- ContextSize = 0;\r
- break;\r
- }\r
-\r
- if (ContextSize == 0) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Create new menu entry\r
- //\r
- MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));\r
- if (MenuEntry == NULL) {\r
- return NULL;\r
- }\r
-\r
- MenuEntry->VariableContext = AllocateZeroPool (ContextSize);\r
- if (MenuEntry->VariableContext == NULL) {\r
- FreePool (MenuEntry);\r
- return NULL;\r
- }\r
-\r
- MenuEntry->Signature = BM_MENU_ENTRY_SIGNATURE;\r
- MenuEntry->ContextSelection = MenuType;\r
- return MenuEntry;\r
-}\r
-\r
-/**\r
- Free up all resource allocated for a BM_MENU_ENTRY.\r
-\r
- @param MenuEntry A pointer to BM_MENU_ENTRY.\r
-\r
-**/\r
-VOID\r
-BOpt_DestroyMenuEntry (\r
- BM_MENU_ENTRY *MenuEntry\r
- )\r
-{\r
- BM_LOAD_CONTEXT *LoadContext;\r
- BM_FILE_CONTEXT *FileContext;\r
- BM_CONSOLE_CONTEXT *ConsoleContext;\r
- BM_TERMINAL_CONTEXT *TerminalContext;\r
- BM_HANDLE_CONTEXT *HandleContext;\r
-\r
- //\r
- // Select by the type in Menu entry for current context type\r
- //\r
- switch (MenuEntry->ContextSelection) {\r
- case BM_LOAD_CONTEXT_SELECT:\r
- LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;\r
- FreePool (LoadContext->FilePathList);\r
- FreePool (LoadContext->LoadOption);\r
- if (LoadContext->OptionalData != NULL) {\r
- FreePool (LoadContext->OptionalData);\r
- }\r
- FreePool (LoadContext);\r
- break;\r
-\r
- case BM_FILE_CONTEXT_SELECT:\r
- FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
-\r
- if (!FileContext->IsRoot) {\r
- FreePool (FileContext->DevicePath);\r
- } else {\r
- if (FileContext->FHandle != NULL) {\r
- FileContext->FHandle->Close (FileContext->FHandle);\r
- }\r
- }\r
-\r
- if (FileContext->FileName != NULL) {\r
- FreePool (FileContext->FileName);\r
- }\r
- if (FileContext->Info != NULL) {\r
- FreePool (FileContext->Info);\r
- }\r
- FreePool (FileContext);\r
- break;\r
-\r
- case BM_CONSOLE_CONTEXT_SELECT:\r
- ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;\r
- FreePool (ConsoleContext->DevicePath);\r
- FreePool (ConsoleContext);\r
- break;\r
-\r
- case BM_TERMINAL_CONTEXT_SELECT:\r
- TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;\r
- FreePool (TerminalContext->DevicePath);\r
- FreePool (TerminalContext);\r
- break;\r
-\r
- case BM_HANDLE_CONTEXT_SELECT:\r
- HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;\r
- FreePool (HandleContext);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- FreePool (MenuEntry->DisplayString);\r
- if (MenuEntry->HelpString != NULL) {\r
- FreePool (MenuEntry->HelpString);\r
- }\r
-\r
- FreePool (MenuEntry);\r
-}\r
-\r
-/**\r
- Get the Menu Entry from the list in Menu Entry List.\r
-\r
- If MenuNumber is great or equal to the number of Menu\r
- Entry in the list, then ASSERT.\r
-\r
- @param MenuOption The Menu Entry List to read the menu entry.\r
- @param MenuNumber The index of Menu Entry.\r
-\r
- @return The Menu Entry.\r
-\r
-**/\r
-BM_MENU_ENTRY *\r
-BOpt_GetMenuEntry (\r
- BM_MENU_OPTION *MenuOption,\r
- UINTN MenuNumber\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINTN Index;\r
- LIST_ENTRY *List;\r
-\r
- ASSERT (MenuNumber < MenuOption->MenuNumber);\r
-\r
- List = MenuOption->Head.ForwardLink;\r
- for (Index = 0; Index < MenuNumber; Index++) {\r
- List = List->ForwardLink;\r
- }\r
-\r
- NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);\r
-\r
- return NewMenuEntry;\r
-}\r
-\r
-/**\r
- Free resources allocated in Allocate Rountine.\r
-\r
- @param FreeMenu Menu to be freed\r
-**/\r
-VOID\r
-BOpt_FreeMenu (\r
- BM_MENU_OPTION *FreeMenu\r
- )\r
-{\r
- BM_MENU_ENTRY *MenuEntry;\r
- while (!IsListEmpty (&FreeMenu->Head)) {\r
- MenuEntry = CR (\r
- FreeMenu->Head.ForwardLink,\r
- BM_MENU_ENTRY,\r
- Link,\r
- BM_MENU_ENTRY_SIGNATURE\r
- );\r
- RemoveEntryList (&MenuEntry->Link);\r
- BOpt_DestroyMenuEntry (MenuEntry);\r
- }\r
- FreeMenu->MenuNumber = 0;\r
-}\r
-\r
-/**\r
-\r
- Build the BootOptionMenu according to BootOrder Variable.\r
- This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @return EFI_NOT_FOUND Fail to find "BootOrder" variable.\r
- @return EFI_SUCESS Success build boot option menu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetBootOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 BootString[10];\r
- UINT8 *LoadOptionFromVar;\r
- UINT8 *LoadOption;\r
- UINTN BootOptionSize;\r
- BOOLEAN BootNextFlag;\r
- UINT16 *BootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 *BootNext;\r
- UINTN BootNextSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT8 *LoadOptionPtr;\r
- UINTN StringSize;\r
- UINTN OptionalDataSize;\r
- UINT8 *LoadOptionEnd;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- UINTN MenuCount;\r
- UINT8 *Ptr;\r
- EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;\r
- UINTN BootOptionCount; \r
- \r
- MenuCount = 0;\r
- BootOrderListSize = 0;\r
- BootNextSize = 0;\r
- BootOrderList = NULL;\r
- BootNext = NULL;\r
- LoadOptionFromVar = NULL;\r
- BOpt_FreeMenu (&BootOptionMenu);\r
- InitializeListHead (&BootOptionMenu.Head);\r
-\r
- //\r
- // Get the BootOrder from the Var\r
- //\r
- GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
- if (BootOrderList == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- //\r
- // Get the BootNext from the Var\r
- //\r
- GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize);\r
- if (BootNext != NULL) {\r
- if (BootNextSize != sizeof (UINT16)) {\r
- FreePool (BootNext);\r
- BootNext = NULL;\r
- }\r
- }\r
- BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);\r
- for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
- //\r
- // Don't display the hidden/inactive boot option\r
- //\r
- if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {\r
- continue;\r
- }\r
- \r
- UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
- //\r
- // Get all loadoptions from the VAR\r
- //\r
- GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize);\r
- if (LoadOptionFromVar == NULL) {\r
- continue;\r
- }\r
-\r
- LoadOption = AllocateZeroPool (BootOptionSize);\r
- if (LoadOption == NULL) {\r
- continue;\r
- }\r
-\r
- CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
- FreePool (LoadOptionFromVar);\r
-\r
- if (BootNext != NULL) {\r
- BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
- } else {\r
- BootNextFlag = FALSE;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- ASSERT (NULL != NewMenuEntry);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- LoadOptionPtr = LoadOption;\r
- LoadOptionEnd = LoadOption + BootOptionSize;\r
-\r
- NewMenuEntry->OptionNumber = BootOrderList[Index];\r
- NewLoadContext->LoadOptionModified = FALSE;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->IsBootNext = BootNextFlag;\r
-\r
- //\r
- // Is a Legacy Device?\r
- //\r
- Ptr = (UINT8 *) LoadOption;\r
-\r
- //\r
- // Attribute = *(UINT32 *)Ptr;\r
- //\r
- Ptr += sizeof (UINT32);\r
-\r
- //\r
- // FilePathSize = *(UINT16 *)Ptr;\r
- //\r
- Ptr += sizeof (UINT16);\r
-\r
- //\r
- // Description = (CHAR16 *)Ptr;\r
- //\r
- Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
- //\r
- // Now Ptr point to Device Path\r
- //\r
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
- if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
- NewLoadContext->IsLegacy = TRUE;\r
- } else {\r
- NewLoadContext->IsLegacy = FALSE;\r
- }\r
- //\r
- // LoadOption is a pointer type of UINT8\r
- // for easy use with following LOAD_OPTION\r
- // embedded in this struct\r
- //\r
- NewLoadContext->LoadOption = LoadOption;\r
- NewLoadContext->LoadOptionSize = BootOptionSize;\r
-\r
- NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
- NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- LoadOptionPtr += sizeof (UINT32);\r
-\r
- NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
- LoadOptionPtr += sizeof (UINT16);\r
- \r
- StringSize = StrSize((UINT16*)LoadOptionPtr);\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));\r
- ASSERT (NewLoadContext->Description != NULL);\r
- StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);\r
- \r
- ASSERT (NewLoadContext->Description != NULL);\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
- LoadOptionPtr += StringSize;\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
- NewLoadContext->FilePathListLength\r
- );\r
-\r
- NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
-\r
- LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
- if (LoadOptionPtr < LoadOptionEnd) {\r
- OptionalDataSize = BootOptionSize -\r
- sizeof (UINT32) -\r
- sizeof (UINT16) -\r
- StringSize -\r
- NewLoadContext->FilePathListLength;\r
-\r
- NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
- ASSERT (NewLoadContext->OptionalData != NULL);\r
- CopyMem (\r
- NewLoadContext->OptionalData,\r
- LoadOptionPtr,\r
- OptionalDataSize\r
- );\r
-\r
- NewLoadContext->OptionalDataSize = OptionalDataSize;\r
- }\r
-\r
- InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
- MenuCount++;\r
- }\r
- EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);\r
-\r
- if (BootNext != NULL) {\r
- FreePool (BootNext);\r
- }\r
- if (BootOrderList != NULL) {\r
- FreePool (BootOrderList);\r
- }\r
- BootOptionMenu.MenuNumber = MenuCount;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Find drivers that will be added as Driver#### variables from handles\r
- in current system environment\r
- All valid handles in the system except those consume SimpleFs, LoadFile\r
- are stored in DriverMenu for future use.\r
-\r
- @retval EFI_SUCCESS The function complets successfully.\r
- @return Other value if failed to build the DriverMenu.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_FindDrivers (\r
- VOID\r
- )\r
-{\r
- UINTN NoDevicePathHandles;\r
- EFI_HANDLE *DevicePathHandle;\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_HANDLE_CONTEXT *NewHandleContext;\r
- EFI_HANDLE CurHandle;\r
- UINTN OptionNumber;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
- EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
-\r
- SimpleFs = NULL;\r
- LoadFile = NULL;\r
-\r
- InitializeListHead (&DriverMenu.Head);\r
-\r
- //\r
- // At first, get all handles that support Device Path\r
- // protocol which is the basic requirement for\r
- // Driver####\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiDevicePathProtocolGuid,\r
- NULL,\r
- &NoDevicePathHandles,\r
- &DevicePathHandle\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- OptionNumber = 0;\r
- for (Index = 0; Index < NoDevicePathHandles; Index++) {\r
- CurHandle = DevicePathHandle[Index];\r
-\r
- Status = gBS->HandleProtocol (\r
- CurHandle,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID **) &SimpleFs\r
- );\r
- if (Status == EFI_SUCCESS) {\r
- continue;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- CurHandle,\r
- &gEfiLoadFileProtocolGuid,\r
- (VOID **) &LoadFile\r
- );\r
- if (Status == EFI_SUCCESS) {\r
- continue;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- FreePool (DevicePathHandle);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewHandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewHandleContext->Handle = CurHandle;\r
- NewHandleContext->DevicePath = DevicePathFromHandle (CurHandle);\r
- NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath);\r
- NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL);\r
- NewMenuEntry->HelpString = NULL;\r
- NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
- NewMenuEntry->OptionNumber = OptionNumber;\r
- OptionNumber++;\r
- InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);\r
-\r
- }\r
-\r
- if (DevicePathHandle != NULL) {\r
- FreePool (DevicePathHandle);\r
- }\r
-\r
- DriverMenu.MenuNumber = OptionNumber;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Get the Option Number that has not been allocated for use.\r
-\r
- @param Type The type of Option.\r
-\r
- @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetOptionNumber (\r
- CHAR16 *Type\r
- )\r
-{\r
- UINT16 *OrderList;\r
- UINTN OrderListSize;\r
- UINTN Index;\r
- CHAR16 StrTemp[20];\r
- UINT16 *OptionBuffer;\r
- UINT16 OptionNumber;\r
- UINTN OptionSize;\r
-\r
- OrderListSize = 0;\r
- OrderList = NULL;\r
- OptionNumber = 0;\r
- Index = 0;\r
-\r
- UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);\r
-\r
- GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize);\r
- for (OptionNumber = 0; ; OptionNumber++) {\r
- if (OrderList != NULL) {\r
- for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {\r
- if (OptionNumber == OrderList[Index]) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- if (Index < OrderListSize / sizeof (UINT16)) {\r
- //\r
- // The OptionNumber occurs in the OrderList, continue to use next one\r
- //\r
- continue;\r
- }\r
- UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);\r
- DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));\r
- GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize);\r
- if (NULL == OptionBuffer) {\r
- //\r
- // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it\r
- //\r
- break;\r
- }\r
- }\r
-\r
- return OptionNumber;\r
-}\r
-\r
-/**\r
-\r
- Get the Option Number for Boot#### that does not used.\r
-\r
- @return The available Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetBootOptionNumber (\r
- VOID\r
- )\r
-{\r
- return BOpt_GetOptionNumber (L"Boot");\r
-}\r
-\r
-/**\r
-\r
- Get the Option Number for Driver#### that does not used.\r
-\r
- @return The unused Option Number.\r
-\r
-**/\r
-UINT16\r
-BOpt_GetDriverOptionNumber (\r
- VOID\r
- )\r
-{\r
- return BOpt_GetOptionNumber (L"Driver");\r
-}\r
-\r
-/**\r
-\r
- Build up all DriverOptionMenu\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCESS The functin completes successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
- @retval EFI_NOT_FOUND Fail to get "DriverOrder" variable.\r
-\r
-**/\r
-EFI_STATUS\r
-BOpt_GetDriverOptions (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 DriverString[12];\r
- UINT8 *LoadOptionFromVar;\r
- UINT8 *LoadOption;\r
- UINTN DriverOptionSize;\r
-\r
- UINT16 *DriverOrderList;\r
- UINTN DriverOrderListSize;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT8 *LoadOptionPtr;\r
- UINTN StringSize;\r
- UINTN OptionalDataSize;\r
- UINT8 *LoadOptionEnd;\r
-\r
- DriverOrderListSize = 0;\r
- DriverOrderList = NULL;\r
- DriverOptionSize = 0;\r
- LoadOptionFromVar = NULL;\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- InitializeListHead (&DriverOptionMenu.Head);\r
- //\r
- // Get the DriverOrder from the Var\r
- //\r
- GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
- if (DriverOrderList == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- DriverOrderList[Index]\r
- );\r
- //\r
- // Get all loadoptions from the VAR\r
- //\r
- GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize);\r
- if (LoadOptionFromVar == NULL) {\r
- continue;\r
- }\r
-\r
- LoadOption = AllocateZeroPool (DriverOptionSize);\r
- if (LoadOption == NULL) {\r
- continue;\r
- }\r
-\r
- CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
- FreePool (LoadOptionFromVar);\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- LoadOptionPtr = LoadOption;\r
- LoadOptionEnd = LoadOption + DriverOptionSize;\r
- NewMenuEntry->OptionNumber = DriverOrderList[Index];\r
- NewLoadContext->LoadOptionModified = FALSE;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->IsLegacy = FALSE;\r
-\r
- //\r
- // LoadOption is a pointer type of UINT8\r
- // for easy use with following LOAD_OPTION\r
- // embedded in this struct\r
- //\r
- NewLoadContext->LoadOption = LoadOption;\r
- NewLoadContext->LoadOptionSize = DriverOptionSize;\r
-\r
- NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
- NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
-\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- LoadOptionPtr += sizeof (UINT32);\r
-\r
- NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
- LoadOptionPtr += sizeof (UINT16);\r
-\r
- StringSize = StrSize ((UINT16 *) LoadOptionPtr);\r
- NewLoadContext->Description = AllocateZeroPool (StringSize);\r
- ASSERT (NewLoadContext->Description != NULL);\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (UINT16 *) LoadOptionPtr,\r
- StringSize\r
- );\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
- LoadOptionPtr += StringSize;\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
- NewLoadContext->FilePathListLength\r
- );\r
-\r
- NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
-\r
- LoadOptionPtr += NewLoadContext->FilePathListLength;\r
-\r
- if (LoadOptionPtr < LoadOptionEnd) {\r
- OptionalDataSize = DriverOptionSize -\r
- sizeof (UINT32) -\r
- sizeof (UINT16) -\r
- StringSize -\r
- NewLoadContext->FilePathListLength;\r
-\r
- NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
- ASSERT (NewLoadContext->OptionalData != NULL);\r
- CopyMem (\r
- NewLoadContext->OptionalData,\r
- LoadOptionPtr,\r
- OptionalDataSize\r
- );\r
-\r
- NewLoadContext->OptionalDataSize = OptionalDataSize;\r
- }\r
-\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-\r
- }\r
-\r
- if (DriverOrderList != NULL) {\r
- FreePool (DriverOrderList);\r
- }\r
- DriverOptionMenu.MenuNumber = Index;\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
- Get option number according to Boot#### and BootOrder variable. \r
- The value is saved as #### + 1.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID \r
-GetBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BMM_FAKE_NV_DATA *BmmConfig;\r
- UINT16 Index;\r
- UINT16 OptionOrderIndex; \r
- UINTN DeviceType;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext; \r
-\r
- ASSERT (CallbackData != NULL);\r
- \r
- DeviceType = (UINTN) -1; \r
- BmmConfig = &CallbackData->BmmFakeNvData; \r
- ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));\r
- \r
- for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&\r
- (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));\r
- Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewLoadContext->IsLegacy) {\r
- if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {\r
- DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;\r
- } else {\r
- //\r
- // Only show one legacy boot option for the same device type\r
- // assuming the boot options are grouped by the device type\r
- //\r
- continue;\r
- }\r
- }\r
- BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
- } \r
-}\r
-\r
-/**\r
- Get driver option order from globalc DriverOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- \r
-**/\r
-VOID \r
-GetDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BMM_FAKE_NV_DATA *BmmConfig;\r
- UINT16 Index;\r
- UINT16 OptionOrderIndex; \r
- UINTN DeviceType;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext; \r
-\r
-\r
- ASSERT (CallbackData != NULL);\r
- \r
- DeviceType = (UINTN) -1; \r
- BmmConfig = &CallbackData->BmmFakeNvData; \r
- ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));\r
- \r
- for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&\r
- (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));\r
- Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewLoadContext->IsLegacy) {\r
- if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {\r
- DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;\r
- } else {\r
- //\r
- // Only show one legacy boot option for the same device type\r
- // assuming the boot options are grouped by the device type\r
- //\r
- continue;\r
- }\r
- }\r
- BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
- } \r
-} \r
-\r
-/**\r
- Boot the file specified by the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
-**/\r
-BOOLEAN \r
-BootFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- )\r
-{\r
- EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
- CHAR16 *FileName;\r
-\r
- FileName = ExtractFileNameFromDevicePath(FilePath);\r
- EfiBootManagerInitializeLoadOption (\r
- &BootOption,\r
- 0,\r
- LoadOptionTypeBoot,\r
- LOAD_OPTION_ACTIVE,\r
- FileName,\r
- FilePath,\r
- NULL,\r
- 0\r
- );\r
- //\r
- // Since current no boot from removable media directly is allowed */\r
- //\r
- gST->ConOut->ClearScreen (gST->ConOut);\r
-\r
- BmmBdsSetConsoleMode (FALSE);\r
- EfiBootManagerBoot (&BootOption);\r
- BmmBdsSetConsoleMode (TRUE);\r
-\r
- FreePool(FileName);\r
-\r
- EfiBootManagerFreeLoadOption (&BootOption);\r
-\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Display the form base on the selected file.\r
-\r
- @param FilePath Point to the file path.\r
- @param FormId The form need to display.\r
-\r
-**/\r
-BOOLEAN\r
-ReSendForm(\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath,\r
- IN EFI_FORM_ID FormId\r
- )\r
-{\r
- gBootMaintenancePrivate.LoadContext->FilePathList = FilePath;\r
-\r
- UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath);\r
-\r
- gBootMaintenancePrivate.FormBrowser2->SendForm (\r
- gBootMaintenancePrivate.FormBrowser2,\r
- &gBootMaintenancePrivate.BmmHiiHandle,\r
- 1,\r
- &mBootMaintGuid,\r
- FormId,\r
- NULL,\r
- NULL\r
- );\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Create boot option base on the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
-**/\r
-BOOLEAN \r
-CreateBootOptionFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- )\r
-{\r
- return ReSendForm(FilePath, FORM_BOOT_ADD_ID);\r
-}\r
-\r
-/**\r
- Create driver option base on the input file path info.\r
-\r
- @param FilePath Point to the file path.\r
-\r
- @retval TRUE Exit caller function.\r
- @retval FALSE Not exit caller function.\r
-\r
-**/\r
-BOOLEAN \r
-CreateDriverOptionFromFile (\r
- IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
- )\r
-{\r
- return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID);\r
-}\r
-\r
+++ /dev/null
-/** @file\r
-handles console redirection from boot manager\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
- Function compares a device path data structure to that of all the nodes of a\r
- second device path instance.\r
-\r
- @param Multi A pointer to a multi-instance device path data\r
- structure.\r
- @param Single A pointer to a single-instance device path data\r
- structure.\r
-\r
- @retval TRUE If the Single device path is contained within Multi device path.\r
- @retval FALSE The Single device path is not match within Multi device path.\r
-\r
-**/\r
-BOOLEAN\r
-MatchDevicePaths (\r
- IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
- IN EFI_DEVICE_PATH_PROTOCOL *Single\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- UINTN Size;\r
-\r
- if (Multi == NULL || Single == NULL) {\r
- return FALSE;\r
- }\r
-\r
- DevicePath = Multi;\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
-\r
- //\r
- // Search for the match of 'Single' in 'Multi'\r
- //\r
- while (DevicePathInst != NULL) {\r
- //\r
- // If the single device path is found in multiple device paths,\r
- // return success\r
- //\r
- if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
- FreePool (DevicePathInst);\r
- return TRUE;\r
- }\r
-\r
- FreePool (DevicePathInst);\r
- DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Check whether the device path node is ISA Serial Node.\r
-\r
- @param Acpi Device path node to be checked\r
-\r
- @retval TRUE It's ISA Serial Node.\r
- @retval FALSE It's NOT ISA Serial Node.\r
-\r
-**/\r
-BOOLEAN\r
-IsIsaSerialNode (\r
- IN ACPI_HID_DEVICE_PATH *Acpi\r
- )\r
-{\r
- return (BOOLEAN) (\r
- (DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&\r
- (DevicePathSubType (Acpi) == ACPI_DP) &&\r
- (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))\r
- );\r
-}\r
-\r
-/**\r
- Update Com Ports attributes from DevicePath\r
-\r
- @param DevicePath DevicePath that contains Com ports\r
-\r
- @retval EFI_SUCCESS The update is successful.\r
-\r
-**/\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- );\r
-\r
-/**\r
- Update the multi-instance device path of Terminal Device based on\r
- the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
- device path in the Terminal Device in TerminalMenu is also updated.\r
-\r
- @param DevicePath The multi-instance device path.\r
- @param ChangeTerminal TRUE, then device path in the Terminal Device \r
- in TerminalMenu is also updated; FALSE, no update.\r
-\r
- @return EFI_SUCCESS The function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-ChangeTerminalDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- IN BOOLEAN ChangeTerminal\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *Node1;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UART_DEVICE_PATH *Uart1;\r
- UINTN Com;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- Com = 0;\r
- while (!IsDevicePathEnd (Node)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (IsIsaSerialNode (Acpi)) {\r
- CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- CopyMem (\r
- &Uart->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- //\r
- // Change the device path in the ComPort\r
- //\r
- if (ChangeTerminal) {\r
- Node1 = NewTerminalContext->DevicePath;\r
- Node1 = NextDevicePathNode (Node1);\r
- while (!IsDevicePathEnd (Node1)) {\r
- if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
- Uart1 = (UART_DEVICE_PATH *) Node1;\r
- CopyMem (\r
- &Uart1->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- break;\r
- }\r
- //\r
- // end if\r
- //\r
- Node1 = NextDevicePathNode (Node1);\r
- }\r
- //\r
- // end while\r
- //\r
- break;\r
- }\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
- Update the device path that describing a terminal device\r
- based on the new BaudRate, Data Bits, parity and Stop Bits\r
- set.\r
-\r
- @param DevicePath terminal device's path\r
-\r
-**/\r
-VOID\r
-ChangeVariableDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UINTN Com;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- Com = 0;\r
- while (!IsDevicePathEnd (Node)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (IsIsaSerialNode (Acpi)) {\r
- CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
- }\r
-\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &TerminalMenu,\r
- Com\r
- );\r
- ASSERT (NewMenuEntry != NULL);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- CopyMem (\r
- &Uart->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &Uart->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
-}\r
-\r
-/**\r
- Retrieve ACPI UID of UART from device path\r
-\r
- @param Handle The handle for the UART device.\r
- @param AcpiUid The ACPI UID on output.\r
-\r
- @retval TRUE Find valid UID from device path\r
- @retval FALSE Can't find\r
-\r
-**/\r
-BOOLEAN\r
-RetrieveUartUid (\r
- IN EFI_HANDLE Handle,\r
- IN OUT UINT32 *AcpiUid\r
- )\r
-{\r
- EFI_STATUS Status;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &DevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
-\r
- Acpi = NULL;\r
- for (; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {\r
- if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DevicePath) == MSG_UART_DP)) {\r
- break;\r
- }\r
- //\r
- // Acpi points to the node before the Uart node\r
- //\r
- Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
- }\r
-\r
- if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
- if (AcpiUid != NULL) {\r
- CopyMem (AcpiUid, &Acpi->UID, sizeof (UINT32));\r
- }\r
- return TRUE;\r
- } else {\r
- return FALSE;\r
- }\r
-}\r
-\r
-/**\r
- Sort Uart handles array with Acpi->UID from low to high.\r
-\r
- @param Handles EFI_SERIAL_IO_PROTOCOL handle buffer\r
- @param NoHandles EFI_SERIAL_IO_PROTOCOL handle count\r
-**/\r
-VOID\r
-SortedUartHandle (\r
- IN EFI_HANDLE *Handles,\r
- IN UINTN NoHandles\r
- )\r
-{\r
- UINTN Index1;\r
- UINTN Index2;\r
- UINTN Position;\r
- UINT32 AcpiUid1;\r
- UINT32 AcpiUid2;\r
- UINT32 TempAcpiUid;\r
- EFI_HANDLE TempHandle;\r
-\r
- for (Index1 = 0; Index1 < NoHandles-1; Index1++) {\r
- if (!RetrieveUartUid (Handles[Index1], &AcpiUid1)) {\r
- continue;\r
- }\r
- TempHandle = Handles[Index1];\r
- Position = Index1;\r
- TempAcpiUid = AcpiUid1;\r
-\r
- for (Index2 = Index1+1; Index2 < NoHandles; Index2++) {\r
- if (!RetrieveUartUid (Handles[Index2], &AcpiUid2)) {\r
- continue;\r
- }\r
- if (AcpiUid2 < TempAcpiUid) {\r
- TempAcpiUid = AcpiUid2;\r
- TempHandle = Handles[Index2];\r
- Position = Index2;\r
- }\r
- }\r
- Handles[Position] = Handles[Index1];\r
- Handles[Index1] = TempHandle;\r
- }\r
-}\r
-\r
-/**\r
- Test whether DevicePath is a valid Terminal\r
-\r
-\r
- @param DevicePath DevicePath to be checked\r
- @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
- @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
-\r
- @retval TRUE If DevicePath point to a Terminal.\r
- @retval FALSE If DevicePath does not point to a Terminal.\r
-\r
-**/\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- OUT TYPE_OF_TERMINAL *Termi,\r
- OUT UINTN *Com\r
- );\r
-\r
-/**\r
- Build a list containing all serial devices.\r
-\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_UNSUPPORTED No serial ports present.\r
-\r
-**/\r
-EFI_STATUS\r
-LocateSerialIo (\r
- VOID\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Index2;\r
- UINTN NoHandles;\r
- EFI_HANDLE *Handles;\r
- EFI_STATUS Status;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- VENDOR_DEVICE_PATH Vendor;\r
-\r
- //\r
- // Get all handles that have SerialIo protocol installed\r
- //\r
- InitializeListHead (&TerminalMenu.Head);\r
- TerminalMenu.MenuNumber = 0;\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSerialIoProtocolGuid,\r
- NULL,\r
- &NoHandles,\r
- &Handles\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // No serial ports present\r
- //\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- //\r
- // Sort Uart handles array with Acpi->UID from low to high\r
- // then Terminal menu can be built from low Acpi->UID to high Acpi->UID\r
- //\r
- SortedUartHandle (Handles, NoHandles);\r
-\r
- for (Index = 0; Index < NoHandles; Index++) {\r
- //\r
- // Check to see whether the handle has DevicePath Protocol installed\r
- //\r
- gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &DevicePath\r
- );\r
-\r
- Acpi = NULL;\r
- for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- break;\r
- }\r
- //\r
- // Acpi points to the node before Uart node\r
- //\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- }\r
-\r
- if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
- if (NewMenuEntry == NULL) {\r
- FreePool (Handles);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
- NewTerminalContext->DevicePath = DuplicateDevicePath (DevicePath);\r
- //\r
- // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
- // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
- // datahub which is not completed, so a searching for end of device path will enter a\r
- // dead-loop.\r
- //\r
- NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
- if (NULL == NewMenuEntry->DisplayString) {\r
- NewMenuEntry->DisplayString = UiDevicePathToStr (DevicePath);\r
- }\r
-\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
- NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-\r
- gBS->HandleProtocol (\r
- Handles[Index],\r
- &gEfiSerialIoProtocolGuid,\r
- (VOID **) &SerialIo\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->BaudRate,\r
- &SerialIo->Mode->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->DataBits,\r
- &SerialIo->Mode->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->Parity,\r
- &SerialIo->Mode->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->StopBits,\r
- &SerialIo->Mode->StopBits,\r
- sizeof (UINT8)\r
- );\r
- InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
- TerminalMenu.MenuNumber++;\r
- }\r
- }\r
- if (Handles != NULL) {\r
- FreePool (Handles);\r
- }\r
-\r
- //\r
- // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
- //\r
- GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
- if (OutDevicePath != NULL) {\r
- UpdateComAttributeFromVariable (OutDevicePath);\r
- }\r
-\r
- if (InpDevicePath != NULL) {\r
- UpdateComAttributeFromVariable (InpDevicePath);\r
- }\r
-\r
- if (ErrDevicePath != NULL) {\r
- UpdateComAttributeFromVariable (ErrDevicePath);\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- NewTerminalContext->TerminalType = 0;\r
- NewTerminalContext->IsConIn = FALSE;\r
- NewTerminalContext->IsConOut = FALSE;\r
- NewTerminalContext->IsStdErr = FALSE;\r
-\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
-\r
- for (Index2 = 0; Index2 < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])); Index2++) {\r
- CopyMem (&Vendor.Guid, &TerminalTypeGuid[Index2], sizeof (EFI_GUID));\r
- SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
- NewDevicePath = AppendDevicePathNode (\r
- NewTerminalContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
- );\r
- if (NewMenuEntry->HelpString != NULL) {\r
- FreePool (NewMenuEntry->HelpString);\r
- }\r
- //\r
- // NewMenuEntry->HelpString = UiDevicePathToStr (NewDevicePath);\r
- // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
- //\r
- NewMenuEntry->HelpString = NULL;\r
-\r
- NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
- NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
-\r
- if (MatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsConOut = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
-\r
- if (MatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsConIn = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
-\r
- if (MatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
- NewTerminalContext->IsStdErr = TRUE;\r
- NewTerminalContext->TerminalType = (UINT8) Index2;\r
- }\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Update Com Ports attributes from DevicePath\r
-\r
- @param DevicePath DevicePath that contains Com ports\r
-\r
- @retval EFI_SUCCESS The update is successful.\r
- @retval EFI_NOT_FOUND Can not find specific menu entry\r
-**/\r
-EFI_STATUS\r
-UpdateComAttributeFromVariable (\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *SerialNode;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
- UART_DEVICE_PATH *Uart;\r
- UART_DEVICE_PATH *Uart1;\r
- UINTN TerminalNumber;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- UINTN Index;\r
-\r
- Node = DevicePath;\r
- Node = NextDevicePathNode (Node);\r
- TerminalNumber = 0;\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- while (!IsDevicePathEnd (Node)) {\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- if (IsIsaSerialNode (Acpi)) {\r
- CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
- }\r
-\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- CopyMem (\r
- &NewTerminalContext->BaudRate,\r
- &Uart->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->DataBits,\r
- &Uart->DataBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->Parity,\r
- &Uart->Parity,\r
- sizeof (UINT8)\r
- );\r
-\r
- CopyMem (\r
- &NewTerminalContext->StopBits,\r
- &Uart->StopBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- SerialNode = NewTerminalContext->DevicePath;\r
- SerialNode = NextDevicePathNode (SerialNode);\r
- while (!IsDevicePathEnd (SerialNode)) {\r
- if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
- //\r
- // Update following device paths according to\r
- // previous acquired uart attributes\r
- //\r
- Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
- CopyMem (\r
- &Uart1->BaudRate,\r
- &NewTerminalContext->BaudRate,\r
- sizeof (UINT64)\r
- );\r
-\r
- CopyMem (\r
- &Uart1->DataBits,\r
- &NewTerminalContext->DataBits,\r
- sizeof (UINT8)\r
- );\r
- CopyMem (\r
- &Uart1->Parity,\r
- &NewTerminalContext->Parity,\r
- sizeof (UINT8)\r
- );\r
- CopyMem (\r
- &Uart1->StopBits,\r
- &NewTerminalContext->StopBits,\r
- sizeof (UINT8)\r
- );\r
-\r
- break;\r
- }\r
-\r
- SerialNode = NextDevicePathNode (SerialNode);\r
- }\r
- //\r
- // end while\r
- //\r
- }\r
-\r
- Node = NextDevicePathNode (Node);\r
- }\r
- //\r
- // end while\r
- //\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Build up Console Menu based on types passed in. The type can\r
- be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
- and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
-\r
- @param ConsoleMenuType Can be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
- and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
-\r
- @retval EFI_UNSUPPORTED The type passed in is not in the 3 types defined.\r
- @retval EFI_NOT_FOUND If the EFI Variable defined in UEFI spec with name "ConOutDev", \r
- "ConInDev" or "ConErrDev" doesn't exists.\r
- @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operations.\r
- @retval EFI_SUCCESS Function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetConsoleMenu (\r
- IN UINTN ConsoleMenuType\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *AllDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *MultiDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
- UINTN Size;\r
- UINTN AllCount;\r
- UINTN Index;\r
- UINTN Index2;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- TYPE_OF_TERMINAL Terminal;\r
- UINTN Com;\r
- BM_MENU_OPTION *ConsoleMenu;\r
-\r
- DevicePath = NULL;\r
- AllDevicePath = NULL;\r
- AllCount = 0;\r
- switch (ConsoleMenuType) {\r
- case BM_CONSOLE_IN_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleInpMenu;\r
- GetEfiGlobalVariable2 (L"ConIn", (VOID**)&DevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ConInDev", (VOID**)&AllDevicePath, NULL);\r
- break;\r
-\r
- case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleOutMenu;\r
- GetEfiGlobalVariable2 (L"ConOut", (VOID**)&DevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ConOutDev", (VOID**)&AllDevicePath, NULL);\r
- break;\r
-\r
- case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
- ConsoleMenu = &ConsoleErrMenu;\r
- GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&DevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ErrOutDev", (VOID**)&AllDevicePath, NULL);\r
- break;\r
-\r
- default:\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (NULL == AllDevicePath) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- InitializeListHead (&ConsoleMenu->Head);\r
-\r
- AllCount = EfiDevicePathInstanceCount (AllDevicePath);\r
- ConsoleMenu->MenuNumber = 0;\r
- //\r
- // Following is menu building up for Console Devices selected.\r
- //\r
- MultiDevicePath = AllDevicePath;\r
- Index2 = 0;\r
- for (Index = 0; Index < AllCount; Index++) {\r
- DevicePathInst = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewMenuEntry->OptionNumber = Index2;\r
-\r
- NewConsoleContext->DevicePath = DuplicateDevicePath (DevicePathInst);\r
- ASSERT (NewConsoleContext->DevicePath != NULL);\r
- NewMenuEntry->DisplayString = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
- if (NULL == NewMenuEntry->DisplayString) {\r
- NewMenuEntry->DisplayString = UiDevicePathToStr (NewConsoleContext->DevicePath);\r
- }\r
-\r
- NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
-\r
- if (NULL == NewMenuEntry->HelpString) {\r
- NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
- } else {\r
- NewMenuEntry->HelpStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
- }\r
-\r
- NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
- NewConsoleContext->DevicePath,\r
- &Terminal,\r
- &Com\r
- );\r
-\r
- NewConsoleContext->IsActive = MatchDevicePaths (\r
- DevicePath,\r
- NewConsoleContext->DevicePath\r
- );\r
-\r
- if (NewConsoleContext->IsTerminal) {\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- } else {\r
- Index2++;\r
- ConsoleMenu->MenuNumber++;\r
- InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
- @retval EFI_SUCCESS The function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-GetAllConsoles (\r
- VOID\r
- )\r
-{\r
- GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
- GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
- GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
-\r
- @retval EFI_SUCCESS The function always complete successfully.\r
-**/\r
-EFI_STATUS\r
-FreeAllConsoles (\r
- VOID\r
- )\r
-{\r
- BOpt_FreeMenu (&ConsoleOutMenu);\r
- BOpt_FreeMenu (&ConsoleInpMenu);\r
- BOpt_FreeMenu (&ConsoleErrMenu);\r
- BOpt_FreeMenu (&TerminalMenu);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Test whether DevicePath is a valid Terminal\r
-\r
-\r
- @param DevicePath DevicePath to be checked\r
- @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
- @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
-\r
- @retval TRUE If DevicePath point to a Terminal.\r
- @retval FALSE If DevicePath does not point to a Terminal.\r
-\r
-**/\r
-BOOLEAN\r
-IsTerminalDevicePath (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
- OUT TYPE_OF_TERMINAL *Termi,\r
- OUT UINTN *Com\r
- )\r
-{\r
- BOOLEAN IsTerminal;\r
- EFI_DEVICE_PATH_PROTOCOL *Node;\r
- VENDOR_DEVICE_PATH *Vendor;\r
- UART_DEVICE_PATH *Uart;\r
- ACPI_HID_DEVICE_PATH *Acpi;\r
-\r
- IsTerminal = FALSE;\r
-\r
- Uart = NULL;\r
- Vendor = NULL;\r
- Acpi = NULL;\r
- for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
- //\r
- // Vendor points to the node before the End node\r
- //\r
- Vendor = (VENDOR_DEVICE_PATH *) Node;\r
-\r
- if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
- Uart = (UART_DEVICE_PATH *) Node;\r
- }\r
-\r
- if (Uart == NULL) {\r
- //\r
- // Acpi points to the node before the UART node\r
- //\r
- Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
- }\r
- }\r
-\r
- if (Vendor == NULL ||\r
- DevicePathType (Vendor) != MESSAGING_DEVICE_PATH ||\r
- DevicePathSubType (Vendor) != MSG_VENDOR_DP ||\r
- Uart == NULL) {\r
- return FALSE;\r
- }\r
-\r
- //\r
- // There are four kinds of Terminal types\r
- // check to see whether this devicepath\r
- // is one of that type\r
- //\r
- if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[0])) {\r
- *Termi = TerminalTypePcAnsi;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[1])) {\r
- *Termi = TerminalTypeVt100;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[2])) {\r
- *Termi = TerminalTypeVt100Plus;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[3])) {\r
- *Termi = TerminalTypeVtUtf8;\r
- IsTerminal = TRUE;\r
- } else {\r
- if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[4])) {\r
- *Termi = TerminalTypeTtyTerm;\r
- IsTerminal = TRUE;\r
- } else {\r
- IsTerminal = FALSE;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (!IsTerminal) {\r
- return FALSE;\r
- }\r
-\r
- if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
- CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
- } else {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Get mode number according to column and row\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-GetConsoleOutMode (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Col;\r
- UINTN Row;\r
- UINTN CurrentCol;\r
- UINTN CurrentRow;\r
- UINTN Mode;\r
- UINTN MaxMode;\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
-\r
- ConOut = gST->ConOut;\r
- MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
-\r
- CurrentCol = PcdGet32 (PcdSetupConOutColumn);\r
- CurrentRow = PcdGet32 (PcdSetupConOutRow);\r
- for (Mode = 0; Mode < MaxMode; Mode++) {\r
- Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
- if (!EFI_ERROR(Status)) {\r
- if (CurrentCol == Col && CurrentRow == Row) {\r
- CallbackData->BmmFakeNvData.ConsoleOutMode = (UINT16) Mode;\r
- break;\r
- }\r
- }\r
- }\r
-}\r
-\r
-/**\r
-\r
- Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/ \r
-VOID \r
-GetConsoleInCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry; \r
- UINT8 *ConInCheck;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
-\r
- ASSERT (CallbackData != NULL);\r
-\r
- ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
- for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
- (Index < MAX_MENU_NUMBER)) ; Index++) { \r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
- ConInCheck[Index] = NewConsoleContext->IsActive;\r
- }\r
-}\r
-\r
-/**\r
-\r
- Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/ \r
-VOID \r
-GetConsoleOutCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry; \r
- UINT8 *ConOutCheck;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- \r
- ASSERT (CallbackData != NULL);\r
- ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
- for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
- (Index < MAX_MENU_NUMBER)) ; Index++) { \r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
- ConOutCheck[Index] = NewConsoleContext->IsActive;\r
- }\r
-}\r
-\r
-/**\r
-\r
- Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
- in BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/ \r
-VOID \r
-GetConsoleErrCheck (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry; \r
- UINT8 *ConErrCheck;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
-\r
- ASSERT (CallbackData != NULL);\r
- ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
- for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
- (Index < MAX_MENU_NUMBER)) ; Index++) { \r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
- ConErrCheck[Index] = NewConsoleContext->IsActive;\r
- }\r
-}\r
-\r
-/**\r
-\r
- Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
- to BMM_FAKE_NV_DATA structure.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID \r
-GetTerminalAttribute (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext; \r
- UINT16 TerminalIndex; \r
- UINT8 AttributeIndex;\r
-\r
- ASSERT (CallbackData != NULL);\r
-\r
- CurrentFakeNVMap = &CallbackData->BmmFakeNvData; \r
- for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
- (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) { \r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
- if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
- NewTerminalContext->BaudRateIndex = AttributeIndex;\r
- break;\r
- }\r
- }\r
- for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
- if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
- NewTerminalContext->DataBitsIndex = AttributeIndex;\r
- break;\r
- }\r
- } \r
-\r
- for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
- if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
- NewTerminalContext->ParityIndex = AttributeIndex;\r
- break;\r
- }\r
- }\r
-\r
- for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
- if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
- NewTerminalContext->StopBitsIndex = AttributeIndex;\r
- break;\r
- }\r
- }\r
- CurrentFakeNVMap->COMBaudRate[TerminalIndex] = NewTerminalContext->BaudRateIndex;\r
- CurrentFakeNVMap->COMDataRate[TerminalIndex] = NewTerminalContext->DataBitsIndex;\r
- CurrentFakeNVMap->COMStopBits[TerminalIndex] = NewTerminalContext->StopBitsIndex;\r
- CurrentFakeNVMap->COMParity[TerminalIndex] = NewTerminalContext->ParityIndex; \r
- CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
- CurrentFakeNVMap->COMFlowControl[TerminalIndex] = NewTerminalContext->FlowControl;\r
- }\r
-}\r
-\r
+++ /dev/null
-/** @file\r
-Define some data used for Boot Maint\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-VOID *mStartOpCodeHandle = NULL;\r
-VOID *mEndOpCodeHandle = NULL;\r
-EFI_IFR_GUID_LABEL *mStartLabel = NULL;\r
-EFI_IFR_GUID_LABEL *mEndLabel = NULL;\r
-\r
-///\r
-/// Terminal type string token storage\r
-///\r
-UINT16 TerminalType[] = {\r
- STRING_TOKEN(STR_COM_TYPE_0),\r
- STRING_TOKEN(STR_COM_TYPE_1),\r
- STRING_TOKEN(STR_COM_TYPE_2),\r
- STRING_TOKEN(STR_COM_TYPE_3),\r
- STRING_TOKEN(STR_COM_TYPE_4),\r
-};\r
-\r
-///\r
-/// Flow Control type string token storage\r
-///\r
-UINT16 mFlowControlType[2] = {\r
- STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
- STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
-};\r
-\r
-UINT32 mFlowControlValue[2] = {\r
- 0,\r
- UART_FLOW_CONTROL_HARDWARE\r
-};\r
-\r
-///\r
-/// Console Input Device Selection Menu\r
-///\r
-BM_MENU_OPTION ConsoleInpMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Console Output Device Selection Menu\r
-///\r
-BM_MENU_OPTION ConsoleOutMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Error Output Device Selection Menu\r
-///\r
-BM_MENU_OPTION ConsoleErrMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Boot Option from variable Menu\r
-///\r
-BM_MENU_OPTION BootOptionMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Driver Option from variable menu\r
-///\r
-BM_MENU_OPTION DriverOptionMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Handles in current system selection menu\r
-///\r
-BM_MENU_OPTION DriverMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-BM_MENU_OPTION TerminalMenu = {\r
- BM_MENU_OPTION_SIGNATURE,\r
- {NULL},\r
- 0\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for BaudRate\r
-///\r
-COM_ATTR BaudRateList[19] = {\r
- {\r
- 115200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_0)\r
- },\r
- {\r
- 57600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_1)\r
- },\r
- {\r
- 38400,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_2)\r
- },\r
- {\r
- 19200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_3)\r
- },\r
- {\r
- 9600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_4)\r
- },\r
- {\r
- 7200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_5)\r
- },\r
- {\r
- 4800,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_6)\r
- },\r
- {\r
- 3600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_7)\r
- },\r
- {\r
- 2400,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_8)\r
- },\r
- {\r
- 2000,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_9)\r
- },\r
- {\r
- 1800,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_10)\r
- },\r
- {\r
- 1200,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_11)\r
- },\r
- {\r
- 600,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_12)\r
- },\r
- {\r
- 300,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_13)\r
- },\r
- {\r
- 150,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_14)\r
- },\r
- {\r
- 134,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_15)\r
- },\r
- {\r
- 110,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_16)\r
- },\r
- {\r
- 75,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_17)\r
- },\r
- {\r
- 50,\r
- STRING_TOKEN(STR_COM_BAUD_RATE_18)\r
- }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for DataBits\r
-///\r
-COM_ATTR DataBitsList[4] = {\r
- {\r
- 5,\r
- STRING_TOKEN(STR_COM_DATA_BITS_0)\r
- },\r
- {\r
- 6,\r
- STRING_TOKEN(STR_COM_DATA_BITS_1)\r
- },\r
- {\r
- 7,\r
- STRING_TOKEN(STR_COM_DATA_BITS_2)\r
- },\r
- {\r
- 8,\r
- STRING_TOKEN(STR_COM_DATA_BITS_3)\r
- }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for Parity\r
-///\r
-COM_ATTR ParityList[5] = {\r
- {\r
- NoParity,\r
- STRING_TOKEN(STR_COM_PAR_0)\r
- },\r
- {\r
- EvenParity,\r
- STRING_TOKEN(STR_COM_PAR_1)\r
- },\r
- {\r
- OddParity,\r
- STRING_TOKEN(STR_COM_PAR_2)\r
- },\r
- {\r
- MarkParity,\r
- STRING_TOKEN(STR_COM_PAR_3)\r
- },\r
- {\r
- SpaceParity,\r
- STRING_TOKEN(STR_COM_PAR_4)\r
- }\r
-};\r
-\r
-///\r
-/// Value and string token correspondency for Baudreate\r
-///\r
-COM_ATTR StopBitsList[3] = {\r
- {\r
- OneStopBit,\r
- STRING_TOKEN(STR_COM_STOP_BITS_0)\r
- },\r
- {\r
- OneFiveStopBits,\r
- STRING_TOKEN(STR_COM_STOP_BITS_1)\r
- },\r
- {\r
- TwoStopBits,\r
- STRING_TOKEN(STR_COM_STOP_BITS_2)\r
- }\r
-};\r
-\r
-///\r
-/// Guid for messaging path, used in Serial port setting.\r
-///\r
-EFI_GUID TerminalTypeGuid[] = {\r
- DEVICE_PATH_MESSAGING_PC_ANSI,\r
- DEVICE_PATH_MESSAGING_VT_100,\r
- DEVICE_PATH_MESSAGING_VT_100_PLUS,\r
- DEVICE_PATH_MESSAGING_VT_UTF8,\r
- EFI_TTY_TERM_GUID\r
-};\r
+++ /dev/null
-/** @file\r
-Formset guids, form id and VarStore data structure for Boot Maintenance Manager.\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-#ifndef _FORM_GUID_H_\r
-#define _FORM_GUID_H_\r
-\r
-#define BOOT_MAINT_FORMSET_GUID \\r
- { \\r
- 0x642237c7, 0x35d4, 0x472d, {0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22} \\r
- }\r
-\r
-#define FORM_MAIN_ID 0x1001\r
-#define FORM_BOOT_ADD_ID 0x1002\r
-#define FORM_BOOT_DEL_ID 0x1003\r
-#define FORM_BOOT_CHG_ID 0x1004\r
-#define FORM_DRV_ADD_ID 0x1005\r
-#define FORM_DRV_DEL_ID 0x1006\r
-#define FORM_DRV_CHG_ID 0x1007\r
-#define FORM_CON_MAIN_ID 0x1008\r
-#define FORM_CON_IN_ID 0x1009\r
-#define FORM_CON_OUT_ID 0x100A\r
-#define FORM_CON_ERR_ID 0x100B\r
-#define FORM_FILE_SEEK_ID 0x100C\r
-#define FORM_FILE_NEW_SEEK_ID 0x100D\r
-#define FORM_DRV_ADD_FILE_ID 0x100E\r
-#define FORM_DRV_ADD_HANDLE_ID 0x100F\r
-#define FORM_DRV_ADD_HANDLE_DESC_ID 0x1010\r
-#define FORM_BOOT_NEXT_ID 0x1011\r
-#define FORM_TIME_OUT_ID 0x1012\r
-#define FORM_BOOT_SETUP_ID 0x1014\r
-#define FORM_DRIVER_SETUP_ID 0x1015\r
-#define FORM_BOOT_LEGACY_DEVICE_ID 0x1016\r
-#define FORM_CON_COM_ID 0x1017\r
-#define FORM_CON_COM_SETUP_ID 0x1018\r
-#define FORM_BOOT_ADD_DESCRIPTION_ID 0x101F\r
-#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID 0x1020\r
-#define FORM_CON_MODE_ID 0x1021\r
-#define FORM_MEMORY_CHECK_ID 0x1022\r
-#define FORM_UEFI_OPTIMIZED_BOOT_ID 0x1023\r
-#define FORM_BOOT_FROM_FILE_ID 0x1024\r
-\r
-\r
-#define MAXIMUM_FORM_ID 0x10FF\r
-\r
-#define KEY_VALUE_COM_SET_BAUD_RATE 0x1101\r
-#define KEY_VALUE_COM_SET_DATA_BITS 0x1102\r
-#define KEY_VALUE_COM_SET_STOP_BITS 0x1103\r
-#define KEY_VALUE_COM_SET_PARITY 0x1104\r
-#define KEY_VALUE_COM_SET_TERMI_TYPE 0x1105\r
-#define KEY_VALUE_MAIN_BOOT_NEXT 0x1106\r
-#define KEY_VALUE_BOOT_ADD_DESC_DATA 0x1107\r
-#define KEY_VALUE_BOOT_ADD_OPT_DATA 0x1108\r
-#define KEY_VALUE_DRIVER_ADD_DESC_DATA 0x1109\r
-#define KEY_VALUE_DRIVER_ADD_OPT_DATA 0x110A\r
-#define KEY_VALUE_SAVE_AND_EXIT 0x110B\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C\r
-#define KEY_VALUE_BOOT_FROM_FILE 0x110D\r
-#define FORM_RESET 0x110E\r
-#define KEY_VALUE_BOOT_DESCRIPTION 0x110F\r
-#define KEY_VALUE_BOOT_OPTION 0x1110\r
-#define KEY_VALUE_DRIVER_DESCRIPTION 0x1111\r
-#define KEY_VALUE_DRIVER_OPTION 0x1112\r
-#define KEY_VALUE_SAVE_AND_EXIT_BOOT 0x1113\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT_BOOT 0x1114\r
-#define KEY_VALUE_SAVE_AND_EXIT_DRIVER 0x1115\r
-#define KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER 0x1116\r
-\r
-#define MAXIMUM_NORMAL_KEY_VALUE 0x11FF\r
-\r
-//\r
-// Varstore ID defined for Buffer Storage\r
-//\r
-#define VARSTORE_ID_BOOT_MAINT 0x1000\r
-\r
-//\r
-// End Label\r
-//\r
-#define LABEL_BMM_PLATFORM_INFORMATION 0xfffe\r
-#define LABEL_END 0xffff\r
-#define MAX_MENU_NUMBER 100\r
-\r
-///\r
-/// This is the structure that will be used to store the\r
-/// question's current value. Use it at initialize time to\r
-/// set default value for each question. When using at run\r
-/// time, this map is returned by the callback function,\r
-/// so dynamically changing the question's value will be\r
-/// possible through this mechanism\r
-///\r
-typedef struct {\r
- //\r
- // Three questions displayed at the main page\r
- // for Timeout, BootNext, Variables respectively\r
- //\r
- UINT16 BootTimeOut;\r
- UINT32 BootNext;\r
-\r
- //\r
- // This is the COM1 Attributes value storage\r
- //\r
- UINT8 COM1BaudRate;\r
- UINT8 COM1DataRate;\r
- UINT8 COM1StopBits;\r
- UINT8 COM1Parity;\r
- UINT8 COM1TerminalType;\r
-\r
- //\r
- // This is the COM2 Attributes value storage\r
- //\r
- UINT8 COM2BaudRate;\r
- UINT8 COM2DataRate;\r
- UINT8 COM2StopBits;\r
- UINT8 COM2Parity;\r
- UINT8 COM2TerminalType;\r
-\r
- //\r
- // Driver Option Add Handle page storage\r
- //\r
- UINT16 DriverAddHandleDesc[MAX_MENU_NUMBER];\r
- UINT16 DriverAddHandleOptionalData[MAX_MENU_NUMBER];\r
- UINT8 DriverAddActive;\r
- UINT8 DriverAddForceReconnect;\r
-\r
- //\r
- // Console Input/Output/Errorout using COM port check storage\r
- //\r
- UINT8 ConsoleInputCOM1;\r
- UINT8 ConsoleInputCOM2;\r
- UINT8 ConsoleOutputCOM1;\r
- UINT8 ConsoleOutputCOM2;\r
- UINT8 ConsoleErrorCOM1;\r
- UINT8 ConsoleErrorCOM2;\r
-\r
- //\r
- // At most 100 input/output/errorout device for console storage\r
- //\r
- UINT8 ConsoleCheck[MAX_MENU_NUMBER];\r
- \r
- //\r
- // At most 100 input/output/errorout device for console storage\r
- //\r
- UINT8 ConsoleInCheck[MAX_MENU_NUMBER];\r
- UINT8 ConsoleOutCheck[MAX_MENU_NUMBER];\r
- UINT8 ConsoleErrCheck[MAX_MENU_NUMBER];\r
-\r
- //\r
- // Boot or Driver Option Order storage\r
- // The value is the OptionNumber+1 because the order list value cannot be 0\r
- // Use UINT32 to hold the potential value 0xFFFF+1=0x10000\r
- //\r
- UINT32 BootOptionOrder[MAX_MENU_NUMBER];\r
- UINT32 DriverOptionOrder[MAX_MENU_NUMBER];\r
- //\r
- // Boot or Driver Option Delete storage\r
- //\r
- BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
- BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
- BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
- BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
-\r
- //\r
- // This is the Terminal Attributes value storage\r
- //\r
- UINT8 COMBaudRate[MAX_MENU_NUMBER];\r
- UINT8 COMDataRate[MAX_MENU_NUMBER];\r
- UINT8 COMStopBits[MAX_MENU_NUMBER];\r
- UINT8 COMParity[MAX_MENU_NUMBER];\r
- UINT8 COMTerminalType[MAX_MENU_NUMBER];\r
- UINT8 COMFlowControl[MAX_MENU_NUMBER];\r
-\r
- //\r
- // We use DisableMap array to record the enable/disable state of each boot device\r
- // It should be taken as a bit array, from left to right there are totally 256 bits\r
- // the most left one stands for BBS table item 0, and the most right one stands for item 256\r
- // If the bit is 1, it means the boot device has been disabled.\r
- //\r
- UINT8 DisableMap[32];\r
-\r
- //\r
- // Console Output Text Mode\r
- //\r
- UINT16 ConsoleOutMode;\r
-\r
- //\r
- // UINT16 PadArea[10];\r
- //\r
-\r
- UINT16 BootDescriptionData[MAX_MENU_NUMBER];\r
- UINT16 BootOptionalData[127];\r
- UINT16 DriverDescriptionData[MAX_MENU_NUMBER];\r
- UINT16 DriverOptionalData[127];\r
- BOOLEAN BootOptionChanged;\r
- BOOLEAN DriverOptionChanged;\r
- UINT8 Active;\r
- UINT8 ForceReconnect;\r
-} BMM_FAKE_NV_DATA;\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
-Dynamically update the pages.\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
- Create the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-CreateUpdateData (\r
- VOID\r
- )\r
-{\r
- //\r
- // Init OpCode Handle and Allocate space for creation of Buffer\r
- //\r
- mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (mStartOpCodeHandle != NULL);\r
- \r
- mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (mEndOpCodeHandle != NULL);\r
- \r
- //\r
- // Create Hii Extend Label OpCode as the start opcode\r
- //\r
- mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- \r
- //\r
- // Create Hii Extend Label OpCode as the end opcode\r
- //\r
- mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
- mEndLabel->Number = LABEL_END;\r
-}\r
-\r
-/**\r
- Refresh the global UpdateData structure.\r
-\r
-**/\r
-VOID\r
-RefreshUpdateData (\r
- VOID\r
- )\r
-{\r
- //\r
- // Free current updated date\r
- // \r
- if (mStartOpCodeHandle != NULL) {\r
- HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
- }\r
-\r
- //\r
- // Create new OpCode Handle\r
- //\r
- mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
-\r
- //\r
- // Create Hii Extend Label OpCode as the start opcode\r
- //\r
- mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
- mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
-\r
-}\r
-\r
-/**\r
- Add a "Go back to main page" tag in front of the form when there are no\r
- "Apply changes" and "Discard changes" tags in the end of the form.\r
- \r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageStart (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- RefreshUpdateData ();\r
- mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
-\r
- if (!(CallbackData->BmmAskSaveOrNot)) {\r
- //\r
- // Add a "Go back to main page" tag in front of the form when there are no\r
- // "Apply changes" and "Discard changes" tags in the end of the form.\r
- //\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_MAIN_ID,\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
- 0,\r
- FORM_MAIN_ID\r
- );\r
- }\r
-}\r
-\r
-/**\r
- Create the "Apply changes" and "Discard changes" tags. And\r
- ensure user can return to the main page.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageEnd (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- //\r
- // Create the "Apply changes" and "Discard changes" tags.\r
- //\r
- if (CallbackData->BmmAskSaveOrNot) {\r
- HiiCreateSubTitleOpCode (\r
- mStartOpCodeHandle,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- HiiCreateActionOpCode (\r
- mStartOpCodeHandle,\r
- KEY_VALUE_SAVE_AND_EXIT,\r
- STRING_TOKEN (STR_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0\r
- );\r
- }\r
-\r
- //\r
- // Ensure user can return to the main page.\r
- //\r
- HiiCreateActionOpCode (\r
- mStartOpCodeHandle,\r
- KEY_VALUE_NO_SAVE_AND_EXIT,\r
- STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0\r
- );\r
-\r
- HiiUpdateForm (\r
- CallbackData->BmmHiiHandle,\r
- &mBootMaintGuid,\r
- CallbackData->BmmCurrentPageId,\r
- mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
- mEndOpCodeHandle // LABEL_END\r
- );\r
-}\r
-\r
-/**\r
- Clean up the dynamic opcode at label and form specified by both LabelId. \r
-\r
- @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-CleanUpPage (\r
- IN UINT16 LabelId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- RefreshUpdateData ();\r
-\r
- //\r
- // Remove all op-codes from dynamic page\r
- //\r
- mStartLabel->Number = LabelId;\r
- HiiUpdateForm (\r
- CallbackData->BmmHiiHandle,\r
- &mBootMaintGuid,\r
- LabelId,\r
- mStartOpCodeHandle, // Label LabelId\r
- mEndOpCodeHandle // LABEL_END\r
- );\r
-}\r
-\r
-/**\r
- Create a list of Goto Opcode for all terminal devices logged\r
- by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
-\r
- @param CallbackData The BMM context data.\r
-**/\r
-VOID\r
-UpdateConCOMPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_CON_COM_SETUP_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-\r
-/**\r
- Create a list of boot option from global BootOptionMenu. It\r
- allow user to delete the boot option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewLoadContext->IsLegacy) {\r
- continue;\r
- }\r
-\r
- NewLoadContext->Deleted = FALSE;\r
-\r
- if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
- //\r
- // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
- // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
- // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
- // through HiiSetBrowserData function.\r
- //\r
- CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
- }\r
- \r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0,\r
- NULL\r
- );\r
- }\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create a lit of driver option from global DriverMenu.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvAddHandlePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = FALSE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
-\r
- HiiCreateGotoOpCode (\r
- mStartOpCodeHandle,\r
- FORM_DRV_ADD_HANDLE_DESC_ID,\r
- NewMenuEntry->DisplayStringToken,\r
- STRING_TOKEN (STR_NULL_STRING),\r
- EFI_IFR_FLAG_CALLBACK,\r
- (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create a lit of driver option from global DriverOptionMenu. It\r
- allow user to delete the driver option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDrvDelPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
-\r
- if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
- //\r
- // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
- // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
- // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
- // through HiiSetBrowserData function.\r
- //\r
- CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
- }\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- EFI_IFR_FLAG_CALLBACK,\r
- 0,\r
- NULL\r
- );\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Prepare the page to allow user to add description for \r
- a Driver Option.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateDriverAddHandleDescPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
-\r
- CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
- CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
- NewMenuEntry = CallbackData->MenuEntry;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- HiiCreateSubTitleOpCode (\r
- mStartOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- HiiCreateStringOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
- STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 6,\r
- 75,\r
- NULL\r
- );\r
-\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRV_ADD_RECON_VAR_OFFSET,\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
- 0,\r
- 0,\r
- NULL\r
- );\r
-\r
- HiiCreateStringOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- DRIVER_ADD_OPTION_VAR_OFFSET,\r
- STRING_TOKEN (STR_OPTIONAL_DATA),\r
- STRING_TOKEN (STR_NULL_STRING),\r
- 0,\r
- 0,\r
- 6,\r
- 75,\r
- NULL\r
- );\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Update console page.\r
-\r
- @param UpdatePageId The form ID to be updated.\r
- @param ConsoleMenu The console menu list.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConsolePage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- UINT16 Index;\r
- UINT16 Index2;\r
- UINT8 CheckFlags;\r
- UINT8 *ConsoleCheck;\r
- UINT8 *OldConsoleCheck;\r
- UINTN ConsoleCheckSize;\r
- EFI_QUESTION_ID QuestionIdBase;\r
- UINT16 VariableOffsetBase;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- ConsoleCheck = NULL;\r
- OldConsoleCheck = NULL;\r
- QuestionIdBase = 0;\r
- VariableOffsetBase = 0;\r
- ConsoleCheckSize = 0;\r
-\r
- switch (UpdatePageId) {\r
- case FORM_CON_IN_ID:\r
- ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
- OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
- ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
- QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
- VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
- OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
- ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
- QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
- VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
- OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
- ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
- QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
- VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
- break;\r
- }\r
- ASSERT (ConsoleCheck != NULL);\r
-\r
- for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
- (Index < MAX_MENU_NUMBER)) ; Index++) {\r
- CheckFlags = 0;\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewConsoleContext->IsActive) {\r
- CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
- ConsoleCheck[Index] = TRUE;\r
- } else {\r
- ConsoleCheck[Index] = FALSE;\r
- }\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (VariableOffsetBase + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- 0,\r
- CheckFlags,\r
- NULL\r
- );\r
- }\r
-\r
- for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
- (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
- CheckFlags = 0;\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
- ConsoleCheck[Index] = TRUE;\r
- } else {\r
- ConsoleCheck[Index] = FALSE;\r
- }\r
- HiiCreateCheckBoxOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (VariableOffsetBase + Index),\r
- NewMenuEntry->DisplayStringToken,\r
- NewMenuEntry->HelpStringToken,\r
- 0,\r
- CheckFlags,\r
- NULL\r
- );\r
-\r
- Index++;\r
- }\r
-\r
- CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Update the page's NV Map if user has changed the order\r
- a list. This list can be Boot Order or Driver Order.\r
-\r
- @param UpdatePageId The form ID to be updated.\r
- @param OptionMenu The new list.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateOrderPage (\r
- IN UINT16 UpdatePageId,\r
- IN BM_MENU_OPTION *OptionMenu,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 Index;\r
- UINT16 OptionIndex;\r
- VOID *OptionsOpCodeHandle;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN BootOptionFound;\r
- UINT32 *OptionOrder;\r
- EFI_QUESTION_ID QuestionId;\r
- UINT16 VarOffset;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
- UpdatePageStart (CallbackData);\r
-\r
- OptionOrder = NULL;\r
- QuestionId = 0;\r
- VarOffset = 0;\r
- switch (UpdatePageId) { \r
- \r
- case FORM_BOOT_CHG_ID:\r
- GetBootOrder (CallbackData);\r
- OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
- QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
- VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
- break;\r
- \r
- case FORM_DRV_CHG_ID:\r
- GetDriverOrder (CallbackData);\r
- OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
- QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
- VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
- break;\r
- } \r
- ASSERT (OptionOrder != NULL); \r
- \r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
- \r
- NewMenuEntry = NULL;\r
- for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
- BootOptionFound = FALSE;\r
- for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
- BootOptionFound = TRUE;\r
- break;\r
- }\r
- }\r
- if (BootOptionFound) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- OptionOrder[OptionIndex]\r
- );\r
- }\r
- }\r
- \r
- if (OptionMenu->MenuNumber > 0) {\r
- HiiCreateOrderedListOpCode ( \r
- mStartOpCodeHandle, // Container for dynamic created opcodes \r
- QuestionId, // Question ID \r
- VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
- VarOffset, // Offset in Buffer Storage \r
- STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
- STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
- 0, // Question flag \r
- 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
- EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
- 100, // Maximum container \r
- OptionsOpCodeHandle, // Option Opcode list \r
- NULL // Default Opcode is NULL \r
- );\r
- }\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-\r
-}\r
-\r
-/**\r
- Create the dynamic page to allow user to set\r
- the "BootNext" value.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateBootNextPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINTN NumberOfOptions;\r
- UINT16 Index;\r
- VOID *OptionsOpCodeHandle;\r
-\r
- NumberOfOptions = BootOptionMenu.MenuNumber;\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- if (NumberOfOptions > 0) {\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
-\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- if (NewLoadContext->IsBootNext) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- Index\r
- );\r
- CallbackData->BmmFakeNvData.BootNext = Index;\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- NewMenuEntry->DisplayStringToken,\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- Index\r
- );\r
- }\r
- }\r
-\r
- if (CallbackData->BmmFakeNvData.BootNext == NONE_BOOTNEXT_VALUE) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NONE),\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- NONE_BOOTNEXT_VALUE\r
- );\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- STRING_TOKEN (STR_NONE),\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_32,\r
- NONE_BOOTNEXT_VALUE\r
- );\r
- } \r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- BOOT_NEXT_VAR_OFFSET,\r
- STRING_TOKEN (STR_BOOT_NEXT),\r
- STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_4,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- }\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-/**\r
- Create the dynamic page to allow user to set the "TimeOut" value.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTimeOutPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- VOID *DefaultOpCodeHandle;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (DefaultOpCodeHandle != NULL);\r
- HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, CallbackData->BmmFakeNvData.BootTimeOut);\r
-\r
- HiiCreateNumericOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- BOOT_TIME_OUT_VAR_OFFSET,\r
- STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
- STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
- 0,\r
- 65535,\r
- 0,\r
- DefaultOpCodeHandle\r
- );\r
- \r
- HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
-\r
-/**\r
- Refresh the text mode page.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateConModePage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINTN Mode;\r
- UINTN Index;\r
- UINTN Col;\r
- UINTN Row;\r
- CHAR16 ModeString[50];\r
- CHAR16 *PStr;\r
- UINTN MaxMode;\r
- UINTN ValidMode;\r
- EFI_STRING_ID *ModeToken;\r
- EFI_STATUS Status;\r
- VOID *OptionsOpCodeHandle;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
-\r
- ConOut = gST->ConOut;\r
- Index = 0;\r
- ValidMode = 0;\r
- MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- //\r
- // Check valid mode\r
- //\r
- for (Mode = 0; Mode < MaxMode; Mode++) {\r
- Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- ValidMode++;\r
- }\r
-\r
- if (ValidMode == 0) {\r
- return;\r
- }\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
- ASSERT(ModeToken != NULL);\r
-\r
- //\r
- // Determin which mode should be the first entry in menu\r
- //\r
- GetConsoleOutMode (CallbackData);\r
-\r
- //\r
- // Build text mode options\r
- //\r
- for (Mode = 0; Mode < MaxMode; Mode++) {\r
- Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
- if (EFI_ERROR (Status)) {\r
- continue;\r
- }\r
- \r
- //\r
- // Build mode string Column x Row\r
- //\r
- UnicodeValueToString (ModeString, 0, Col, 0);\r
- PStr = &ModeString[0];\r
- StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
- PStr = PStr + StrLen (PStr);\r
- UnicodeValueToString (PStr , 0, Row, 0);\r
-\r
- ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
-\r
- if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ModeToken[Index],\r
- EFI_IFR_OPTION_DEFAULT,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- (UINT16) Mode\r
- );\r
- } else {\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ModeToken[Index],\r
- 0,\r
- EFI_IFR_TYPE_NUM_SIZE_16,\r
- (UINT16) Mode\r
- );\r
- }\r
- Index++;\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
- VARSTORE_ID_BOOT_MAINT,\r
- CON_MODE_VAR_OFFSET,\r
- STRING_TOKEN (STR_CON_MODE_SETUP),\r
- STRING_TOKEN (STR_CON_MODE_SETUP),\r
- EFI_IFR_FLAG_RESET_REQUIRED,\r
- EFI_IFR_NUMERIC_SIZE_2,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- FreePool (ModeToken);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
-\r
- /**\r
- Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
- Parity, Stop Bits, Terminal Type.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdateTerminalPage (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT8 Index;\r
- UINT8 CheckFlags;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- VOID *OptionsOpCodeHandle;\r
- UINTN CurrentTerminal;\r
-\r
- CallbackData->BmmAskSaveOrNot = TRUE;\r
-\r
- UpdatePageStart (CallbackData);\r
-\r
- CurrentTerminal = CallbackData->CurrentTerminal;\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &TerminalMenu,\r
- CurrentTerminal\r
- );\r
-\r
- if (NewMenuEntry == NULL) {\r
- return ;\r
- }\r
-\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
- CheckFlags = 0;\r
- if (BaudRateList[Index].Value == 115200) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- BaudRateList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- STRING_TOKEN (STR_COM_BAUD_RATE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
- \r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
- CheckFlags = 0;\r
-\r
- if (DataBitsList[Index].Value == 8) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- DataBitsList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- STRING_TOKEN (STR_COM_DATA_BITS),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
- CheckFlags = 0;\r
- if (ParityList[Index].Value == NoParity) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- ParityList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_PARITY),\r
- STRING_TOKEN (STR_COM_PARITY),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
- CheckFlags = 0;\r
- if (StopBitsList[Index].Value == OneStopBit) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- StopBitsList[Index].StringToken,\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- STRING_TOKEN (STR_COM_STOP_BITS),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
- CheckFlags = 0;\r
- if (Index == 0) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
-\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- (EFI_STRING_ID) TerminalType[Index],\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- Index\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- STRING_TOKEN (STR_COM_TERMI_TYPE),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
- OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
- ASSERT (OptionsOpCodeHandle != NULL);\r
-\r
- for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
- CheckFlags = 0;\r
- if (Index == 0) {\r
- CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- }\r
- HiiCreateOneOfOptionOpCode (\r
- OptionsOpCodeHandle,\r
- (EFI_STRING_ID) mFlowControlType[Index],\r
- CheckFlags,\r
- EFI_IFR_TYPE_NUM_SIZE_8,\r
- mFlowControlValue[Index]\r
- );\r
- }\r
-\r
- HiiCreateOneOfOpCode (\r
- mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
- VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
- STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
- STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
- 0,\r
- EFI_IFR_NUMERIC_SIZE_1,\r
- OptionsOpCodeHandle,\r
- NULL\r
- );\r
-\r
- HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
-\r
- UpdatePageEnd (CallbackData);\r
-}\r
- \r
-/**\r
-Update add boot/driver option page.\r
-\r
-@param CallbackData The BMM context data.\r
-@param FormId The form ID to be updated.\r
-@param DevicePath Device path.\r
-\r
-**/\r
-VOID\r
-UpdateOptionPage(\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_FORM_ID FormId,\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- CHAR16 *String;\r
- EFI_STRING_ID StringToken;\r
-\r
- if (DevicePath != NULL){\r
- String = ExtractFileNameFromDevicePath(DevicePath);\r
- StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
- FreePool(String);\r
- } else {\r
- String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
- ASSERT (String != NULL);\r
- StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
- FreePool (String);\r
- }\r
-\r
- if(FormId == FORM_BOOT_ADD_ID){\r
- if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
- ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
- ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
- }\r
- } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
- if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
- ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
- ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
- }\r
- }\r
-\r
- RefreshUpdateData();\r
- mStartLabel->Number = FormId;\r
-\r
- HiiCreateSubTitleOpCode (\r
- mStartOpCodeHandle,\r
- StringToken,\r
- 0,\r
- 0,\r
- 0\r
- );\r
-\r
- HiiUpdateForm (\r
- CallbackData->BmmHiiHandle,\r
- &mBootMaintGuid,\r
- FormId,\r
- mStartOpCodeHandle,// Label FormId\r
- mEndOpCodeHandle // LABEL_END\r
- );\r
-}\r
-\r
-/**\r
- Dispatch the correct update page function to call based on\r
- the UpdatePageId.\r
-\r
- @param UpdatePageId The form ID.\r
- @param CallbackData The BMM context data.\r
-\r
-**/\r
-VOID\r
-UpdatePageBody (\r
- IN UINT16 UpdatePageId,\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- CleanUpPage (UpdatePageId, CallbackData);\r
- switch (UpdatePageId) {\r
- case FORM_CON_IN_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-}\r
-\r
-/**\r
- Dispatch the display to the next page based on NewPageId.\r
-\r
- @param Private The BMM context data.\r
- @param NewPageId The original page ID.\r
-\r
-**/\r
-VOID\r
-UpdatePageId (\r
- BMM_CALLBACK_DATA *Private,\r
- UINT16 NewPageId\r
- )\r
-{\r
- if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
- //\r
- // If we select a handle to add driver option, advance to the add handle description page.\r
- //\r
- NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
- } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
- //\r
- // Return to main page after "Save Changes" or "Discard Changes".\r
- //\r
- NewPageId = FORM_MAIN_ID;\r
- } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
- NewPageId = FORM_CON_COM_SETUP_ID;\r
- }\r
-\r
- if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
- Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
- Private->BmmCurrentPageId = NewPageId;\r
- }\r
-}\r
+++ /dev/null
-/** @file\r
-Variable operation that will be used by bootmaint\r
-\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaintenanceManager.h"\r
-\r
-/**\r
- Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this boot option, call Var_ChangeBootOrder to\r
- make sure BootOrder is in valid state.\r
-\r
- @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to \r
- BM_LOAD_CONTEXT marked for deletion is deleted.\r
- @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
- @return Others If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
- VOID\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 BootString[10];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- BootString,\r
- sizeof (BootString),\r
- L"Boot%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
- //\r
- // If current Load Option is the same as BootNext,\r
- // must delete BootNext in order to make sure\r
- // there will be no panic on next boot\r
- //\r
- if (NewLoadContext->IsBootNext) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- BootOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeBootOrder ();\r
- return Status;\r
-}\r
-\r
-/**\r
- After any operation on Boot####, there will be a discrepancy in BootOrder.\r
- Since some are missing but in BootOrder, while some are present but are\r
- not reflected by BootOrder. Then a function rebuild BootOrder from\r
- scratch by content from BootOptionMenu is needed.\r
-\r
-\r
- \r
-\r
- @retval EFI_SUCCESS The boot order is updated successfully.\r
- @return EFI_STATUS other than EFI_SUCCESS if failed to\r
- Set the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
- VOID\r
- )\r
-{\r
-\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *BootOrderList;\r
- UINT16 *BootOrderListPtr;\r
- UINTN BootOrderListSize;\r
- UINTN Index;\r
-\r
- BootOrderList = NULL;\r
- BootOrderListSize = 0;\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
-\r
- //\r
- // If exists, delete it to hold new BootOrder\r
- //\r
- if (BootOrderList != NULL) {\r
- EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
- FreePool (BootOrderList);\r
- BootOrderList = NULL;\r
- }\r
- //\r
- // Maybe here should be some check method to ensure that\r
- // no new added boot options will be added\r
- // but the setup engine now will give only one callback\r
- // that is to say, user are granted only one chance to\r
- // decide whether the boot option will be added or not\r
- // there should be no indictor to show whether this\r
- // is a "new" boot option\r
- //\r
- BootOrderListSize = BootOptionMenu.MenuNumber;\r
-\r
- if (BootOrderListSize > 0) {\r
- BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
- ASSERT (BootOrderList != NULL);\r
- BootOrderListPtr = BootOrderList;\r
-\r
- //\r
- // Get all current used Boot#### from BootOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < BootOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- *BootOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- BootOrderList++;\r
- }\r
-\r
- BootOrderList = BootOrderListPtr;\r
-\r
- //\r
- // After building the BootOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize * sizeof (UINT16),\r
- BootOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Delete Load Option that represent a Deleted state in BootOptionMenu.\r
- After deleting this Driver option, call Var_ChangeDriverOrder to\r
- make sure DriverOrder is in valid state.\r
-\r
- @retval EFI_SUCCESS Load Option is successfully updated.\r
- @retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.\r
- @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
- Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
- VOID\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 DriverString[12];\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Index2;\r
-\r
- Status = EFI_SUCCESS;\r
- Index2 = 0;\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
- if (NULL == NewMenuEntry) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (!NewLoadContext->Deleted) {\r
- continue;\r
- }\r
-\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- NewMenuEntry->OptionNumber\r
- );\r
-\r
- EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
- Index2++;\r
-\r
- RemoveEntryList (&NewMenuEntry->Link);\r
- BOpt_DestroyMenuEntry (NewMenuEntry);\r
- NewMenuEntry = NULL;\r
- }\r
-\r
- DriverOptionMenu.MenuNumber -= Index2;\r
-\r
- Status = Var_ChangeDriverOrder ();\r
- return Status;\r
-}\r
-\r
-/**\r
- After any operation on Driver####, there will be a discrepancy in\r
- DriverOrder. Since some are missing but in DriverOrder, while some\r
- are present but are not reflected by DriverOrder. Then a function\r
- rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
- needed.\r
-\r
- @retval EFI_SUCCESS The driver order is updated successfully.\r
- @return Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- UINT16 *DriverOrderList;\r
- UINT16 *DriverOrderListPtr;\r
- UINTN DriverOrderListSize;\r
- UINTN Index;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- FreePool (DriverOrderList);\r
- DriverOrderList = NULL;\r
- }\r
-\r
- DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
-\r
- if (DriverOrderListSize > 0) {\r
- DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
- ASSERT (DriverOrderList != NULL);\r
- DriverOrderListPtr = DriverOrderList;\r
-\r
- //\r
- // Get all current used Driver#### from DriverOptionMenu.\r
- // OptionNumber in each BM_LOAD_OPTION is really its\r
- // #### value.\r
- //\r
- for (Index = 0; Index < DriverOrderListSize; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- *DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
- DriverOrderList++;\r
- }\r
-\r
- DriverOrderList = DriverOrderListPtr;\r
-\r
- //\r
- // After building the DriverOrderList, write it back\r
- //\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize * sizeof (UINT16),\r
- DriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Update the device path of "ConOut", "ConIn" and "ErrOut" \r
- based on the new BaudRate, Data Bits, parity and Stop Bits\r
- set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
- VOID\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
- EFI_STATUS Status;\r
-\r
- GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
- GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
- if (OutDevicePath != NULL) {\r
- ChangeVariableDevicePath (OutDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (OutDevicePath),\r
- OutDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (InpDevicePath != NULL) {\r
- ChangeVariableDevicePath (InpDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ConIn",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (InpDevicePath),\r
- InpDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-\r
- if (ErrDevicePath != NULL) {\r
- ChangeVariableDevicePath (ErrDevicePath);\r
- Status = gRT->SetVariable (\r
- L"ErrOut",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ErrDevicePath),\r
- ErrDevicePath\r
- );\r
- ASSERT (!EFI_ERROR (Status));\r
- }\r
-}\r
-\r
-/**\r
- This function delete and build multi-instance device path for\r
- specified type of console device.\r
-\r
- This function clear the EFI variable defined by ConsoleName and\r
- gEfiGlobalVariableGuid. It then build the multi-instance device\r
- path by appending the device path of the Console (In/Out/Err) instance \r
- in ConsoleMenu. Then it scan all corresponding console device by\r
- scanning Terminal (built from device supporting Serial I/O instances)\r
- devices in TerminalMenu. At last, it save a EFI variable specifed\r
- by ConsoleName and gEfiGlobalVariableGuid.\r
-\r
- @param ConsoleName The name for the console device type. They are\r
- usually "ConIn", "ConOut" and "ErrOut".\r
- @param ConsoleMenu The console memu which is a list of console devices.\r
- @param UpdatePageId The flag specifying which type of console device\r
- to be processed.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOption (\r
- IN UINT16 *ConsoleName,\r
- IN BM_MENU_OPTION *ConsoleMenu,\r
- IN UINT16 UpdatePageId\r
- )\r
-{\r
- EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- EFI_STATUS Status;\r
- VENDOR_DEVICE_PATH Vendor;\r
- EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath;\r
- UINTN Index;\r
-\r
- GetEfiGlobalVariable2 (ConsoleName, (VOID**)&ConDevicePath, NULL);\r
- if (ConDevicePath != NULL) {\r
- EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
- FreePool (ConDevicePath);\r
- ConDevicePath = NULL;\r
- };\r
-\r
- //\r
- // First add all console input device from console input menu\r
- //\r
- for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (NewConsoleContext->IsActive) {\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- NewConsoleContext->DevicePath\r
- );\r
- }\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
- ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
- ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
- ) {\r
- Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
- Vendor.Header.SubType = MSG_VENDOR_DP;\r
- \r
- ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
- CopyMem (\r
- &Vendor.Guid,\r
- &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
- sizeof (EFI_GUID)\r
- );\r
- SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
- TerminalDevicePath = AppendDevicePathNode (\r
- NewTerminalContext->DevicePath,\r
- (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
- );\r
- ASSERT (TerminalDevicePath != NULL);\r
- ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
- ConDevicePath = AppendDevicePathInstance (\r
- ConDevicePath,\r
- TerminalDevicePath\r
- );\r
- }\r
- }\r
-\r
- if (ConDevicePath != NULL) {\r
- Status = gRT->SetVariable (\r
- ConsoleName,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- GetDevicePathSize (ConDevicePath),\r
- ConDevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
- This function delete and build multi-instance device path ConIn\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\r
-\r
-/**\r
- This function delete and build multi-instance device path ConOut\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
-}\r
-\r
-/**\r
- This function delete and build multi-instance device path ErrOut\r
- console device.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information. \r
-**/\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
- VOID\r
- )\r
-{\r
- return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
-}\r
-\r
-/**\r
- This function create a currently loaded Drive Option from \r
- the BMM. It then appends this Driver Option to the end of \r
- the "DriverOrder" list. It append this Driver Opotion to the end\r
- of DriverOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
- @param HiiHandle The HII handle associated with the BMM formset.\r
- @param DescriptionData The description of this driver option.\r
- @param OptionalData The optional load option.\r
- @param ForceReconnect If to force reconnect.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
- IN BMM_CALLBACK_DATA *CallbackData,\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN UINT16 *DescriptionData,\r
- IN UINT16 *OptionalData,\r
- IN UINT8 ForceReconnect\r
- )\r
-{\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINT16 DriverString[12];\r
- UINTN DriverOrderListSize;\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
-\r
- OptionalDataExist = FALSE;\r
-\r
- Index = BOpt_GetDriverOptionNumber ();\r
- UnicodeSPrint (\r
- DriverString,\r
- sizeof (DriverString),\r
- L"Driver%04x",\r
- Index\r
- );\r
-\r
- if (*DescriptionData == 0x0000) {\r
- StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
- BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (*OptionalData != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (OptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- FreePool (Buffer);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
- Ptr += sizeof (UINT16);\r
- CopyMem (\r
- Ptr,\r
- DescriptionData,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (DescriptionData)\r
- );\r
-\r
- Ptr += StrSize (DescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
- NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (\r
- Ptr,\r
- OptionalData,\r
- StrSize (OptionalData)\r
- );\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- DriverString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
- ASSERT (NewDriverOrderList != NULL);\r
- if (DriverOrderList != NULL){\r
- CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
- }\r
- NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize + sizeof (UINT16),\r
- NewDriverOrderList\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- if (DriverOrderList != NULL) {\r
- FreePool (DriverOrderList);\r
- }\r
- DriverOrderList = NULL;\r
- FreePool (NewDriverOrderList);\r
- InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
- DriverOptionMenu.MenuNumber++;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function create a currently loaded Boot Option from \r
- the BMM. It then appends this Boot Option to the end of \r
- the "BootOrder" list. It also append this Boot Opotion to the end\r
- of BootOptionMenu.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
- @retval EFI_SUCCESS If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- UINT16 *BootOrderList;\r
- UINT16 *NewBootOrderList;\r
- UINTN BootOrderListSize;\r
- UINT16 BootString[10];\r
- VOID *Buffer;\r
- UINTN BufferSize;\r
- UINT8 *Ptr;\r
- UINT16 Index;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BOOLEAN OptionalDataExist;\r
- EFI_STATUS Status;\r
- BMM_FAKE_NV_DATA *NvRamMap;\r
-\r
- OptionalDataExist = FALSE;\r
- NvRamMap = &CallbackData->BmmFakeNvData;\r
-\r
- Index = BOpt_GetBootOptionNumber () ;\r
- UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
-\r
- if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
- StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
- }\r
-\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
- BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
- OptionalDataExist = TRUE;\r
- BufferSize += StrSize (NvRamMap->BootOptionalData);\r
- }\r
-\r
- Buffer = AllocateZeroPool (BufferSize);\r
- if (NULL == Buffer) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
- if (NULL == NewMenuEntry) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = FALSE;\r
- NewLoadContext->LoadOptionSize = BufferSize;\r
- Ptr = (UINT8 *) Buffer;\r
- NewLoadContext->LoadOption = Ptr;\r
- *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
- NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
- NewLoadContext->IsActive = TRUE;\r
- NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
- Ptr += sizeof (UINT32);\r
- *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
- NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
- Ptr += sizeof (UINT16);\r
-\r
- CopyMem (\r
- Ptr,\r
- NvRamMap->BootDescriptionData,\r
- StrSize (NvRamMap->BootDescriptionData)\r
- );\r
-\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
- ASSERT (NewLoadContext->Description != NULL);\r
-\r
- NewMenuEntry->DisplayString = NewLoadContext->Description;\r
- CopyMem (\r
- NewLoadContext->Description,\r
- (VOID *) Ptr,\r
- StrSize (NvRamMap->BootDescriptionData)\r
- );\r
-\r
- Ptr += StrSize (NvRamMap->BootDescriptionData);\r
- CopyMem (\r
- Ptr,\r
- CallbackData->LoadContext->FilePathList,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
- ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
- CopyMem (\r
- NewLoadContext->FilePathList,\r
- (VOID *) Ptr,\r
- GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
- );\r
-\r
- NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
- NewMenuEntry->OptionNumber = Index;\r
- NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
- NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
-\r
- if (OptionalDataExist) {\r
- Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
- CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- BootString,\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BufferSize,\r
- Buffer\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
- NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
- ASSERT (NewBootOrderList != NULL);\r
- if (BootOrderList != NULL){\r
- CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
- }\r
- NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
- if (BootOrderList != NULL) {\r
- FreePool (BootOrderList);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderListSize + sizeof (UINT16),\r
- NewBootOrderList\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- FreePool (NewBootOrderList);\r
- NewBootOrderList = NULL;\r
- InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
- BootOptionMenu.MenuNumber++;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function update the "BootNext" EFI Variable. If there is \r
- no "BootNext" specified in BMM, this EFI Variable is deleted.\r
- It also update the BMM context data specified the "BootNext"\r
- vaule.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @return The EFI variable can be saved. See gRT->SetVariable \r
- for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- UINT16 Index;\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
- CurrentFakeNVMap = &CallbackData->BmmFakeNvData;\r
- for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- ASSERT (NULL != NewMenuEntry);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->IsBootNext = FALSE;\r
- }\r
-\r
- if (CurrentFakeNVMap->BootNext == NONE_BOOTNEXT_VALUE) {\r
- EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- NewMenuEntry = BOpt_GetMenuEntry (\r
- &BootOptionMenu,\r
- CurrentFakeNVMap->BootNext\r
- );\r
- ASSERT (NewMenuEntry != NULL);\r
-\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- Status = gRT->SetVariable (\r
- L"BootNext",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- sizeof (UINT16),\r
- &NewMenuEntry->OptionNumber\r
- );\r
- NewLoadContext->IsBootNext = TRUE;\r
- CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
- return Status;\r
-}\r
-\r
-/**\r
- This function update the "BootOrder" EFI Variable based on\r
- BMM Formset's NV map. It then refresh BootOptionMenu\r
- with the new "BootOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 OrderIndex;\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
- UINT16 OptionNumber;\r
-\r
- //\r
- // First check whether BootOrder is present in current configuration\r
- //\r
- GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize);\r
- if (BootOrder == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionOrder) / sizeof (CallbackData->BmmFakeNvData.BootOptionOrder[0])));\r
-\r
- //\r
- // OptionOrder is subset of BootOrder\r
- //\r
- for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] != 0); OrderIndex++) {\r
- for (Index = OrderIndex; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
- if ((BootOrder[Index] == (UINT16) (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
- OptionNumber = BootOrder[Index];\r
- CopyMem (&BootOrder[OrderIndex + 1], &BootOrder[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
- BootOrder[OrderIndex] = OptionNumber;\r
- }\r
- }\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- BootOrderSize,\r
- BootOrder\r
- );\r
- FreePool (BootOrder);\r
- \r
- BOpt_FreeMenu (&BootOptionMenu);\r
- BOpt_GetBootOptions (CallbackData);\r
-\r
- return Status;\r
-\r
-}\r
-\r
-/**\r
- This function update the "DriverOrder" EFI Variable based on\r
- BMM Formset's NV map. It then refresh DriverOptionMenu\r
- with the new "DriverOrder" list.\r
-\r
- @param CallbackData The BMM context data.\r
-\r
- @retval EFI_SUCCESS The function complete successfully.\r
- @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
- @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
- UINT16 *DriverOrderList;\r
- UINT16 *NewDriverOrderList;\r
- UINTN DriverOrderListSize;\r
-\r
- DriverOrderList = NULL;\r
- DriverOrderListSize = 0;\r
-\r
- //\r
- // First check whether DriverOrder is present in current configuration\r
- //\r
- GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
- NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
-\r
- if (NewDriverOrderList == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- //\r
- // If exists, delete it to hold new DriverOrder\r
- //\r
- if (DriverOrderList != NULL) {\r
- EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
- FreePool (DriverOrderList);\r
- }\r
-\r
- ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder) / sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder[0])));\r
- for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
- NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] - 1);\r
- }\r
-\r
- Status = gRT->SetVariable (\r
- L"DriverOrder",\r
- &gEfiGlobalVariableGuid,\r
- VAR_FLAG,\r
- DriverOrderListSize,\r
- NewDriverOrderList\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_FreeMenu (&DriverOptionMenu);\r
- BOpt_GetDriverOptions (CallbackData);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Update the Text Mode of Console.\r
-\r
- @param CallbackData The context data for BMM.\r
-\r
- @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
- @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
- IN BMM_CALLBACK_DATA *CallbackData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Mode;\r
- CONSOLE_OUT_MODE ModeInfo;\r
-\r
- Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
-\r
- Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
- if (!EFI_ERROR(Status)) {\r
- Status = PcdSet32S (PcdSetupConOutColumn, (UINT32) ModeInfo.Column);\r
- if (!EFI_ERROR (Status)) {\r
- Status = PcdSet32S (PcdSetupConOutRow, (UINT32) ModeInfo.Row);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
--- /dev/null
+/** @file\r
+Utility routines used by boot maintenance modules.\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+ Function deletes the variable specified by VarName and VarGuid.\r
+\r
+ @param VarName A Null-terminated Unicode string that is\r
+ the name of the vendor's variable.\r
+\r
+ @param VarGuid A unique identifier for the vendor.\r
+\r
+ @retval EFI_SUCCESS The variable was found and removed\r
+ @retval EFI_UNSUPPORTED The variable store was inaccessible\r
+ @retval EFI_NOT_FOUND The variable was not found\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibDeleteVariable (\r
+ IN CHAR16 *VarName,\r
+ IN EFI_GUID *VarGuid\r
+ )\r
+{\r
+ return gRT->SetVariable (\r
+ VarName,\r
+ VarGuid,\r
+ 0,\r
+ 0,\r
+ NULL\r
+ );\r
+}\r
+\r
+/**\r
+ Function is used to determine the number of device path instances\r
+ that exist in a device path.\r
+\r
+\r
+ @param DevicePath A pointer to a device path data structure.\r
+\r
+ @return This function counts and returns the number of device path instances\r
+ in DevicePath.\r
+\r
+**/\r
+UINTN\r
+EfiDevicePathInstanceCount (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ UINTN Count;\r
+ UINTN Size;\r
+\r
+ Count = 0;\r
+ while (GetNextDevicePathInstance (&DevicePath, &Size) != NULL) {\r
+ Count += 1;\r
+ }\r
+\r
+ return Count;\r
+}\r
+\r
+/**\r
+ Get a string from the Data Hub record based on \r
+ a device path.\r
+\r
+ @param DevPath The device Path.\r
+\r
+ @return A string located from the Data Hub records based on\r
+ the device path.\r
+ @retval NULL If failed to get the String from Data Hub.\r
+\r
+**/\r
+UINT16 *\r
+EfiLibStrFromDatahub (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
+ )\r
+{\r
+ return NULL;\r
+}\r
--- /dev/null
+/** @file\r
+The functions for Boot Maintainence Main menu.\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+#define FRONT_PAGE_KEY_OFFSET 0x4000\r
+//\r
+// Boot video resolution and text mode.\r
+//\r
+UINT32 mBmmBootHorizontalResolution = 0;\r
+UINT32 mBmmBootVerticalResolution = 0;\r
+UINT32 mBmmBootTextModeColumn = 0;\r
+UINT32 mBmmBootTextModeRow = 0;\r
+//\r
+// BIOS setup video resolution and text mode.\r
+//\r
+UINT32 mBmmSetupTextModeColumn = 0;\r
+UINT32 mBmmSetupTextModeRow = 0;\r
+UINT32 mBmmSetupHorizontalResolution = 0;\r
+UINT32 mBmmSetupVerticalResolution = 0;\r
+\r
+EFI_DEVICE_PATH_PROTOCOL EndDevicePath[] = {\r
+ {\r
+ END_DEVICE_PATH_TYPE,\r
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+ {\r
+ END_DEVICE_PATH_LENGTH,\r
+ 0\r
+ }\r
+ }\r
+};\r
+\r
+HII_VENDOR_DEVICE_PATH mBmmHiiVendorDevicePath = {\r
+ {\r
+ {\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_VENDOR_DP,\r
+ {\r
+ (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ }\r
+ },\r
+ //\r
+ // {165A028F-0BB2-4b5f-8747-77592E3F6499}\r
+ //\r
+ { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 0x99 } }\r
+ },\r
+ {\r
+ END_DEVICE_PATH_TYPE,\r
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+ { \r
+ (UINT8) (END_DEVICE_PATH_LENGTH),\r
+ (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+ }\r
+ }\r
+};\r
+\r
+EFI_GUID mBootMaintGuid = BOOT_MAINT_FORMSET_GUID;\r
+\r
+CHAR16 mBootMaintStorageName[] = L"BmmData";\r
+BMM_CALLBACK_DATA gBootMaintenancePrivate = {\r
+ BMM_CALLBACK_DATA_SIGNATURE,\r
+ NULL,\r
+ NULL,\r
+ {\r
+ BootMaintExtractConfig,\r
+ BootMaintRouteConfig,\r
+ BootMaintCallback\r
+ }\r
+};\r
+\r
+BMM_CALLBACK_DATA *mBmmCallbackInfo = &gBootMaintenancePrivate;\r
+BOOLEAN mAllMenuInit = FALSE;\r
+\r
+/**\r
+ Init all memu.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitAllMenu (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Free up all Menu Option list.\r
+\r
+**/\r
+VOID\r
+FreeAllMenu (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function will change video resolution and text mode\r
+ according to defined setup mode or defined boot mode \r
+\r
+ @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
+\r
+ @retval EFI_SUCCESS Mode is changed successfully.\r
+ @retval Others Mode failed to be changed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BmmBdsSetConsoleMode (\r
+ BOOLEAN IsSetupMode\r
+ )\r
+{\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ UINT32 MaxGopMode;\r
+ UINT32 MaxTextMode;\r
+ UINT32 ModeNumber;\r
+ UINT32 NewHorizontalResolution;\r
+ UINT32 NewVerticalResolution;\r
+ UINT32 NewColumns;\r
+ UINT32 NewRows;\r
+ UINTN HandleCount;\r
+ EFI_HANDLE *HandleBuffer;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINTN CurrentColumn;\r
+ UINTN CurrentRow; \r
+\r
+ MaxGopMode = 0;\r
+ MaxTextMode = 0;\r
+\r
+ //\r
+ // Get current video resolution and text mode \r
+ //\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID**)&GraphicsOutput\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ GraphicsOutput = NULL;\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ gST->ConsoleOutHandle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ (VOID**)&SimpleTextOut\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ SimpleTextOut = NULL;\r
+ } \r
+\r
+ if ((GraphicsOutput == NULL) || (SimpleTextOut == NULL)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (IsSetupMode) {\r
+ //\r
+ // The requried resolution and text mode is setup mode.\r
+ //\r
+ NewHorizontalResolution = mBmmSetupHorizontalResolution;\r
+ NewVerticalResolution = mBmmSetupVerticalResolution;\r
+ NewColumns = mBmmSetupTextModeColumn;\r
+ NewRows = mBmmSetupTextModeRow;\r
+ } else {\r
+ //\r
+ // The required resolution and text mode is boot mode.\r
+ //\r
+ NewHorizontalResolution = mBmmBootHorizontalResolution;\r
+ NewVerticalResolution = mBmmBootVerticalResolution;\r
+ NewColumns = mBmmBootTextModeColumn;\r
+ NewRows = mBmmBootTextModeRow; \r
+ }\r
+\r
+ if (GraphicsOutput != NULL) {\r
+ MaxGopMode = GraphicsOutput->Mode->MaxMode;\r
+ } \r
+\r
+ if (SimpleTextOut != NULL) {\r
+ MaxTextMode = SimpleTextOut->Mode->MaxMode;\r
+ }\r
+\r
+ //\r
+ // 1. If current video resolution is same with required video resolution,\r
+ // video resolution need not be changed.\r
+ // 1.1. If current text mode is same with required text mode, text mode need not be changed.\r
+ // 1.2. If current text mode is different from required text mode, text mode need be changed.\r
+ // 2. If current video resolution is different from required video resolution, we need restart whole console drivers.\r
+ //\r
+ for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {\r
+ Status = GraphicsOutput->QueryMode (\r
+ GraphicsOutput,\r
+ ModeNumber,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution == NewHorizontalResolution) &&\r
+ (Info->VerticalResolution == NewVerticalResolution)) {\r
+ if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&\r
+ (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) {\r
+ //\r
+ // Current resolution is same with required resolution, check if text mode need be set\r
+ //\r
+ Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (CurrentColumn == NewColumns && CurrentRow == NewRows) {\r
+ //\r
+ // If current text mode is same with required text mode. Do nothing\r
+ //\r
+ FreePool (Info);\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ //\r
+ // If current text mode is different from requried text mode. Set new video mode\r
+ //\r
+ for (Index = 0; Index < MaxTextMode; Index++) {\r
+ Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);\r
+ if (!EFI_ERROR(Status)) {\r
+ if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {\r
+ //\r
+ // Required text mode is supported, set it.\r
+ //\r
+ Status = SimpleTextOut->SetMode (SimpleTextOut, Index);\r
+ ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Update text mode PCD.\r
+ //\r
+ Status = PcdSet32S (PcdConOutColumn, mBmmSetupTextModeColumn);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = PcdSet32S (PcdConOutRow, mBmmSetupTextModeRow);\r
+ ASSERT_EFI_ERROR (Status);\r
+ FreePool (Info);\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+ if (Index == MaxTextMode) {\r
+ //\r
+ // If requried text mode is not supported, return error.\r
+ //\r
+ FreePool (Info);\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ }\r
+ } else {\r
+ //\r
+ // If current video resolution is not same with the new one, set new video resolution.\r
+ // In this case, the driver which produces simple text out need be restarted.\r
+ //\r
+ Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+ if (!EFI_ERROR (Status)) {\r
+ FreePool (Info);\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ FreePool (Info);\r
+ }\r
+ }\r
+\r
+ if (ModeNumber == MaxGopMode) {\r
+ //\r
+ // If the resolution is not supported, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Set PCD to Inform GraphicsConsole to change video resolution.\r
+ // Set PCD to Inform Consplitter to change text mode.\r
+ //\r
+ Status = PcdSet32S (PcdVideoHorizontalResolution, NewHorizontalResolution);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = PcdSet32S (PcdVideoVerticalResolution, NewVerticalResolution);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = PcdSet32S (PcdConOutColumn, NewColumns);\r
+ ASSERT_EFI_ERROR (Status);\r
+ Status = PcdSet32S (PcdConOutRow, NewRows);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Video mode is changed, so restart graphics console driver and higher level driver.\r
+ // Reconnect graphics console driver and higher level driver.\r
+ // Locate all the handles with GOP protocol and reconnect it.\r
+ //\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ NULL,\r
+ &HandleCount,\r
+ &HandleBuffer\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
+ gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);\r
+ }\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
+ gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);\r
+ }\r
+ if (HandleBuffer != NULL) {\r
+ FreePool (HandleBuffer);\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ This function converts an input device structure to a Unicode string.\r
+\r
+ @param DevPath A pointer to the device path structure.\r
+\r
+ @return A new allocated Unicode string that represents the device path.\r
+\r
+**/\r
+CHAR16 *\r
+UiDevicePathToStr (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CHAR16 *ToText;\r
+ EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
+\r
+ if (DevPath == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiDevicePathToTextProtocolGuid,\r
+ NULL,\r
+ (VOID **) &DevPathToText\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ ToText = DevPathToText->ConvertDevicePathToText (\r
+ DevPath,\r
+ FALSE,\r
+ TRUE\r
+ );\r
+ ASSERT (ToText != NULL);\r
+ return ToText;\r
+}\r
+\r
+/**\r
+ Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
+ The caller is responsible for freeing the allocated buffer using FreePool().\r
+\r
+ @param DevicePath Device path.\r
+\r
+ @return A new allocated string that represents the file name.\r
+\r
+**/\r
+CHAR16 *\r
+ExtractFileNameFromDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ CHAR16 *String;\r
+ CHAR16 *MatchString;\r
+ CHAR16 *LastMatch;\r
+ CHAR16 *FileName;\r
+ UINTN Length;\r
+\r
+ ASSERT(DevicePath != NULL);\r
+\r
+ String = UiDevicePathToStr(DevicePath);\r
+ MatchString = String;\r
+ LastMatch = String;\r
+\r
+ while(MatchString != NULL){\r
+ LastMatch = MatchString + 1;\r
+ MatchString = StrStr(LastMatch,L"\\");\r
+ }\r
+\r
+ Length = StrLen(LastMatch);\r
+ FileName = AllocateCopyPool ((Length + 1) * sizeof(CHAR16), LastMatch);\r
+ *(FileName + Length) = 0;\r
+\r
+ FreePool(String);\r
+\r
+ return FileName;\r
+}\r
+\r
+/**\r
+ Extract device path for given HII handle and class guid.\r
+\r
+ @param Handle The HII handle.\r
+\r
+ @retval NULL Fail to get the device path string.\r
+ @return PathString Get the device path string.\r
+\r
+**/\r
+CHAR16 *\r
+BmmExtractDevicePathFromHiiHandle (\r
+ IN EFI_HII_HANDLE Handle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE DriverHandle;\r
+\r
+ ASSERT (Handle != NULL);\r
+\r
+ if (Handle == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Get device path string.\r
+ //\r
+ return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
+\r
+}\r
+\r
+/**\r
+ This function allows a caller to extract the current configuration for one\r
+ or more named elements from the target driver.\r
+\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
+ @param Progress On return, points to a character in the Request string.\r
+ Points to the string's null terminator if request was successful.\r
+ Points to the most recent '&' before the first failing name/value\r
+ pair (or the beginning of the string if the failure is in the\r
+ first name/value pair) if the request was not successful.\r
+ @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
+ has all values filled in for the names in the Request string.\r
+ String to be allocated by the called function.\r
+\r
+ @retval EFI_SUCCESS The Results is filled with the requested values.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
+ @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
+ @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintExtractConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Request,\r
+ OUT EFI_STRING *Progress,\r
+ OUT EFI_STRING *Results\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ BMM_CALLBACK_DATA *Private;\r
+ EFI_STRING ConfigRequestHdr;\r
+ EFI_STRING ConfigRequest;\r
+ BOOLEAN AllocatedRequest;\r
+ UINTN Size;\r
+\r
+ if (Progress == NULL || Results == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ *Progress = Request;\r
+ if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mBootMaintGuid, mBootMaintStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ ConfigRequestHdr = NULL;\r
+ ConfigRequest = NULL;\r
+ AllocatedRequest = FALSE;\r
+ Size = 0;\r
+\r
+ Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
+ //\r
+ // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
+ //\r
+ BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
+ ConfigRequest = Request;\r
+ if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+ //\r
+ // Request has no request element, construct full request string.\r
+ // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+ // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+ //\r
+ ConfigRequestHdr = HiiConstructConfigHdr (&mBootMaintGuid, mBootMaintStorageName, Private->BmmDriverHandle);\r
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+ ConfigRequest = AllocateZeroPool (Size);\r
+ ASSERT (ConfigRequest != NULL);\r
+ AllocatedRequest = TRUE;\r
+ UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+ FreePool (ConfigRequestHdr);\r
+ }\r
+\r
+ Status = gHiiConfigRouting->BlockToConfig (\r
+ gHiiConfigRouting,\r
+ ConfigRequest,\r
+ (UINT8 *) &Private->BmmFakeNvData,\r
+ BufferSize,\r
+ Results,\r
+ Progress\r
+ );\r
+ //\r
+ // Free the allocated config request string.\r
+ //\r
+ if (AllocatedRequest) {\r
+ FreePool (ConfigRequest);\r
+ ConfigRequest = NULL;\r
+ }\r
+ //\r
+ // Set Progress string to the original request string.\r
+ //\r
+ if (Request == NULL) {\r
+ *Progress = NULL;\r
+ } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+ *Progress = Request + StrLen (Request);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ This function applies changes in a driver's configuration.\r
+ Input is a Configuration, which has the routing data for this\r
+ driver followed by name / value configuration pairs. The driver\r
+ must apply those pairs to its configurable storage. If the\r
+ driver's configuration is stored in a linear block of data\r
+ and the driver's name / value pairs are in <BlockConfig>\r
+ format, it may use the ConfigToBlock helper function (above) to\r
+ simplify the job. Currently not implemented.\r
+\r
+ @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param[in] Configuration A null-terminated Unicode string in\r
+ <ConfigString> format. \r
+ @param[out] Progress A pointer to a string filled in with the\r
+ offset of the most recent '&' before the\r
+ first failing name / value pair (or the\r
+ beginn ing of the string if the failure\r
+ is in the first name / value pair) or\r
+ the terminating NULL if all was\r
+ successful.\r
+\r
+ @retval EFI_SUCCESS The results have been distributed or are\r
+ awaiting distribution. \r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
+ parts of the results that must be\r
+ stored awaiting possible future\r
+ protocols.\r
+ @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
+ Results parameter would result\r
+ in this type of error.\r
+ @retval EFI_NOT_FOUND Target for the specified routing data\r
+ was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintRouteConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Configuration,\r
+ OUT EFI_STRING *Progress\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
+ BMM_FAKE_NV_DATA *NewBmmData;\r
+ BMM_FAKE_NV_DATA *OldBmmData;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 Index;\r
+ BOOLEAN TerminalAttChange;\r
+ BMM_CALLBACK_DATA *Private; \r
+\r
+ if (Progress == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ *Progress = Configuration;\r
+\r
+ if (Configuration == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Check routing data in <ConfigHdr>.\r
+ // Note: there is no name for Name/Value storage, only GUID will be checked\r
+ //\r
+ if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiHiiConfigRoutingProtocolGuid, \r
+ NULL, \r
+ (VOID **)&ConfigRouting\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Private = BMM_CALLBACK_DATA_FROM_THIS (This); \r
+ //\r
+ // Get Buffer Storage data from EFI variable\r
+ //\r
+ BufferSize = sizeof (BMM_FAKE_NV_DATA);\r
+ OldBmmData = &Private->BmmOldFakeNVData;\r
+ NewBmmData = &Private->BmmFakeNvData;\r
+ //\r
+ // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+ //\r
+ Status = ConfigRouting->ConfigToBlock (\r
+ ConfigRouting,\r
+ Configuration,\r
+ (UINT8 *) NewBmmData,\r
+ &BufferSize,\r
+ Progress\r
+ );\r
+ ASSERT_EFI_ERROR (Status); \r
+ //\r
+ // Compare new and old BMM configuration data and only do action for modified item to \r
+ // avoid setting unnecessary non-volatile variable\r
+ //\r
+\r
+ //\r
+ // Check data which located in BMM main page and save the settings if need\r
+ // \r
+ if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof (NewBmmData->BootNext)) != 0) {\r
+ Status = Var_UpdateBootNext (Private);\r
+ }\r
+\r
+ //\r
+ // Check data which located in Boot Options Menu and save the settings if need\r
+ // \r
+ if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof (NewBmmData->BootOptionDel)) != 0) { \r
+ for (Index = 0; \r
+ ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); \r
+ Index ++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
+ NewBmmData->BootOptionDel[Index] = FALSE;\r
+ NewBmmData->BootOptionDelMark[Index] = FALSE;\r
+ }\r
+\r
+ Var_DelBootOption ();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) {\r
+ Status = Var_UpdateBootOrder (Private);\r
+ }\r
+\r
+ if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
+ Status = gRT->SetVariable(\r
+ L"Timeout",\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof(UINT16),\r
+ &(NewBmmData->BootTimeOut)\r
+ );\r
+ ASSERT_EFI_ERROR(Status);\r
+\r
+ Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
+ }\r
+\r
+ //\r
+ // Check data which located in Driver Options Menu and save the settings if need\r
+ // \r
+ if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, sizeof (NewBmmData->DriverOptionDel)) != 0) { \r
+ for (Index = 0; \r
+ ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); \r
+ Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
+ NewBmmData->DriverOptionDel[Index] = FALSE;\r
+ NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
+ }\r
+ Var_DelDriverOption (); \r
+ }\r
+\r
+ if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
+ Status = Var_UpdateDriverOrder (Private);\r
+ }\r
+\r
+ if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
+ Var_UpdateConMode(Private);\r
+ }\r
+\r
+ TerminalAttChange = FALSE;\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+\r
+ //\r
+ // only need update modified items\r
+ //\r
+ if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\r
+ continue;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ ASSERT (NewMenuEntry != NULL);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
+ ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
+ NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
+ NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
+ ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
+ NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
+ NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
+ ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
+ NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
+ NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index];\r
+ ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
+ NewTerminalContext->Parity = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
+ NewTerminalContext->TerminalType = NewBmmData->COMTerminalType[Index];\r
+ NewTerminalContext->FlowControl = NewBmmData->COMFlowControl[Index];\r
+ ChangeTerminalDevicePath (\r
+ NewTerminalContext->DevicePath,\r
+ FALSE\r
+ );\r
+ TerminalAttChange = TRUE;\r
+ }\r
+ if (TerminalAttChange) {\r
+ Var_UpdateConsoleInpOption ();\r
+ Var_UpdateConsoleOutOption ();\r
+ Var_UpdateErrorOutOption ();\r
+ }\r
+ //\r
+ // Check data which located in Console Options Menu and save the settings if need\r
+ //\r
+ if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+ }\r
+ Var_UpdateConsoleInpOption();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+ }\r
+ Var_UpdateConsoleOutOption();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+ }\r
+ Var_UpdateErrorOutOption();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->BootDescriptionData, OldBmmData->BootDescriptionData, sizeof (NewBmmData->BootDescriptionData)) != 0 ||\r
+ CompareMem (NewBmmData->BootOptionalData, OldBmmData->BootOptionalData, sizeof (NewBmmData->BootOptionalData)) != 0) {\r
+ Status = Var_UpdateBootOption (Private);\r
+ NewBmmData->BootOptionChanged = FALSE;\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ BOpt_GetBootOptions (Private);\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->DriverDescriptionData, OldBmmData->DriverDescriptionData, sizeof (NewBmmData->DriverDescriptionData)) != 0 ||\r
+ CompareMem (NewBmmData->DriverOptionalData, OldBmmData->DriverOptionalData, sizeof (NewBmmData->DriverOptionalData)) != 0) {\r
+ Status = Var_UpdateDriverOption (\r
+ Private,\r
+ Private->BmmHiiHandle,\r
+ NewBmmData->DriverDescriptionData,\r
+ NewBmmData->DriverOptionalData,\r
+ NewBmmData->ForceReconnect\r
+ );\r
+ NewBmmData->DriverOptionChanged = FALSE;\r
+ NewBmmData->ForceReconnect = TRUE;\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ BOpt_GetDriverOptions (Private);\r
+ }\r
+\r
+ //\r
+ // After user do the save action, need to update OldBmmData.\r
+ //\r
+ CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ This function processes the results of changes in configuration.\r
+\r
+\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Action Specifies the type of action taken by the browser.\r
+ @param QuestionId A unique value which is sent to the original exporting driver\r
+ so that it can identify the type of data to expect.\r
+ @param Type The type of value for the question.\r
+ @param Value A pointer to the data being sent to the original exporting driver.\r
+ @param ActionRequest On return, points to the action requested by the callback function.\r
+\r
+ @retval EFI_SUCCESS The callback successfully handled the action.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
+ @retval EFI_DEVICE_ERROR The variable could not be saved.\r
+ @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
+ @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintCallback (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN EFI_BROWSER_ACTION Action,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value,\r
+ OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
+ )\r
+{\r
+ BMM_CALLBACK_DATA *Private;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
+ UINTN OldValue;\r
+ UINTN NewValue;\r
+ UINTN Number;\r
+ UINTN Index;\r
+ EFI_DEVICE_PATH_PROTOCOL * File;\r
+\r
+ if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+ //\r
+ // Do nothing for other UEFI Action. Only do call back when data is changed.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ OldValue = 0;\r
+ NewValue = 0;\r
+ Number = 0;\r
+\r
+ Private = BMM_CALLBACK_DATA_FROM_THIS (This);\r
+ //\r
+ // Retrive uncommitted data from Form Browser\r
+ //\r
+ CurrentFakeNVMap = &Private->BmmFakeNvData;\r
+ HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);\r
+\r
+ if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+ if (Value == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ UpdatePageId (Private, QuestionId);\r
+\r
+ if (QuestionId < FILE_OPTION_OFFSET) {\r
+ if (QuestionId < CONFIG_OPTION_OFFSET) {\r
+ switch (QuestionId) {\r
+ case FORM_BOOT_ADD_ID:\r
+ // Leave BMM and enter FileExplorer. \r
+ ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateBootOptionFromFile, &File);\r
+ break;\r
+\r
+ case FORM_DRV_ADD_FILE_ID:\r
+ // Leave BMM and enter FileExplorer.\r
+ ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) CreateDriverOptionFromFile, &File);\r
+ break;\r
+\r
+ case FORM_DRV_ADD_HANDLE_ID:\r
+ CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);\r
+ UpdateDrvAddHandlePage (Private);\r
+ break;\r
+\r
+ case FORM_BOOT_DEL_ID:\r
+ CleanUpPage (FORM_BOOT_DEL_ID, Private);\r
+ UpdateBootDelPage (Private);\r
+ break;\r
+\r
+ case FORM_BOOT_CHG_ID:\r
+ case FORM_DRV_CHG_ID:\r
+ UpdatePageBody (QuestionId, Private);\r
+ break;\r
+\r
+ case FORM_DRV_DEL_ID:\r
+ CleanUpPage (FORM_DRV_DEL_ID, Private);\r
+ UpdateDrvDelPage (Private);\r
+ break;\r
+\r
+ case FORM_BOOT_NEXT_ID:\r
+ CleanUpPage (FORM_BOOT_NEXT_ID, Private);\r
+ UpdateBootNextPage (Private);\r
+ break;\r
+\r
+ case FORM_TIME_OUT_ID:\r
+ CleanUpPage (FORM_TIME_OUT_ID, Private);\r
+ UpdateTimeOutPage (Private);\r
+ break;\r
+\r
+ case FORM_CON_IN_ID:\r
+ case FORM_CON_OUT_ID:\r
+ case FORM_CON_ERR_ID:\r
+ UpdatePageBody (QuestionId, Private);\r
+ break;\r
+\r
+ case FORM_CON_MODE_ID:\r
+ CleanUpPage (FORM_CON_MODE_ID, Private);\r
+ UpdateConModePage (Private);\r
+ break;\r
+\r
+ case FORM_CON_COM_ID:\r
+ CleanUpPage (FORM_CON_COM_ID, Private);\r
+ UpdateConCOMPage (Private);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < CONSOLE_OPTION_OFFSET)) {\r
+ Index = (UINT16) (QuestionId - TERMINAL_OPTION_OFFSET);\r
+ Private->CurrentTerminal = Index;\r
+\r
+ CleanUpPage (FORM_CON_COM_SETUP_ID, Private);\r
+ UpdateTerminalPage (Private);\r
+\r
+ } else if (QuestionId >= HANDLE_OPTION_OFFSET) {\r
+ Index = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);\r
+\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
+ ASSERT (NewMenuEntry != NULL);\r
+ Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);\r
+\r
+ Private->MenuEntry = NewMenuEntry;\r
+ Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;\r
+\r
+ UpdateDriverAddHandleDescPage (Private);\r
+ }\r
+ }\r
+ if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){\r
+ // Leave BMM and enter FileExplorer.\r
+ ChooseFile( NULL, L".efi", (CHOOSE_HANDLER) BootFromFile, &File);\r
+ }\r
+ } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+ if ((Value == NULL) || (ActionRequest == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT) {\r
+ CurrentFakeNVMap->BootOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
+ CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+ //\r
+ // Discard changes and exit formset\r
+ //\r
+ CurrentFakeNVMap->DriverOptionalData[0] = 0x0000;\r
+ CurrentFakeNVMap->DriverDescriptionData[0] = 0x0000;\r
+ CurrentFakeNVMap->DriverOptionChanged = FALSE;\r
+ CurrentFakeNVMap->ForceReconnect = TRUE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
+ //\r
+ // Discard changes and exit formset\r
+ //\r
+ CurrentFakeNVMap->BootOptionalData[0] = 0x0000;\r
+ CurrentFakeNVMap->BootDescriptionData[0] = 0x0000;\r
+ CurrentFakeNVMap->BootOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION) {\r
+ CurrentFakeNVMap->BootOptionChanged = TRUE;\r
+ } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION) {\r
+ CurrentFakeNVMap->DriverOptionChanged = TRUE;\r
+ } \r
+\r
+ if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ //\r
+ // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ //\r
+ // Means user remove the old check status.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
+ }\r
+ } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+ }\r
+ } else {\r
+ switch (QuestionId) {\r
+ case KEY_VALUE_SAVE_AND_EXIT:\r
+ case KEY_VALUE_NO_SAVE_AND_EXIT:\r
+ if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
+ DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+ }\r
+\r
+ break;\r
+\r
+ case FORM_RESET:\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ return EFI_UNSUPPORTED;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Pass changed uncommitted data back to Form Browser\r
+ //\r
+ HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof (BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Discard all changes done to the BMM pages such as Boot Order change,\r
+ Driver order change.\r
+\r
+ @param Private The BMM context data.\r
+ @param CurrentFakeNVMap The current Fack NV Map.\r
+\r
+**/\r
+VOID\r
+DiscardChangeHandler (\r
+ IN BMM_CALLBACK_DATA *Private,\r
+ IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
+ )\r
+{\r
+ UINT16 Index;\r
+\r
+ switch (Private->BmmPreviousPageId) {\r
+ case FORM_BOOT_CHG_ID:\r
+ CopyMem (CurrentFakeNVMap->BootOptionOrder, Private->BmmOldFakeNVData.BootOptionOrder, sizeof (CurrentFakeNVMap->BootOptionOrder));\r
+ break;\r
+\r
+ case FORM_DRV_CHG_ID:\r
+ CopyMem (CurrentFakeNVMap->DriverOptionOrder, Private->BmmOldFakeNVData.DriverOptionOrder, sizeof (CurrentFakeNVMap->DriverOptionOrder));\r
+ break;\r
+\r
+ case FORM_BOOT_DEL_ID:\r
+ ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])));\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
+ }\r
+ break;\r
+\r
+ case FORM_DRV_DEL_ID:\r
+ ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])));\r
+ for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+ CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
+ }\r
+ break;\r
+\r
+ case FORM_BOOT_NEXT_ID:\r
+ CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;\r
+ break;\r
+\r
+ case FORM_TIME_OUT_ID:\r
+ CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;\r
+ break;\r
+\r
+ case FORM_DRV_ADD_HANDLE_DESC_ID:\r
+ case FORM_DRV_ADD_FILE_ID:\r
+ case FORM_DRV_ADD_HANDLE_ID:\r
+ CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;\r
+ CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+/**\r
+ Create dynamic code for BMM.\r
+\r
+ @param BmmCallbackInfo The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitializeDrivers(\r
+ IN BMM_CALLBACK_DATA *BmmCallbackInfo\r
+ )\r
+{\r
+ EFI_HII_HANDLE HiiHandle;\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
+ UINTN Index; \r
+ EFI_STRING String;\r
+ EFI_STRING_ID Token;\r
+ EFI_STRING_ID TokenHelp; \r
+ EFI_HII_HANDLE *HiiHandles;\r
+ EFI_GUID FormSetGuid;\r
+ CHAR16 *DevicePathStr;\r
+ EFI_STRING_ID DevicePathId;\r
+ EFI_IFR_FORM_SET *Buffer; \r
+ UINTN BufferSize; \r
+ UINT8 ClassGuidNum; \r
+ EFI_GUID *ClassGuid; \r
+ UINTN TempSize;\r
+ UINT8 *Ptr;\r
+ EFI_STATUS Status;\r
+\r
+ TempSize =0;\r
+ BufferSize = 0;\r
+ Buffer = NULL;\r
+\r
+ HiiHandle = BmmCallbackInfo->BmmHiiHandle;\r
+ //\r
+ // Allocate space for creation of UpdateData Buffer\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (StartOpCodeHandle != NULL);\r
+\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (EndOpCodeHandle != NULL);\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the start opcode\r
+ //\r
+ StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartLabel->Number = LABEL_BMM_PLATFORM_INFORMATION;\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the end opcode\r
+ //\r
+ EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndLabel->Number = LABEL_END;\r
+\r
+ //\r
+ // Get all the Hii handles\r
+ //\r
+ HiiHandles = HiiGetHiiHandles (NULL);\r
+ ASSERT (HiiHandles != NULL);\r
+\r
+ //\r
+ // Search for formset of each class type\r
+ //\r
+ for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
+ Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
+\r
+ Ptr = (UINT8 *)Buffer;\r
+ while(TempSize < BufferSize) {\r
+ TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+\r
+ if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
+ Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // Find FormSet OpCode\r
+ //\r
+ ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
+ ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
+ while (ClassGuidNum-- > 0) {\r
+ if (CompareGuid (&gEfiIfrBootMaintenanceGuid, ClassGuid) == 0){\r
+ ClassGuid ++;\r
+ continue;\r
+ }\r
+\r
+ String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL);\r
+ if (String == NULL) {\r
+ String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+ ASSERT (String != NULL);\r
+ }\r
+ Token = HiiSetString (HiiHandle, 0, String, NULL);\r
+ FreePool (String);\r
+\r
+ String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL);\r
+ if (String == NULL) {\r
+ String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
+ ASSERT (String != NULL);\r
+ }\r
+ TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
+ FreePool (String);\r
+\r
+ FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid;\r
+\r
+ DevicePathStr = BmmExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
+ DevicePathId = 0;\r
+ if (DevicePathStr != NULL){\r
+ DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
+ FreePool (DevicePathStr);\r
+ }\r
+ HiiCreateGotoExOpCode (\r
+ StartOpCodeHandle,\r
+ 0,\r
+ Token,\r
+ TokenHelp,\r
+ 0,\r
+ (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),\r
+ 0,\r
+ &FormSetGuid,\r
+ DevicePathId\r
+ );\r
+ break;\r
+ }\r
+ Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
+ }\r
+\r
+ FreePool(Buffer);\r
+ Buffer = NULL;\r
+ TempSize = 0;\r
+ BufferSize = 0;\r
+ } \r
+ \r
+ HiiUpdateForm (\r
+ HiiHandle,\r
+ &mBootMaintGuid,\r
+ FORM_MAIN_ID,\r
+ StartOpCodeHandle,\r
+ EndOpCodeHandle\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+ HiiFreeOpCodeHandle (EndOpCodeHandle); \r
+ FreePool (HiiHandles);\r
+}\r
+\r
+/**\r
+ Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
+ BmmOldFakeNVData member in BMM context data.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitializeBmmConfig (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 Index;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ InitializeDrivers (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in BMM main page\r
+ //\r
+ CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ if (NewLoadContext->IsBootNext) {\r
+ CallbackData->BmmFakeNvData.BootNext = Index;\r
+ break;\r
+ }\r
+ }\r
+\r
+ CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
+\r
+ //\r
+ // Initialize data which located in Boot Options Menu\r
+ //\r
+ GetBootOrder (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in Driver Options Menu\r
+ //\r
+ GetDriverOrder (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in Console Options Menu\r
+ //\r
+ GetConsoleOutMode (CallbackData);\r
+ GetConsoleInCheck (CallbackData);\r
+ GetConsoleOutCheck (CallbackData);\r
+ GetConsoleErrCheck (CallbackData);\r
+ GetTerminalAttribute (CallbackData);\r
+\r
+ CallbackData->BmmFakeNvData.ForceReconnect = TRUE;\r
+\r
+ //\r
+ // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
+ //\r
+ CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
+}\r
+\r
+/**\r
+ Initialized all Menu Option List.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+InitAllMenu (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ InitializeListHead (&BootOptionMenu.Head);\r
+ InitializeListHead (&DriverOptionMenu.Head);\r
+ BOpt_GetBootOptions (CallbackData);\r
+ BOpt_GetDriverOptions (CallbackData);\r
+ BOpt_FindDrivers ();\r
+ InitializeListHead (&ConsoleInpMenu.Head);\r
+ InitializeListHead (&ConsoleOutMenu.Head);\r
+ InitializeListHead (&ConsoleErrMenu.Head);\r
+ InitializeListHead (&TerminalMenu.Head);\r
+ LocateSerialIo ();\r
+ GetAllConsoles ();\r
+ mAllMenuInit = TRUE;\r
+}\r
+\r
+/**\r
+ Free up all Menu Option list.\r
+\r
+**/\r
+VOID\r
+FreeAllMenu (\r
+ VOID\r
+ )\r
+{\r
+ if (!mAllMenuInit){\r
+ return;\r
+ }\r
+ BOpt_FreeMenu (&BootOptionMenu);\r
+ BOpt_FreeMenu (&DriverOptionMenu);\r
+ BOpt_FreeMenu (&DriverMenu);\r
+ FreeAllConsoles ();\r
+ mAllMenuInit = FALSE;\r
+}\r
+\r
+/**\r
+\r
+ Install Boot Maintenance Manager Menu driver.\r
+\r
+ @param ImageHandle The image handle.\r
+ @param SystemTable The system table.\r
+\r
+ @retval EFI_SUCEESS Install Boot manager menu success.\r
+ @retval Other Return error status.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintenanceManagerLibConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+\r
+{\r
+ EFI_STATUS Status;\r
+ UINT8 *Ptr;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // Install Device Path Protocol and Config Access protocol to driver handle\r
+ //\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &mBmmCallbackInfo->BmmDriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mBmmHiiVendorDevicePath,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ &mBmmCallbackInfo->BmmConfigAccess,\r
+ NULL\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Post our Boot Maint VFR binary to the HII database.\r
+ //\r
+ mBmmCallbackInfo->BmmHiiHandle = HiiAddPackages (\r
+ &mBootMaintGuid,\r
+ mBmmCallbackInfo->BmmDriverHandle,\r
+ BootMaintenanceManagerBin,\r
+ BootMaintenanceManagerLibStrings,\r
+ NULL\r
+ );\r
+ ASSERT (mBmmCallbackInfo->BmmHiiHandle != NULL);\r
+\r
+ //\r
+ // Locate Formbrowser2 protocol\r
+ //\r
+ Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mBmmCallbackInfo->FormBrowser2);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ EfiBootManagerRefreshAllBootOption ();\r
+\r
+ //\r
+ // Create LoadOption in BmmCallbackInfo for Driver Callback\r
+ //\r
+ Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));\r
+ ASSERT (Ptr != NULL);\r
+\r
+ //\r
+ // Initialize Bmm callback data.\r
+ //\r
+ mBmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;\r
+ Ptr += sizeof (BM_LOAD_CONTEXT);\r
+\r
+ mBmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;\r
+ Ptr += sizeof (BM_FILE_CONTEXT);\r
+\r
+ mBmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;\r
+ Ptr += sizeof (BM_HANDLE_CONTEXT);\r
+\r
+ mBmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;\r
+\r
+ mBmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
+ mBmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
+\r
+ InitAllMenu (mBmmCallbackInfo);\r
+\r
+ CreateUpdateData();\r
+ //\r
+ // Update boot maintenance manager page \r
+ //\r
+ InitializeBmmConfig(mBmmCallbackInfo);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Unloads the application and its installed protocol.\r
+\r
+ @param ImageHandle Handle that identifies the image to be unloaded.\r
+ @param SystemTable The system table.\r
+\r
+ @retval EFI_SUCCESS The image has been unloaded.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintenanceManagerLibDestructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+\r
+{\r
+ if (mStartOpCodeHandle != NULL) {\r
+ HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
+ }\r
+\r
+ if (mEndOpCodeHandle != NULL) {\r
+ HiiFreeOpCodeHandle (mEndOpCodeHandle);\r
+ }\r
+\r
+ FreeAllMenu ();\r
+\r
+ //\r
+ // Remove our IFR data from HII database\r
+ //\r
+ HiiRemovePackages (mBmmCallbackInfo->BmmHiiHandle);\r
+\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ mBmmCallbackInfo->BmmDriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mBmmHiiVendorDevicePath,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ &mBmmCallbackInfo->BmmConfigAccess,\r
+ NULL\r
+ );\r
+\r
+ FreePool (mBmmCallbackInfo->LoadContext);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
--- /dev/null
+/** @file\r
+Header file for boot maintenance module.\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _BOOT_MAINT_H_\r
+#define _BOOT_MAINT_H_\r
+\r
+#include "FormGuid.h"\r
+\r
+#include <Guid/TtyTerm.h>\r
+#include <Guid/MdeModuleHii.h>\r
+#include <Guid/FileSystemVolumeLabelInfo.h>\r
+#include <Guid/GlobalVariable.h>\r
+#include <Guid/HiiBootMaintenanceFormset.h>\r
+\r
+#include <Protocol/LoadFile.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/SimpleFileSystem.h>\r
+#include <Protocol/SerialIo.h>\r
+#include <Protocol/DevicePathToText.h>\r
+\r
+#include <Library/PrintLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/HiiLib.h>\r
+#include <Library/UefiHiiServicesLib.h>\r
+#include <Library/UefiBootManagerLib.h>\r
+#include <Library/FileExplorerLib.h>\r
+\r
+#pragma pack(1)\r
+\r
+///\r
+/// HII specific Vendor Device Path definition.\r
+///\r
+typedef struct {\r
+ VENDOR_DEVICE_PATH VendorDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+#pragma pack()\r
+\r
+//\r
+// Constants which are variable names used to access variables\r
+//\r
+\r
+#define VAR_CON_OUT_MODE L"ConOutMode"\r
+\r
+//\r
+// Variable created with this flag will be "Efi:...."\r
+//\r
+#define VAR_FLAG EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
+\r
+extern EFI_GUID mBootMaintGuid;\r
+extern CHAR16 mBootMaintStorageName[];\r
+//\r
+// These are the VFR compiler generated data representing our VFR data.\r
+//\r
+extern UINT8 BootMaintenanceManagerBin[];\r
+\r
+//\r
+// Below are the number of options in Baudrate, Databits,\r
+// Parity and Stopbits selection for serial ports.\r
+//\r
+#define BM_COM_ATTR_BUADRATE 19\r
+#define BM_COM_ATTR_DATABITS 4\r
+#define BM_COM_ATTR_PARITY 5\r
+#define BM_COM_ATTR_STOPBITS 3\r
+\r
+//\r
+// Callback function helper\r
+//\r
+#define BMM_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('C', 'b', 'c', 'k')\r
+#define BMM_CALLBACK_DATA_FROM_THIS(a) CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
+\r
+//\r
+// Enumeration type definition\r
+//\r
+typedef UINT8 BBS_TYPE;\r
+\r
+typedef enum _TYPE_OF_TERMINAL {\r
+ TerminalTypePcAnsi = 0,\r
+ TerminalTypeVt100,\r
+ TerminalTypeVt100Plus,\r
+ TerminalTypeVtUtf8,\r
+ TerminalTypeTtyTerm\r
+} TYPE_OF_TERMINAL;\r
+\r
+//\r
+// All of the signatures that will be used in list structure\r
+//\r
+#define BM_MENU_OPTION_SIGNATURE SIGNATURE_32 ('m', 'e', 'n', 'u')\r
+#define BM_LOAD_OPTION_SIGNATURE SIGNATURE_32 ('l', 'o', 'a', 'd')\r
+#define BM_CONSOLE_OPTION_SIGNATURE SIGNATURE_32 ('c', 'n', 's', 'l')\r
+#define BM_FILE_OPTION_SIGNATURE SIGNATURE_32 ('f', 'i', 'l', 'e')\r
+#define BM_HANDLE_OPTION_SIGNATURE SIGNATURE_32 ('h', 'n', 'd', 'l')\r
+#define BM_TERMINAL_OPTION_SIGNATURE SIGNATURE_32 ('t', 'r', 'm', 'l')\r
+#define BM_MENU_ENTRY_SIGNATURE SIGNATURE_32 ('e', 'n', 't', 'r')\r
+\r
+#define BM_LOAD_CONTEXT_SELECT 0x0\r
+#define BM_CONSOLE_CONTEXT_SELECT 0x1\r
+#define BM_FILE_CONTEXT_SELECT 0x2\r
+#define BM_HANDLE_CONTEXT_SELECT 0x3\r
+#define BM_TERMINAL_CONTEXT_SELECT 0x5\r
+\r
+#define BM_CONSOLE_IN_CONTEXT_SELECT 0x6\r
+#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
+#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
+\r
+//\r
+// Buffer size for update data\r
+//\r
+#define UPDATE_DATA_SIZE 0x100000\r
+\r
+//\r
+// Namespace of callback keys used in display and file system navigation\r
+//\r
+#define MAX_BBS_OFFSET 0xE000\r
+#define NET_OPTION_OFFSET 0xD800\r
+#define BEV_OPTION_OFFSET 0xD000\r
+#define FD_OPTION_OFFSET 0xC000\r
+#define HD_OPTION_OFFSET 0xB000\r
+#define CD_OPTION_OFFSET 0xA000\r
+#define FILE_OPTION_OFFSET 0x8000\r
+#define FILE_OPTION_MASK 0x7FFF\r
+#define HANDLE_OPTION_OFFSET 0x7000\r
+#define CONSOLE_OPTION_OFFSET 0x6000\r
+#define TERMINAL_OPTION_OFFSET 0x5000\r
+#define CONFIG_OPTION_OFFSET 0x1200\r
+#define KEY_VALUE_OFFSET 0x1100\r
+#define FORM_ID_OFFSET 0x1000\r
+\r
+//\r
+// VarOffset that will be used to create question\r
+// all these values are computed from the structure\r
+// defined below\r
+//\r
+#define VAR_OFFSET(Field) ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))\r
+\r
+//\r
+// Question Id of Zero is invalid, so add an offset to it\r
+//\r
+#define QUESTION_ID(Field) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)\r
+\r
+#define BOOT_TIME_OUT_VAR_OFFSET VAR_OFFSET (BootTimeOut)\r
+#define BOOT_NEXT_VAR_OFFSET VAR_OFFSET (BootNext)\r
+#define COM1_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM1BaudRate)\r
+#define COM1_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM1DataRate)\r
+#define COM1_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM1StopBits)\r
+#define COM1_PARITY_VAR_OFFSET VAR_OFFSET (COM1Parity)\r
+#define COM1_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)\r
+#define COM2_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COM2BaudRate)\r
+#define COM2_DATA_RATE_VAR_OFFSET VAR_OFFSET (COM2DataRate)\r
+#define COM2_STOP_BITS_VAR_OFFSET VAR_OFFSET (COM2StopBits)\r
+#define COM2_PARITY_VAR_OFFSET VAR_OFFSET (COM2Parity)\r
+#define COM2_TERMINAL_VAR_OFFSET VAR_OFFSET (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_VAR_OFFSET VAR_OFFSET (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_VAR_OFFSET VAR_OFFSET (DriverAddActive)\r
+#define DRV_ADD_RECON_VAR_OFFSET VAR_OFFSET (DriverAddForceReconnect)\r
+#define CON_IN_COM1_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM1)\r
+#define CON_IN_COM2_VAR_OFFSET VAR_OFFSET (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_VAR_OFFSET VAR_OFFSET (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM2)\r
+#define CON_MODE_VAR_OFFSET VAR_OFFSET (ConsoleOutMode)\r
+#define CON_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleCheck)\r
+#define CON_IN_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleErrCheck)\r
+#define BOOT_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_VAR_OFFSET VAR_OFFSET (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_VAR_OFFSET VAR_OFFSET (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_VAR_OFFSET VAR_OFFSET (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_VAR_OFFSET VAR_OFFSET (COMBaudRate)\r
+#define COM_DATA_RATE_VAR_OFFSET VAR_OFFSET (COMDataRate)\r
+#define COM_STOP_BITS_VAR_OFFSET VAR_OFFSET (COMStopBits)\r
+#define COM_PARITY_VAR_OFFSET VAR_OFFSET (COMParity)\r
+#define COM_TERMINAL_VAR_OFFSET VAR_OFFSET (COMTerminalType)\r
+#define COM_FLOWCONTROL_VAR_OFFSET VAR_OFFSET (COMFlowControl)\r
+\r
+#define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut)\r
+#define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext)\r
+#define COM1_BAUD_RATE_QUESTION_ID QUESTION_ID (COM1BaudRate)\r
+#define COM1_DATA_RATE_QUESTION_ID QUESTION_ID (COM1DataRate)\r
+#define COM1_STOP_BITS_QUESTION_ID QUESTION_ID (COM1StopBits)\r
+#define COM1_PARITY_QUESTION_ID QUESTION_ID (COM1Parity)\r
+#define COM1_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
+#define COM2_BAUD_RATE_QUESTION_ID QUESTION_ID (COM2BaudRate)\r
+#define COM2_DATA_RATE_QUESTION_ID QUESTION_ID (COM2DataRate)\r
+#define COM2_STOP_BITS_QUESTION_ID QUESTION_ID (COM2StopBits)\r
+#define COM2_PARITY_QUESTION_ID QUESTION_ID (COM2Parity)\r
+#define COM2_TERMINAL_QUESTION_ID QUESTION_ID (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_QUESTION_ID QUESTION_ID (DriverAddActive)\r
+#define DRV_ADD_RECON_QUESTION_ID QUESTION_ID (DriverAddForceReconnect)\r
+#define CON_IN_COM1_QUESTION_ID QUESTION_ID (ConsoleInputCOM1)\r
+#define CON_IN_COM2_QUESTION_ID QUESTION_ID (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_QUESTION_ID QUESTION_ID (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_QUESTION_ID QUESTION_ID (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_QUESTION_ID QUESTION_ID (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2)\r
+#define CON_MODE_QUESTION_ID QUESTION_ID (ConsoleOutMode)\r
+#define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck)\r
+#define CON_IN_DEVICE_QUESTION_ID QUESTION_ID (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_QUESTION_ID QUESTION_ID (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_QUESTION_ID QUESTION_ID (ConsoleErrCheck)\r
+#define BOOT_OPTION_ORDER_QUESTION_ID QUESTION_ID (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_QUESTION_ID QUESTION_ID (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_QUESTION_ID QUESTION_ID (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_QUESTION_ID QUESTION_ID (COMBaudRate)\r
+#define COM_DATA_RATE_QUESTION_ID QUESTION_ID (COMDataRate)\r
+#define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits)\r
+#define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity)\r
+#define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType)\r
+#define COM_FLOWCONTROL_QUESTION_ID QUESTION_ID (COMFlowControl)\r
+\r
+#define STRING_DEPOSITORY_NUMBER 8\r
+\r
+#define NONE_BOOTNEXT_VALUE (0xFFFF + 1)\r
+\r
+///\r
+/// Serial Ports attributes, first one is the value for\r
+/// return from callback function, stringtoken is used to\r
+/// display the value properly\r
+///\r
+typedef struct {\r
+ UINTN Value;\r
+ UINT16 StringToken;\r
+} COM_ATTR;\r
+\r
+typedef struct {\r
+ UINT64 BaudRate;\r
+ UINT8 DataBits;\r
+ UINT8 Parity;\r
+ UINT8 StopBits;\r
+\r
+ UINT8 BaudRateIndex;\r
+ UINT8 DataBitsIndex;\r
+ UINT8 ParityIndex;\r
+ UINT8 StopBitsIndex;\r
+\r
+ UINT8 FlowControl;\r
+\r
+ UINT8 IsConIn;\r
+ UINT8 IsConOut;\r
+ UINT8 IsStdErr;\r
+ UINT8 TerminalType;\r
+\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+} BM_TERMINAL_CONTEXT;\r
+\r
+typedef struct {\r
+ BOOLEAN IsBootNext;\r
+ BOOLEAN LoadOptionModified;\r
+ BOOLEAN Deleted;\r
+\r
+ BOOLEAN IsLegacy;\r
+ BOOLEAN IsActive;\r
+ BOOLEAN ForceReconnect;\r
+ UINTN OptionalDataSize;\r
+\r
+ UINTN LoadOptionSize;\r
+ UINT8 *LoadOption;\r
+\r
+ UINT32 Attributes;\r
+ UINT16 FilePathListLength;\r
+ UINT16 *Description;\r
+ EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
+ UINT8 *OptionalData;\r
+\r
+ UINT16 BbsIndex;\r
+} BM_LOAD_CONTEXT;\r
+\r
+typedef struct {\r
+\r
+ BOOLEAN IsActive;\r
+\r
+ BOOLEAN IsTerminal;\r
+\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+} BM_CONSOLE_CONTEXT;\r
+\r
+typedef struct {\r
+ UINTN Column;\r
+ UINTN Row;\r
+} CONSOLE_OUT_MODE;\r
+\r
+typedef struct {\r
+ EFI_HANDLE Handle;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_FILE_HANDLE FHandle;\r
+ UINT16 *FileName;\r
+ EFI_FILE_SYSTEM_VOLUME_LABEL *Info;\r
+\r
+ BOOLEAN IsRoot;\r
+ BOOLEAN IsDir;\r
+ BOOLEAN IsRemovableMedia;\r
+ BOOLEAN IsLoadFile;\r
+ BOOLEAN IsBootLegacy;\r
+} BM_FILE_CONTEXT;\r
+\r
+typedef struct {\r
+ EFI_HANDLE Handle;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+} BM_HANDLE_CONTEXT;\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ LIST_ENTRY Head;\r
+ UINTN MenuNumber;\r
+} BM_MENU_OPTION;\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+ LIST_ENTRY Link;\r
+ UINTN OptionNumber;\r
+ UINT16 *DisplayString;\r
+ UINT16 *HelpString;\r
+ EFI_STRING_ID DisplayStringToken;\r
+ EFI_STRING_ID HelpStringToken;\r
+ UINTN ContextSelection;\r
+ VOID *VariableContext;\r
+} BM_MENU_ENTRY;\r
+\r
+typedef struct {\r
+ \r
+ UINTN Signature;\r
+\r
+ EFI_HII_HANDLE BmmHiiHandle;\r
+ EFI_HANDLE BmmDriverHandle;\r
+ ///\r
+ /// Boot Maintenance Manager Produced protocols\r
+ ///\r
+ EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;\r
+ EFI_FORM_BROWSER2_PROTOCOL *FormBrowser2;\r
+\r
+ BM_MENU_ENTRY *MenuEntry;\r
+ BM_HANDLE_CONTEXT *HandleContext;\r
+ BM_FILE_CONTEXT *FileContext;\r
+ BM_LOAD_CONTEXT *LoadContext;\r
+ BM_TERMINAL_CONTEXT *TerminalContext;\r
+ UINTN CurrentTerminal;\r
+ BBS_TYPE BbsType;\r
+\r
+ //\r
+ // BMM main formset callback data.\r
+ //\r
+ \r
+ EFI_FORM_ID BmmCurrentPageId;\r
+ EFI_FORM_ID BmmPreviousPageId;\r
+ BOOLEAN BmmAskSaveOrNot;\r
+ BMM_FAKE_NV_DATA BmmFakeNvData;\r
+ BMM_FAKE_NV_DATA BmmOldFakeNVData;\r
+\r
+} BMM_CALLBACK_DATA;\r
+\r
+/**\r
+\r
+ Find drivers that will be added as Driver#### variables from handles\r
+ in current system environment\r
+ All valid handles in the system except those consume SimpleFs, LoadFile\r
+ are stored in DriverMenu for future use.\r
+\r
+ @retval EFI_SUCCESS The function complets successfully.\r
+ @return Other value if failed to build the DriverMenu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindDrivers (\r
+ VOID\r
+ );\r
+\r
+/**\r
+\r
+ Build the BootOptionMenu according to BootOrder Variable.\r
+ This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @return The number of the Var Boot####.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetBootOptions (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Build up all DriverOptionMenu\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @return EFI_SUCESS The functin completes successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
+ \r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetDriverOptions (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Free resources allocated in Allocate Rountine.\r
+\r
+ @param FreeMenu Menu to be freed\r
+\r
+**/\r
+VOID\r
+BOpt_FreeMenu (\r
+ BM_MENU_OPTION *FreeMenu\r
+ );\r
+\r
+/**\r
+\r
+ Get the Option Number that has not been allocated for use.\r
+\r
+ @param Type The type of Option.\r
+\r
+ @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetOptionNumber (\r
+ CHAR16 *Type\r
+ );\r
+\r
+/**\r
+\r
+ Get the Option Number for Boot#### that does not used.\r
+\r
+ @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetBootOptionNumber (\r
+ VOID\r
+ );\r
+\r
+/**\r
+\r
+Get the Option Number for Driver#### that does not used.\r
+\r
+@return The unused Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetDriverOptionNumber (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Create a menu entry give a Menu type.\r
+\r
+ @param MenuType The Menu type to be created.\r
+\r
+\r
+ @retval NULL If failed to create the menu.\r
+ @return The menu.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_CreateMenuEntry (\r
+ UINTN MenuType\r
+ );\r
+\r
+/**\r
+ Free up all resource allocated for a BM_MENU_ENTRY.\r
+\r
+ @param MenuEntry A pointer to BM_MENU_ENTRY.\r
+\r
+**/\r
+VOID\r
+BOpt_DestroyMenuEntry (\r
+ BM_MENU_ENTRY *MenuEntry\r
+ );\r
+\r
+/**\r
+ Get the Menu Entry from the list in Menu Entry List.\r
+\r
+ If MenuNumber is great or equal to the number of Menu\r
+ Entry in the list, then ASSERT.\r
+\r
+ @param MenuOption The Menu Entry List to read the menu entry.\r
+ @param MenuNumber The index of Menu Entry.\r
+\r
+ @return The Menu Entry.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_GetMenuEntry (\r
+ BM_MENU_OPTION *MenuOption,\r
+ UINTN MenuNumber\r
+ );\r
+\r
+/**\r
+ Get option number according to Boot#### and BootOrder variable. \r
+ The value is saved as #### + 1.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID \r
+GetBootOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Get driver option order from globalc DriverOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+ \r
+**/\r
+VOID \r
+GetDriverOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+//\r
+// Locate all serial io devices for console\r
+//\r
+/**\r
+ Build a list containing all serial devices.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_UNSUPPORTED No serial ports present.\r
+\r
+**/\r
+EFI_STATUS\r
+LocateSerialIo (\r
+ VOID\r
+ );\r
+\r
+//\r
+// Initializing Console menu\r
+//\r
+/**\r
+ Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+ @retval EFI_SUCCESS The function always complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetAllConsoles(\r
+ VOID\r
+ );\r
+\r
+//\r
+// Get current mode information\r
+//\r
+/**\r
+ Get mode number according to column and row\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+GetConsoleOutMode (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+//\r
+// Cleaning up console menu\r
+//\r
+/**\r
+ Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+ @retval EFI_SUCCESS The function always complete successfully.\r
+**/\r
+EFI_STATUS\r
+FreeAllConsoles (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Update the device path that describing a terminal device\r
+ based on the new BaudRate, Data Bits, parity and Stop Bits\r
+ set.\r
+\r
+ @param DevicePath The devicepath protocol instance wanted to be updated.\r
+\r
+**/\r
+VOID\r
+ChangeVariableDevicePath (\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ Update the multi-instance device path of Terminal Device based on\r
+ the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
+ device path in the Terminal Device in TerminalMenu is also updated.\r
+\r
+ @param DevicePath The multi-instance device path.\r
+ @param ChangeTerminal TRUE, then device path in the Terminal Device \r
+ in TerminalMenu is also updated; FALSE, no update.\r
+\r
+ @return EFI_SUCCESS The function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ChangeTerminalDevicePath (\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN BOOLEAN ChangeTerminal\r
+ );\r
+\r
+//\r
+// Variable operation by menu selection\r
+//\r
+/**\r
+ This function create a currently loaded Boot Option from \r
+ the BMM. It then appends this Boot Option to the end of \r
+ the "BootOrder" list. It also append this Boot Opotion to the end\r
+ of BootOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+ @retval EFI_SUCCESS If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOption (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
+ After deleting this boot option, call Var_ChangeBootOrder to\r
+ make sure BootOrder is in valid state.\r
+\r
+ @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to \r
+ BM_LOAD_CONTEXT marked for deletion is deleted\r
+ @return Others If failed to update the "BootOrder" variable after deletion. \r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelBootOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ After any operation on Boot####, there will be a discrepancy in BootOrder.\r
+ Since some are missing but in BootOrder, while some are present but are\r
+ not reflected by BootOrder. Then a function rebuild BootOrder from\r
+ scratch by content from BootOptionMenu is needed.\r
+\r
+ @retval EFI_SUCCESS The boot order is updated successfully.\r
+ @return other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeBootOrder (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function create a currently loaded Drive Option from \r
+ the BMM. It then appends this Driver Option to the end of \r
+ the "DriverOrder" list. It append this Driver Opotion to the end\r
+ of DriverOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+ @param HiiHandle The HII handle associated with the BMM formset.\r
+ @param DescriptionData The description of this driver option.\r
+ @param OptionalData The optional load option.\r
+ @param ForceReconnect If to force reconnect.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+ @retval EFI_SUCCESS If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOption (\r
+ IN BMM_CALLBACK_DATA *CallbackData,\r
+ IN EFI_HII_HANDLE HiiHandle,\r
+ IN UINT16 *DescriptionData,\r
+ IN UINT16 *OptionalData,\r
+ IN UINT8 ForceReconnect\r
+ );\r
+\r
+/**\r
+ Delete Load Option that represent a Deleted state in BootOptionMenu.\r
+ After deleting this Driver option, call Var_ChangeDriverOrder to\r
+ make sure DriverOrder is in valid state.\r
+\r
+ @retval EFI_SUCCESS Load Option is successfully updated.\r
+ @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
+ Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelDriverOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ After any operation on Driver####, there will be a discrepancy in\r
+ DriverOrder. Since some are missing but in DriverOrder, while some\r
+ are present but are not reflected by DriverOrder. Then a function\r
+ rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
+ needed.\r
+\r
+ @retval EFI_SUCCESS The driver order is updated successfully.\r
+ @return other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeDriverOrder (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function delete and build multi-instance device path ConIn\r
+ console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleInpOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function delete and build multi-instance device path ConOut console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOutOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function delete and build multi-instance device path ErrOut console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateErrorOutOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function delete and build Out of Band console device.\r
+ \r
+ @param MenuIndex Menu index which user select in the terminal menu list.\r
+ \r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information. \r
+**/\r
+EFI_STATUS\r
+Var_UpdateOutOfBandOption (\r
+ IN UINT16 MenuIndex\r
+ );\r
+\r
+/**\r
+ Update the device path of "ConOut", "ConIn" and "ErrOut" based on the new BaudRate, Data Bits, \r
+ parity and stop Bits set.\r
+\r
+**/\r
+VOID\r
+Var_UpdateAllConsoleOption (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM, \r
+ this EFI Variable is deleted.\r
+ It also update the BMM context data specified the "BootNext" value.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootNext (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh \r
+ BootOptionMenu with the new "BootOrder" list.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
+ @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ This function update the "DriverOrder" EFI Variable based on\r
+ BMM Formset's NV map. It then refresh DriverOptionMenu\r
+ with the new "DriverOrder" list.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Update the Text Mode of Console.\r
+\r
+ @param CallbackData The context data for BMM.\r
+\r
+ @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
+ @return Other value if the Text Mode of Console is not updated.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConMode (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+//\r
+// Following are page create and refresh functions\r
+//\r
+/**\r
+ Create the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+CreateUpdateData (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Refresh the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+RefreshUpdateData (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Clean up the dynamic opcode at label and form specified by\r
+ both LabelId. \r
+\r
+ @param LabelId It is both the Form ID and Label ID for\r
+ opcode deletion.\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+CleanUpPage (\r
+ IN UINT16 LabelId,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create a lit of boot option from global BootOptionMenu. It\r
+ allow user to delete the boot option.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootDelPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create a lit of driver option from global DriverMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvAddHandlePage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create a lit of driver option from global DriverOptionMenu. It\r
+ allow user to delete the driver option.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvDelPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Prepare the page to allow user to add description for a Driver Option.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateDriverAddHandleDescPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Dispatch the correct update page function to call based on the UpdatePageId.\r
+\r
+ @param UpdatePageId The form ID.\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdatePageBody (\r
+ IN UINT16 UpdatePageId,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create the dynamic page to allow user to set the "BootNext" vaule.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateBootNextPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create the dynamic page to allow user to set the "TimeOut" vaule.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateTimeOutPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
+ Parity, Stop Bits, Terminal Type.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateTerminalPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Refresh the text mode page\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateConModePage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Create a list of Goto Opcode for all terminal devices logged\r
+ by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateConCOMPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ Update add boot/driver option page.\r
+\r
+ @param CallbackData The BMM context data.\r
+ @param FormId The form ID to be updated.\r
+ @param DevicePath Device path.\r
+\r
+**/\r
+VOID\r
+UpdateOptionPage(\r
+ IN BMM_CALLBACK_DATA *CallbackData,\r
+ IN EFI_FORM_ID FormId,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ Function deletes the variable specified by VarName and VarGuid.\r
+\r
+\r
+ @param VarName A Null-terminated Unicode string that is\r
+ the name of the vendor's variable.\r
+ \r
+ @param VarGuid A unique identifier for the vendor.\r
+\r
+ @retval EFI_SUCCESS The variable was found and removed\r
+ @retval EFI_UNSUPPORTED The variable store was inaccessible\r
+ @retval EFI_OUT_OF_RESOURCES The temporary buffer was not available\r
+ @retval EFI_NOT_FOUND The variable was not found\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibDeleteVariable (\r
+ IN CHAR16 *VarName,\r
+ IN EFI_GUID *VarGuid\r
+ );\r
+\r
+/**\r
+ Function is used to determine the number of device path instances\r
+ that exist in a device path.\r
+\r
+\r
+ @param DevicePath A pointer to a device path data structure.\r
+\r
+ @return This function counts and returns the number of device path instances\r
+ in DevicePath.\r
+\r
+**/\r
+UINTN\r
+EfiDevicePathInstanceCount (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ Get a string from the Data Hub record based on \r
+ a device path.\r
+\r
+ @param DevPath The device Path.\r
+\r
+ @return A string located from the Data Hub records based on\r
+ the device path.\r
+ @retval NULL If failed to get the String from Data Hub.\r
+\r
+**/\r
+UINT16 *\r
+EfiLibStrFromDatahub (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
+ );\r
+\r
+/**\r
+ Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
+ specified by DeviceType.\r
+\r
+ @param DeviceType The legacy device type. It can be floppy, network, harddisk, cdrom,\r
+ etc.\r
+ @param OptionIndex Returns the index number (#### in Boot####).\r
+ @param OptionSize Return the size of the Boot### variable.\r
+\r
+**/\r
+VOID *\r
+GetLegacyBootOptionVar (\r
+ IN UINTN DeviceType,\r
+ OUT UINTN *OptionIndex,\r
+ OUT UINTN *OptionSize\r
+ );\r
+\r
+/**\r
+ Discard all changes done to the BMM pages such as Boot Order change,\r
+ Driver order change.\r
+\r
+ @param Private The BMM context data.\r
+ @param CurrentFakeNVMap The current Fack NV Map.\r
+\r
+**/\r
+VOID\r
+DiscardChangeHandler (\r
+ IN BMM_CALLBACK_DATA *Private,\r
+ IN BMM_FAKE_NV_DATA *CurrentFakeNVMap\r
+ );\r
+\r
+/**\r
+ Dispatch the display to the next page based on NewPageId.\r
+\r
+ @param Private The BMM context data.\r
+ @param NewPageId The original page ID.\r
+\r
+**/\r
+VOID\r
+UpdatePageId (\r
+ BMM_CALLBACK_DATA *Private,\r
+ UINT16 NewPageId\r
+ );\r
+\r
+/**\r
+ Remove the installed BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+FreeBMPackage(\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Install BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+InitBootMaintenance(\r
+ VOID\r
+ );\r
+\r
+/**\r
+\r
+ Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleInCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+GetConsoleOutCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID\r
+GetConsoleErrCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+ to BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+GetTerminalAttribute (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+ This function will change video resolution and text mode\r
+ according to defined setup mode or defined boot mode \r
+\r
+ @param IsSetupMode Indicate mode is changed to setup mode or boot mode. \r
+\r
+ @retval EFI_SUCCESS Mode is changed successfully.\r
+ @retval Others Mode failed to be changed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BmmBdsSetConsoleMode (\r
+ BOOLEAN IsSetupMode\r
+ );\r
+\r
+\r
+/**\r
+ This function converts an input device structure to a Unicode string.\r
+\r
+ @param DevPath A pointer to the device path structure.\r
+\r
+ @return A new allocated Unicode string that represents the device path.\r
+\r
+**/\r
+CHAR16 *\r
+UiDevicePathToStr (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevPath\r
+ );\r
+\r
+/**\r
+ Extract filename from device path. The returned buffer is allocated using AllocateCopyPool.\r
+ The caller is responsible for freeing the allocated buffer using FreePool().\r
+\r
+ @param DevicePath Device path.\r
+\r
+ @return A new allocated string that represents the file name.\r
+\r
+**/\r
+CHAR16 *\r
+ExtractFileNameFromDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ This function allows a caller to extract the current configuration for one\r
+ or more named elements from the target driver.\r
+\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Request A null-terminated Unicode string in <ConfigRequest> format.\r
+ @param Progress On return, points to a character in the Request string.\r
+ Points to the string's null terminator if request was successful.\r
+ Points to the most recent '&' before the first failing name/value\r
+ pair (or the beginning of the string if the failure is in the\r
+ first name/value pair) if the request was not successful.\r
+ @param Results A null-terminated Unicode string in <ConfigAltResp> format which\r
+ has all values filled in for the names in the Request string.\r
+ String to be allocated by the called function.\r
+\r
+ @retval EFI_SUCCESS The Results is filled with the requested values.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
+ @retval EFI_INVALID_PARAMETER Request is NULL, illegal syntax, or unknown name.\r
+ @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintExtractConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Request,\r
+ OUT EFI_STRING *Progress,\r
+ OUT EFI_STRING *Results\r
+ );\r
+\r
+/**\r
+ This function applies changes in a driver's configuration.\r
+ Input is a Configuration, which has the routing data for this\r
+ driver followed by name / value configuration pairs. The driver\r
+ must apply those pairs to its configurable storage. If the\r
+ driver's configuration is stored in a linear block of data\r
+ and the driver's name / value pairs are in <BlockConfig>\r
+ format, it may use the ConfigToBlock helper function (above) to\r
+ simplify the job. Currently not implemented.\r
+\r
+ @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param[in] Configuration A null-terminated Unicode string in\r
+ <ConfigString> format. \r
+ @param[out] Progress A pointer to a string filled in with the\r
+ offset of the most recent '&' before the\r
+ first failing name / value pair (or the\r
+ beginn ing of the string if the failure\r
+ is in the first name / value pair) or\r
+ the terminating NULL if all was\r
+ successful.\r
+\r
+ @retval EFI_SUCCESS The results have been distributed or are\r
+ awaiting distribution. \r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
+ parts of the results that must be\r
+ stored awaiting possible future\r
+ protocols.\r
+ @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
+ Results parameter would result\r
+ in this type of error.\r
+ @retval EFI_NOT_FOUND Target for the specified routing data\r
+ was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintRouteConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Configuration,\r
+ OUT EFI_STRING *Progress\r
+ );\r
+\r
+/**\r
+ This function processes the results of changes in configuration.\r
+\r
+\r
+ @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param Action Specifies the type of action taken by the browser.\r
+ @param QuestionId A unique value which is sent to the original exporting driver\r
+ so that it can identify the type of data to expect.\r
+ @param Type The type of value for the question.\r
+ @param Value A pointer to the data being sent to the original exporting driver.\r
+ @param ActionRequest On return, points to the action requested by the callback function.\r
+\r
+ @retval EFI_SUCCESS The callback successfully handled the action.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the variable and its data.\r
+ @retval EFI_DEVICE_ERROR The variable could not be saved.\r
+ @retval EFI_UNSUPPORTED The specified Action is not supported by the callback.\r
+ @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is invalid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+BootMaintCallback (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN EFI_BROWSER_ACTION Action,\r
+ IN EFI_QUESTION_ID QuestionId,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE *Value,\r
+ OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
+ );\r
+\r
+/**\r
+ Create boot option base on the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+\r
+**/\r
+BOOLEAN \r
+CreateBootOptionFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ );\r
+\r
+/**\r
+ Create driver option base on the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+**/\r
+BOOLEAN \r
+CreateDriverOptionFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ );\r
+\r
+/**\r
+ Boot the file specified by the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+ \r
+**/\r
+BOOLEAN \r
+BootFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ );\r
+\r
+//\r
+// Global variable in this program (defined in data.c)\r
+//\r
+extern BM_MENU_OPTION BootOptionMenu;\r
+extern BM_MENU_OPTION DriverOptionMenu;\r
+extern BM_MENU_OPTION ConsoleInpMenu;\r
+extern BM_MENU_OPTION ConsoleOutMenu;\r
+extern BM_MENU_OPTION ConsoleErrMenu;\r
+extern BM_MENU_OPTION DriverMenu;\r
+extern BM_MENU_OPTION TerminalMenu;\r
+extern UINT16 TerminalType[5];\r
+extern COM_ATTR BaudRateList[19];\r
+extern COM_ATTR DataBitsList[4];\r
+extern COM_ATTR ParityList[5];\r
+extern COM_ATTR StopBitsList[3];\r
+extern EFI_GUID TerminalTypeGuid[5];\r
+extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];\r
+extern UINT16 mFlowControlType[2];\r
+extern UINT32 mFlowControlValue[2];\r
+\r
+//\r
+// Shared IFR form update data\r
+//\r
+extern VOID *mStartOpCodeHandle;\r
+extern VOID *mEndOpCodeHandle;\r
+extern EFI_IFR_GUID_LABEL *mStartLabel;\r
+extern EFI_IFR_GUID_LABEL *mEndLabel;\r
+extern BMM_CALLBACK_DATA gBootMaintenancePrivate;\r
+extern BMM_CALLBACK_DATA *mBmmCallbackInfo;\r
+\r
+#endif\r
--- /dev/null
+///** @file\r
+// Boot Maintenance Utility Formset\r
+//\r
+// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+// This program and the accompanying materials\r
+// are licensed and made available under the terms and conditions of the BSD License\r
+// which accompanies this distribution. The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php\r
+// \r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+// \r
+//**/\r
+\r
+#include "FormGuid.h"\r
+\r
+formset\r
+ guid = BOOT_MAINT_FORMSET_GUID,\r
+ title = STRING_TOKEN(STR_FORM_MAIN_TITLE),\r
+ help = STRING_TOKEN(STR_BOOT_MAINT_MANAGER_HELP),\r
+ classguid = gEfiIfrFrontPageGuid,\r
+\r
+ varstore BMM_FAKE_NV_DATA,\r
+ varid = VARSTORE_ID_BOOT_MAINT,\r
+ name = BmmData,\r
+ guid = BOOT_MAINT_FORMSET_GUID;\r
+\r
+ form formid = FORM_MAIN_ID,\r
+ title = STRING_TOKEN(STR_FORM_MAIN_TITLE);\r
+\r
+ goto FORM_BOOT_SETUP_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_BOOT_SETUP_ID;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ goto FORM_DRIVER_SETUP_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_DRIVER_SETUP_ID;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ goto FORM_CON_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_MAIN_ID;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ goto FORM_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_BOOT_FROM_FILE),\r
+ help = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP),\r
+ flags = INTERACTIVE,\r
+ key = KEY_VALUE_BOOT_FROM_FILE;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+// label FORM_MAIN_ID;\r
+\r
+ goto FORM_BOOT_NEXT_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_BOOT_NEXT_ID;\r
+\r
+ goto FORM_TIME_OUT_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_TIME_OUT_ID;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ text\r
+ help = STRING_TOKEN(STR_RESET),\r
+ text = STRING_TOKEN(STR_RESET),\r
+ flags = INTERACTIVE,\r
+ key = FORM_RESET;\r
+ \r
+ label LABEL_BMM_PLATFORM_INFORMATION;\r
+ //\r
+ // This is where we will dynamically add a Action type op-code to show \r
+ // the platform information.\r
+ //\r
+ \r
+ //\r
+ // This is where we will dynamically add a Action type op-code to show \r
+ // the advanced menu.\r
+ //\r
+ \r
+ //\r
+ // This is where we will dynamically add a Action type op-code to show \r
+ // the intel test menu.\r
+ //\r
+ label LABEL_END; \r
+ endform;\r
+\r
+ form formid = FORM_BOOT_SETUP_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);\r
+\r
+ goto FORM_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+ help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+ //flags = INTERACTIVE,\r
+ //key = FORM_MAIN_ID;\r
+\r
+ goto FORM_BOOT_SETUP_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_BOOT_ADD_ID;\r
+\r
+ goto FORM_BOOT_DEL_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_BOOT_DEL_ID;\r
+\r
+ goto FORM_BOOT_CHG_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_BOOT_CHG_ID;\r
+ endform;\r
+\r
+ form formid = FORM_DRIVER_SETUP_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);\r
+\r
+ goto FORM_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+ help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+ //help = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+ //flags = INTERACTIVE,\r
+ //key = FORM_MAIN_ID;\r
+\r
+ goto FORM_DRV_ADD_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_DRV_ADD_ID;\r
+\r
+ goto FORM_DRV_DEL_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_DRV_DEL_ID;\r
+\r
+ goto FORM_DRV_CHG_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_DRV_CHG_ID;\r
+ endform;\r
+\r
+ form formid = FORM_BOOT_ADD_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_ADD_DESC_TITLE);\r
+\r
+ label FORM_BOOT_ADD_ID;\r
+ label LABEL_END;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ string varid = BmmData.BootDescriptionData,\r
+ questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
+ prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
+ help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
+ minsize = 6,\r
+ maxsize = 75,\r
+ endstring;\r
+\r
+ string varid = BmmData.BootOptionalData,\r
+ questionid = KEY_VALUE_BOOT_OPTION,\r
+ prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+ help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
+ minsize = 0,\r
+ maxsize = 120,\r
+ endstring;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ text\r
+ help = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+ text = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+ flags = INTERACTIVE,\r
+ key = KEY_VALUE_SAVE_AND_EXIT_BOOT;\r
+\r
+ text\r
+ help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+ text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+ flags = INTERACTIVE,\r
+ key = KEY_VALUE_NO_SAVE_AND_EXIT_BOOT;\r
+ \r
+ endform;\r
+\r
+ form formid = FORM_BOOT_DEL_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);\r
+\r
+ label FORM_BOOT_DEL_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_BOOT_CHG_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);\r
+\r
+ label FORM_BOOT_CHG_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_BOOT_NEXT_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);\r
+\r
+ label FORM_BOOT_NEXT_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_TIME_OUT_ID,\r
+ title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);\r
+\r
+ label FORM_TIME_OUT_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_MEMORY_CHECK_ID,\r
+ title = STRING_TOKEN(STR_FORM_MEMORY_CHECK_TITLE);\r
+\r
+ label FORM_MEMORY_CHECK_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_UEFI_OPTIMIZED_BOOT_ID,\r
+ title = STRING_TOKEN(STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE);\r
+\r
+ label FORM_UEFI_OPTIMIZED_BOOT_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_DRV_ADD_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);\r
+\r
+ goto FORM_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+ help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+ //flags = INTERACTIVE,\r
+ //key = FORM_MAIN_ID;\r
+\r
+ goto FORM_DRIVER_SETUP_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),\r
+ flags = INTERACTIVE,\r
+ key = FORM_DRV_ADD_FILE_ID;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_DRV_ADD_FILE_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
+ \r
+ label FORM_DRV_ADD_FILE_ID;\r
+ label LABEL_END;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ string varid = BmmData.DriverDescriptionData,\r
+ questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
+ prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
+ help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
+ minsize = 6,\r
+ maxsize = 75,\r
+ endstring;\r
+\r
+ string varid = BmmData.DriverOptionalData,\r
+ questionid = KEY_VALUE_DRIVER_OPTION,\r
+ prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+ help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
+ minsize = 0,\r
+ maxsize = 120,\r
+ endstring;\r
+\r
+ checkbox varid = BmmData.ForceReconnect,\r
+ prompt = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
+ help = STRING_TOKEN(STR_LOAD_OPTION_FORCE_RECON),\r
+ flags = CHECKBOX_DEFAULT,\r
+ key = 0,\r
+ endcheckbox;\r
+\r
+ subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
+\r
+ text\r
+ help = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+ text = STRING_TOKEN(STR_SAVE_AND_EXIT),\r
+ flags = INTERACTIVE,\r
+ key = KEY_VALUE_SAVE_AND_EXIT_DRIVER; //BUGBUB: allow duplicate key in one formset???\r
+\r
+ text\r
+ help = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+ text = STRING_TOKEN(STR_NO_SAVE_AND_EXIT),\r
+ flags = INTERACTIVE,\r
+ key = KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER;\r
+ endform;\r
+\r
+ form formid = FORM_DRV_DEL_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);\r
+\r
+ label FORM_DRV_DEL_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_DRV_CHG_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);\r
+\r
+ label FORM_DRV_CHG_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_CON_MAIN_ID,\r
+ title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);\r
+\r
+ goto FORM_MAIN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),\r
+ help = STRING_TOKEN(STR_FORM_GOTO_MAIN);\r
+ //flags = INTERACTIVE,\r
+ //key = FORM_MAIN_ID;\r
+\r
+ goto FORM_CON_IN_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_CON_IN_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_IN_ID;\r
+\r
+ goto FORM_CON_OUT_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_OUT_ID;\r
+\r
+ goto FORM_CON_ERR_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_ERR_ID;\r
+\r
+ goto FORM_CON_MODE_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_MODE_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_MODE_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_MODE_ID;\r
+\r
+ goto FORM_CON_COM_ID,\r
+ prompt = STRING_TOKEN(STR_FORM_COM_TITLE),\r
+ help = STRING_TOKEN(STR_FORM_COM_HELP),\r
+ flags = INTERACTIVE,\r
+ key = FORM_CON_COM_ID;\r
+ endform;\r
+\r
+ form formid = FORM_CON_MODE_ID,\r
+ title = STRING_TOKEN(STR_FORM_MODE_TITLE);\r
+\r
+ label FORM_CON_MODE_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_CON_COM_ID,\r
+ title = STRING_TOKEN(STR_FORM_COM_TITLE);\r
+\r
+ label FORM_CON_COM_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_CON_COM_SETUP_ID,\r
+ title = STRING_TOKEN(STR_CON_COM_SETUP);\r
+\r
+ label FORM_CON_COM_SETUP_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_FILE_SEEK_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
+\r
+ label FORM_FILE_SEEK_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_FILE_NEW_SEEK_ID,\r
+ title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);\r
+\r
+ label FORM_FILE_NEW_SEEK_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_DRV_ADD_HANDLE_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);\r
+\r
+ label FORM_DRV_ADD_HANDLE_ID;\r
+ label LABEL_END;\r
+ endform;\r
+\r
+ form formid = FORM_DRV_ADD_HANDLE_DESC_ID,\r
+ title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);\r
+\r
+ label FORM_DRV_ADD_HANDLE_DESC_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_CON_IN_ID,\r
+ title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);\r
+\r
+ label FORM_CON_IN_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_CON_OUT_ID,\r
+ title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);\r
+\r
+ label FORM_CON_OUT_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+ form formid = FORM_CON_ERR_ID,\r
+ title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);\r
+\r
+ label FORM_CON_ERR_ID;\r
+ label LABEL_END;\r
+\r
+ endform;\r
+\r
+endformset;\r
--- /dev/null
+///** @file\r
+// String definitions for Boot Maintenance Utility.\r
+//\r
+// Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+// This program and the accompanying materials\r
+// are licensed and made available under the terms and conditions of the BSD License\r
+// which accompanies this distribution. The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php\r
+// \r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+// \r
+//**/\r
+\r
+/=#\r
+\r
+#langdef en-US "English"\r
+#langdef fr-FR "Français"\r
+\r
+#string STR_NULL_STRING #language en-US " "\r
+ #language fr-FR " "\r
+#string STR_NONE #language en-US "NONE"\r
+ #language fr-FR "NONE"\r
+#string STR_MISSING_STRING #language en-US "Missing String"\r
+ #language fr-FR "Missing String"\r
+#string STR_FORM_MAIN_TITLE #language en-US "Boot Maintenance Manager"\r
+ #language fr-FR "Boot Maintenance Manager"\r
+#string STR_FORM_BOOT_SETUP_TITLE #language en-US "Boot Options"\r
+ #language fr-FR "Boot Options"\r
+#string STR_BOOT_MAINT_MANAGER_HELP #language en-US "This selection will take you to the Boot Maintenance Manager"\r
+ #language fr-FR "This selection will take you to the Boot Maintenance Manager"\r
+#string STR_FORM_BOOT_SETUP_HELP #language en-US "Modify system boot options"\r
+ #language fr-FR "Modify system boot options"\r
+#string STR_FORM_DRIVER_SETUP_TITLE #language en-US "Driver Options"\r
+ #language fr-FR "Driver Options"\r
+#string STR_FORM_DRIVER_SETUP_HELP #language en-US "Modify boot driver options"\r
+ #language fr-FR "Modify boot driver options"\r
+#string STR_FORM_BOOT_ADD_TITLE #language en-US "Add Boot Option"\r
+ #language fr-FR "Add Boot Option"\r
+#string STR_FORM_BOOT_ADD_HELP #language en-US "Add EFI Application or Removable Fs as Boot Option"\r
+ #language fr-FR "Add EFI Application or Removable Fs as Boot Option"\r
+#string STR_FORM_BOOT_DEL_TITLE #language en-US "Delete Boot Option"\r
+ #language fr-FR "Delete Boot Option"\r
+#string STR_FORM_BOOT_IMMEDIATE_HELP #language en-US "Will be valid immediately"\r
+ #language fr-FR "Will be valid immediately"\r
+#string STR_FORM_BOOT_CHG_TITLE #language en-US "Change Boot Order"\r
+ #language fr-FR "Change Boot Order"\r
+#string STR_FORM_DRV_ADD_TITLE #language en-US "Add Driver Option"\r
+ #language fr-FR "Add Driver Option"\r
+#string STR_FORM_DRV_ADD_HELP #language en-US "Add .EFI Driver as Driver Option"\r
+ #language fr-FR "Add .EFI Driver as Driver Option"\r
+#string STR_FORM_DRV_DEL_TITLE #language en-US "Delete Driver Option"\r
+ #language fr-FR "Delete Driver Option"\r
+#string STR_FORM_DRV_CHG_TITLE #language en-US "Change Driver Order"\r
+ #language fr-FR "Change Driver Order"\r
+#string STR_FORM_NEXT_BOOT_HELP #language en-US "Will be valid on next boot"\r
+ #language fr-FR "Will be valid on next boot"\r
+#string STR_FORM_BOOT_NEXT_TITLE #language en-US "Set Boot Next Value"\r
+ #language fr-FR "Set Boot Next Value"\r
+#string STR_FORM_BOOT_NEXT_HELP #language en-US "Modify next boot behavior"\r
+ #language fr-FR "Modify next boot behavior"\r
+#string STR_FORM_TIME_OUT_TITLE #language en-US "Set Time Out Value"\r
+ #language fr-FR "Set Time Out Value"\r
+#string STR_FORM_TIME_OUT_HELP #language en-US "Modify automatic boot time-out value"\r
+ #language fr-FR "Modify automatic boot time-out value"\r
+#string STR_FORM_MEMORY_CHECK_TITLE #language en-US "Set Memory Check Type"\r
+ #language fr-FR "Set Memory Check Type"\r
+#string STR_FORM_MEMORY_CHECK_HELP #language en-US "Modify the type of memory checking"\r
+ #language fr-FR "Modify the type of memory checking"\r
+#string STR_MEMORY_CHECK_SETUP #language en-US "Memory Check Type"\r
+ #language fr-FR "Memory Check Type"\r
+#string STR_MEMORY_CHECK_SETUP_HELP #language en-US "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
+ #language fr-FR "Memory test coverage level. Ignore chooses not to test memory. Quick and Sparse test some memory, and Extensive performs a detailed memory test."\r
+#string STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE #language en-US "UEFI Optimized Boot"\r
+ #language fr-FR "UEFI Optimized Boot"\r
+#string STR_FORM_UEFI_OPTIMIZED_BOOT_HELP #language en-US "Modify the UEFI Optimized Boot setting"\r
+ #language fr-FR "Modify the UEFI Optimized Boot setting"\r
+#string UEFI_OPTIMIZED_BOOT_DESCRIPTION #language en-US "UEFI Optimized Boot"\r
+ #language fr-FR "UEFI Optimized Boot"\r
+#string UEFI_OPTIMIZED_BOOT_HELP #language en-US "Check to enable UEFI Optimized Boot"\r
+ #language fr-FR "Check to enable UEFI Optimized Boot"\r
+#string STR_FORM_CON_MAIN_TITLE #language en-US "Console Options"\r
+ #language fr-FR "Console Options"\r
+#string STR_FORM_CON_MAIN_HELP #language en-US "Modify system console options"\r
+ #language fr-FR "Modify system console options"\r
+#string STR_FORM_CON_IN_TITLE #language en-US "Console Input Device Select"\r
+ #language fr-FR "Console Input Device Select"\r
+#string STR_FORM_CON_IN_HELP #language en-US "Enable console device as ConIn"\r
+ #language fr-FR "Enable console device as ConIn"\r
+#string STR_FORM_SET_FD_ORDER_TITLE #language en-US "Set Legacy Floppy Drive Order"\r
+ #language fr-FR "Set Legacy Floppy Drive Order"\r
+#string STR_FORM_SET_HD_ORDER_TITLE #language en-US "Set Legacy HardDisk Drive Order"\r
+ #language fr-FR "Set Legacy HardDisk Drive Order"\r
+#string STR_FORM_SET_CD_ORDER_TITLE #language en-US "Set Legacy CD-ROM Drive Order"\r
+ #language fr-FR "Set Legacy CD-ROM Drive Order"\r
+#string STR_FORM_SET_NET_ORDER_TITLE #language en-US "Set Legacy NET Drive Order"\r
+ #language fr-FR "Set Legacy NET Drive Order"\r
+#string STR_FORM_SET_BEV_ORDER_TITLE #language en-US "Set Legacy BEV Drive Order"\r
+ #language fr-FR "Set Legacy BEV Drive Order"\r
+#string STR_FORM_GOTO_SETTING #language en-US "Go Back To Setting Page"\r
+ #language fr-FR "Go Back To Setting Page"\r
+#string STR_COM1 #language en-US "COM1"\r
+ #language fr-FR "COM1"\r
+#string STR_COM2 #language en-US "COM2"\r
+ #language fr-FR "COM2"\r
+#string STR_COM_AS_CONSOLE_OPTION #language en-US "Select this COM port as Console"\r
+ #language fr-FR "Select this COM port as Console"\r
+#string STR_FORM_CON_OUT_TITLE #language en-US "Console Output Device Select"\r
+ #language fr-FR "Console Output Device Select"\r
+#string STR_FORM_CON_OUT_HELP #language en-US "Enable console device as ConOut"\r
+ #language fr-FR "Enable console device as ConOut"\r
+#string STR_FORM_STD_ERR_TITLE #language en-US "Console Standard Error Device Select"\r
+ #language fr-FR "Console Standard Error Device Select"\r
+#string STR_FORM_STD_ERR_HELP #language en-US "Enable console device as StdErr"\r
+ #language fr-FR "Enable console device as StdErr"\r
+#string STR_FORM_MODE_TITLE #language en-US "Console Output Mode Select"\r
+ #language fr-FR "Console Output Mode Select"\r
+#string STR_FORM_MODE_HELP #language en-US "Select Console Output Mode: 80x25, 100x31, etc."\r
+ #language fr-FR "Select Console Output Mode: 80x25, 100x31, etc."\r
+#string STR_FORM_COM_TITLE #language en-US "COM Attribute Setup Page"\r
+ #language fr-FR "COM Attribute Setup Page"\r
+#string STR_FORM_COM_HELP #language en-US "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
+ #language fr-FR "Setup ComPort BaudRate, DataBits, StopBits, Parity and TerminalType"\r
+#string STR_FORM_DRV_ADD_FILE_TITLE #language en-US "Add Driver Option Using File"\r
+ #language fr-FR "Add Driver Option Using File"\r
+#string STR_FORM_DRV_ADD_HANDLE_TITLE #language en-US "Add Driver Option Using Handle"\r
+ #language fr-FR "Add Driver Option Using Handle"\r
+#string STR_FORM_BOOT_ADD_DESC_TITLE #language en-US "Modify Boot Option Description"\r
+ #language fr-FR "Modify Boot Option Description"\r
+#string STR_FORM_DRV_ADD_DESC_TITLE #language en-US "Modify Driver Option Description"\r
+ #language fr-FR "Modify Driver Option Description"\r
+#string STR_NUM_AUTO_BOOT #language en-US "Auto Boot Time-out"\r
+ #language fr-FR "Auto Boot Time-out"\r
+#string STR_HLP_AUTO_BOOT #language en-US "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
+ #language fr-FR "Range: 0 to 65535 seconds, 0 means no wait, 65535 means waiting for key"\r
+#string STR_BOOT_NEXT #language en-US "Boot Next Value"\r
+ #language fr-FR "Boot Next Value"\r
+#string STR_BOOT_NEXT_HELP #language en-US "Next boot use this boot option"\r
+ #language fr-FR "Next boot use this boot option"\r
+#string STR_LOAD_OPTION_DEVPATH #language en-US "This is the devicepath"\r
+ #language fr-FR "This is the devicepath"\r
+#string STR_LOAD_OPTION_DESC #language en-US "Input the description"\r
+ #language fr-FR "Input the description"\r
+#string STR_LOAD_OPTION_ACTIVE #language en-US "Load Option Active"\r
+ #language fr-FR "Load Option Active"\r
+#string STR_LOAD_OPTION_FORCE_RECON #language en-US "Load Option Reconnect"\r
+ #language fr-FR "Load Option Reconnect"\r
+#string STR_SAVE_AND_EXIT #language en-US "Commit Changes and Exit"\r
+ #language fr-FR "Commit Changes and Exit"\r
+#string STR_NO_SAVE_AND_EXIT #language en-US "Discard Changes and Exit"\r
+ #language fr-FR "Discard Changes and Exit"\r
+#string STR_CON_IN_SETUP #language en-US "Set Console Input Device"\r
+ #language fr-FR "Set Console Input Device"\r
+#string STR_CON_OUT_SETUP #language en-US "Set Console Output Device"\r
+ #language fr-FR "Set Console Output Device"\r
+#string STR_CON_ERR_SETUP #language en-US "Set Error Output Device"\r
+ #language fr-FR "Set Error Output Device"\r
+#string STR_CON_MODE_SETUP #language en-US "Set Console Output Mode"\r
+ #language fr-FR "Set Console Output Mode"\r
+#string STR_CON_COM_SETUP #language en-US "Set COM Attributes"\r
+ #language fr-FR "Set COM Attributes"\r
+#string STR_COM_TERMI_TYPE #language en-US "Set COM Terminal Type"\r
+ #language fr-FR "Set COM Terminal Type"\r
+#string STR_COM_FLOW_CONTROL #language en-US "Set COM Flow Control"\r
+ #language fr-FR "Set COM Flow Control"\r
+#string STR_COM_BAUD_RATE #language en-US "Set COM Baud Rate"\r
+ #language fr-FR "Set COM Baud Rate"\r
+#string STR_COM_DATA_BITS #language en-US "Set COM Data Bits"\r
+ #language fr-FR "Set COM Data Bits"\r
+#string STR_COM_PARITY #language en-US "Set COM Parity"\r
+ #language fr-FR "Set COM Parity"\r
+#string STR_COM_STOP_BITS #language en-US "Set COM Stop Bits"\r
+ #language fr-FR "Set COM Stop Bits"\r
+#string STR_COM_BAUD_RATE_0 #language en-US "115200"\r
+ #language fr-FR "115200"\r
+#string STR_COM_BAUD_RATE_1 #language en-US "57600"\r
+ #language fr-FR "57600"\r
+#string STR_COM_BAUD_RATE_2 #language en-US "38400"\r
+ #language fr-FR "38400"\r
+#string STR_COM_BAUD_RATE_3 #language en-US "19200"\r
+ #language fr-FR "19200"\r
+#string STR_COM_BAUD_RATE_4 #language en-US "9600"\r
+ #language fr-FR "9600"\r
+#string STR_COM_BAUD_RATE_5 #language en-US "7200"\r
+ #language fr-FR "7200"\r
+#string STR_COM_BAUD_RATE_6 #language en-US "4800"\r
+ #language fr-FR "4800"\r
+#string STR_COM_BAUD_RATE_7 #language en-US "3600"\r
+ #language fr-FR "3600"\r
+#string STR_COM_BAUD_RATE_8 #language en-US "2400"\r
+ #language fr-FR "2400"\r
+#string STR_COM_BAUD_RATE_9 #language en-US "2000"\r
+ #language fr-FR "2000"\r
+#string STR_COM_BAUD_RATE_10 #language en-US "1800"\r
+ #language fr-FR "1800"\r
+#string STR_COM_BAUD_RATE_11 #language en-US "1200"\r
+ #language fr-FR "1200"\r
+#string STR_COM_BAUD_RATE_12 #language en-US "600"\r
+ #language fr-FR "600"\r
+#string STR_COM_BAUD_RATE_13 #language en-US "300"\r
+ #language fr-FR "300"\r
+#string STR_COM_BAUD_RATE_14 #language en-US "150"\r
+ #language fr-FR "150"\r
+#string STR_COM_BAUD_RATE_15 #language en-US "134"\r
+ #language fr-FR "134"\r
+#string STR_COM_BAUD_RATE_16 #language en-US "110"\r
+ #language fr-FR "110"\r
+#string STR_COM_BAUD_RATE_17 #language en-US "75"\r
+ #language fr-FR "75"\r
+#string STR_COM_BAUD_RATE_18 #language en-US "50"\r
+ #language fr-FR "50"\r
+#string STR_COM_DATA_BITS_0 #language en-US "5"\r
+ #language fr-FR "5"\r
+#string STR_COM_DATA_BITS_1 #language en-US "6"\r
+ #language fr-FR "6"\r
+#string STR_COM_DATA_BITS_2 #language en-US "7"\r
+ #language fr-FR "7"\r
+#string STR_COM_DATA_BITS_3 #language en-US "8"\r
+ #language fr-FR "8"\r
+#string STR_COM_PAR_0 #language en-US "None"\r
+ #language fr-FR "None"\r
+#string STR_COM_PAR_1 #language en-US "Even"\r
+ #language fr-FR "Even"\r
+#string STR_COM_PAR_2 #language en-US "Odd"\r
+ #language fr-FR "Odd"\r
+#string STR_COM_PAR_3 #language en-US "Mark"\r
+ #language fr-FR "Mark"\r
+#string STR_COM_PAR_4 #language en-US "Space"\r
+ #language fr-FR "Space"\r
+#string STR_COM_STOP_BITS_0 #language en-US "One"\r
+ #language fr-FR "One"\r
+#string STR_COM_STOP_BITS_1 #language en-US "One And A Half"\r
+ #language fr-FR "One And A Half"\r
+#string STR_COM_STOP_BITS_2 #language en-US "Two"\r
+ #language fr-FR "Two"\r
+#string STR_COM_TYPE_0 #language en-US "PC_ANSI"\r
+ #language fr-FR "PC_ANSI"\r
+#string STR_COM_TYPE_1 #language en-US "VT_100"\r
+ #language fr-FR "VT_100"\r
+#string STR_COM_TYPE_2 #language en-US "VT_100_PLUS"\r
+ #language fr-FR "VT_100_PLUS"\r
+#string STR_COM_TYPE_3 #language en-US "VT_UTF8"\r
+ #language fr-FR "VT_UTF8"\r
+#string STR_COM_TYPE_4 #language en-US "TTY_TERM"\r
+ #language fr-FR "TTY_TERM"\r
+#string STR_RESET #language en-US "Reset System"\r
+ #language fr-FR "Reset System"\r
+#string STR_FORM_GOTO_MAIN #language en-US "Go Back To Main Page"\r
+ #language fr-FR "Go Back To Main Page"\r
+#string STR_BOOT_FROM_FILE #language en-US "Boot From File"\r
+ #language fr-FR "Boot From File"\r
+#string STR_BOOT_FROM_FILE_HELP #language en-US "Boot system from a file or device"\r
+ #language fr-FR "Boot system from a file or device"\r
+#string STR_OPTIONAL_DATA #language en-US "Input Optional Data"\r
+ #language fr-FR "Input Optional Data"\r
+#string STR_CHANGE_ORDER #language en-US "Change the order"\r
+ #language fr-FR "Change the order"\r
+#string STR_BOOT_LEGACY #language en-US "Boot Legacy System"\r
+ #language fr-FR "Boot Legacy System"\r
+#string STR_BOOT_LEGACY_HELP #language en-US "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
+ #language fr-FR "Supports boot from legacy FD, HD, CD, PCMCIA, USB, and Network"\r
+#string STR_BOOT_LEGACY_FLOPPY #language en-US "Boot From Floppy"\r
+ #language fr-FR "Boot From Floppy"\r
+#string STR_BOOT_LEGACY_HARDDRIVE #language en-US "Boot From Hard Drive"\r
+ #language fr-FR "Boot From Hard Drive"\r
+#string STR_BOOT_LEGACY_CDROM #language en-US "Boot From CD Rom"\r
+ #language fr-FR "Boot From CD Rom"\r
+#string STR_BOOT_LEGACY_PCMCIA #language en-US "Boot From PCMCIA"\r
+ #language fr-FR "Boot From PCMCIA"\r
+#string STR_BOOT_LEGACY_USB #language en-US "Boot From USB Device"\r
+ #language fr-FR "Boot From USB Device"\r
+#string STR_BOOT_LEGACY_NETWORK #language en-US "Boot From Network"\r
+ #language fr-FR "Boot From Network"\r
+#string STR_DISABLE_LEGACY_DEVICE #language en-US "Disabled"\r
+ #language fr-FR "Disabled"\r
+#string STR_FILE_EXPLORER_TITLE #language en-US "File Explorer"\r
+ #language fr-FR "File Explorer"\r
+#string STR_OUT_OF_BAND_PORT #language fr-FR "Out-Of-Band Mgmt Port"\r
+ #language en-US "Out-Of-Band Mgmt Port"\r
+#string STR_HARDWARE_FLOW_CONTROL #language fr-FR "Hardware"\r
+ #language en-US "Hardware"\r
+#string STR_NONE_FLOW_CONTROL #language fr-FR "None"\r
+ #language en-US "None"\r
+//\r
+// BugBug : need someone to translate these strings to french\r
+//\r
--- /dev/null
+## @file\r
+# Boot Maintenance Manager Library used by UiApp.\r
+#\r
+# Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR>\r
+# This program and the accompanying materials are licensed and made available under\r
+# the terms and conditions of the BSD License that accompanies this distribution.\r
+# The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php.\r
+# \r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# \r
+##\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = BootMaintenanceManagerLib\r
+ MODULE_UNI_FILE = BootMaintenanceManagerLib.uni\r
+ FILE_GUID = CA9E4824-4198-4715-AA22-E2935E703A07\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = NULL|DXE_DRIVER UEFI_APPLICATION\r
+ CONSTRUCTOR = BootMaintenanceManagerLibConstructor\r
+ DESTRUCTOR = BootMaintenanceManagerLibDestructor\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources]\r
+ BootMaintenanceManager.h\r
+ BootMaintenanceManager.vfr\r
+ BootMaintenanceManagerStrings.uni\r
+ BootMaintenance.c\r
+ FormGuid.h\r
+ BootOption.c\r
+ ConsoleOption.c\r
+ Data.c\r
+ Variable.c\r
+ UpdatePage.c\r
+ BmLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+ DevicePathLib\r
+ BaseLib\r
+ UefiRuntimeServicesTableLib\r
+ MemoryAllocationLib\r
+ UefiLib\r
+ UefiBootServicesTableLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+ PrintLib\r
+ HiiLib\r
+ UefiHiiServicesLib\r
+ UefiBootManagerLib\r
+ FileExplorerLib\r
+ \r
+[Guids]\r
+ gEfiGlobalVariableGuid ## SOMETIMES_PRODUCES ## Variable:L"BootNext" (The number of next boot option)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"BootXX" (Boot option variable)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" (Platform supported languange in Rfc4646 format)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"Lang" (Platform supported languange in Iso639 format)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"KeyXX" (Hotkey option variable)\r
+ ## PRODUCES ## Variable:L"HwErrRecSupport" (The level of platform supported hardware Error Record Persistence)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"BootOptionSupport" (The feature supported in boot option menu, value could be: EFI_BOOT_OPTION_SUPPORT_KEY, EFI_BOOT_OPTION_SUPPORT_APP\r
+ ## SOMETIMES_PRODUCES (not PcdUefiVariableDefaultLangDeprecate)## Variable:L"LangCodes" (Value of PcdUefiVariableDefaultLangCodes)\r
+ ## PRODUCES ## Variable:L"PlatformLangCodes" (Value of PcdUefiVariableDefaultPlatformLangCodes)\r
+ ## PRODUCES ## Variable:L"Timeout" (The time out value in second of showing progress bar)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"BootOrder" (The boot option array)\r
+ ## SOMETIMES_PRODUCES ## Variable:L"DriverOrder" (The driver order list)\r
+ ## SOMETIMES_CONSUMES ## Variable:L"ConIn" (The device path of console in device)\r
+ ## SOMETIMES_CONSUMES ## Variable:L"ConOut" (The device path of console out device)\r
+ ## SOMETIMES_CONSUMES ## Variable:L"ErrOut" (The device path of error out device)\r
+ gEfiFileSystemVolumeLabelInfoIdGuid ## CONSUMES ## GUID (Indicate the information type is volume)\r
+ gEfiFileInfoGuid ## CONSUMES ## GUID (Indicate the information type is file)\r
+ gEfiIfrTianoGuid ## CONSUMES ## GUID (Extended IFR Guid Opcode)\r
+ gEfiIfrFrontPageGuid ## CONSUMES ## GUID\r
+ gEfiIfrBootMaintenanceGuid ## CONSUMES ## GUID\r
+ \r
+[Protocols]\r
+ gEfiSimpleFileSystemProtocolGuid ## CONSUMES\r
+ gEfiLoadFileProtocolGuid ## CONSUMES\r
+ gEfiHiiConfigAccessProtocolGuid ## CONSUMES\r
+ gEfiSerialIoProtocolGuid ## CONSUMES\r
+ gEfiDevicePathToTextProtocolGuid ## CONSUMES\r
+\r
+[FeaturePcd]\r
+\r
+[Pcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutRow ## CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdConOutColumn ## CONSUMES\r
+ gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut ## CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CONSUMES\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CONSUMES
\ No newline at end of file
--- /dev/null
+// /** @file\r
+// Boot Maintenance Manager Library used by UiApp.\r
+//\r
+// Boot Maintenance Manager Library used by UiApp.\r
+//\r
+// Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// This program and the accompanying materials are licensed and made available under\r
+// the terms and conditions of the BSD License that accompanies this distribution.\r
+// The full text of the license may be found at\r
+// http://opensource.org/licenses/bsd-license.php.\r
+//\r
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+//\r
+// **/\r
+\r
+#string STR_MODULE_ABSTRACT\r
+#language en-US\r
+"Boot Maintenance Manager Library used by UiApp."\r
+\r
+#string STR_MODULE_DESCRIPTION\r
+#language en-US\r
+"Boot Maintenance Manager Library used by UiApp."\r
+\r
+\r
--- /dev/null
+/** @file\r
+ Provide boot option support for Application "BootMaint"\r
+\r
+ Include file system navigation, system handle selection\r
+\r
+ Boot option manipulation\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+///\r
+/// Define the maximum characters that will be accepted.\r
+///\r
+#define MAX_CHAR 480\r
+\r
+/**\r
+ Create a menu entry by given menu type.\r
+\r
+ @param MenuType The Menu type to be created.\r
+\r
+ @retval NULL If failed to create the menu.\r
+ @return the new menu entry.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_CreateMenuEntry (\r
+ UINTN MenuType\r
+ )\r
+{\r
+ BM_MENU_ENTRY *MenuEntry;\r
+ UINTN ContextSize;\r
+\r
+ //\r
+ // Get context size according to menu type\r
+ //\r
+ switch (MenuType) {\r
+ case BM_LOAD_CONTEXT_SELECT:\r
+ ContextSize = sizeof (BM_LOAD_CONTEXT);\r
+ break;\r
+\r
+ case BM_FILE_CONTEXT_SELECT:\r
+ ContextSize = sizeof (BM_FILE_CONTEXT);\r
+ break;\r
+\r
+ case BM_CONSOLE_CONTEXT_SELECT:\r
+ ContextSize = sizeof (BM_CONSOLE_CONTEXT);\r
+ break;\r
+\r
+ case BM_TERMINAL_CONTEXT_SELECT:\r
+ ContextSize = sizeof (BM_TERMINAL_CONTEXT);\r
+ break;\r
+\r
+ case BM_HANDLE_CONTEXT_SELECT:\r
+ ContextSize = sizeof (BM_HANDLE_CONTEXT);\r
+ break;\r
+\r
+ default:\r
+ ContextSize = 0;\r
+ break;\r
+ }\r
+\r
+ if (ContextSize == 0) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Create new menu entry\r
+ //\r
+ MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY));\r
+ if (MenuEntry == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ MenuEntry->VariableContext = AllocateZeroPool (ContextSize);\r
+ if (MenuEntry->VariableContext == NULL) {\r
+ FreePool (MenuEntry);\r
+ return NULL;\r
+ }\r
+\r
+ MenuEntry->Signature = BM_MENU_ENTRY_SIGNATURE;\r
+ MenuEntry->ContextSelection = MenuType;\r
+ return MenuEntry;\r
+}\r
+\r
+/**\r
+ Free up all resource allocated for a BM_MENU_ENTRY.\r
+\r
+ @param MenuEntry A pointer to BM_MENU_ENTRY.\r
+\r
+**/\r
+VOID\r
+BOpt_DestroyMenuEntry (\r
+ BM_MENU_ENTRY *MenuEntry\r
+ )\r
+{\r
+ BM_LOAD_CONTEXT *LoadContext;\r
+ BM_FILE_CONTEXT *FileContext;\r
+ BM_CONSOLE_CONTEXT *ConsoleContext;\r
+ BM_TERMINAL_CONTEXT *TerminalContext;\r
+ BM_HANDLE_CONTEXT *HandleContext;\r
+\r
+ //\r
+ // Select by the type in Menu entry for current context type\r
+ //\r
+ switch (MenuEntry->ContextSelection) {\r
+ case BM_LOAD_CONTEXT_SELECT:\r
+ LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext;\r
+ FreePool (LoadContext->FilePathList);\r
+ FreePool (LoadContext->LoadOption);\r
+ if (LoadContext->OptionalData != NULL) {\r
+ FreePool (LoadContext->OptionalData);\r
+ }\r
+ FreePool (LoadContext);\r
+ break;\r
+\r
+ case BM_FILE_CONTEXT_SELECT:\r
+ FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext;\r
+\r
+ if (!FileContext->IsRoot) {\r
+ FreePool (FileContext->DevicePath);\r
+ } else {\r
+ if (FileContext->FHandle != NULL) {\r
+ FileContext->FHandle->Close (FileContext->FHandle);\r
+ }\r
+ }\r
+\r
+ if (FileContext->FileName != NULL) {\r
+ FreePool (FileContext->FileName);\r
+ }\r
+ if (FileContext->Info != NULL) {\r
+ FreePool (FileContext->Info);\r
+ }\r
+ FreePool (FileContext);\r
+ break;\r
+\r
+ case BM_CONSOLE_CONTEXT_SELECT:\r
+ ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext;\r
+ FreePool (ConsoleContext->DevicePath);\r
+ FreePool (ConsoleContext);\r
+ break;\r
+\r
+ case BM_TERMINAL_CONTEXT_SELECT:\r
+ TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext;\r
+ FreePool (TerminalContext->DevicePath);\r
+ FreePool (TerminalContext);\r
+ break;\r
+\r
+ case BM_HANDLE_CONTEXT_SELECT:\r
+ HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext;\r
+ FreePool (HandleContext);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ FreePool (MenuEntry->DisplayString);\r
+ if (MenuEntry->HelpString != NULL) {\r
+ FreePool (MenuEntry->HelpString);\r
+ }\r
+\r
+ FreePool (MenuEntry);\r
+}\r
+\r
+/**\r
+ Get the Menu Entry from the list in Menu Entry List.\r
+\r
+ If MenuNumber is great or equal to the number of Menu\r
+ Entry in the list, then ASSERT.\r
+\r
+ @param MenuOption The Menu Entry List to read the menu entry.\r
+ @param MenuNumber The index of Menu Entry.\r
+\r
+ @return The Menu Entry.\r
+\r
+**/\r
+BM_MENU_ENTRY *\r
+BOpt_GetMenuEntry (\r
+ BM_MENU_OPTION *MenuOption,\r
+ UINTN MenuNumber\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINTN Index;\r
+ LIST_ENTRY *List;\r
+\r
+ ASSERT (MenuNumber < MenuOption->MenuNumber);\r
+\r
+ List = MenuOption->Head.ForwardLink;\r
+ for (Index = 0; Index < MenuNumber; Index++) {\r
+ List = List->ForwardLink;\r
+ }\r
+\r
+ NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE);\r
+\r
+ return NewMenuEntry;\r
+}\r
+\r
+/**\r
+ Free resources allocated in Allocate Rountine.\r
+\r
+ @param FreeMenu Menu to be freed\r
+**/\r
+VOID\r
+BOpt_FreeMenu (\r
+ BM_MENU_OPTION *FreeMenu\r
+ )\r
+{\r
+ BM_MENU_ENTRY *MenuEntry;\r
+ while (!IsListEmpty (&FreeMenu->Head)) {\r
+ MenuEntry = CR (\r
+ FreeMenu->Head.ForwardLink,\r
+ BM_MENU_ENTRY,\r
+ Link,\r
+ BM_MENU_ENTRY_SIGNATURE\r
+ );\r
+ RemoveEntryList (&MenuEntry->Link);\r
+ BOpt_DestroyMenuEntry (MenuEntry);\r
+ }\r
+ FreeMenu->MenuNumber = 0;\r
+}\r
+\r
+/**\r
+\r
+ Build the BootOptionMenu according to BootOrder Variable.\r
+ This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @return EFI_NOT_FOUND Fail to find "BootOrder" variable.\r
+ @return EFI_SUCESS Success build boot option menu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetBootOptions (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT16 BootString[10];\r
+ UINT8 *LoadOptionFromVar;\r
+ UINT8 *LoadOption;\r
+ UINTN BootOptionSize;\r
+ BOOLEAN BootNextFlag;\r
+ UINT16 *BootOrderList;\r
+ UINTN BootOrderListSize;\r
+ UINT16 *BootNext;\r
+ UINTN BootNextSize;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT8 *LoadOptionPtr;\r
+ UINTN StringSize;\r
+ UINTN OptionalDataSize;\r
+ UINT8 *LoadOptionEnd;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ UINTN MenuCount;\r
+ UINT8 *Ptr;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;\r
+ UINTN BootOptionCount; \r
+ \r
+ MenuCount = 0;\r
+ BootOrderListSize = 0;\r
+ BootNextSize = 0;\r
+ BootOrderList = NULL;\r
+ BootNext = NULL;\r
+ LoadOptionFromVar = NULL;\r
+ BOpt_FreeMenu (&BootOptionMenu);\r
+ InitializeListHead (&BootOptionMenu.Head);\r
+\r
+ //\r
+ // Get the BootOrder from the Var\r
+ //\r
+ GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+ if (BootOrderList == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ \r
+ //\r
+ // Get the BootNext from the Var\r
+ //\r
+ GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize);\r
+ if (BootNext != NULL) {\r
+ if (BootNextSize != sizeof (UINT16)) {\r
+ FreePool (BootNext);\r
+ BootNext = NULL;\r
+ }\r
+ }\r
+ BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);\r
+ for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) {\r
+ //\r
+ // Don't display the hidden/inactive boot option\r
+ //\r
+ if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) {\r
+ continue;\r
+ }\r
+ \r
+ UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]);\r
+ //\r
+ // Get all loadoptions from the VAR\r
+ //\r
+ GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize);\r
+ if (LoadOptionFromVar == NULL) {\r
+ continue;\r
+ }\r
+\r
+ LoadOption = AllocateZeroPool (BootOptionSize);\r
+ if (LoadOption == NULL) {\r
+ continue;\r
+ }\r
+\r
+ CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize);\r
+ FreePool (LoadOptionFromVar);\r
+\r
+ if (BootNext != NULL) {\r
+ BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]);\r
+ } else {\r
+ BootNextFlag = FALSE;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+ ASSERT (NULL != NewMenuEntry);\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ LoadOptionPtr = LoadOption;\r
+ LoadOptionEnd = LoadOption + BootOptionSize;\r
+\r
+ NewMenuEntry->OptionNumber = BootOrderList[Index];\r
+ NewLoadContext->LoadOptionModified = FALSE;\r
+ NewLoadContext->Deleted = FALSE;\r
+ NewLoadContext->IsBootNext = BootNextFlag;\r
+\r
+ //\r
+ // Is a Legacy Device?\r
+ //\r
+ Ptr = (UINT8 *) LoadOption;\r
+\r
+ //\r
+ // Attribute = *(UINT32 *)Ptr;\r
+ //\r
+ Ptr += sizeof (UINT32);\r
+\r
+ //\r
+ // FilePathSize = *(UINT16 *)Ptr;\r
+ //\r
+ Ptr += sizeof (UINT16);\r
+\r
+ //\r
+ // Description = (CHAR16 *)Ptr;\r
+ //\r
+ Ptr += StrSize ((CHAR16 *) Ptr);\r
+\r
+ //\r
+ // Now Ptr point to Device Path\r
+ //\r
+ DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr;\r
+ if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) {\r
+ NewLoadContext->IsLegacy = TRUE;\r
+ } else {\r
+ NewLoadContext->IsLegacy = FALSE;\r
+ }\r
+ //\r
+ // LoadOption is a pointer type of UINT8\r
+ // for easy use with following LOAD_OPTION\r
+ // embedded in this struct\r
+ //\r
+ NewLoadContext->LoadOption = LoadOption;\r
+ NewLoadContext->LoadOptionSize = BootOptionSize;\r
+\r
+ NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
+ NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
+\r
+ NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+ LoadOptionPtr += sizeof (UINT32);\r
+\r
+ NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
+ LoadOptionPtr += sizeof (UINT16);\r
+ \r
+ StringSize = StrSize((UINT16*)LoadOptionPtr);\r
+\r
+ NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr));\r
+ ASSERT (NewLoadContext->Description != NULL);\r
+ StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr);\r
+ \r
+ ASSERT (NewLoadContext->Description != NULL);\r
+ NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+ LoadOptionPtr += StringSize;\r
+\r
+ NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
+ ASSERT (NewLoadContext->FilePathList != NULL);\r
+ CopyMem (\r
+ NewLoadContext->FilePathList,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
+ NewLoadContext->FilePathListLength\r
+ );\r
+\r
+ NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+ NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+\r
+ LoadOptionPtr += NewLoadContext->FilePathListLength;\r
+\r
+ if (LoadOptionPtr < LoadOptionEnd) {\r
+ OptionalDataSize = BootOptionSize -\r
+ sizeof (UINT32) -\r
+ sizeof (UINT16) -\r
+ StringSize -\r
+ NewLoadContext->FilePathListLength;\r
+\r
+ NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
+ ASSERT (NewLoadContext->OptionalData != NULL);\r
+ CopyMem (\r
+ NewLoadContext->OptionalData,\r
+ LoadOptionPtr,\r
+ OptionalDataSize\r
+ );\r
+\r
+ NewLoadContext->OptionalDataSize = OptionalDataSize;\r
+ }\r
+\r
+ InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
+ MenuCount++;\r
+ }\r
+ EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);\r
+\r
+ if (BootNext != NULL) {\r
+ FreePool (BootNext);\r
+ }\r
+ if (BootOrderList != NULL) {\r
+ FreePool (BootOrderList);\r
+ }\r
+ BootOptionMenu.MenuNumber = MenuCount;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ Find drivers that will be added as Driver#### variables from handles\r
+ in current system environment\r
+ All valid handles in the system except those consume SimpleFs, LoadFile\r
+ are stored in DriverMenu for future use.\r
+\r
+ @retval EFI_SUCCESS The function complets successfully.\r
+ @return Other value if failed to build the DriverMenu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindDrivers (\r
+ VOID\r
+ )\r
+{\r
+ UINTN NoDevicePathHandles;\r
+ EFI_HANDLE *DevicePathHandle;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_HANDLE_CONTEXT *NewHandleContext;\r
+ EFI_HANDLE CurHandle;\r
+ UINTN OptionNumber;\r
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs;\r
+ EFI_LOAD_FILE_PROTOCOL *LoadFile;\r
+\r
+ SimpleFs = NULL;\r
+ LoadFile = NULL;\r
+\r
+ InitializeListHead (&DriverMenu.Head);\r
+\r
+ //\r
+ // At first, get all handles that support Device Path\r
+ // protocol which is the basic requirement for\r
+ // Driver####\r
+ //\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiDevicePathProtocolGuid,\r
+ NULL,\r
+ &NoDevicePathHandles,\r
+ &DevicePathHandle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ OptionNumber = 0;\r
+ for (Index = 0; Index < NoDevicePathHandles; Index++) {\r
+ CurHandle = DevicePathHandle[Index];\r
+\r
+ Status = gBS->HandleProtocol (\r
+ CurHandle,\r
+ &gEfiSimpleFileSystemProtocolGuid,\r
+ (VOID **) &SimpleFs\r
+ );\r
+ if (Status == EFI_SUCCESS) {\r
+ continue;\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ CurHandle,\r
+ &gEfiLoadFileProtocolGuid,\r
+ (VOID **) &LoadFile\r
+ );\r
+ if (Status == EFI_SUCCESS) {\r
+ continue;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT);\r
+ if (NULL == NewMenuEntry) {\r
+ FreePool (DevicePathHandle);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewHandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewHandleContext->Handle = CurHandle;\r
+ NewHandleContext->DevicePath = DevicePathFromHandle (CurHandle);\r
+ NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath);\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL);\r
+ NewMenuEntry->HelpString = NULL;\r
+ NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+ NewMenuEntry->OptionNumber = OptionNumber;\r
+ OptionNumber++;\r
+ InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link);\r
+\r
+ }\r
+\r
+ if (DevicePathHandle != NULL) {\r
+ FreePool (DevicePathHandle);\r
+ }\r
+\r
+ DriverMenu.MenuNumber = OptionNumber;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ Get the Option Number that has not been allocated for use.\r
+\r
+ @param Type The type of Option.\r
+\r
+ @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetOptionNumber (\r
+ CHAR16 *Type\r
+ )\r
+{\r
+ UINT16 *OrderList;\r
+ UINTN OrderListSize;\r
+ UINTN Index;\r
+ CHAR16 StrTemp[20];\r
+ UINT16 *OptionBuffer;\r
+ UINT16 OptionNumber;\r
+ UINTN OptionSize;\r
+\r
+ OrderListSize = 0;\r
+ OrderList = NULL;\r
+ OptionNumber = 0;\r
+ Index = 0;\r
+\r
+ UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type);\r
+\r
+ GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize);\r
+ for (OptionNumber = 0; ; OptionNumber++) {\r
+ if (OrderList != NULL) {\r
+ for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) {\r
+ if (OptionNumber == OrderList[Index]) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (Index < OrderListSize / sizeof (UINT16)) {\r
+ //\r
+ // The OptionNumber occurs in the OrderList, continue to use next one\r
+ //\r
+ continue;\r
+ }\r
+ UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber);\r
+ DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp));\r
+ GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize);\r
+ if (NULL == OptionBuffer) {\r
+ //\r
+ // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it\r
+ //\r
+ break;\r
+ }\r
+ }\r
+\r
+ return OptionNumber;\r
+}\r
+\r
+/**\r
+\r
+ Get the Option Number for Boot#### that does not used.\r
+\r
+ @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetBootOptionNumber (\r
+ VOID\r
+ )\r
+{\r
+ return BOpt_GetOptionNumber (L"Boot");\r
+}\r
+\r
+/**\r
+\r
+ Get the Option Number for Driver#### that does not used.\r
+\r
+ @return The unused Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetDriverOptionNumber (\r
+ VOID\r
+ )\r
+{\r
+ return BOpt_GetOptionNumber (L"Driver");\r
+}\r
+\r
+/**\r
+\r
+ Build up all DriverOptionMenu\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCESS The functin completes successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
+ @retval EFI_NOT_FOUND Fail to get "DriverOrder" variable.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetDriverOptions (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT16 DriverString[12];\r
+ UINT8 *LoadOptionFromVar;\r
+ UINT8 *LoadOption;\r
+ UINTN DriverOptionSize;\r
+\r
+ UINT16 *DriverOrderList;\r
+ UINTN DriverOrderListSize;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT8 *LoadOptionPtr;\r
+ UINTN StringSize;\r
+ UINTN OptionalDataSize;\r
+ UINT8 *LoadOptionEnd;\r
+\r
+ DriverOrderListSize = 0;\r
+ DriverOrderList = NULL;\r
+ DriverOptionSize = 0;\r
+ LoadOptionFromVar = NULL;\r
+ BOpt_FreeMenu (&DriverOptionMenu);\r
+ InitializeListHead (&DriverOptionMenu.Head);\r
+ //\r
+ // Get the DriverOrder from the Var\r
+ //\r
+ GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+ if (DriverOrderList == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ \r
+ for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) {\r
+ UnicodeSPrint (\r
+ DriverString,\r
+ sizeof (DriverString),\r
+ L"Driver%04x",\r
+ DriverOrderList[Index]\r
+ );\r
+ //\r
+ // Get all loadoptions from the VAR\r
+ //\r
+ GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize);\r
+ if (LoadOptionFromVar == NULL) {\r
+ continue;\r
+ }\r
+\r
+ LoadOption = AllocateZeroPool (DriverOptionSize);\r
+ if (LoadOption == NULL) {\r
+ continue;\r
+ }\r
+\r
+ CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize);\r
+ FreePool (LoadOptionFromVar);\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ LoadOptionPtr = LoadOption;\r
+ LoadOptionEnd = LoadOption + DriverOptionSize;\r
+ NewMenuEntry->OptionNumber = DriverOrderList[Index];\r
+ NewLoadContext->LoadOptionModified = FALSE;\r
+ NewLoadContext->Deleted = FALSE;\r
+ NewLoadContext->IsLegacy = FALSE;\r
+\r
+ //\r
+ // LoadOption is a pointer type of UINT8\r
+ // for easy use with following LOAD_OPTION\r
+ // embedded in this struct\r
+ //\r
+ NewLoadContext->LoadOption = LoadOption;\r
+ NewLoadContext->LoadOptionSize = DriverOptionSize;\r
+\r
+ NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr;\r
+ NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE);\r
+\r
+ NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+ LoadOptionPtr += sizeof (UINT32);\r
+\r
+ NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr;\r
+ LoadOptionPtr += sizeof (UINT16);\r
+\r
+ StringSize = StrSize ((UINT16 *) LoadOptionPtr);\r
+ NewLoadContext->Description = AllocateZeroPool (StringSize);\r
+ ASSERT (NewLoadContext->Description != NULL);\r
+ CopyMem (\r
+ NewLoadContext->Description,\r
+ (UINT16 *) LoadOptionPtr,\r
+ StringSize\r
+ );\r
+ NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+ LoadOptionPtr += StringSize;\r
+\r
+ NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength);\r
+ ASSERT (NewLoadContext->FilePathList != NULL);\r
+ CopyMem (\r
+ NewLoadContext->FilePathList,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr,\r
+ NewLoadContext->FilePathListLength\r
+ );\r
+\r
+ NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+ NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); \r
+\r
+ LoadOptionPtr += NewLoadContext->FilePathListLength;\r
+\r
+ if (LoadOptionPtr < LoadOptionEnd) {\r
+ OptionalDataSize = DriverOptionSize -\r
+ sizeof (UINT32) -\r
+ sizeof (UINT16) -\r
+ StringSize -\r
+ NewLoadContext->FilePathListLength;\r
+\r
+ NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize);\r
+ ASSERT (NewLoadContext->OptionalData != NULL);\r
+ CopyMem (\r
+ NewLoadContext->OptionalData,\r
+ LoadOptionPtr,\r
+ OptionalDataSize\r
+ );\r
+\r
+ NewLoadContext->OptionalDataSize = OptionalDataSize;\r
+ }\r
+\r
+ InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
+\r
+ }\r
+\r
+ if (DriverOrderList != NULL) {\r
+ FreePool (DriverOrderList);\r
+ }\r
+ DriverOptionMenu.MenuNumber = Index;\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+ Get option number according to Boot#### and BootOrder variable. \r
+ The value is saved as #### + 1.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID \r
+GetBootOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BMM_FAKE_NV_DATA *BmmConfig;\r
+ UINT16 Index;\r
+ UINT16 OptionOrderIndex; \r
+ UINTN DeviceType;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext; \r
+\r
+ ASSERT (CallbackData != NULL);\r
+ \r
+ DeviceType = (UINTN) -1; \r
+ BmmConfig = &CallbackData->BmmFakeNvData; \r
+ ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder));\r
+ \r
+ for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) &&\r
+ (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0]))));\r
+ Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ if (NewLoadContext->IsLegacy) {\r
+ if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {\r
+ DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;\r
+ } else {\r
+ //\r
+ // Only show one legacy boot option for the same device type\r
+ // assuming the boot options are grouped by the device type\r
+ //\r
+ continue;\r
+ }\r
+ }\r
+ BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+ } \r
+}\r
+\r
+/**\r
+ Get driver option order from globalc DriverOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+ \r
+**/\r
+VOID \r
+GetDriverOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BMM_FAKE_NV_DATA *BmmConfig;\r
+ UINT16 Index;\r
+ UINT16 OptionOrderIndex; \r
+ UINTN DeviceType;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext; \r
+\r
+\r
+ ASSERT (CallbackData != NULL);\r
+ \r
+ DeviceType = (UINTN) -1; \r
+ BmmConfig = &CallbackData->BmmFakeNvData; \r
+ ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder));\r
+ \r
+ for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) &&\r
+ (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0]))));\r
+ Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ if (NewLoadContext->IsLegacy) {\r
+ if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) {\r
+ DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType;\r
+ } else {\r
+ //\r
+ // Only show one legacy boot option for the same device type\r
+ // assuming the boot options are grouped by the device type\r
+ //\r
+ continue;\r
+ }\r
+ }\r
+ BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1);\r
+ } \r
+} \r
+\r
+/**\r
+ Boot the file specified by the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+**/\r
+BOOLEAN \r
+BootFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ )\r
+{\r
+ EFI_BOOT_MANAGER_LOAD_OPTION BootOption;\r
+ CHAR16 *FileName;\r
+\r
+ FileName = ExtractFileNameFromDevicePath(FilePath);\r
+ EfiBootManagerInitializeLoadOption (\r
+ &BootOption,\r
+ 0,\r
+ LoadOptionTypeBoot,\r
+ LOAD_OPTION_ACTIVE,\r
+ FileName,\r
+ FilePath,\r
+ NULL,\r
+ 0\r
+ );\r
+ //\r
+ // Since current no boot from removable media directly is allowed */\r
+ //\r
+ gST->ConOut->ClearScreen (gST->ConOut);\r
+\r
+ BmmBdsSetConsoleMode (FALSE);\r
+ EfiBootManagerBoot (&BootOption);\r
+ BmmBdsSetConsoleMode (TRUE);\r
+\r
+ FreePool(FileName);\r
+\r
+ EfiBootManagerFreeLoadOption (&BootOption);\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Display the form base on the selected file.\r
+\r
+ @param FilePath Point to the file path.\r
+ @param FormId The form need to display.\r
+\r
+**/\r
+BOOLEAN\r
+ReSendForm(\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath,\r
+ IN EFI_FORM_ID FormId\r
+ )\r
+{\r
+ gBootMaintenancePrivate.LoadContext->FilePathList = FilePath;\r
+\r
+ UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath);\r
+\r
+ gBootMaintenancePrivate.FormBrowser2->SendForm (\r
+ gBootMaintenancePrivate.FormBrowser2,\r
+ &gBootMaintenancePrivate.BmmHiiHandle,\r
+ 1,\r
+ &mBootMaintGuid,\r
+ FormId,\r
+ NULL,\r
+ NULL\r
+ );\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+ Create boot option base on the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+**/\r
+BOOLEAN \r
+CreateBootOptionFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ )\r
+{\r
+ return ReSendForm(FilePath, FORM_BOOT_ADD_ID);\r
+}\r
+\r
+/**\r
+ Create driver option base on the input file path info.\r
+\r
+ @param FilePath Point to the file path.\r
+\r
+ @retval TRUE Exit caller function.\r
+ @retval FALSE Not exit caller function.\r
+\r
+**/\r
+BOOLEAN \r
+CreateDriverOptionFromFile (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath\r
+ )\r
+{\r
+ return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID);\r
+}\r
+\r
--- /dev/null
+/** @file\r
+handles console redirection from boot manager\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+ Function compares a device path data structure to that of all the nodes of a\r
+ second device path instance.\r
+\r
+ @param Multi A pointer to a multi-instance device path data\r
+ structure.\r
+ @param Single A pointer to a single-instance device path data\r
+ structure.\r
+\r
+ @retval TRUE If the Single device path is contained within Multi device path.\r
+ @retval FALSE The Single device path is not match within Multi device path.\r
+\r
+**/\r
+BOOLEAN\r
+MatchDevicePaths (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Multi,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *Single\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
+ UINTN Size;\r
+\r
+ if (Multi == NULL || Single == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ DevicePath = Multi;\r
+ DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+\r
+ //\r
+ // Search for the match of 'Single' in 'Multi'\r
+ //\r
+ while (DevicePathInst != NULL) {\r
+ //\r
+ // If the single device path is found in multiple device paths,\r
+ // return success\r
+ //\r
+ if (CompareMem (Single, DevicePathInst, Size) == 0) {\r
+ FreePool (DevicePathInst);\r
+ return TRUE;\r
+ }\r
+\r
+ FreePool (DevicePathInst);\r
+ DevicePathInst = GetNextDevicePathInstance (&DevicePath, &Size);\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Check whether the device path node is ISA Serial Node.\r
+\r
+ @param Acpi Device path node to be checked\r
+\r
+ @retval TRUE It's ISA Serial Node.\r
+ @retval FALSE It's NOT ISA Serial Node.\r
+\r
+**/\r
+BOOLEAN\r
+IsIsaSerialNode (\r
+ IN ACPI_HID_DEVICE_PATH *Acpi\r
+ )\r
+{\r
+ return (BOOLEAN) (\r
+ (DevicePathType (Acpi) == ACPI_DEVICE_PATH) &&\r
+ (DevicePathSubType (Acpi) == ACPI_DP) &&\r
+ (ReadUnaligned32 (&Acpi->HID) == EISA_PNP_ID (0x0501))\r
+ );\r
+}\r
+\r
+/**\r
+ Update Com Ports attributes from DevicePath\r
+\r
+ @param DevicePath DevicePath that contains Com ports\r
+\r
+ @retval EFI_SUCCESS The update is successful.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdateComAttributeFromVariable (\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ );\r
+\r
+/**\r
+ Update the multi-instance device path of Terminal Device based on\r
+ the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
+ device path in the Terminal Device in TerminalMenu is also updated.\r
+\r
+ @param DevicePath The multi-instance device path.\r
+ @param ChangeTerminal TRUE, then device path in the Terminal Device \r
+ in TerminalMenu is also updated; FALSE, no update.\r
+\r
+ @return EFI_SUCCESS The function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ChangeTerminalDevicePath (\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN BOOLEAN ChangeTerminal\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *Node;\r
+ EFI_DEVICE_PATH_PROTOCOL *Node1;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+ UART_DEVICE_PATH *Uart;\r
+ UART_DEVICE_PATH *Uart1;\r
+ UINTN Com;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ Node = DevicePath;\r
+ Node = NextDevicePathNode (Node);\r
+ Com = 0;\r
+ while (!IsDevicePathEnd (Node)) {\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+ if (IsIsaSerialNode (Acpi)) {\r
+ CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
+ }\r
+\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Com);\r
+\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+ Uart = (UART_DEVICE_PATH *) Node;\r
+ CopyMem (\r
+ &Uart->BaudRate,\r
+ &NewTerminalContext->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->DataBits,\r
+ &NewTerminalContext->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->Parity,\r
+ &NewTerminalContext->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->StopBits,\r
+ &NewTerminalContext->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+ //\r
+ // Change the device path in the ComPort\r
+ //\r
+ if (ChangeTerminal) {\r
+ Node1 = NewTerminalContext->DevicePath;\r
+ Node1 = NextDevicePathNode (Node1);\r
+ while (!IsDevicePathEnd (Node1)) {\r
+ if ((DevicePathType (Node1) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node1) == MSG_UART_DP)) {\r
+ Uart1 = (UART_DEVICE_PATH *) Node1;\r
+ CopyMem (\r
+ &Uart1->BaudRate,\r
+ &NewTerminalContext->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart1->DataBits,\r
+ &NewTerminalContext->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart1->Parity,\r
+ &NewTerminalContext->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart1->StopBits,\r
+ &NewTerminalContext->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+ break;\r
+ }\r
+ //\r
+ // end if\r
+ //\r
+ Node1 = NextDevicePathNode (Node1);\r
+ }\r
+ //\r
+ // end while\r
+ //\r
+ break;\r
+ }\r
+ }\r
+\r
+ Node = NextDevicePathNode (Node);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+ Update the device path that describing a terminal device\r
+ based on the new BaudRate, Data Bits, parity and Stop Bits\r
+ set.\r
+\r
+ @param DevicePath terminal device's path\r
+\r
+**/\r
+VOID\r
+ChangeVariableDevicePath (\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *Node;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+ UART_DEVICE_PATH *Uart;\r
+ UINTN Com;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ Node = DevicePath;\r
+ Node = NextDevicePathNode (Node);\r
+ Com = 0;\r
+ while (!IsDevicePathEnd (Node)) {\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+ if (IsIsaSerialNode (Acpi)) {\r
+ CopyMem (&Com, &Acpi->UID, sizeof (UINT32));\r
+ }\r
+\r
+ if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (\r
+ &TerminalMenu,\r
+ Com\r
+ );\r
+ ASSERT (NewMenuEntry != NULL);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ Uart = (UART_DEVICE_PATH *) Node;\r
+ CopyMem (\r
+ &Uart->BaudRate,\r
+ &NewTerminalContext->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->DataBits,\r
+ &NewTerminalContext->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->Parity,\r
+ &NewTerminalContext->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart->StopBits,\r
+ &NewTerminalContext->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+ }\r
+\r
+ Node = NextDevicePathNode (Node);\r
+ }\r
+}\r
+\r
+/**\r
+ Retrieve ACPI UID of UART from device path\r
+\r
+ @param Handle The handle for the UART device.\r
+ @param AcpiUid The ACPI UID on output.\r
+\r
+ @retval TRUE Find valid UID from device path\r
+ @retval FALSE Can't find\r
+\r
+**/\r
+BOOLEAN\r
+RetrieveUartUid (\r
+ IN EFI_HANDLE Handle,\r
+ IN OUT UINT32 *AcpiUid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID **) &DevicePath\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+\r
+ Acpi = NULL;\r
+ for (; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {\r
+ if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DevicePath) == MSG_UART_DP)) {\r
+ break;\r
+ }\r
+ //\r
+ // Acpi points to the node before the Uart node\r
+ //\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
+ }\r
+\r
+ if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+ if (AcpiUid != NULL) {\r
+ CopyMem (AcpiUid, &Acpi->UID, sizeof (UINT32));\r
+ }\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+/**\r
+ Sort Uart handles array with Acpi->UID from low to high.\r
+\r
+ @param Handles EFI_SERIAL_IO_PROTOCOL handle buffer\r
+ @param NoHandles EFI_SERIAL_IO_PROTOCOL handle count\r
+**/\r
+VOID\r
+SortedUartHandle (\r
+ IN EFI_HANDLE *Handles,\r
+ IN UINTN NoHandles\r
+ )\r
+{\r
+ UINTN Index1;\r
+ UINTN Index2;\r
+ UINTN Position;\r
+ UINT32 AcpiUid1;\r
+ UINT32 AcpiUid2;\r
+ UINT32 TempAcpiUid;\r
+ EFI_HANDLE TempHandle;\r
+\r
+ for (Index1 = 0; Index1 < NoHandles-1; Index1++) {\r
+ if (!RetrieveUartUid (Handles[Index1], &AcpiUid1)) {\r
+ continue;\r
+ }\r
+ TempHandle = Handles[Index1];\r
+ Position = Index1;\r
+ TempAcpiUid = AcpiUid1;\r
+\r
+ for (Index2 = Index1+1; Index2 < NoHandles; Index2++) {\r
+ if (!RetrieveUartUid (Handles[Index2], &AcpiUid2)) {\r
+ continue;\r
+ }\r
+ if (AcpiUid2 < TempAcpiUid) {\r
+ TempAcpiUid = AcpiUid2;\r
+ TempHandle = Handles[Index2];\r
+ Position = Index2;\r
+ }\r
+ }\r
+ Handles[Position] = Handles[Index1];\r
+ Handles[Index1] = TempHandle;\r
+ }\r
+}\r
+\r
+/**\r
+ Test whether DevicePath is a valid Terminal\r
+\r
+\r
+ @param DevicePath DevicePath to be checked\r
+ @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
+ @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
+\r
+ @retval TRUE If DevicePath point to a Terminal.\r
+ @retval FALSE If DevicePath does not point to a Terminal.\r
+\r
+**/\r
+BOOLEAN\r
+IsTerminalDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ OUT TYPE_OF_TERMINAL *Termi,\r
+ OUT UINTN *Com\r
+ );\r
+\r
+/**\r
+ Build a list containing all serial devices.\r
+\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_UNSUPPORTED No serial ports present.\r
+\r
+**/\r
+EFI_STATUS\r
+LocateSerialIo (\r
+ VOID\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN Index2;\r
+ UINTN NoHandles;\r
+ EFI_HANDLE *Handles;\r
+ EFI_STATUS Status;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
+ EFI_DEVICE_PATH_PROTOCOL *Node;\r
+ EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
+ VENDOR_DEVICE_PATH Vendor;\r
+\r
+ //\r
+ // Get all handles that have SerialIo protocol installed\r
+ //\r
+ InitializeListHead (&TerminalMenu.Head);\r
+ TerminalMenu.MenuNumber = 0;\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiSerialIoProtocolGuid,\r
+ NULL,\r
+ &NoHandles,\r
+ &Handles\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // No serial ports present\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Sort Uart handles array with Acpi->UID from low to high\r
+ // then Terminal menu can be built from low Acpi->UID to high Acpi->UID\r
+ //\r
+ SortedUartHandle (Handles, NoHandles);\r
+\r
+ for (Index = 0; Index < NoHandles; Index++) {\r
+ //\r
+ // Check to see whether the handle has DevicePath Protocol installed\r
+ //\r
+ gBS->HandleProtocol (\r
+ Handles[Index],\r
+ &gEfiDevicePathProtocolGuid,\r
+ (VOID **) &DevicePath\r
+ );\r
+\r
+ Acpi = NULL;\r
+ for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
+ if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+ break;\r
+ }\r
+ //\r
+ // Acpi points to the node before Uart node\r
+ //\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+ }\r
+\r
+ if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_TERMINAL_CONTEXT_SELECT);\r
+ if (NewMenuEntry == NULL) {\r
+ FreePool (Handles);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ CopyMem (&NewMenuEntry->OptionNumber, &Acpi->UID, sizeof (UINT32));\r
+ NewTerminalContext->DevicePath = DuplicateDevicePath (DevicePath);\r
+ //\r
+ // BugBug: I have no choice, calling EfiLibStrFromDatahub will hang the system!\r
+ // coz' the misc data for each platform is not correct, actually it's the device path stored in\r
+ // datahub which is not completed, so a searching for end of device path will enter a\r
+ // dead-loop.\r
+ //\r
+ NewMenuEntry->DisplayString = EfiLibStrFromDatahub (DevicePath);\r
+ if (NULL == NewMenuEntry->DisplayString) {\r
+ NewMenuEntry->DisplayString = UiDevicePathToStr (DevicePath);\r
+ }\r
+\r
+ NewMenuEntry->HelpString = NULL;\r
+\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+ NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+\r
+ gBS->HandleProtocol (\r
+ Handles[Index],\r
+ &gEfiSerialIoProtocolGuid,\r
+ (VOID **) &SerialIo\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->BaudRate,\r
+ &SerialIo->Mode->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->DataBits,\r
+ &SerialIo->Mode->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->Parity,\r
+ &SerialIo->Mode->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->StopBits,\r
+ &SerialIo->Mode->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+ InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
+ TerminalMenu.MenuNumber++;\r
+ }\r
+ }\r
+ if (Handles != NULL) {\r
+ FreePool (Handles);\r
+ }\r
+\r
+ //\r
+ // Get L"ConOut", L"ConIn" and L"ErrOut" from the Var\r
+ //\r
+ GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
+ if (OutDevicePath != NULL) {\r
+ UpdateComAttributeFromVariable (OutDevicePath);\r
+ }\r
+\r
+ if (InpDevicePath != NULL) {\r
+ UpdateComAttributeFromVariable (InpDevicePath);\r
+ }\r
+\r
+ if (ErrDevicePath != NULL) {\r
+ UpdateComAttributeFromVariable (ErrDevicePath);\r
+ }\r
+\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ NewTerminalContext->TerminalType = 0;\r
+ NewTerminalContext->IsConIn = FALSE;\r
+ NewTerminalContext->IsConOut = FALSE;\r
+ NewTerminalContext->IsStdErr = FALSE;\r
+\r
+ Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
+ Vendor.Header.SubType = MSG_VENDOR_DP;\r
+\r
+ for (Index2 = 0; Index2 < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])); Index2++) {\r
+ CopyMem (&Vendor.Guid, &TerminalTypeGuid[Index2], sizeof (EFI_GUID));\r
+ SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
+ NewDevicePath = AppendDevicePathNode (\r
+ NewTerminalContext->DevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
+ );\r
+ if (NewMenuEntry->HelpString != NULL) {\r
+ FreePool (NewMenuEntry->HelpString);\r
+ }\r
+ //\r
+ // NewMenuEntry->HelpString = UiDevicePathToStr (NewDevicePath);\r
+ // NewMenuEntry->DisplayString = NewMenuEntry->HelpString;\r
+ //\r
+ NewMenuEntry->HelpString = NULL;\r
+\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+ NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+\r
+ if (MatchDevicePaths (OutDevicePath, NewDevicePath)) {\r
+ NewTerminalContext->IsConOut = TRUE;\r
+ NewTerminalContext->TerminalType = (UINT8) Index2;\r
+ }\r
+\r
+ if (MatchDevicePaths (InpDevicePath, NewDevicePath)) {\r
+ NewTerminalContext->IsConIn = TRUE;\r
+ NewTerminalContext->TerminalType = (UINT8) Index2;\r
+ }\r
+\r
+ if (MatchDevicePaths (ErrDevicePath, NewDevicePath)) {\r
+ NewTerminalContext->IsStdErr = TRUE;\r
+ NewTerminalContext->TerminalType = (UINT8) Index2;\r
+ }\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Update Com Ports attributes from DevicePath\r
+\r
+ @param DevicePath DevicePath that contains Com ports\r
+\r
+ @retval EFI_SUCCESS The update is successful.\r
+ @retval EFI_NOT_FOUND Can not find specific menu entry\r
+**/\r
+EFI_STATUS\r
+UpdateComAttributeFromVariable (\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *Node;\r
+ EFI_DEVICE_PATH_PROTOCOL *SerialNode;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+ UART_DEVICE_PATH *Uart;\r
+ UART_DEVICE_PATH *Uart1;\r
+ UINTN TerminalNumber;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ UINTN Index;\r
+\r
+ Node = DevicePath;\r
+ Node = NextDevicePathNode (Node);\r
+ TerminalNumber = 0;\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ while (!IsDevicePathEnd (Node)) {\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+ if (IsIsaSerialNode (Acpi)) {\r
+ CopyMem (&TerminalNumber, &Acpi->UID, sizeof (UINT32));\r
+ }\r
+\r
+ if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+ Uart = (UART_DEVICE_PATH *) Node;\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalNumber);\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ CopyMem (\r
+ &NewTerminalContext->BaudRate,\r
+ &Uart->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->DataBits,\r
+ &Uart->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->Parity,\r
+ &Uart->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ CopyMem (\r
+ &NewTerminalContext->StopBits,\r
+ &Uart->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ SerialNode = NewTerminalContext->DevicePath;\r
+ SerialNode = NextDevicePathNode (SerialNode);\r
+ while (!IsDevicePathEnd (SerialNode)) {\r
+ if ((DevicePathType (SerialNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (SerialNode) == MSG_UART_DP)) {\r
+ //\r
+ // Update following device paths according to\r
+ // previous acquired uart attributes\r
+ //\r
+ Uart1 = (UART_DEVICE_PATH *) SerialNode;\r
+ CopyMem (\r
+ &Uart1->BaudRate,\r
+ &NewTerminalContext->BaudRate,\r
+ sizeof (UINT64)\r
+ );\r
+\r
+ CopyMem (\r
+ &Uart1->DataBits,\r
+ &NewTerminalContext->DataBits,\r
+ sizeof (UINT8)\r
+ );\r
+ CopyMem (\r
+ &Uart1->Parity,\r
+ &NewTerminalContext->Parity,\r
+ sizeof (UINT8)\r
+ );\r
+ CopyMem (\r
+ &Uart1->StopBits,\r
+ &NewTerminalContext->StopBits,\r
+ sizeof (UINT8)\r
+ );\r
+\r
+ break;\r
+ }\r
+\r
+ SerialNode = NextDevicePathNode (SerialNode);\r
+ }\r
+ //\r
+ // end while\r
+ //\r
+ }\r
+\r
+ Node = NextDevicePathNode (Node);\r
+ }\r
+ //\r
+ // end while\r
+ //\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Build up Console Menu based on types passed in. The type can\r
+ be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
+ and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
+\r
+ @param ConsoleMenuType Can be BM_CONSOLE_IN_CONTEXT_SELECT, BM_CONSOLE_OUT_CONTEXT_SELECT\r
+ and BM_CONSOLE_ERR_CONTEXT_SELECT.\r
+\r
+ @retval EFI_UNSUPPORTED The type passed in is not in the 3 types defined.\r
+ @retval EFI_NOT_FOUND If the EFI Variable defined in UEFI spec with name "ConOutDev", \r
+ "ConInDev" or "ConErrDev" doesn't exists.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operations.\r
+ @retval EFI_SUCCESS Function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetConsoleMenu (\r
+ IN UINTN ConsoleMenuType\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *AllDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *MultiDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;\r
+ UINTN Size;\r
+ UINTN AllCount;\r
+ UINTN Index;\r
+ UINTN Index2;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ TYPE_OF_TERMINAL Terminal;\r
+ UINTN Com;\r
+ BM_MENU_OPTION *ConsoleMenu;\r
+\r
+ DevicePath = NULL;\r
+ AllDevicePath = NULL;\r
+ AllCount = 0;\r
+ switch (ConsoleMenuType) {\r
+ case BM_CONSOLE_IN_CONTEXT_SELECT:\r
+ ConsoleMenu = &ConsoleInpMenu;\r
+ GetEfiGlobalVariable2 (L"ConIn", (VOID**)&DevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ConInDev", (VOID**)&AllDevicePath, NULL);\r
+ break;\r
+\r
+ case BM_CONSOLE_OUT_CONTEXT_SELECT:\r
+ ConsoleMenu = &ConsoleOutMenu;\r
+ GetEfiGlobalVariable2 (L"ConOut", (VOID**)&DevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ConOutDev", (VOID**)&AllDevicePath, NULL);\r
+ break;\r
+\r
+ case BM_CONSOLE_ERR_CONTEXT_SELECT:\r
+ ConsoleMenu = &ConsoleErrMenu;\r
+ GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&DevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ErrOutDev", (VOID**)&AllDevicePath, NULL);\r
+ break;\r
+\r
+ default:\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (NULL == AllDevicePath) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ InitializeListHead (&ConsoleMenu->Head);\r
+\r
+ AllCount = EfiDevicePathInstanceCount (AllDevicePath);\r
+ ConsoleMenu->MenuNumber = 0;\r
+ //\r
+ // Following is menu building up for Console Devices selected.\r
+ //\r
+ MultiDevicePath = AllDevicePath;\r
+ Index2 = 0;\r
+ for (Index = 0; Index < AllCount; Index++) {\r
+ DevicePathInst = GetNextDevicePathInstance (&MultiDevicePath, &Size);\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_CONSOLE_CONTEXT_SELECT);\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewMenuEntry->OptionNumber = Index2;\r
+\r
+ NewConsoleContext->DevicePath = DuplicateDevicePath (DevicePathInst);\r
+ ASSERT (NewConsoleContext->DevicePath != NULL);\r
+ NewMenuEntry->DisplayString = EfiLibStrFromDatahub (NewConsoleContext->DevicePath);\r
+ if (NULL == NewMenuEntry->DisplayString) {\r
+ NewMenuEntry->DisplayString = UiDevicePathToStr (NewConsoleContext->DevicePath);\r
+ }\r
+\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+\r
+ if (NULL == NewMenuEntry->HelpString) {\r
+ NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;\r
+ } else {\r
+ NewMenuEntry->HelpStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+ }\r
+\r
+ NewConsoleContext->IsTerminal = IsTerminalDevicePath (\r
+ NewConsoleContext->DevicePath,\r
+ &Terminal,\r
+ &Com\r
+ );\r
+\r
+ NewConsoleContext->IsActive = MatchDevicePaths (\r
+ DevicePath,\r
+ NewConsoleContext->DevicePath\r
+ );\r
+\r
+ if (NewConsoleContext->IsTerminal) {\r
+ BOpt_DestroyMenuEntry (NewMenuEntry);\r
+ } else {\r
+ Index2++;\r
+ ConsoleMenu->MenuNumber++;\r
+ InsertTailList (&ConsoleMenu->Head, &NewMenuEntry->Link);\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+ @retval EFI_SUCCESS The function always complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetAllConsoles (\r
+ VOID\r
+ )\r
+{\r
+ GetConsoleMenu (BM_CONSOLE_IN_CONTEXT_SELECT);\r
+ GetConsoleMenu (BM_CONSOLE_OUT_CONTEXT_SELECT);\r
+ GetConsoleMenu (BM_CONSOLE_ERR_CONTEXT_SELECT);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+ @retval EFI_SUCCESS The function always complete successfully.\r
+**/\r
+EFI_STATUS\r
+FreeAllConsoles (\r
+ VOID\r
+ )\r
+{\r
+ BOpt_FreeMenu (&ConsoleOutMenu);\r
+ BOpt_FreeMenu (&ConsoleInpMenu);\r
+ BOpt_FreeMenu (&ConsoleErrMenu);\r
+ BOpt_FreeMenu (&TerminalMenu);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Test whether DevicePath is a valid Terminal\r
+\r
+\r
+ @param DevicePath DevicePath to be checked\r
+ @param Termi If DevicePath is valid Terminal, terminal type is returned.\r
+ @param Com If DevicePath is valid Terminal, Com Port type is returned.\r
+\r
+ @retval TRUE If DevicePath point to a Terminal.\r
+ @retval FALSE If DevicePath does not point to a Terminal.\r
+\r
+**/\r
+BOOLEAN\r
+IsTerminalDevicePath (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ OUT TYPE_OF_TERMINAL *Termi,\r
+ OUT UINTN *Com\r
+ )\r
+{\r
+ BOOLEAN IsTerminal;\r
+ EFI_DEVICE_PATH_PROTOCOL *Node;\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+ UART_DEVICE_PATH *Uart;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+\r
+ IsTerminal = FALSE;\r
+\r
+ Uart = NULL;\r
+ Vendor = NULL;\r
+ Acpi = NULL;\r
+ for (Node = DevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {\r
+ //\r
+ // Vendor points to the node before the End node\r
+ //\r
+ Vendor = (VENDOR_DEVICE_PATH *) Node;\r
+\r
+ if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (Node) == MSG_UART_DP)) {\r
+ Uart = (UART_DEVICE_PATH *) Node;\r
+ }\r
+\r
+ if (Uart == NULL) {\r
+ //\r
+ // Acpi points to the node before the UART node\r
+ //\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) Node;\r
+ }\r
+ }\r
+\r
+ if (Vendor == NULL ||\r
+ DevicePathType (Vendor) != MESSAGING_DEVICE_PATH ||\r
+ DevicePathSubType (Vendor) != MSG_VENDOR_DP ||\r
+ Uart == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ //\r
+ // There are four kinds of Terminal types\r
+ // check to see whether this devicepath\r
+ // is one of that type\r
+ //\r
+ if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[0])) {\r
+ *Termi = TerminalTypePcAnsi;\r
+ IsTerminal = TRUE;\r
+ } else {\r
+ if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[1])) {\r
+ *Termi = TerminalTypeVt100;\r
+ IsTerminal = TRUE;\r
+ } else {\r
+ if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[2])) {\r
+ *Termi = TerminalTypeVt100Plus;\r
+ IsTerminal = TRUE;\r
+ } else {\r
+ if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[3])) {\r
+ *Termi = TerminalTypeVtUtf8;\r
+ IsTerminal = TRUE;\r
+ } else {\r
+ if (CompareGuid (&Vendor->Guid, &TerminalTypeGuid[4])) {\r
+ *Termi = TerminalTypeTtyTerm;\r
+ IsTerminal = TRUE;\r
+ } else {\r
+ IsTerminal = FALSE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!IsTerminal) {\r
+ return FALSE;\r
+ }\r
+\r
+ if ((Acpi != NULL) && IsIsaSerialNode (Acpi)) {\r
+ CopyMem (Com, &Acpi->UID, sizeof (UINT32));\r
+ } else {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+/**\r
+ Get mode number according to column and row\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+GetConsoleOutMode (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINTN Col;\r
+ UINTN Row;\r
+ UINTN CurrentCol;\r
+ UINTN CurrentRow;\r
+ UINTN Mode;\r
+ UINTN MaxMode;\r
+ EFI_STATUS Status;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
+\r
+ ConOut = gST->ConOut;\r
+ MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
+\r
+ CurrentCol = PcdGet32 (PcdSetupConOutColumn);\r
+ CurrentRow = PcdGet32 (PcdSetupConOutRow);\r
+ for (Mode = 0; Mode < MaxMode; Mode++) {\r
+ Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+ if (!EFI_ERROR(Status)) {\r
+ if (CurrentCol == Col && CurrentRow == Row) {\r
+ CallbackData->BmmFakeNvData.ConsoleOutMode = (UINT16) Mode;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleInCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConInCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+ for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConInCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleOutCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConOutCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ \r
+ ASSERT (CallbackData != NULL);\r
+ ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+ for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConOutCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleErrCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConErrCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+ ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+ for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConErrCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+ to BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID \r
+GetTerminalAttribute (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext; \r
+ UINT16 TerminalIndex; \r
+ UINT8 AttributeIndex;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ CurrentFakeNVMap = &CallbackData->BmmFakeNvData; \r
+ for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
+ (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
+ if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
+ NewTerminalContext->BaudRateIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
+ NewTerminalContext->DataBitsIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ } \r
+\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
+ NewTerminalContext->ParityIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
+ NewTerminalContext->StopBitsIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+ CurrentFakeNVMap->COMBaudRate[TerminalIndex] = NewTerminalContext->BaudRateIndex;\r
+ CurrentFakeNVMap->COMDataRate[TerminalIndex] = NewTerminalContext->DataBitsIndex;\r
+ CurrentFakeNVMap->COMStopBits[TerminalIndex] = NewTerminalContext->StopBitsIndex;\r
+ CurrentFakeNVMap->COMParity[TerminalIndex] = NewTerminalContext->ParityIndex; \r
+ CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
+ CurrentFakeNVMap->COMFlowControl[TerminalIndex] = NewTerminalContext->FlowControl;\r
+ }\r
+}\r
+\r
--- /dev/null
+/** @file\r
+Define some data used for Boot Maint\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+VOID *mStartOpCodeHandle = NULL;\r
+VOID *mEndOpCodeHandle = NULL;\r
+EFI_IFR_GUID_LABEL *mStartLabel = NULL;\r
+EFI_IFR_GUID_LABEL *mEndLabel = NULL;\r
+\r
+///\r
+/// Terminal type string token storage\r
+///\r
+UINT16 TerminalType[] = {\r
+ STRING_TOKEN(STR_COM_TYPE_0),\r
+ STRING_TOKEN(STR_COM_TYPE_1),\r
+ STRING_TOKEN(STR_COM_TYPE_2),\r
+ STRING_TOKEN(STR_COM_TYPE_3),\r
+ STRING_TOKEN(STR_COM_TYPE_4),\r
+};\r
+\r
+///\r
+/// Flow Control type string token storage\r
+///\r
+UINT16 mFlowControlType[2] = {\r
+ STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
+ STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
+};\r
+\r
+UINT32 mFlowControlValue[2] = {\r
+ 0,\r
+ UART_FLOW_CONTROL_HARDWARE\r
+};\r
+\r
+///\r
+/// Console Input Device Selection Menu\r
+///\r
+BM_MENU_OPTION ConsoleInpMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Console Output Device Selection Menu\r
+///\r
+BM_MENU_OPTION ConsoleOutMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Error Output Device Selection Menu\r
+///\r
+BM_MENU_OPTION ConsoleErrMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Boot Option from variable Menu\r
+///\r
+BM_MENU_OPTION BootOptionMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Driver Option from variable menu\r
+///\r
+BM_MENU_OPTION DriverOptionMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Handles in current system selection menu\r
+///\r
+BM_MENU_OPTION DriverMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+BM_MENU_OPTION TerminalMenu = {\r
+ BM_MENU_OPTION_SIGNATURE,\r
+ {NULL},\r
+ 0\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for BaudRate\r
+///\r
+COM_ATTR BaudRateList[19] = {\r
+ {\r
+ 115200,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_0)\r
+ },\r
+ {\r
+ 57600,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_1)\r
+ },\r
+ {\r
+ 38400,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_2)\r
+ },\r
+ {\r
+ 19200,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_3)\r
+ },\r
+ {\r
+ 9600,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_4)\r
+ },\r
+ {\r
+ 7200,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_5)\r
+ },\r
+ {\r
+ 4800,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_6)\r
+ },\r
+ {\r
+ 3600,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_7)\r
+ },\r
+ {\r
+ 2400,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_8)\r
+ },\r
+ {\r
+ 2000,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_9)\r
+ },\r
+ {\r
+ 1800,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_10)\r
+ },\r
+ {\r
+ 1200,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_11)\r
+ },\r
+ {\r
+ 600,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_12)\r
+ },\r
+ {\r
+ 300,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_13)\r
+ },\r
+ {\r
+ 150,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_14)\r
+ },\r
+ {\r
+ 134,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_15)\r
+ },\r
+ {\r
+ 110,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_16)\r
+ },\r
+ {\r
+ 75,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_17)\r
+ },\r
+ {\r
+ 50,\r
+ STRING_TOKEN(STR_COM_BAUD_RATE_18)\r
+ }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for DataBits\r
+///\r
+COM_ATTR DataBitsList[4] = {\r
+ {\r
+ 5,\r
+ STRING_TOKEN(STR_COM_DATA_BITS_0)\r
+ },\r
+ {\r
+ 6,\r
+ STRING_TOKEN(STR_COM_DATA_BITS_1)\r
+ },\r
+ {\r
+ 7,\r
+ STRING_TOKEN(STR_COM_DATA_BITS_2)\r
+ },\r
+ {\r
+ 8,\r
+ STRING_TOKEN(STR_COM_DATA_BITS_3)\r
+ }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for Parity\r
+///\r
+COM_ATTR ParityList[5] = {\r
+ {\r
+ NoParity,\r
+ STRING_TOKEN(STR_COM_PAR_0)\r
+ },\r
+ {\r
+ EvenParity,\r
+ STRING_TOKEN(STR_COM_PAR_1)\r
+ },\r
+ {\r
+ OddParity,\r
+ STRING_TOKEN(STR_COM_PAR_2)\r
+ },\r
+ {\r
+ MarkParity,\r
+ STRING_TOKEN(STR_COM_PAR_3)\r
+ },\r
+ {\r
+ SpaceParity,\r
+ STRING_TOKEN(STR_COM_PAR_4)\r
+ }\r
+};\r
+\r
+///\r
+/// Value and string token correspondency for Baudreate\r
+///\r
+COM_ATTR StopBitsList[3] = {\r
+ {\r
+ OneStopBit,\r
+ STRING_TOKEN(STR_COM_STOP_BITS_0)\r
+ },\r
+ {\r
+ OneFiveStopBits,\r
+ STRING_TOKEN(STR_COM_STOP_BITS_1)\r
+ },\r
+ {\r
+ TwoStopBits,\r
+ STRING_TOKEN(STR_COM_STOP_BITS_2)\r
+ }\r
+};\r
+\r
+///\r
+/// Guid for messaging path, used in Serial port setting.\r
+///\r
+EFI_GUID TerminalTypeGuid[] = {\r
+ DEVICE_PATH_MESSAGING_PC_ANSI,\r
+ DEVICE_PATH_MESSAGING_VT_100,\r
+ DEVICE_PATH_MESSAGING_VT_100_PLUS,\r
+ DEVICE_PATH_MESSAGING_VT_UTF8,\r
+ EFI_TTY_TERM_GUID\r
+};\r
--- /dev/null
+/** @file\r
+Formset guids, form id and VarStore data structure for Boot Maintenance Manager.\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+#ifndef _FORM_GUID_H_\r
+#define _FORM_GUID_H_\r
+\r
+#define BOOT_MAINT_FORMSET_GUID \\r
+ { \\r
+ 0x642237c7, 0x35d4, 0x472d, {0x83, 0x65, 0x12, 0xe0, 0xcc, 0xf2, 0x7a, 0x22} \\r
+ }\r
+\r
+#define FORM_MAIN_ID 0x1001\r
+#define FORM_BOOT_ADD_ID 0x1002\r
+#define FORM_BOOT_DEL_ID 0x1003\r
+#define FORM_BOOT_CHG_ID 0x1004\r
+#define FORM_DRV_ADD_ID 0x1005\r
+#define FORM_DRV_DEL_ID 0x1006\r
+#define FORM_DRV_CHG_ID 0x1007\r
+#define FORM_CON_MAIN_ID 0x1008\r
+#define FORM_CON_IN_ID 0x1009\r
+#define FORM_CON_OUT_ID 0x100A\r
+#define FORM_CON_ERR_ID 0x100B\r
+#define FORM_FILE_SEEK_ID 0x100C\r
+#define FORM_FILE_NEW_SEEK_ID 0x100D\r
+#define FORM_DRV_ADD_FILE_ID 0x100E\r
+#define FORM_DRV_ADD_HANDLE_ID 0x100F\r
+#define FORM_DRV_ADD_HANDLE_DESC_ID 0x1010\r
+#define FORM_BOOT_NEXT_ID 0x1011\r
+#define FORM_TIME_OUT_ID 0x1012\r
+#define FORM_BOOT_SETUP_ID 0x1014\r
+#define FORM_DRIVER_SETUP_ID 0x1015\r
+#define FORM_BOOT_LEGACY_DEVICE_ID 0x1016\r
+#define FORM_CON_COM_ID 0x1017\r
+#define FORM_CON_COM_SETUP_ID 0x1018\r
+#define FORM_BOOT_ADD_DESCRIPTION_ID 0x101F\r
+#define FORM_DRIVER_ADD_FILE_DESCRIPTION_ID 0x1020\r
+#define FORM_CON_MODE_ID 0x1021\r
+#define FORM_MEMORY_CHECK_ID 0x1022\r
+#define FORM_UEFI_OPTIMIZED_BOOT_ID 0x1023\r
+#define FORM_BOOT_FROM_FILE_ID 0x1024\r
+\r
+\r
+#define MAXIMUM_FORM_ID 0x10FF\r
+\r
+#define KEY_VALUE_COM_SET_BAUD_RATE 0x1101\r
+#define KEY_VALUE_COM_SET_DATA_BITS 0x1102\r
+#define KEY_VALUE_COM_SET_STOP_BITS 0x1103\r
+#define KEY_VALUE_COM_SET_PARITY 0x1104\r
+#define KEY_VALUE_COM_SET_TERMI_TYPE 0x1105\r
+#define KEY_VALUE_MAIN_BOOT_NEXT 0x1106\r
+#define KEY_VALUE_BOOT_ADD_DESC_DATA 0x1107\r
+#define KEY_VALUE_BOOT_ADD_OPT_DATA 0x1108\r
+#define KEY_VALUE_DRIVER_ADD_DESC_DATA 0x1109\r
+#define KEY_VALUE_DRIVER_ADD_OPT_DATA 0x110A\r
+#define KEY_VALUE_SAVE_AND_EXIT 0x110B\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C\r
+#define KEY_VALUE_BOOT_FROM_FILE 0x110D\r
+#define FORM_RESET 0x110E\r
+#define KEY_VALUE_BOOT_DESCRIPTION 0x110F\r
+#define KEY_VALUE_BOOT_OPTION 0x1110\r
+#define KEY_VALUE_DRIVER_DESCRIPTION 0x1111\r
+#define KEY_VALUE_DRIVER_OPTION 0x1112\r
+#define KEY_VALUE_SAVE_AND_EXIT_BOOT 0x1113\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT_BOOT 0x1114\r
+#define KEY_VALUE_SAVE_AND_EXIT_DRIVER 0x1115\r
+#define KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER 0x1116\r
+\r
+#define MAXIMUM_NORMAL_KEY_VALUE 0x11FF\r
+\r
+//\r
+// Varstore ID defined for Buffer Storage\r
+//\r
+#define VARSTORE_ID_BOOT_MAINT 0x1000\r
+\r
+//\r
+// End Label\r
+//\r
+#define LABEL_BMM_PLATFORM_INFORMATION 0xfffe\r
+#define LABEL_END 0xffff\r
+#define MAX_MENU_NUMBER 100\r
+\r
+///\r
+/// This is the structure that will be used to store the\r
+/// question's current value. Use it at initialize time to\r
+/// set default value for each question. When using at run\r
+/// time, this map is returned by the callback function,\r
+/// so dynamically changing the question's value will be\r
+/// possible through this mechanism\r
+///\r
+typedef struct {\r
+ //\r
+ // Three questions displayed at the main page\r
+ // for Timeout, BootNext, Variables respectively\r
+ //\r
+ UINT16 BootTimeOut;\r
+ UINT32 BootNext;\r
+\r
+ //\r
+ // This is the COM1 Attributes value storage\r
+ //\r
+ UINT8 COM1BaudRate;\r
+ UINT8 COM1DataRate;\r
+ UINT8 COM1StopBits;\r
+ UINT8 COM1Parity;\r
+ UINT8 COM1TerminalType;\r
+\r
+ //\r
+ // This is the COM2 Attributes value storage\r
+ //\r
+ UINT8 COM2BaudRate;\r
+ UINT8 COM2DataRate;\r
+ UINT8 COM2StopBits;\r
+ UINT8 COM2Parity;\r
+ UINT8 COM2TerminalType;\r
+\r
+ //\r
+ // Driver Option Add Handle page storage\r
+ //\r
+ UINT16 DriverAddHandleDesc[MAX_MENU_NUMBER];\r
+ UINT16 DriverAddHandleOptionalData[MAX_MENU_NUMBER];\r
+ UINT8 DriverAddActive;\r
+ UINT8 DriverAddForceReconnect;\r
+\r
+ //\r
+ // Console Input/Output/Errorout using COM port check storage\r
+ //\r
+ UINT8 ConsoleInputCOM1;\r
+ UINT8 ConsoleInputCOM2;\r
+ UINT8 ConsoleOutputCOM1;\r
+ UINT8 ConsoleOutputCOM2;\r
+ UINT8 ConsoleErrorCOM1;\r
+ UINT8 ConsoleErrorCOM2;\r
+\r
+ //\r
+ // At most 100 input/output/errorout device for console storage\r
+ //\r
+ UINT8 ConsoleCheck[MAX_MENU_NUMBER];\r
+ \r
+ //\r
+ // At most 100 input/output/errorout device for console storage\r
+ //\r
+ UINT8 ConsoleInCheck[MAX_MENU_NUMBER];\r
+ UINT8 ConsoleOutCheck[MAX_MENU_NUMBER];\r
+ UINT8 ConsoleErrCheck[MAX_MENU_NUMBER];\r
+\r
+ //\r
+ // Boot or Driver Option Order storage\r
+ // The value is the OptionNumber+1 because the order list value cannot be 0\r
+ // Use UINT32 to hold the potential value 0xFFFF+1=0x10000\r
+ //\r
+ UINT32 BootOptionOrder[MAX_MENU_NUMBER];\r
+ UINT32 DriverOptionOrder[MAX_MENU_NUMBER];\r
+ //\r
+ // Boot or Driver Option Delete storage\r
+ //\r
+ BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
+ BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
+ BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
+ BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
+\r
+ //\r
+ // This is the Terminal Attributes value storage\r
+ //\r
+ UINT8 COMBaudRate[MAX_MENU_NUMBER];\r
+ UINT8 COMDataRate[MAX_MENU_NUMBER];\r
+ UINT8 COMStopBits[MAX_MENU_NUMBER];\r
+ UINT8 COMParity[MAX_MENU_NUMBER];\r
+ UINT8 COMTerminalType[MAX_MENU_NUMBER];\r
+ UINT8 COMFlowControl[MAX_MENU_NUMBER];\r
+\r
+ //\r
+ // We use DisableMap array to record the enable/disable state of each boot device\r
+ // It should be taken as a bit array, from left to right there are totally 256 bits\r
+ // the most left one stands for BBS table item 0, and the most right one stands for item 256\r
+ // If the bit is 1, it means the boot device has been disabled.\r
+ //\r
+ UINT8 DisableMap[32];\r
+\r
+ //\r
+ // Console Output Text Mode\r
+ //\r
+ UINT16 ConsoleOutMode;\r
+\r
+ //\r
+ // UINT16 PadArea[10];\r
+ //\r
+\r
+ UINT16 BootDescriptionData[MAX_MENU_NUMBER];\r
+ UINT16 BootOptionalData[127];\r
+ UINT16 DriverDescriptionData[MAX_MENU_NUMBER];\r
+ UINT16 DriverOptionalData[127];\r
+ BOOLEAN BootOptionChanged;\r
+ BOOLEAN DriverOptionChanged;\r
+ UINT8 Active;\r
+ UINT8 ForceReconnect;\r
+} BMM_FAKE_NV_DATA;\r
+\r
+#endif\r
+\r
--- /dev/null
+/** @file\r
+Dynamically update the pages.\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+ Create the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+CreateUpdateData (\r
+ VOID\r
+ )\r
+{\r
+ //\r
+ // Init OpCode Handle and Allocate space for creation of Buffer\r
+ //\r
+ mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (mStartOpCodeHandle != NULL);\r
+ \r
+ mEndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (mEndOpCodeHandle != NULL);\r
+ \r
+ //\r
+ // Create Hii Extend Label OpCode as the start opcode\r
+ //\r
+ mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ \r
+ //\r
+ // Create Hii Extend Label OpCode as the end opcode\r
+ //\r
+ mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ mEndLabel->Number = LABEL_END;\r
+}\r
+\r
+/**\r
+ Refresh the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+RefreshUpdateData (\r
+ VOID\r
+ )\r
+{\r
+ //\r
+ // Free current updated date\r
+ // \r
+ if (mStartOpCodeHandle != NULL) {\r
+ HiiFreeOpCodeHandle (mStartOpCodeHandle);\r
+ }\r
+\r
+ //\r
+ // Create new OpCode Handle\r
+ //\r
+ mStartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the start opcode\r
+ //\r
+ mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+\r
+}\r
+\r
+/**\r
+ Add a "Go back to main page" tag in front of the form when there are no\r
+ "Apply changes" and "Discard changes" tags in the end of the form.\r
+ \r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageStart (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ RefreshUpdateData ();\r
+ mStartLabel->Number = CallbackData->BmmCurrentPageId;\r
+\r
+ if (!(CallbackData->BmmAskSaveOrNot)) {\r
+ //\r
+ // Add a "Go back to main page" tag in front of the form when there are no\r
+ // "Apply changes" and "Discard changes" tags in the end of the form.\r
+ //\r
+ HiiCreateGotoOpCode (\r
+ mStartOpCodeHandle,\r
+ FORM_MAIN_ID,\r
+ STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
+ STRING_TOKEN (STR_FORM_GOTO_MAIN),\r
+ 0,\r
+ FORM_MAIN_ID\r
+ );\r
+ }\r
+}\r
+\r
+/**\r
+ Create the "Apply changes" and "Discard changes" tags. And\r
+ ensure user can return to the main page.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageEnd (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ //\r
+ // Create the "Apply changes" and "Discard changes" tags.\r
+ //\r
+ if (CallbackData->BmmAskSaveOrNot) {\r
+ HiiCreateSubTitleOpCode (\r
+ mStartOpCodeHandle,\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ 0,\r
+ 0,\r
+ 0\r
+ );\r
+\r
+ HiiCreateActionOpCode (\r
+ mStartOpCodeHandle,\r
+ KEY_VALUE_SAVE_AND_EXIT,\r
+ STRING_TOKEN (STR_SAVE_AND_EXIT),\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ 0\r
+ );\r
+ }\r
+\r
+ //\r
+ // Ensure user can return to the main page.\r
+ //\r
+ HiiCreateActionOpCode (\r
+ mStartOpCodeHandle,\r
+ KEY_VALUE_NO_SAVE_AND_EXIT,\r
+ STRING_TOKEN (STR_NO_SAVE_AND_EXIT),\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ 0\r
+ );\r
+\r
+ HiiUpdateForm (\r
+ CallbackData->BmmHiiHandle,\r
+ &mBootMaintGuid,\r
+ CallbackData->BmmCurrentPageId,\r
+ mStartOpCodeHandle, // Label CallbackData->BmmCurrentPageId\r
+ mEndOpCodeHandle // LABEL_END\r
+ );\r
+}\r
+\r
+/**\r
+ Clean up the dynamic opcode at label and form specified by both LabelId. \r
+\r
+ @param LabelId It is both the Form ID and Label ID for opcode deletion.\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+CleanUpPage (\r
+ IN UINT16 LabelId,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ RefreshUpdateData ();\r
+\r
+ //\r
+ // Remove all op-codes from dynamic page\r
+ //\r
+ mStartLabel->Number = LabelId;\r
+ HiiUpdateForm (\r
+ CallbackData->BmmHiiHandle,\r
+ &mBootMaintGuid,\r
+ LabelId,\r
+ mStartOpCodeHandle, // Label LabelId\r
+ mEndOpCodeHandle // LABEL_END\r
+ );\r
+}\r
+\r
+/**\r
+ Create a list of Goto Opcode for all terminal devices logged\r
+ by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
+\r
+ @param CallbackData The BMM context data.\r
+**/\r
+VOID\r
+UpdateConCOMPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINT16 Index;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+\r
+ HiiCreateGotoOpCode (\r
+ mStartOpCodeHandle,\r
+ FORM_CON_COM_SETUP_ID,\r
+ NewMenuEntry->DisplayStringToken,\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ (UINT16) (TERMINAL_OPTION_OFFSET + Index)\r
+ );\r
+ }\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+\r
+/**\r
+ Create a list of boot option from global BootOptionMenu. It\r
+ allow user to delete the boot option.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootDelPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 Index;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionDel) / sizeof (CallbackData->BmmFakeNvData.BootOptionDel[0])));\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (NewLoadContext->IsLegacy) {\r
+ continue;\r
+ }\r
+\r
+ NewLoadContext->Deleted = FALSE;\r
+\r
+ if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+ //\r
+ // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+ // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+ // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+ // through HiiSetBrowserData function.\r
+ //\r
+ CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+ }\r
+ \r
+ HiiCreateCheckBoxOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (BOOT_OPTION_DEL_QUESTION_ID + Index),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
+ NewMenuEntry->DisplayStringToken,\r
+ NewMenuEntry->HelpStringToken,\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ 0,\r
+ NULL\r
+ );\r
+ }\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Create a lit of driver option from global DriverMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDrvAddHandlePage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINT16 Index;\r
+\r
+ CallbackData->BmmAskSaveOrNot = FALSE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ for (Index = 0; Index < DriverMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index);\r
+\r
+ HiiCreateGotoOpCode (\r
+ mStartOpCodeHandle,\r
+ FORM_DRV_ADD_HANDLE_DESC_ID,\r
+ NewMenuEntry->DisplayStringToken,\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ (UINT16) (HANDLE_OPTION_OFFSET + Index)\r
+ );\r
+ }\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Create a lit of driver option from global DriverOptionMenu. It\r
+ allow user to delete the driver option.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDrvDelPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 Index;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionDel) / sizeof (CallbackData->BmmFakeNvData.DriverOptionDel[0])));\r
+ for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->Deleted = FALSE;\r
+\r
+ if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+ //\r
+ // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+ // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+ // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+ // through HiiSetBrowserData function.\r
+ //\r
+ CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+ }\r
+ HiiCreateCheckBoxOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
+ NewMenuEntry->DisplayStringToken,\r
+ NewMenuEntry->HelpStringToken,\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ 0,\r
+ NULL\r
+ );\r
+ }\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Prepare the page to allow user to add description for \r
+ a Driver Option.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateDriverAddHandleDescPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+\r
+ CallbackData->BmmFakeNvData.DriverAddActive = 0x01;\r
+ CallbackData->BmmFakeNvData.DriverAddForceReconnect = 0x00;\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+ NewMenuEntry = CallbackData->MenuEntry;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ HiiCreateSubTitleOpCode (\r
+ mStartOpCodeHandle,\r
+ NewMenuEntry->DisplayStringToken,\r
+ 0,\r
+ 0,\r
+ 0\r
+ );\r
+\r
+ HiiCreateStringOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) DRV_ADD_HANDLE_DESC_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ DRV_ADD_HANDLE_DESC_VAR_OFFSET,\r
+ STRING_TOKEN (STR_LOAD_OPTION_DESC),\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ 0,\r
+ 0,\r
+ 6,\r
+ 75,\r
+ NULL\r
+ );\r
+\r
+ HiiCreateCheckBoxOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) DRV_ADD_RECON_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ DRV_ADD_RECON_VAR_OFFSET,\r
+ STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
+ STRING_TOKEN (STR_LOAD_OPTION_FORCE_RECON),\r
+ 0,\r
+ 0,\r
+ NULL\r
+ );\r
+\r
+ HiiCreateStringOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) DRIVER_ADD_OPTION_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ DRIVER_ADD_OPTION_VAR_OFFSET,\r
+ STRING_TOKEN (STR_OPTIONAL_DATA),\r
+ STRING_TOKEN (STR_NULL_STRING),\r
+ 0,\r
+ 0,\r
+ 6,\r
+ 75,\r
+ NULL\r
+ );\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Update console page.\r
+\r
+ @param UpdatePageId The form ID to be updated.\r
+ @param ConsoleMenu The console menu list.\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateConsolePage (\r
+ IN UINT16 UpdatePageId,\r
+ IN BM_MENU_OPTION *ConsoleMenu,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ UINT16 Index;\r
+ UINT16 Index2;\r
+ UINT8 CheckFlags;\r
+ UINT8 *ConsoleCheck;\r
+ UINT8 *OldConsoleCheck;\r
+ UINTN ConsoleCheckSize;\r
+ EFI_QUESTION_ID QuestionIdBase;\r
+ UINT16 VariableOffsetBase;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ ConsoleCheck = NULL;\r
+ OldConsoleCheck = NULL;\r
+ QuestionIdBase = 0;\r
+ VariableOffsetBase = 0;\r
+ ConsoleCheckSize = 0;\r
+\r
+ switch (UpdatePageId) {\r
+ case FORM_CON_IN_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
+ QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
+ break;\r
+\r
+ case FORM_CON_OUT_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
+ QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
+ break;\r
+\r
+ case FORM_CON_ERR_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
+ QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+ break;\r
+ }\r
+ ASSERT (ConsoleCheck != NULL);\r
+\r
+ for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+ CheckFlags = 0;\r
+ NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (NewConsoleContext->IsActive) {\r
+ CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
+ ConsoleCheck[Index] = TRUE;\r
+ } else {\r
+ ConsoleCheck[Index] = FALSE;\r
+ }\r
+ HiiCreateCheckBoxOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (VariableOffsetBase + Index),\r
+ NewMenuEntry->DisplayStringToken,\r
+ NewMenuEntry->HelpStringToken,\r
+ 0,\r
+ CheckFlags,\r
+ NULL\r
+ );\r
+ }\r
+\r
+ for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
+ (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
+ CheckFlags = 0;\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
+ ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
+ ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
+ ) {\r
+ CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
+ ConsoleCheck[Index] = TRUE;\r
+ } else {\r
+ ConsoleCheck[Index] = FALSE;\r
+ }\r
+ HiiCreateCheckBoxOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (VariableOffsetBase + Index),\r
+ NewMenuEntry->DisplayStringToken,\r
+ NewMenuEntry->HelpStringToken,\r
+ 0,\r
+ CheckFlags,\r
+ NULL\r
+ );\r
+\r
+ Index++;\r
+ }\r
+\r
+ CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Update the page's NV Map if user has changed the order\r
+ a list. This list can be Boot Order or Driver Order.\r
+\r
+ @param UpdatePageId The form ID to be updated.\r
+ @param OptionMenu The new list.\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateOrderPage (\r
+ IN UINT16 UpdatePageId,\r
+ IN BM_MENU_OPTION *OptionMenu,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINT16 Index;\r
+ UINT16 OptionIndex;\r
+ VOID *OptionsOpCodeHandle;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ BOOLEAN BootOptionFound;\r
+ UINT32 *OptionOrder;\r
+ EFI_QUESTION_ID QuestionId;\r
+ UINT16 VarOffset;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+ UpdatePageStart (CallbackData);\r
+\r
+ OptionOrder = NULL;\r
+ QuestionId = 0;\r
+ VarOffset = 0;\r
+ switch (UpdatePageId) { \r
+ \r
+ case FORM_BOOT_CHG_ID:\r
+ GetBootOrder (CallbackData);\r
+ OptionOrder = CallbackData->BmmFakeNvData.BootOptionOrder;\r
+ QuestionId = BOOT_OPTION_ORDER_QUESTION_ID;\r
+ VarOffset = BOOT_OPTION_ORDER_VAR_OFFSET;\r
+ break;\r
+ \r
+ case FORM_DRV_CHG_ID:\r
+ GetDriverOrder (CallbackData);\r
+ OptionOrder = CallbackData->BmmFakeNvData.DriverOptionOrder;\r
+ QuestionId = DRIVER_OPTION_ORDER_QUESTION_ID;\r
+ VarOffset = DRIVER_OPTION_ORDER_VAR_OFFSET;\r
+ break;\r
+ } \r
+ ASSERT (OptionOrder != NULL); \r
+ \r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+ \r
+ NewMenuEntry = NULL;\r
+ for (OptionIndex = 0; (OptionOrder[OptionIndex] != 0 && OptionIndex < MAX_MENU_NUMBER); OptionIndex++) {\r
+ BootOptionFound = FALSE;\r
+ for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if ((UINT32) (NewMenuEntry->OptionNumber + 1) == OptionOrder[OptionIndex]) {\r
+ BootOptionFound = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ if (BootOptionFound) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ NewMenuEntry->DisplayStringToken,\r
+ 0,\r
+ EFI_IFR_TYPE_NUM_SIZE_32,\r
+ OptionOrder[OptionIndex]\r
+ );\r
+ }\r
+ }\r
+ \r
+ if (OptionMenu->MenuNumber > 0) {\r
+ HiiCreateOrderedListOpCode ( \r
+ mStartOpCodeHandle, // Container for dynamic created opcodes \r
+ QuestionId, // Question ID \r
+ VARSTORE_ID_BOOT_MAINT, // VarStore ID \r
+ VarOffset, // Offset in Buffer Storage \r
+ STRING_TOKEN (STR_CHANGE_ORDER), // Question prompt text \r
+ STRING_TOKEN (STR_CHANGE_ORDER), // Question help text \r
+ 0, // Question flag \r
+ 0, // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
+ EFI_IFR_TYPE_NUM_SIZE_32, // Data type of Question value \r
+ 100, // Maximum container \r
+ OptionsOpCodeHandle, // Option Opcode list \r
+ NULL // Default Opcode is NULL \r
+ );\r
+ }\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+\r
+ UpdatePageEnd (CallbackData);\r
+\r
+}\r
+\r
+/**\r
+ Create the dynamic page to allow user to set\r
+ the "BootNext" value.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootNextPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINTN NumberOfOptions;\r
+ UINT16 Index;\r
+ VOID *OptionsOpCodeHandle;\r
+\r
+ NumberOfOptions = BootOptionMenu.MenuNumber;\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ if (NumberOfOptions > 0) {\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ CallbackData->BmmFakeNvData.BootNext = NONE_BOOTNEXT_VALUE;\r
+\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ if (NewLoadContext->IsBootNext) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ NewMenuEntry->DisplayStringToken,\r
+ EFI_IFR_OPTION_DEFAULT,\r
+ EFI_IFR_TYPE_NUM_SIZE_32,\r
+ Index\r
+ );\r
+ CallbackData->BmmFakeNvData.BootNext = Index;\r
+ } else {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ NewMenuEntry->DisplayStringToken,\r
+ 0,\r
+ EFI_IFR_TYPE_NUM_SIZE_32,\r
+ Index\r
+ );\r
+ }\r
+ }\r
+\r
+ if (CallbackData->BmmFakeNvData.BootNext == NONE_BOOTNEXT_VALUE) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ STRING_TOKEN (STR_NONE),\r
+ EFI_IFR_OPTION_DEFAULT,\r
+ EFI_IFR_TYPE_NUM_SIZE_32,\r
+ NONE_BOOTNEXT_VALUE\r
+ );\r
+ } else {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ STRING_TOKEN (STR_NONE),\r
+ 0,\r
+ EFI_IFR_TYPE_NUM_SIZE_32,\r
+ NONE_BOOTNEXT_VALUE\r
+ );\r
+ } \r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ BOOT_NEXT_VAR_OFFSET,\r
+ STRING_TOKEN (STR_BOOT_NEXT),\r
+ STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_4,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ }\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+/**\r
+ Create the dynamic page to allow user to set the "TimeOut" value.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateTimeOutPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ VOID *DefaultOpCodeHandle;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (DefaultOpCodeHandle != NULL);\r
+ HiiCreateDefaultOpCode (DefaultOpCodeHandle, EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_NUM_SIZE_16, CallbackData->BmmFakeNvData.BootTimeOut);\r
+\r
+ HiiCreateNumericOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) BOOT_TIME_OUT_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ BOOT_TIME_OUT_VAR_OFFSET,\r
+ STRING_TOKEN (STR_NUM_AUTO_BOOT),\r
+ STRING_TOKEN (STR_HLP_AUTO_BOOT),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
+ 0,\r
+ 65535,\r
+ 0,\r
+ DefaultOpCodeHandle\r
+ );\r
+ \r
+ HiiFreeOpCodeHandle (DefaultOpCodeHandle);\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+\r
+/**\r
+ Refresh the text mode page.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateConModePage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINTN Mode;\r
+ UINTN Index;\r
+ UINTN Col;\r
+ UINTN Row;\r
+ CHAR16 ModeString[50];\r
+ CHAR16 *PStr;\r
+ UINTN MaxMode;\r
+ UINTN ValidMode;\r
+ EFI_STRING_ID *ModeToken;\r
+ EFI_STATUS Status;\r
+ VOID *OptionsOpCodeHandle;\r
+ EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
+\r
+ ConOut = gST->ConOut;\r
+ Index = 0;\r
+ ValidMode = 0;\r
+ MaxMode = (UINTN) (ConOut->Mode->MaxMode);\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ //\r
+ // Check valid mode\r
+ //\r
+ for (Mode = 0; Mode < MaxMode; Mode++) {\r
+ Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
+ ValidMode++;\r
+ }\r
+\r
+ if (ValidMode == 0) {\r
+ return;\r
+ }\r
+\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ ModeToken = AllocateZeroPool (sizeof (EFI_STRING_ID) * ValidMode);\r
+ ASSERT(ModeToken != NULL);\r
+\r
+ //\r
+ // Determin which mode should be the first entry in menu\r
+ //\r
+ GetConsoleOutMode (CallbackData);\r
+\r
+ //\r
+ // Build text mode options\r
+ //\r
+ for (Mode = 0; Mode < MaxMode; Mode++) {\r
+ Status = ConOut->QueryMode (ConOut, Mode, &Col, &Row);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
+ \r
+ //\r
+ // Build mode string Column x Row\r
+ //\r
+ UnicodeValueToString (ModeString, 0, Col, 0);\r
+ PStr = &ModeString[0];\r
+ StrnCatS (PStr, sizeof (ModeString) / sizeof (ModeString[0]), L" x ", StrLen(L" x ") + 1);\r
+ PStr = PStr + StrLen (PStr);\r
+ UnicodeValueToString (PStr , 0, Row, 0);\r
+\r
+ ModeToken[Index] = HiiSetString (CallbackData->BmmHiiHandle, 0, ModeString, NULL);\r
+\r
+ if (Mode == CallbackData->BmmFakeNvData.ConsoleOutMode) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ ModeToken[Index],\r
+ EFI_IFR_OPTION_DEFAULT,\r
+ EFI_IFR_TYPE_NUM_SIZE_16,\r
+ (UINT16) Mode\r
+ );\r
+ } else {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ ModeToken[Index],\r
+ 0,\r
+ EFI_IFR_TYPE_NUM_SIZE_16,\r
+ (UINT16) Mode\r
+ );\r
+ }\r
+ Index++;\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) CON_MODE_QUESTION_ID,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ CON_MODE_VAR_OFFSET,\r
+ STRING_TOKEN (STR_CON_MODE_SETUP),\r
+ STRING_TOKEN (STR_CON_MODE_SETUP),\r
+ EFI_IFR_FLAG_RESET_REQUIRED,\r
+ EFI_IFR_NUMERIC_SIZE_2,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ FreePool (ModeToken);\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+\r
+ /**\r
+ Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
+ Parity, Stop Bits, Terminal Type.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateTerminalPage (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT8 Index;\r
+ UINT8 CheckFlags;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ VOID *OptionsOpCodeHandle;\r
+ UINTN CurrentTerminal;\r
+\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
+ UpdatePageStart (CallbackData);\r
+\r
+ CurrentTerminal = CallbackData->CurrentTerminal;\r
+ NewMenuEntry = BOpt_GetMenuEntry (\r
+ &TerminalMenu,\r
+ CurrentTerminal\r
+ );\r
+\r
+ if (NewMenuEntry == NULL) {\r
+ return ;\r
+ }\r
+\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (BaudRateList[Index].Value == 115200) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ BaudRateList[Index].StringToken,\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ Index\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_BAUD_RATE),\r
+ STRING_TOKEN (STR_COM_BAUD_RATE),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+ \r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
+ CheckFlags = 0;\r
+\r
+ if (DataBitsList[Index].Value == 8) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ DataBitsList[Index].StringToken,\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ Index\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_DATA_BITS),\r
+ STRING_TOKEN (STR_COM_DATA_BITS),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (ParityList[Index].Value == NoParity) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ ParityList[Index].StringToken,\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ Index\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_PARITY),\r
+ STRING_TOKEN (STR_COM_PARITY),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (StopBitsList[Index].Value == OneStopBit) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ StopBitsList[Index].StringToken,\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ Index\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_STOP_BITS),\r
+ STRING_TOKEN (STR_COM_STOP_BITS),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (Index == 0) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ (EFI_STRING_ID) TerminalType[Index],\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ Index\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_TERMI_TYPE),\r
+ STRING_TOKEN (STR_COM_TERMI_TYPE),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (Index == 0) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ (EFI_STRING_ID) mFlowControlType[Index],\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ mFlowControlValue[Index]\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+ STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+\r
+ UpdatePageEnd (CallbackData);\r
+}\r
+ \r
+/**\r
+Update add boot/driver option page.\r
+\r
+@param CallbackData The BMM context data.\r
+@param FormId The form ID to be updated.\r
+@param DevicePath Device path.\r
+\r
+**/\r
+VOID\r
+UpdateOptionPage(\r
+ IN BMM_CALLBACK_DATA *CallbackData,\r
+ IN EFI_FORM_ID FormId,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ CHAR16 *String;\r
+ EFI_STRING_ID StringToken;\r
+\r
+ if (DevicePath != NULL){\r
+ String = ExtractFileNameFromDevicePath(DevicePath);\r
+ StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
+ FreePool(String);\r
+ } else {\r
+ String = HiiGetString (CallbackData->BmmHiiHandle, STRING_TOKEN (STR_NULL_STRING), NULL);\r
+ ASSERT (String != NULL);\r
+ StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, String, NULL);\r
+ FreePool (String);\r
+ }\r
+\r
+ if(FormId == FORM_BOOT_ADD_ID){\r
+ if (!CallbackData->BmmFakeNvData.BootOptionChanged) {\r
+ ZeroMem (CallbackData->BmmFakeNvData.BootOptionalData, sizeof (CallbackData->BmmFakeNvData.BootOptionalData));\r
+ ZeroMem (CallbackData->BmmFakeNvData.BootDescriptionData, sizeof (CallbackData->BmmFakeNvData.BootDescriptionData));\r
+ }\r
+ } else if (FormId == FORM_DRV_ADD_FILE_ID){\r
+ if (!CallbackData->BmmFakeNvData.DriverOptionChanged) {\r
+ ZeroMem (CallbackData->BmmFakeNvData.DriverOptionalData, sizeof (CallbackData->BmmFakeNvData.DriverOptionalData));\r
+ ZeroMem (CallbackData->BmmFakeNvData.DriverDescriptionData, sizeof (CallbackData->BmmFakeNvData.DriverDescriptionData));\r
+ }\r
+ }\r
+\r
+ RefreshUpdateData();\r
+ mStartLabel->Number = FormId;\r
+\r
+ HiiCreateSubTitleOpCode (\r
+ mStartOpCodeHandle,\r
+ StringToken,\r
+ 0,\r
+ 0,\r
+ 0\r
+ );\r
+\r
+ HiiUpdateForm (\r
+ CallbackData->BmmHiiHandle,\r
+ &mBootMaintGuid,\r
+ FormId,\r
+ mStartOpCodeHandle,// Label FormId\r
+ mEndOpCodeHandle // LABEL_END\r
+ );\r
+}\r
+\r
+/**\r
+ Dispatch the correct update page function to call based on\r
+ the UpdatePageId.\r
+\r
+ @param UpdatePageId The form ID.\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdatePageBody (\r
+ IN UINT16 UpdatePageId,\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ CleanUpPage (UpdatePageId, CallbackData);\r
+ switch (UpdatePageId) {\r
+ case FORM_CON_IN_ID:\r
+ UpdateConsolePage (UpdatePageId, &ConsoleInpMenu, CallbackData);\r
+ break;\r
+\r
+ case FORM_CON_OUT_ID:\r
+ UpdateConsolePage (UpdatePageId, &ConsoleOutMenu, CallbackData);\r
+ break;\r
+\r
+ case FORM_CON_ERR_ID:\r
+ UpdateConsolePage (UpdatePageId, &ConsoleErrMenu, CallbackData);\r
+ break;\r
+\r
+ case FORM_BOOT_CHG_ID:\r
+ UpdateOrderPage (UpdatePageId, &BootOptionMenu, CallbackData);\r
+ break;\r
+\r
+ case FORM_DRV_CHG_ID:\r
+ UpdateOrderPage (UpdatePageId, &DriverOptionMenu, CallbackData);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+/**\r
+ Dispatch the display to the next page based on NewPageId.\r
+\r
+ @param Private The BMM context data.\r
+ @param NewPageId The original page ID.\r
+\r
+**/\r
+VOID\r
+UpdatePageId (\r
+ BMM_CALLBACK_DATA *Private,\r
+ UINT16 NewPageId\r
+ )\r
+{\r
+ if ((NewPageId < FILE_OPTION_OFFSET) && (NewPageId >= HANDLE_OPTION_OFFSET)) {\r
+ //\r
+ // If we select a handle to add driver option, advance to the add handle description page.\r
+ //\r
+ NewPageId = FORM_DRV_ADD_HANDLE_DESC_ID;\r
+ } else if ((NewPageId == KEY_VALUE_SAVE_AND_EXIT) || (NewPageId == KEY_VALUE_NO_SAVE_AND_EXIT)) {\r
+ //\r
+ // Return to main page after "Save Changes" or "Discard Changes".\r
+ //\r
+ NewPageId = FORM_MAIN_ID;\r
+ } else if ((NewPageId >= TERMINAL_OPTION_OFFSET) && (NewPageId < CONSOLE_OPTION_OFFSET)) {\r
+ NewPageId = FORM_CON_COM_SETUP_ID;\r
+ }\r
+\r
+ if ((NewPageId > 0) && (NewPageId < MAXIMUM_FORM_ID)) {\r
+ Private->BmmPreviousPageId = Private->BmmCurrentPageId;\r
+ Private->BmmCurrentPageId = NewPageId;\r
+ }\r
+}\r
--- /dev/null
+/** @file\r
+Variable operation that will be used by bootmaint\r
+\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "BootMaintenanceManager.h"\r
+\r
+/**\r
+ Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
+ After deleting this boot option, call Var_ChangeBootOrder to\r
+ make sure BootOrder is in valid state.\r
+\r
+ @retval EFI_SUCCESS If all boot load option EFI Variables corresponding to \r
+ BM_LOAD_CONTEXT marked for deletion is deleted.\r
+ @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
+ @return Others If failed to update the "BootOrder" variable after deletion. \r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelBootOption (\r
+ VOID\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 BootString[10];\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINTN Index2;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Index2 = 0;\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (!NewLoadContext->Deleted) {\r
+ continue;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ BootString,\r
+ sizeof (BootString),\r
+ L"Boot%04x",\r
+ NewMenuEntry->OptionNumber\r
+ );\r
+\r
+ EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
+ Index2++;\r
+ //\r
+ // If current Load Option is the same as BootNext,\r
+ // must delete BootNext in order to make sure\r
+ // there will be no panic on next boot\r
+ //\r
+ if (NewLoadContext->IsBootNext) {\r
+ EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
+ }\r
+\r
+ RemoveEntryList (&NewMenuEntry->Link);\r
+ BOpt_DestroyMenuEntry (NewMenuEntry);\r
+ NewMenuEntry = NULL;\r
+ }\r
+\r
+ BootOptionMenu.MenuNumber -= Index2;\r
+\r
+ Status = Var_ChangeBootOrder ();\r
+ return Status;\r
+}\r
+\r
+/**\r
+ After any operation on Boot####, there will be a discrepancy in BootOrder.\r
+ Since some are missing but in BootOrder, while some are present but are\r
+ not reflected by BootOrder. Then a function rebuild BootOrder from\r
+ scratch by content from BootOptionMenu is needed.\r
+\r
+\r
+ \r
+\r
+ @retval EFI_SUCCESS The boot order is updated successfully.\r
+ @return EFI_STATUS other than EFI_SUCCESS if failed to\r
+ Set the "BootOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeBootOrder (\r
+ VOID\r
+ )\r
+{\r
+\r
+ EFI_STATUS Status;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINT16 *BootOrderList;\r
+ UINT16 *BootOrderListPtr;\r
+ UINTN BootOrderListSize;\r
+ UINTN Index;\r
+\r
+ BootOrderList = NULL;\r
+ BootOrderListSize = 0;\r
+ //\r
+ // First check whether BootOrder is present in current configuration\r
+ //\r
+ GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+\r
+ //\r
+ // If exists, delete it to hold new BootOrder\r
+ //\r
+ if (BootOrderList != NULL) {\r
+ EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
+ FreePool (BootOrderList);\r
+ BootOrderList = NULL;\r
+ }\r
+ //\r
+ // Maybe here should be some check method to ensure that\r
+ // no new added boot options will be added\r
+ // but the setup engine now will give only one callback\r
+ // that is to say, user are granted only one chance to\r
+ // decide whether the boot option will be added or not\r
+ // there should be no indictor to show whether this\r
+ // is a "new" boot option\r
+ //\r
+ BootOrderListSize = BootOptionMenu.MenuNumber;\r
+\r
+ if (BootOrderListSize > 0) {\r
+ BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
+ ASSERT (BootOrderList != NULL);\r
+ BootOrderListPtr = BootOrderList;\r
+\r
+ //\r
+ // Get all current used Boot#### from BootOptionMenu.\r
+ // OptionNumber in each BM_LOAD_OPTION is really its\r
+ // #### value.\r
+ //\r
+ for (Index = 0; Index < BootOrderListSize; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ *BootOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
+ BootOrderList++;\r
+ }\r
+\r
+ BootOrderList = BootOrderListPtr;\r
+\r
+ //\r
+ // After building the BootOrderList, write it back\r
+ //\r
+ Status = gRT->SetVariable (\r
+ L"BootOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ BootOrderListSize * sizeof (UINT16),\r
+ BootOrderList\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Delete Load Option that represent a Deleted state in BootOptionMenu.\r
+ After deleting this Driver option, call Var_ChangeDriverOrder to\r
+ make sure DriverOrder is in valid state.\r
+\r
+ @retval EFI_SUCCESS Load Option is successfully updated.\r
+ @retval EFI_NOT_FOUND Fail to find the driver option want to be deleted.\r
+ @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
+ Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelDriverOption (\r
+ VOID\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 DriverString[12];\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINTN Index2;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Index2 = 0;\r
+ for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (!NewLoadContext->Deleted) {\r
+ continue;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ DriverString,\r
+ sizeof (DriverString),\r
+ L"Driver%04x",\r
+ NewMenuEntry->OptionNumber\r
+ );\r
+\r
+ EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
+ Index2++;\r
+\r
+ RemoveEntryList (&NewMenuEntry->Link);\r
+ BOpt_DestroyMenuEntry (NewMenuEntry);\r
+ NewMenuEntry = NULL;\r
+ }\r
+\r
+ DriverOptionMenu.MenuNumber -= Index2;\r
+\r
+ Status = Var_ChangeDriverOrder ();\r
+ return Status;\r
+}\r
+\r
+/**\r
+ After any operation on Driver####, there will be a discrepancy in\r
+ DriverOrder. Since some are missing but in DriverOrder, while some\r
+ are present but are not reflected by DriverOrder. Then a function\r
+ rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
+ needed.\r
+\r
+ @retval EFI_SUCCESS The driver order is updated successfully.\r
+ @return Other status than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeDriverOrder (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ UINT16 *DriverOrderList;\r
+ UINT16 *DriverOrderListPtr;\r
+ UINTN DriverOrderListSize;\r
+ UINTN Index;\r
+\r
+ DriverOrderList = NULL;\r
+ DriverOrderListSize = 0;\r
+\r
+ //\r
+ // First check whether DriverOrder is present in current configuration\r
+ //\r
+ GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+ //\r
+ // If exists, delete it to hold new DriverOrder\r
+ //\r
+ if (DriverOrderList != NULL) {\r
+ EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+ FreePool (DriverOrderList);\r
+ DriverOrderList = NULL;\r
+ }\r
+\r
+ DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
+\r
+ if (DriverOrderListSize > 0) {\r
+ DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
+ ASSERT (DriverOrderList != NULL);\r
+ DriverOrderListPtr = DriverOrderList;\r
+\r
+ //\r
+ // Get all current used Driver#### from DriverOptionMenu.\r
+ // OptionNumber in each BM_LOAD_OPTION is really its\r
+ // #### value.\r
+ //\r
+ for (Index = 0; Index < DriverOrderListSize; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
+ *DriverOrderList = (UINT16) NewMenuEntry->OptionNumber;\r
+ DriverOrderList++;\r
+ }\r
+\r
+ DriverOrderList = DriverOrderListPtr;\r
+\r
+ //\r
+ // After building the DriverOrderList, write it back\r
+ //\r
+ Status = gRT->SetVariable (\r
+ L"DriverOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ DriverOrderListSize * sizeof (UINT16),\r
+ DriverOrderList\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Update the device path of "ConOut", "ConIn" and "ErrOut" \r
+ based on the new BaudRate, Data Bits, parity and Stop Bits\r
+ set.\r
+\r
+**/\r
+VOID\r
+Var_UpdateAllConsoleOption (\r
+ VOID\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *OutDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *InpDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *ErrDevicePath;\r
+ EFI_STATUS Status;\r
+\r
+ GetEfiGlobalVariable2 (L"ConOut", (VOID**)&OutDevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ConIn", (VOID**)&InpDevicePath, NULL);\r
+ GetEfiGlobalVariable2 (L"ErrOut", (VOID**)&ErrDevicePath, NULL);\r
+ if (OutDevicePath != NULL) {\r
+ ChangeVariableDevicePath (OutDevicePath);\r
+ Status = gRT->SetVariable (\r
+ L"ConOut",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ GetDevicePathSize (OutDevicePath),\r
+ OutDevicePath\r
+ );\r
+ ASSERT (!EFI_ERROR (Status));\r
+ }\r
+\r
+ if (InpDevicePath != NULL) {\r
+ ChangeVariableDevicePath (InpDevicePath);\r
+ Status = gRT->SetVariable (\r
+ L"ConIn",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ GetDevicePathSize (InpDevicePath),\r
+ InpDevicePath\r
+ );\r
+ ASSERT (!EFI_ERROR (Status));\r
+ }\r
+\r
+ if (ErrDevicePath != NULL) {\r
+ ChangeVariableDevicePath (ErrDevicePath);\r
+ Status = gRT->SetVariable (\r
+ L"ErrOut",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ GetDevicePathSize (ErrDevicePath),\r
+ ErrDevicePath\r
+ );\r
+ ASSERT (!EFI_ERROR (Status));\r
+ }\r
+}\r
+\r
+/**\r
+ This function delete and build multi-instance device path for\r
+ specified type of console device.\r
+\r
+ This function clear the EFI variable defined by ConsoleName and\r
+ gEfiGlobalVariableGuid. It then build the multi-instance device\r
+ path by appending the device path of the Console (In/Out/Err) instance \r
+ in ConsoleMenu. Then it scan all corresponding console device by\r
+ scanning Terminal (built from device supporting Serial I/O instances)\r
+ devices in TerminalMenu. At last, it save a EFI variable specifed\r
+ by ConsoleName and gEfiGlobalVariableGuid.\r
+\r
+ @param ConsoleName The name for the console device type. They are\r
+ usually "ConIn", "ConOut" and "ErrOut".\r
+ @param ConsoleMenu The console memu which is a list of console devices.\r
+ @param UpdatePageId The flag specifying which type of console device\r
+ to be processed.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOption (\r
+ IN UINT16 *ConsoleName,\r
+ IN BM_MENU_OPTION *ConsoleMenu,\r
+ IN UINT16 UpdatePageId\r
+ )\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL *ConDevicePath;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
+ EFI_STATUS Status;\r
+ VENDOR_DEVICE_PATH Vendor;\r
+ EFI_DEVICE_PATH_PROTOCOL *TerminalDevicePath;\r
+ UINTN Index;\r
+\r
+ GetEfiGlobalVariable2 (ConsoleName, (VOID**)&ConDevicePath, NULL);\r
+ if (ConDevicePath != NULL) {\r
+ EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
+ FreePool (ConDevicePath);\r
+ ConDevicePath = NULL;\r
+ };\r
+\r
+ //\r
+ // First add all console input device from console input menu\r
+ //\r
+ for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (NewConsoleContext->IsActive) {\r
+ ConDevicePath = AppendDevicePathInstance (\r
+ ConDevicePath,\r
+ NewConsoleContext->DevicePath\r
+ );\r
+ }\r
+ }\r
+\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
+ ((NewTerminalContext->IsConOut != 0) && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
+ ((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
+ ) {\r
+ Vendor.Header.Type = MESSAGING_DEVICE_PATH;\r
+ Vendor.Header.SubType = MSG_VENDOR_DP;\r
+ \r
+ ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
+ CopyMem (\r
+ &Vendor.Guid,\r
+ &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
+ sizeof (EFI_GUID)\r
+ );\r
+ SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
+ TerminalDevicePath = AppendDevicePathNode (\r
+ NewTerminalContext->DevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
+ );\r
+ ASSERT (TerminalDevicePath != NULL);\r
+ ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
+ ConDevicePath = AppendDevicePathInstance (\r
+ ConDevicePath,\r
+ TerminalDevicePath\r
+ );\r
+ }\r
+ }\r
+\r
+ if (ConDevicePath != NULL) {\r
+ Status = gRT->SetVariable (\r
+ ConsoleName,\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ GetDevicePathSize (ConDevicePath),\r
+ ConDevicePath\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+ This function delete and build multi-instance device path ConIn\r
+ console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleInpOption (\r
+ VOID\r
+ )\r
+{\r
+ return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
+}\r
+\r
+/**\r
+ This function delete and build multi-instance device path ConOut\r
+ console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOutOption (\r
+ VOID\r
+ )\r
+{\r
+ return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
+}\r
+\r
+/**\r
+ This function delete and build multi-instance device path ErrOut\r
+ console device.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information. \r
+**/\r
+EFI_STATUS\r
+Var_UpdateErrorOutOption (\r
+ VOID\r
+ )\r
+{\r
+ return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
+}\r
+\r
+/**\r
+ This function create a currently loaded Drive Option from \r
+ the BMM. It then appends this Driver Option to the end of \r
+ the "DriverOrder" list. It append this Driver Opotion to the end\r
+ of DriverOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+ @param HiiHandle The HII handle associated with the BMM formset.\r
+ @param DescriptionData The description of this driver option.\r
+ @param OptionalData The optional load option.\r
+ @param ForceReconnect If to force reconnect.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+ @retval EFI_SUCCESS If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOption (\r
+ IN BMM_CALLBACK_DATA *CallbackData,\r
+ IN EFI_HII_HANDLE HiiHandle,\r
+ IN UINT16 *DescriptionData,\r
+ IN UINT16 *OptionalData,\r
+ IN UINT8 ForceReconnect\r
+ )\r
+{\r
+ UINT16 Index;\r
+ UINT16 *DriverOrderList;\r
+ UINT16 *NewDriverOrderList;\r
+ UINT16 DriverString[12];\r
+ UINTN DriverOrderListSize;\r
+ VOID *Buffer;\r
+ UINTN BufferSize;\r
+ UINT8 *Ptr;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ BOOLEAN OptionalDataExist;\r
+ EFI_STATUS Status;\r
+\r
+ OptionalDataExist = FALSE;\r
+\r
+ Index = BOpt_GetDriverOptionNumber ();\r
+ UnicodeSPrint (\r
+ DriverString,\r
+ sizeof (DriverString),\r
+ L"Driver%04x",\r
+ Index\r
+ );\r
+\r
+ if (*DescriptionData == 0x0000) {\r
+ StrCpyS (DescriptionData, MAX_MENU_NUMBER, DriverString);\r
+ }\r
+\r
+ BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
+ BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+ if (*OptionalData != 0x0000) {\r
+ OptionalDataExist = TRUE;\r
+ BufferSize += StrSize (OptionalData);\r
+ }\r
+\r
+ Buffer = AllocateZeroPool (BufferSize);\r
+ if (NULL == Buffer) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+ if (NULL == NewMenuEntry) {\r
+ FreePool (Buffer);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->Deleted = FALSE;\r
+ NewLoadContext->LoadOptionSize = BufferSize;\r
+ Ptr = (UINT8 *) Buffer;\r
+ NewLoadContext->LoadOption = Ptr;\r
+ *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
+ NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
+ NewLoadContext->IsActive = TRUE;\r
+ NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+ Ptr += sizeof (UINT32);\r
+ *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+ NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
+\r
+ Ptr += sizeof (UINT16);\r
+ CopyMem (\r
+ Ptr,\r
+ DescriptionData,\r
+ StrSize (DescriptionData)\r
+ );\r
+\r
+ NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
+ ASSERT (NewLoadContext->Description != NULL);\r
+ NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+ CopyMem (\r
+ NewLoadContext->Description,\r
+ (VOID *) Ptr,\r
+ StrSize (DescriptionData)\r
+ );\r
+\r
+ Ptr += StrSize (DescriptionData);\r
+ CopyMem (\r
+ Ptr,\r
+ CallbackData->LoadContext->FilePathList,\r
+ GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+ );\r
+\r
+ NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
+ ASSERT (NewLoadContext->FilePathList != NULL);\r
+\r
+ CopyMem (\r
+ NewLoadContext->FilePathList,\r
+ (VOID *) Ptr,\r
+ GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+ );\r
+\r
+ NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+ NewMenuEntry->OptionNumber = Index;\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+ NewMenuEntry->HelpStringToken = HiiSetString (HiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+\r
+ if (OptionalDataExist) {\r
+ Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+ CopyMem (\r
+ Ptr,\r
+ OptionalData,\r
+ StrSize (OptionalData)\r
+ );\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ DriverString,\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ BufferSize,\r
+ Buffer\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+ NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
+ ASSERT (NewDriverOrderList != NULL);\r
+ if (DriverOrderList != NULL){\r
+ CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
+ }\r
+ NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
+ if (DriverOrderList != NULL) {\r
+ EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ L"DriverOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ DriverOrderListSize + sizeof (UINT16),\r
+ NewDriverOrderList\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+ if (DriverOrderList != NULL) {\r
+ FreePool (DriverOrderList);\r
+ }\r
+ DriverOrderList = NULL;\r
+ FreePool (NewDriverOrderList);\r
+ InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
+ DriverOptionMenu.MenuNumber++;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ This function create a currently loaded Boot Option from \r
+ the BMM. It then appends this Boot Option to the end of \r
+ the "BootOrder" list. It also append this Boot Opotion to the end\r
+ of BootOptionMenu.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+ @retval EFI_SUCCESS If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOption (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 *BootOrderList;\r
+ UINT16 *NewBootOrderList;\r
+ UINTN BootOrderListSize;\r
+ UINT16 BootString[10];\r
+ VOID *Buffer;\r
+ UINTN BufferSize;\r
+ UINT8 *Ptr;\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ BOOLEAN OptionalDataExist;\r
+ EFI_STATUS Status;\r
+ BMM_FAKE_NV_DATA *NvRamMap;\r
+\r
+ OptionalDataExist = FALSE;\r
+ NvRamMap = &CallbackData->BmmFakeNvData;\r
+\r
+ Index = BOpt_GetBootOptionNumber () ;\r
+ UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
+\r
+ if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
+ StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
+ }\r
+\r
+ BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
+ BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+ if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
+ OptionalDataExist = TRUE;\r
+ BufferSize += StrSize (NvRamMap->BootOptionalData);\r
+ }\r
+\r
+ Buffer = AllocateZeroPool (BufferSize);\r
+ if (NULL == Buffer) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
+ if (NULL == NewMenuEntry) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->Deleted = FALSE;\r
+ NewLoadContext->LoadOptionSize = BufferSize;\r
+ Ptr = (UINT8 *) Buffer;\r
+ NewLoadContext->LoadOption = Ptr;\r
+ *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
+ NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
+ NewLoadContext->IsActive = TRUE;\r
+ NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
+\r
+ Ptr += sizeof (UINT32);\r
+ *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+ NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
+ Ptr += sizeof (UINT16);\r
+\r
+ CopyMem (\r
+ Ptr,\r
+ NvRamMap->BootDescriptionData,\r
+ StrSize (NvRamMap->BootDescriptionData)\r
+ );\r
+\r
+ NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
+ ASSERT (NewLoadContext->Description != NULL);\r
+\r
+ NewMenuEntry->DisplayString = NewLoadContext->Description;\r
+ CopyMem (\r
+ NewLoadContext->Description,\r
+ (VOID *) Ptr,\r
+ StrSize (NvRamMap->BootDescriptionData)\r
+ );\r
+\r
+ Ptr += StrSize (NvRamMap->BootDescriptionData);\r
+ CopyMem (\r
+ Ptr,\r
+ CallbackData->LoadContext->FilePathList,\r
+ GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+ );\r
+\r
+ NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
+ ASSERT (NewLoadContext->FilePathList != NULL);\r
+\r
+ CopyMem (\r
+ NewLoadContext->FilePathList,\r
+ (VOID *) Ptr,\r
+ GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
+ );\r
+\r
+ NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList);\r
+ NewMenuEntry->OptionNumber = Index;\r
+ NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL);\r
+ NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL);\r
+\r
+ if (OptionalDataExist) {\r
+ Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
+\r
+ CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ BootString,\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ BufferSize,\r
+ Buffer\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize);\r
+ NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
+ ASSERT (NewBootOrderList != NULL);\r
+ if (BootOrderList != NULL){\r
+ CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
+ }\r
+ NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
+\r
+ if (BootOrderList != NULL) {\r
+ FreePool (BootOrderList);\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ L"BootOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ BootOrderListSize + sizeof (UINT16),\r
+ NewBootOrderList\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ FreePool (NewBootOrderList);\r
+ NewBootOrderList = NULL;\r
+ InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
+ BootOptionMenu.MenuNumber++;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ This function update the "BootNext" EFI Variable. If there is \r
+ no "BootNext" specified in BMM, this EFI Variable is deleted.\r
+ It also update the BMM context data specified the "BootNext"\r
+ vaule.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @return The EFI variable can be saved. See gRT->SetVariable \r
+ for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootNext (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
+ UINT16 Index;\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
+ CurrentFakeNVMap = &CallbackData->BmmFakeNvData;\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ ASSERT (NULL != NewMenuEntry);\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewLoadContext->IsBootNext = FALSE;\r
+ }\r
+\r
+ if (CurrentFakeNVMap->BootNext == NONE_BOOTNEXT_VALUE) {\r
+ EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_GetMenuEntry (\r
+ &BootOptionMenu,\r
+ CurrentFakeNVMap->BootNext\r
+ );\r
+ ASSERT (NewMenuEntry != NULL);\r
+\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+ Status = gRT->SetVariable (\r
+ L"BootNext",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ sizeof (UINT16),\r
+ &NewMenuEntry->OptionNumber\r
+ );\r
+ NewLoadContext->IsBootNext = TRUE;\r
+ CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
+ return Status;\r
+}\r
+\r
+/**\r
+ This function update the "BootOrder" EFI Variable based on\r
+ BMM Formset's NV map. It then refresh BootOptionMenu\r
+ with the new "BootOrder" list.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT16 Index;\r
+ UINT16 OrderIndex;\r
+ UINT16 *BootOrder;\r
+ UINTN BootOrderSize;\r
+ UINT16 OptionNumber;\r
+\r
+ //\r
+ // First check whether BootOrder is present in current configuration\r
+ //\r
+ GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrder, &BootOrderSize);\r
+ if (BootOrder == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.BootOptionOrder) / sizeof (CallbackData->BmmFakeNvData.BootOptionOrder[0])));\r
+\r
+ //\r
+ // OptionOrder is subset of BootOrder\r
+ //\r
+ for (OrderIndex = 0; (OrderIndex < BootOptionMenu.MenuNumber) && (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] != 0); OrderIndex++) {\r
+ for (Index = OrderIndex; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
+ if ((BootOrder[Index] == (UINT16) (CallbackData->BmmFakeNvData.BootOptionOrder[OrderIndex] - 1)) && (OrderIndex != Index)) {\r
+ OptionNumber = BootOrder[Index];\r
+ CopyMem (&BootOrder[OrderIndex + 1], &BootOrder[OrderIndex], (Index - OrderIndex) * sizeof (UINT16));\r
+ BootOrder[OrderIndex] = OptionNumber;\r
+ }\r
+ }\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ L"BootOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ BootOrderSize,\r
+ BootOrder\r
+ );\r
+ FreePool (BootOrder);\r
+ \r
+ BOpt_FreeMenu (&BootOptionMenu);\r
+ BOpt_GetBootOptions (CallbackData);\r
+\r
+ return Status;\r
+\r
+}\r
+\r
+/**\r
+ This function update the "DriverOrder" EFI Variable based on\r
+ BMM Formset's NV map. It then refresh DriverOptionMenu\r
+ with the new "DriverOrder" list.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+ @retval EFI_SUCCESS The function complete successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to complete the function.\r
+ @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOrder (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT16 Index;\r
+ UINT16 *DriverOrderList;\r
+ UINT16 *NewDriverOrderList;\r
+ UINTN DriverOrderListSize;\r
+\r
+ DriverOrderList = NULL;\r
+ DriverOrderListSize = 0;\r
+\r
+ //\r
+ // First check whether DriverOrder is present in current configuration\r
+ //\r
+ GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize);\r
+ NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
+\r
+ if (NewDriverOrderList == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ //\r
+ // If exists, delete it to hold new DriverOrder\r
+ //\r
+ if (DriverOrderList != NULL) {\r
+ EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
+ FreePool (DriverOrderList);\r
+ }\r
+\r
+ ASSERT (DriverOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder) / sizeof (CallbackData->BmmFakeNvData.DriverOptionOrder[0])));\r
+ for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
+ NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.DriverOptionOrder[Index] - 1);\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ L"DriverOrder",\r
+ &gEfiGlobalVariableGuid,\r
+ VAR_FLAG,\r
+ DriverOrderListSize,\r
+ NewDriverOrderList\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ BOpt_FreeMenu (&DriverOptionMenu);\r
+ BOpt_GetDriverOptions (CallbackData);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Update the Text Mode of Console.\r
+\r
+ @param CallbackData The context data for BMM.\r
+\r
+ @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
+ @return Other value if the Text Mode of Console is not updated.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConMode (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Mode;\r
+ CONSOLE_OUT_MODE ModeInfo;\r
+\r
+ Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
+\r
+ Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = PcdSet32S (PcdSetupConOutColumn, (UINT32) ModeInfo.Column);\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = PcdSet32S (PcdSetupConOutRow, (UINT32) ModeInfo.Row);\r
+ }\r
+ }\r
+\r
+ return Status;\r
+}\r