diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
commit | f215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch) | |
tree | 6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c | |
parent | Initial commit. (diff) | |
download | virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip |
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c | 469 |
1 files changed, 469 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c b/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c new file mode 100644 index 00000000..baa179ef --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c @@ -0,0 +1,469 @@ +/** @file +The functions for Boot Maintainence Main menu. + +Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#include "BootMaintenanceManager.h" +#include "BootMaintenanceManagerCustomizedUiSupport.h" + +#define UI_HII_DRIVER_LIST_SIZE 0x8 + +typedef struct { + EFI_STRING_ID PromptId; + EFI_STRING_ID HelpId; + EFI_STRING_ID DevicePathId; + EFI_GUID FormSetGuid; + BOOLEAN EmptyLineAfter; +} UI_HII_DRIVER_INSTANCE; + +STATIC UI_HII_DRIVER_INSTANCE *gHiiDriverList; + + +/** + Create the dynamic item to allow user to set the "BootNext" vaule. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateBootNextMenu( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + BM_MENU_ENTRY *NewMenuEntry; + BM_LOAD_CONTEXT *NewLoadContext; + UINT16 Index; + VOID *OptionsOpCodeHandle; + UINT32 BootNextIndex; + + if (BootOptionMenu.MenuNumber == 0) { + return; + } + + BootNextIndex = NONE_BOOTNEXT_VALUE; + + OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (OptionsOpCodeHandle != NULL); + + for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) { + NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); + NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; + + if (NewLoadContext->IsBootNext) { + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + NewMenuEntry->DisplayStringToken, + EFI_IFR_OPTION_DEFAULT, + EFI_IFR_TYPE_NUM_SIZE_32, + Index + ); + BootNextIndex = Index; + } else { + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + NewMenuEntry->DisplayStringToken, + 0, + EFI_IFR_TYPE_NUM_SIZE_32, + Index + ); + } + } + + if (BootNextIndex == NONE_BOOTNEXT_VALUE) { + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + STRING_TOKEN (STR_NONE), + EFI_IFR_OPTION_DEFAULT, + EFI_IFR_TYPE_NUM_SIZE_32, + NONE_BOOTNEXT_VALUE + ); + } else { + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + STRING_TOKEN (STR_NONE), + 0, + EFI_IFR_TYPE_NUM_SIZE_32, + NONE_BOOTNEXT_VALUE + ); + } + + HiiCreateOneOfOpCode ( + StartOpCodeHandle, + (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID, + VARSTORE_ID_BOOT_MAINT, + BOOT_NEXT_VAR_OFFSET, + STRING_TOKEN (STR_BOOT_NEXT), + STRING_TOKEN (STR_BOOT_NEXT_HELP), + 0, + EFI_IFR_NUMERIC_SIZE_4, + OptionsOpCodeHandle, + NULL + ); + + HiiFreeOpCodeHandle (OptionsOpCodeHandle); + +} + +/** + Create Time Out Menu in the page. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateTimeOutMenu ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateNumericOpCode ( + StartOpCodeHandle, + (EFI_QUESTION_ID) FORM_TIME_OUT_ID, + VARSTORE_ID_BOOT_MAINT, + BOOT_TIME_OUT_VAR_OFFSET, + STRING_TOKEN(STR_NUM_AUTO_BOOT), + STRING_TOKEN(STR_HLP_AUTO_BOOT), + EFI_IFR_FLAG_CALLBACK, + EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC, + 0, + 65535, + 0, + NULL + ); +} + +/** + Create Boot Option menu in the page. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateBootOptionMenu ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateGotoOpCode ( + StartOpCodeHandle, + FORM_BOOT_SETUP_ID, + STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE), + STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP), + EFI_IFR_FLAG_CALLBACK, + FORM_BOOT_SETUP_ID + ); +} + +/** + Create Driver Option menu in the page. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateDriverOptionMenu ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateGotoOpCode ( + StartOpCodeHandle, + FORM_DRIVER_SETUP_ID, + STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE), + STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP), + EFI_IFR_FLAG_CALLBACK, + FORM_DRIVER_SETUP_ID + ); +} + +/** + Create Com Option menu in the page. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateComOptionMenu ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateGotoOpCode ( + StartOpCodeHandle, + FORM_CON_MAIN_ID, + STRING_TOKEN (STR_FORM_CON_MAIN_TITLE), + STRING_TOKEN (STR_FORM_CON_MAIN_HELP), + EFI_IFR_FLAG_CALLBACK, + FORM_CON_MAIN_ID + ); +} + +/** + Create Com Option menu in the page. + + @param[in] HiiHandle The hii handle for the Uiapp driver. + @param[in] StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateBootFromFileMenu ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateGotoOpCode ( + StartOpCodeHandle, + FORM_MAIN_ID, + STRING_TOKEN (STR_BOOT_FROM_FILE), + STRING_TOKEN (STR_BOOT_FROM_FILE_HELP), + EFI_IFR_FLAG_CALLBACK, + KEY_VALUE_BOOT_FROM_FILE + ); +} + +/** + Create empty line menu in the front page. + + @param HiiHandle The hii handle for the Uiapp driver. + @param StartOpCodeHandle The opcode handle to save the new opcode. + +**/ +VOID +BmmCreateEmptyLine ( + IN EFI_HII_HANDLE HiiHandle, + IN VOID *StartOpCodeHandle + ) +{ + HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0); +} + +/** + Extract device path for given HII handle and class guid. + + @param Handle The HII handle. + + @retval NULL Fail to get the device path string. + @return PathString Get the device path string. + +**/ +CHAR16 * +ExtractDevicePathFromHandle ( + IN EFI_HII_HANDLE Handle + ) +{ + EFI_STATUS Status; + EFI_HANDLE DriverHandle; + + ASSERT (Handle != NULL); + + if (Handle == NULL) { + return NULL; + } + + Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle); + if (EFI_ERROR (Status)) { + return NULL; + } + + return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE); +} + +/** + Check whether this driver need to be shown in the front page. + + @param HiiHandle The hii handle for the driver. + @param Guid The special guid for the driver which is the target. + @param PromptId Return the prompt string id. + @param HelpId Return the help string id. + @param FormsetGuid Return the formset guid info. + + @retval EFI_SUCCESS Search the driver success + +**/ +BOOLEAN +IsRequiredDriver ( + IN EFI_HII_HANDLE HiiHandle, + IN EFI_GUID *Guid, + OUT EFI_STRING_ID *PromptId, + OUT EFI_STRING_ID *HelpId, + OUT VOID *FormsetGuid + ) +{ + EFI_STATUS Status; + UINT8 ClassGuidNum; + EFI_GUID *ClassGuid; + EFI_IFR_FORM_SET *Buffer; + UINTN BufferSize; + UINT8 *Ptr; + UINTN TempSize; + BOOLEAN RetVal; + + Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize); + if (EFI_ERROR (Status)) { + return FALSE; + } + + RetVal = FALSE; + TempSize = 0; + Ptr = (UINT8 *) Buffer; + while(TempSize < BufferSize) { + TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length; + + if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){ + Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length; + continue; + } + + ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3); + ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET)); + while (ClassGuidNum-- > 0) { + if (!CompareGuid (Guid, ClassGuid)){ + ClassGuid ++; + continue; + } + + *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle; + *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help; + CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID)); + RetVal = TRUE; + } + } + + FreePool (Buffer); + + return RetVal; +} + +/** + Search the drivers in the system which need to show in the front page + and insert the menu to the front page. + + @param HiiHandle The hii handle for the Uiapp driver. + @param ClassGuid The class guid for the driver which is the target. + @param SpecialHandlerFn The pointer to the specail handler function, if any. + @param StartOpCodeHandle The opcode handle to save the new opcode. + + @retval EFI_SUCCESS Search the driver success + +**/ +EFI_STATUS +BmmListThirdPartyDrivers ( + IN EFI_HII_HANDLE HiiHandle, + IN EFI_GUID *ClassGuid, + IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn, + IN VOID *StartOpCodeHandle + ) +{ + UINTN Index; + EFI_STRING String; + EFI_STRING_ID Token; + EFI_STRING_ID TokenHelp; + EFI_HII_HANDLE *HiiHandles; + CHAR16 *DevicePathStr; + UINTN Count; + UINTN CurrentSize; + UI_HII_DRIVER_INSTANCE *DriverListPtr; + EFI_STRING NewName; + BOOLEAN EmptyLineAfter; + + if (gHiiDriverList != NULL) { + FreePool (gHiiDriverList); + } + + HiiHandles = HiiGetHiiHandles (NULL); + ASSERT (HiiHandles != NULL); + + gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE)); + ASSERT (gHiiDriverList != NULL); + DriverListPtr = gHiiDriverList; + CurrentSize = UI_HII_DRIVER_LIST_SIZE; + + for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) { + if (!IsRequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) { + continue; + } + + String = HiiGetString (HiiHandles[Index], Token, NULL); + if (String == NULL) { + String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL); + ASSERT (String != NULL); + } else if (SpecialHandlerFn != NULL) { + // + // Check whether need to rename the driver name. + // + EmptyLineAfter = FALSE; + if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) { + FreePool (String); + String = NewName; + DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter; + } + } + DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL); + FreePool (String); + + String = HiiGetString (HiiHandles[Index], TokenHelp, NULL); + if (String == NULL) { + String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL); + ASSERT (String != NULL); + } + DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL); + FreePool (String); + + DevicePathStr = ExtractDevicePathFromHandle(HiiHandles[Index]); + if (DevicePathStr != NULL){ + DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL); + FreePool (DevicePathStr); + } else { + DriverListPtr[Count].DevicePathId = 0; + } + + Count++; + if (Count >= CurrentSize) { + DriverListPtr = ReallocatePool ( + CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE), + (Count + UI_HII_DRIVER_LIST_SIZE) + * sizeof (UI_HII_DRIVER_INSTANCE), + gHiiDriverList + ); + ASSERT (DriverListPtr != NULL); + gHiiDriverList = DriverListPtr; + CurrentSize += UI_HII_DRIVER_LIST_SIZE; + } + } + + FreePool (HiiHandles); + + Index = 0; + while (gHiiDriverList[Index].PromptId != 0) { + HiiCreateGotoExOpCode ( + StartOpCodeHandle, + 0, + gHiiDriverList[Index].PromptId, + gHiiDriverList[Index].HelpId, + 0, + 0, + 0, + &gHiiDriverList[Index].FormSetGuid, + gHiiDriverList[Index].DevicePathId + ); + + if (gHiiDriverList[Index].EmptyLineAfter) { + BmmCreateEmptyLine (HiiHandle, StartOpCodeHandle); + } + + Index ++; + } + + return EFI_SUCCESS; +} + |