X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=IntelFrameworkModulePkg%2FUniversal%2FBdsDxe%2FFrontPage.c;h=55fce979f781cf8f2ff961ee6ac0f83cac58e07e;hp=29974769bb8768e76c2dedd8a49df694836ac5fb;hb=b55f8b0146ab1a0b26909a63bb04ba850b9ba198;hpb=a3a795afdb9d8efd8e6603cce92103d610346b78 diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index 29974769bb..55fce979f7 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "Bds.h" #include "FrontPage.h" +#include "Language.h" EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID; @@ -37,6 +38,31 @@ FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = { } }; +HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = { + { + { + HARDWARE_DEVICE_PATH, + HW_VENDOR_DP, + { + (UINT8) (sizeof (VENDOR_DEVICE_PATH)), + (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) + } + }, + // + // {8E6D99EE-7531-48f8-8745-7F6144468FF2} + // + { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } } + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + (UINT8) (END_DEVICE_PATH_LENGTH), + (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) + } + } +}; + /** This function allows a caller to extract the current configuration for one or more named elements from the target driver. @@ -68,6 +94,10 @@ FakeExtractConfig ( OUT EFI_STRING *Results ) { + if (Request == NULL || Progress == NULL || Results == NULL) { + return EFI_INVALID_PARAMETER; + } + *Progress = Request; return EFI_NOT_FOUND; } @@ -95,6 +125,17 @@ FakeRouteConfig ( OUT EFI_STRING *Progress ) { + if (Configuration == NULL || Progress == NULL) { + return EFI_INVALID_PARAMETER; + } + + *Progress = Configuration; + if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName) + && !HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) { + return EFI_NOT_FOUND; + } + + *Progress = Configuration + StrLen (Configuration); return EFI_SUCCESS; } @@ -130,7 +171,6 @@ FrontPageCallback ( CHAR8 *LanguageString; CHAR8 *LangCode; CHAR8 *Lang; - CHAR8 OldLang[ISO_639_2_ENTRY_SIZE]; UINTN Index; EFI_STATUS Status; CHAR8 *PlatformSupportedLanguages; @@ -158,18 +198,18 @@ FrontPageCallback ( // // Collect the languages from what our current Language support is based on our VFR // - LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle); + LanguageString = HiiGetSupportedLanguages (gFrontPagePrivate.HiiHandle); ASSERT (LanguageString != NULL); // // Allocate working buffer for RFC 4646 language in supported LanguageString. // Lang = AllocatePool (AsciiStrSize (LanguageString)); ASSERT (Lang != NULL); - + Index = 0; LangCode = LanguageString; while (*LangCode != 0) { - HiiLibGetNextLanguage (&LangCode, Lang); + GetNextLanguage (&LangCode, Lang); if (Index == Value->u8) { break; @@ -186,7 +226,7 @@ FrontPageCallback ( ); ASSERT (PlatformSupportedLanguages != NULL); } - + // // Select the best language in platform supported Language. // @@ -204,25 +244,12 @@ FrontPageCallback ( AsciiStrSize (BestLanguage), Lang ); - - if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { - // - // Set UEFI deprecated variable "Lang" for backwards compatibility - // - Status = ConvertRfc3066LanguageToIso639Language (BestLanguage, OldLang); - if (!EFI_ERROR (Status)) { - Status = gRT->SetVariable ( - L"Lang", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - ISO_639_2_ENTRY_SIZE, - OldLang - ); - } - } + ASSERT_EFI_ERROR(Status); FreePool (BestLanguage); + } else { + ASSERT (FALSE); } - + FreePool (PlatformSupportedLanguages); FreePool (Lang); FreePool (LanguageString); @@ -272,20 +299,21 @@ InitializeFrontPage ( ) { EFI_STATUS Status; - EFI_HII_PACKAGE_LIST_HEADER *PackageList; - EFI_HII_UPDATE_DATA UpdateData; - IFR_OPTION *OptionList; CHAR8 *LanguageString; CHAR8 *LangCode; CHAR8 *Lang; CHAR8 *CurrentLang; CHAR8 *BestLanguage; UINTN OptionCount; - EFI_STRING_ID Token; CHAR16 *StringBuffer; UINTN BufferSize; - UINTN Index; EFI_HII_HANDLE HiiHandle; + VOID *OptionsOpCodeHandle; + VOID *StartOpCodeHandle; + VOID *EndOpCodeHandle; + EFI_IFR_GUID_LABEL *StartLabel; + EFI_IFR_GUID_LABEL *EndLabel; + BOOLEAN FirstFlag; if (InitializeHiiData) { // @@ -324,58 +352,64 @@ InitializeFrontPage ( } // - // Create driver handle used by HII database + // Install Device Path Protocol and Config Access protocol to driver handle // - Status = HiiLibCreateHiiDriverHandle (&gFrontPagePrivate.DriverHandle); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Install Config Access protocol to driver handle - // - Status = gBS->InstallProtocolInterface ( + Status = gBS->InstallMultipleProtocolInterfaces ( &gFrontPagePrivate.DriverHandle, + &gEfiDevicePathProtocolGuid, + &mFrontPageHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, - EFI_NATIVE_INTERFACE, - &gFrontPagePrivate.ConfigAccess + &gFrontPagePrivate.ConfigAccess, + NULL ); ASSERT_EFI_ERROR (Status); // // Publish our HII data // - PackageList = HiiLibPreparePackageList (2, &mFrontPageGuid, FrontPageVfrBin, BdsDxeStrings); - ASSERT (PackageList != NULL); - - Status = gHiiDatabase->NewPackageList ( - gHiiDatabase, - PackageList, - gFrontPagePrivate.DriverHandle, - &gFrontPagePrivate.HiiHandle - ); - FreePool (PackageList); - if (EFI_ERROR (Status)) { - return Status; + gFrontPagePrivate.HiiHandle = HiiAddPackages ( + &mFrontPageGuid, + gFrontPagePrivate.DriverHandle, + FrontPageVfrBin, + BdsDxeStrings, + NULL + ); + if (gFrontPagePrivate.HiiHandle == NULL) { + return EFI_OUT_OF_RESOURCES; } } // - // Allocate space for creation of UpdateData Buffer + // Init OpCode Handle and Allocate space for creation of UpdateData Buffer + // + StartOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (StartOpCodeHandle != NULL); + + EndOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (EndOpCodeHandle != NULL); + + OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); + ASSERT (OptionsOpCodeHandle != NULL); + // + // Create Hii Extend Label OpCode as the start opcode // - UpdateData.BufferSize = 0x1000; - UpdateData.Data = AllocateZeroPool (0x1000); - ASSERT (UpdateData.Data != NULL); + StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); + StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + StartLabel->Number = LABEL_SELECT_LANGUAGE; - OptionList = AllocateZeroPool (0x1000); - ASSERT (OptionList != NULL); + // + // Create Hii Extend Label OpCode as the end opcode + // + EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); + EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; + EndLabel->Number = LABEL_END; // // Collect the languages from what our current Language support is based on our VFR // HiiHandle = gFrontPagePrivate.HiiHandle; - LanguageString = HiiLibGetSupportedLanguages (HiiHandle); + LanguageString = HiiGetSupportedLanguages (HiiHandle); ASSERT (LanguageString != NULL); // // Allocate working buffer for RFC 4646 language in supported LanguageString. @@ -400,12 +434,26 @@ InitializeFrontPage ( // ASSERT (BestLanguage != NULL); + OptionCount = 0; + LangCode = LanguageString; + FirstFlag = FALSE; + + if (gFrontPagePrivate.LanguageToken == NULL) { + while (*LangCode != 0) { + GetNextLanguage (&LangCode, Lang); + OptionCount ++; + } + gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID)); + ASSERT (gFrontPagePrivate.LanguageToken != NULL); + FirstFlag = TRUE; + } + OptionCount = 0; LangCode = LanguageString; while (*LangCode != 0) { - HiiLibGetNextLanguage (&LangCode, Lang); + GetNextLanguage (&LangCode, Lang); - if (gFrontPagePrivate.LanguageToken == NULL) { + if (FirstFlag) { // // Get Language Name from String Package. The StringId of Printable Language // Name is always 1 which is generated by StringGather Tool. @@ -436,20 +484,30 @@ InitializeFrontPage ( } ASSERT_EFI_ERROR (Status); - Token = 0; - Status = HiiLibNewString (HiiHandle, &Token, StringBuffer); + // + // Save the string Id for each language + // + gFrontPagePrivate.LanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL); FreePool (StringBuffer); - } else { - Token = gFrontPagePrivate.LanguageToken[OptionCount]; } if (AsciiStrCmp (Lang, BestLanguage) == 0) { - OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT; + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + gFrontPagePrivate.LanguageToken[OptionCount], + EFI_IFR_OPTION_DEFAULT, + EFI_IFR_NUMERIC_SIZE_1, + (UINT8) OptionCount + ); } else { - OptionList[OptionCount].Flags = 0; + HiiCreateOneOfOptionOpCode ( + OptionsOpCodeHandle, + gFrontPagePrivate.LanguageToken[OptionCount], + 0, + EFI_IFR_NUMERIC_SIZE_1, + (UINT8) OptionCount + ); } - OptionList[OptionCount].StringToken = Token; - OptionList[OptionCount].Value.u8 = (UINT8) OptionCount; OptionCount++; } @@ -461,8 +519,8 @@ InitializeFrontPage ( FreePool (Lang); FreePool (LanguageString); - UpdateData.Offset = 0; - CreateOneOfOpCode ( + HiiCreateOneOfOpCode ( + StartOpCodeHandle, FRONT_PAGE_KEY_LANGUAGE, 0, 0, @@ -470,31 +528,21 @@ InitializeFrontPage ( STRING_TOKEN (STR_LANGUAGE_SELECT_HELP), EFI_IFR_FLAG_CALLBACK, EFI_IFR_NUMERIC_SIZE_1, - OptionList, - OptionCount, - &UpdateData + OptionsOpCodeHandle, + NULL ); - Status = IfrLibUpdateForm ( + Status = HiiUpdateForm ( HiiHandle, &mFrontPageGuid, FRONT_PAGE_FORM_ID, - LABEL_SELECT_LANGUAGE, - FALSE, - &UpdateData + StartOpCodeHandle, // LABEL_SELECT_LANGUAGE + EndOpCodeHandle // LABEL_END ); - // - // Save the string Id for each language - // - gFrontPagePrivate.LanguageToken = AllocatePool (OptionCount * sizeof (EFI_STRING_ID)); - ASSERT (gFrontPagePrivate.LanguageToken != NULL); - for (Index = 0; Index < OptionCount; Index++) { - gFrontPagePrivate.LanguageToken[Index] = OptionList[Index].StringToken; - } - - FreePool (UpdateData.Data); - FreePool (OptionList); + HiiFreeOpCodeHandle (StartOpCodeHandle); + HiiFreeOpCodeHandle (EndOpCodeHandle); + HiiFreeOpCodeHandle (OptionsOpCodeHandle); return Status; } @@ -526,7 +574,7 @@ CallFrontPage ( gFormBrowser2, &gFrontPagePrivate.HiiHandle, 1, - NULL, + &mFrontPageGuid, 0, NULL, &ActionRequest @@ -559,18 +607,20 @@ GetProducerString ( OUT CHAR16 **String ) { - EFI_STATUS Status; + EFI_STRING TmpString; - Status = HiiLibGetStringFromToken (ProducerGuid, Token, String); - if (EFI_ERROR (Status)) { + TmpString = HiiGetPackageString (ProducerGuid, Token, NULL); + if (TmpString == NULL) { *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING)); + } else { + *String = TmpString; } return EFI_SUCCESS; } /** - Convert Processor Frequency Data to a string + Convert Processor Frequency Data to a string. @param ProcessorFrequency The frequency data to process @param String The string that is created @@ -671,6 +721,9 @@ UpdateFrontPageStrings ( Record = NULL; do { Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record); + if (EFI_ERROR (Status) || Record == NULL) { + break; + } if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) { DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1); if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) && @@ -679,7 +732,7 @@ UpdateFrontPageStrings ( BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1); GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString); TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION); - HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); FreePool (NewString); Find[0] = TRUE; } @@ -690,7 +743,7 @@ UpdateFrontPageStrings ( SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1); GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString); TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL); - HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); FreePool (NewString); Find[1] = TRUE; } @@ -701,7 +754,7 @@ UpdateFrontPageStrings ( ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1); GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString); TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL); - HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); FreePool (NewString); Find[2] = TRUE; } @@ -712,7 +765,7 @@ UpdateFrontPageStrings ( ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1); ConvertProcessorToString (ProcessorFrequency, &NewString); TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED); - HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); FreePool (NewString); Find[3] = TRUE; } @@ -726,7 +779,7 @@ UpdateFrontPageStrings ( &NewString ); TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE); - HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); FreePool (NewString); Find[4] = TRUE; } @@ -827,7 +880,7 @@ ShowProgress ( } DEBUG ((EFI_D_INFO, "\n\nStart showing progress bar... Press any key to stop it! ...Zzz....\n")); - + SetMem (&Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff); SetMem (&Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0x0); SetMem (&Color, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), 0xff); @@ -843,7 +896,7 @@ ShowProgress ( TimeoutRemain = TimeoutDefault; while (TimeoutRemain != 0) { DEBUG ((EFI_D_INFO, "Showing progress bar...Remaining %d second!\n", TimeoutRemain)); - + Status = WaitForSingleEvent (gST->ConIn->WaitForKey, ONE_SECOND); if (Status != EFI_TIMEOUT) { break; @@ -911,7 +964,7 @@ PlatformBdsEnterFrontPage ( { EFI_STATUS Status; - PERF_START (0, "BdsTimeOut", "BDS", 0); + PERF_START (NULL, "BdsTimeOut", "BDS", 0); // // Indicate if we need connect all in the platform setup // @@ -1022,5 +1075,5 @@ Exit: // Note: The following lines of code only execute when Auto boot // takes affect // - PERF_END (0, "BdsTimeOut", "BDS", 0); + PERF_END (NULL, "BdsTimeOut", "BDS", 0); }