X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=IntelFrameworkModulePkg%2FUniversal%2FBdsDxe%2FFrontPage.c;h=7513ab6d6bb19170d4a05d153493ec82e8417f6e;hb=6cfbf7adff681490789ce9c20bf9344aee6a225e;hp=9443a65bcdfe9404bcebde3eb42b432e26e9c949;hpb=cdcc36ae921c4c1e157907ec44bb98a67d3be96f;p=mirror_edk2.git diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index 9443a65bcd..7513ab6d6b 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -21,10 +21,7 @@ EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID; BOOLEAN gConnectAllHappened = FALSE; UINTN gCallbackKey; -EFI_HII_DATABASE_PROTOCOL *gHiiDatabase; -EFI_HII_STRING_PROTOCOL *gHiiString; EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2; -EFI_HII_CONFIG_ROUTING_PROTOCOL *gHiiConfigRouting; FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = { FRONT_PAGE_CALLBACK_DATA_SIGNATURE, @@ -56,7 +53,7 @@ HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = { { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, - { + { (UINT8) (END_DEVICE_PATH_LENGTH), (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) } @@ -94,6 +91,9 @@ FakeExtractConfig ( OUT EFI_STRING *Results ) { + if (Request == NULL || Progress == NULL || Results == NULL) { + return EFI_INVALID_PARAMETER; + } *Progress = Request; return EFI_NOT_FOUND; } @@ -122,15 +122,18 @@ FakeRouteConfig ( OUT EFI_STRING *Progress ) { - if (Configuration == NULL) { + if (Configuration == NULL || Progress == NULL) { return EFI_INVALID_PARAMETER; } - if (Progress == NULL) { - return EFI_INVALID_PARAMETER; + *Progress = Configuration; + if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, mBootMaintStorageName) + && !HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) { + return EFI_NOT_FOUND; } - return EFI_NOT_FOUND; + *Progress = Configuration + StrLen (Configuration); + return EFI_SUCCESS; } /** @@ -199,7 +202,7 @@ FrontPageCallback ( // Lang = AllocatePool (AsciiStrSize (LanguageString)); ASSERT (Lang != NULL); - + Index = 0; LangCode = LanguageString; while (*LangCode != 0) { @@ -220,7 +223,7 @@ FrontPageCallback ( ); ASSERT (PlatformSupportedLanguages != NULL); } - + // // Select the best language in platform supported Language. // @@ -300,7 +303,6 @@ InitializeFrontPage ( CHAR8 *BestLanguage; UINTN OptionCount; CHAR16 *StringBuffer; - UINTN BufferSize; EFI_HII_HANDLE HiiHandle; VOID *OptionsOpCodeHandle; VOID *StartOpCodeHandle; @@ -325,26 +327,11 @@ InitializeFrontPage ( // // Locate Hii relative protocols // - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gHiiDatabase); - if (EFI_ERROR (Status)) { - return Status; - } - - Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gHiiString); - if (EFI_ERROR (Status)) { - return Status; - } - Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2); if (EFI_ERROR (Status)) { return Status; } - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &gHiiConfigRouting); - if (EFI_ERROR (Status)) { - return Status; - } - // // Install Device Path Protocol and Config Access protocol to driver handle // @@ -431,7 +418,7 @@ InitializeFrontPage ( OptionCount = 0; LangCode = LanguageString; FirstFlag = FALSE; - + if (gFrontPagePrivate.LanguageToken == NULL) { while (*LangCode != 0) { GetNextLanguage (&LangCode, Lang); @@ -448,35 +435,8 @@ InitializeFrontPage ( GetNextLanguage (&LangCode, Lang); if (FirstFlag) { - // - // Get Language Name from String Package. The StringId of Printable Language - // Name is always 1 which is generated by StringGather Tool. - // - BufferSize = 0x100; - StringBuffer = AllocatePool (BufferSize); - Status = gHiiString->GetString ( - gHiiString, - Lang, - HiiHandle, - PRINTABLE_LANGUAGE_NAME_STRING_ID, - StringBuffer, - &BufferSize, - NULL - ); - if (Status == EFI_BUFFER_TOO_SMALL) { - FreePool (StringBuffer); - StringBuffer = AllocatePool (BufferSize); - Status = gHiiString->GetString ( - gHiiString, - Lang, - HiiHandle, - PRINTABLE_LANGUAGE_NAME_STRING_ID, - StringBuffer, - &BufferSize, - NULL - ); - } - ASSERT_EFI_ERROR (Status); + StringBuffer = HiiGetString (HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, Lang); + ASSERT_EFI_ERROR (StringBuffer != NULL); // // Save the string Id for each language @@ -614,25 +574,27 @@ GetProducerString ( } /** - Convert Processor Frequency Data to a string + Convert Processor Frequency Data to a string. @param ProcessorFrequency The frequency data to process + @param Base10Exponent The exponent based on 10 @param String The string that is created **/ VOID ConvertProcessorToString ( - IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency, - OUT CHAR16 **String + IN UINT16 ProcessorFrequency, + IN UINT16 Base10Exponent, + OUT CHAR16 **String ) { CHAR16 *StringBuffer; UINTN Index; UINT32 FreqMhz; - if (ProcessorFrequency->Exponent >= 6) { - FreqMhz = ProcessorFrequency->Value; - for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) { + if (Base10Exponent >= 6) { + FreqMhz = ProcessorFrequency; + for (Index = 0; Index < (UINTN) (Base10Exponent - 6); Index++) { FreqMhz *= 10; } } else { @@ -645,12 +607,11 @@ ConvertProcessorToString ( StrCat (StringBuffer, L"."); UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2); StrCat (StringBuffer, L" GHz"); - *String = (CHAR16 *) StringBuffer; - return ; } + /** Convert Memory Size to a string. @@ -676,6 +637,74 @@ ConvertMemorySizeToString ( return ; } +/** + + Acquire the string associated with the Index from smbios structure and return it. + The caller is responsible for free the string buffer. + + @param OptionalStrStart The start position to search the string + @param Index The index of the string to extract + @param String The string that is extracted + + @retval EFI_SUCCESS The function returns EFI_SUCCESS always. + +**/ +EFI_STATUS +GetOptionalStringByIndex ( + IN CHAR8 *OptionalStrStart, + IN UINT8 Index, + OUT CHAR16 **String + ) +{ + UINT8 StrNum; + UINTN CurrentStrLen; + CHAR8* CharInStr; + EFI_STATUS Status; + + StrNum = 0; + Status = EFI_NOT_FOUND; + CharInStr = OptionalStrStart; + + if (Index != 1) { + CurrentStrLen = 0; + // + // look for the two consecutive zeros, check the string limit by the way. + // + while (*CharInStr != 0 || *(CharInStr+1) != 0) { + if (*CharInStr == 0) { + StrNum += 1; + CharInStr++; + } + + if (StrNum == Index) { + Status = EFI_SUCCESS; + break; + } + + CurrentStrLen = AsciiStrLen(CharInStr); + + // + // forward the pointer + // + OptionalStrStart = CharInStr; + CharInStr += CurrentStrLen; + } + + if (EFI_ERROR (Status)) { + *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING)); + return Status; + } + } else { + CurrentStrLen = AsciiStrLen(CharInStr); + } + + *String = AllocatePool((CurrentStrLen + 1)*sizeof(CHAR16)); + AsciiStrToUnicodeStr(OptionalStrStart, *String); + + return EFI_SUCCESS; +} + + /** Update the banner information for the Front Page based on DataHub information. @@ -685,19 +714,18 @@ UpdateFrontPageStrings ( VOID ) { - EFI_STATUS Status; - EFI_STRING_ID TokenToUpdate; + UINT8 StrIndex; CHAR16 *NewString; - UINT64 MonotonicCount; - EFI_DATA_HUB_PROTOCOL *DataHub; - EFI_DATA_RECORD_HEADER *Record; - EFI_SUBCLASS_TYPE1_HEADER *DataHeader; - EFI_MISC_BIOS_VENDOR_DATA *BiosVendor; - EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer; - EFI_PROCESSOR_VERSION_DATA *ProcessorVersion; - EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency; - EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray; BOOLEAN Find[5]; + EFI_STATUS Status; + EFI_STRING_ID TokenToUpdate; + EFI_SMBIOS_HANDLE SmbiosHandle; + EFI_SMBIOS_PROTOCOL *Smbios; + SMBIOS_TABLE_TYPE0 *Type0Record; + SMBIOS_TABLE_TYPE1 *Type1Record; + SMBIOS_TABLE_TYPE4 *Type4Record; + SMBIOS_TABLE_TYPE19 *Type19Record; + EFI_SMBIOS_TABLE_HEADER *Record; ZeroMem (Find, sizeof (Find)); @@ -705,86 +733,79 @@ UpdateFrontPageStrings ( // Update Front Page strings // Status = gBS->LocateProtocol ( - &gEfiDataHubProtocolGuid, + &gEfiSmbiosProtocolGuid, NULL, - (VOID **) &DataHub + (VOID **) &Smbios ); ASSERT_EFI_ERROR (Status); - MonotonicCount = 0; - Record = NULL; + SmbiosHandle = 0; do { - Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record); - if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) { - DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1); - if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) && - (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER) - ) { - BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1); - GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString); - TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION); - HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); - FreePool (NewString); - Find[0] = TRUE; - } - - if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) && - (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER) - ) { - SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1); - GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString); - TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL); - HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); - FreePool (NewString); - Find[1] = TRUE; - } - - if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) && - (DataHeader->RecordType == ProcessorVersionRecordType) - ) { - ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1); - GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString); - TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL); - HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); - FreePool (NewString); - Find[2] = TRUE; - } - - if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) && - (DataHeader->RecordType == ProcessorCoreFrequencyRecordType) - ) { - ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1); - ConvertProcessorToString (ProcessorFrequency, &NewString); - TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED); - HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); - FreePool (NewString); - Find[3] = TRUE; - } - - if (CompareGuid (&Record->DataRecordGuid, &gEfiMemorySubClassGuid) && - (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER) - ) { - MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1); - ConvertMemorySizeToString ( - (UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20)), - &NewString - ); - TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE); - HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); - FreePool (NewString); - Find[4] = TRUE; - } + Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL); + if (EFI_ERROR(Status)) { + break; } - } while (!EFI_ERROR (Status) && (MonotonicCount != 0) && !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4])); + if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) { + Type0Record = (SMBIOS_TABLE_TYPE0 *) Record; + StrIndex = Type0Record->BiosVersion; + GetOptionalStringByIndex ((CHAR8*)(Type0Record+1), StrIndex, &NewString); + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); + FreePool (NewString); + Find[0] = TRUE; + } + + if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) { + Type1Record = (SMBIOS_TABLE_TYPE1 *) Record; + StrIndex = Type1Record->ProductName; + GetOptionalStringByIndex ((CHAR8*)(Type1Record+1), StrIndex, &NewString); + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); + FreePool (NewString); + Find[1] = TRUE; + } + + if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) { + Type4Record = (SMBIOS_TABLE_TYPE4 *) Record; + StrIndex = Type4Record->ProcessorVersion; + GetOptionalStringByIndex ((CHAR8*)(Type4Record+1), StrIndex, &NewString); + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); + FreePool (NewString); + Find[2] = TRUE; + } + + if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) { + Type4Record = (SMBIOS_TABLE_TYPE4 *) Record; + ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString); + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); + FreePool (NewString); + Find[3] = TRUE; + } + + if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) { + Type19Record = (SMBIOS_TABLE_TYPE19 *) Record; + ConvertMemorySizeToString ( + (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)), + &NewString + ); + TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE); + HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL); + FreePool (NewString); + Find[4] = TRUE; + } + } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4])); return ; } + /** Function waits for a given event to fire, or for an optional timeout to expire. - @param Event The event to wait for - @param Timeout An optional timeout value in 100 ns units. + @param Event The event to wait for + @param Timeout An optional timeout value in 100 ns units. @retval EFI_SUCCESS Event fired before Timeout expired. @retval EFI_TIME_OUT Timout expired before Event fired.. @@ -796,8 +817,8 @@ WaitForSingleEvent ( IN UINT64 Timeout OPTIONAL ) { - EFI_STATUS Status; UINTN Index; + EFI_STATUS Status; EFI_EVENT TimerEvent; EFI_EVENT WaitList[2]; @@ -811,10 +832,10 @@ WaitForSingleEvent ( // Set the timer event // gBS->SetTimer ( - TimerEvent, - TimerRelative, - Timeout - ); + TimerEvent, + TimerRelative, + Timeout + ); // // Wait for the original event or the timer @@ -847,7 +868,7 @@ WaitForSingleEvent ( Function show progress bar to wait for user input. - @param TimeoutDefault The fault time out value before the system continue to boot. + @param TimeoutDefault The fault time out value before the system continue to boot. @retval EFI_SUCCESS User pressed some key except "Enter" @retval EFI_TIME_OUT Timout expired or user press "Enter" @@ -858,20 +879,20 @@ ShowProgress ( IN UINT16 TimeoutDefault ) { - EFI_STATUS Status; CHAR16 *TmpStr; + UINT16 TimeoutRemain; + EFI_STATUS Status; + EFI_INPUT_KEY Key; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; - EFI_INPUT_KEY Key; - UINT16 TimeoutRemain; if (TimeoutDefault == 0) { return EFI_TIMEOUT; } 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); @@ -887,7 +908,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; @@ -955,7 +976,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 // @@ -1066,5 +1087,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); }