Convert Processor Frequency Data to a string.\r
\r
@param ProcessorFrequency The frequency data to process\r
+ @param Base10Exponent The exponent based on 10\r
@param String The string that is created\r
\r
**/\r
VOID\r
ConvertProcessorToString (\r
- IN EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency,\r
- OUT CHAR16 **String\r
+ IN UINT16 ProcessorFrequency,\r
+ IN UINT16 Base10Exponent,\r
+ OUT CHAR16 **String\r
)\r
{\r
CHAR16 *StringBuffer;\r
UINTN Index;\r
UINT32 FreqMhz;\r
\r
- if (ProcessorFrequency->Exponent >= 6) {\r
- FreqMhz = ProcessorFrequency->Value;\r
- for (Index = 0; Index < (UINTN) (ProcessorFrequency->Exponent - 6); Index++) {\r
+ if (Base10Exponent >= 6) {\r
+ FreqMhz = ProcessorFrequency;\r
+ for (Index = 0; Index < (UINTN) (Base10Exponent - 6); Index++) {\r
FreqMhz *= 10;\r
}\r
} else {\r
StrCat (StringBuffer, L".");\r
UnicodeValueToString (StringBuffer + Index + 1, PREFIX_ZERO, (FreqMhz % 1000) / 10, 2);\r
StrCat (StringBuffer, L" GHz");\r
-\r
*String = (CHAR16 *) StringBuffer;\r
-\r
return ;\r
}\r
\r
+\r
/**\r
Convert Memory Size to a string.\r
\r
return ;\r
}\r
\r
+/**\r
+\r
+ Acquire the string associated with the Index from smbios structure and return it.\r
+ The caller is responsible for free the string buffer.\r
+\r
+ @param OptionalStrStart The start position to search the string\r
+ @param Index The index of the string to extract\r
+ @param String The string that is extracted\r
+\r
+ @retval EFI_SUCCESS The function returns EFI_SUCCESS always.\r
+\r
+**/\r
+EFI_STATUS\r
+GetOptionalStringByIndex (\r
+ IN CHAR8 *OptionalStrStart,\r
+ IN UINT8 Index,\r
+ OUT CHAR16 **String\r
+ )\r
+{\r
+ UINT8 StrNum;\r
+ UINTN CurrentStrLen;\r
+ CHAR8* CharInStr;\r
+ EFI_STATUS Status;\r
+\r
+ StrNum = 0;\r
+ Status = EFI_NOT_FOUND;\r
+ CharInStr = OptionalStrStart;\r
+\r
+ if (Index != 1) {\r
+ CurrentStrLen = 0;\r
+ //\r
+ // look for the two consecutive zeros, check the string limit by the way.\r
+ //\r
+ while (*CharInStr != 0 || *(CharInStr+1) != 0) { \r
+ if (*CharInStr == 0) {\r
+ StrNum += 1;\r
+ CharInStr++;\r
+ }\r
+ \r
+ if (StrNum == Index) {\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+ }\r
+ \r
+ CurrentStrLen = AsciiStrLen(CharInStr);\r
+ \r
+ //\r
+ // forward the pointer\r
+ //\r
+ OptionalStrStart = CharInStr;\r
+ CharInStr += CurrentStrLen;\r
+ }\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
+ return Status;\r
+ }\r
+ } else {\r
+ CurrentStrLen = AsciiStrLen(CharInStr);\r
+ }\r
+\r
+ *String = AllocatePool((CurrentStrLen + 1)*sizeof(CHAR16));\r
+ AsciiStrToUnicodeStr(OptionalStrStart, *String);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
/**\r
Update the banner information for the Front Page based on DataHub information.\r
\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_STRING_ID TokenToUpdate;\r
+ UINT8 StrIndex;\r
CHAR16 *NewString;\r
- UINT64 MonotonicCount;\r
- EFI_DATA_HUB_PROTOCOL *DataHub;\r
- EFI_DATA_RECORD_HEADER *Record;\r
- EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
- EFI_MISC_BIOS_VENDOR_DATA *BiosVendor;\r
- EFI_MISC_SYSTEM_MANUFACTURER_DATA *SystemManufacturer;\r
- EFI_PROCESSOR_VERSION_DATA *ProcessorVersion;\r
- EFI_PROCESSOR_CORE_FREQUENCY_DATA *ProcessorFrequency;\r
- EFI_MEMORY_ARRAY_START_ADDRESS_DATA *MemoryArray;\r
BOOLEAN Find[5];\r
+ EFI_STATUS Status;\r
+ EFI_STRING_ID TokenToUpdate;\r
+ EFI_SMBIOS_HANDLE SmbiosHandle;\r
+ EFI_SMBIOS_PROTOCOL *Smbios;\r
+ SMBIOS_TABLE_TYPE0 *Type0Record;\r
+ SMBIOS_TABLE_TYPE1 *Type1Record;\r
+ SMBIOS_TABLE_TYPE4 *Type4Record;\r
+ SMBIOS_TABLE_TYPE19 *Type19Record;\r
+ EFI_SMBIOS_TABLE_HEADER *Record;\r
\r
ZeroMem (Find, sizeof (Find));\r
\r
// Update Front Page strings\r
//\r
Status = gBS->LocateProtocol (\r
- &gEfiDataHubProtocolGuid,\r
+ &gEfiSmbiosProtocolGuid,\r
NULL,\r
- (VOID **) &DataHub\r
+ (VOID **) &Smbios\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- MonotonicCount = 0;\r
- Record = NULL;\r
+ SmbiosHandle = 0;\r
do {\r
- Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
- if (EFI_ERROR (Status) || Record == NULL) {\r
+ Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);\r
+ if (EFI_ERROR(Status)) {\r
break;\r
}\r
- if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
- DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
- if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&\r
- (DataHeader->RecordType == EFI_MISC_BIOS_VENDOR_RECORD_NUMBER)\r
- ) {\r
- BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
- GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
- TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
- HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
- FreePool (NewString);\r
- Find[0] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &gEfiMiscSubClassGuid) &&\r
- (DataHeader->RecordType == EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER)\r
- ) {\r
- SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
- GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
- TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
- HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
- FreePool (NewString);\r
- Find[1] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&\r
- (DataHeader->RecordType == ProcessorVersionRecordType)\r
- ) {\r
- ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
- GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString);\r
- TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
- HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
- FreePool (NewString);\r
- Find[2] = TRUE;\r
- }\r
-\r
- if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&\r
- (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)\r
- ) {\r
- ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
- ConvertProcessorToString (ProcessorFrequency, &NewString);\r
- TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
- HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
- FreePool (NewString);\r
- Find[3] = TRUE;\r
- }\r
\r
- if (CompareGuid (&Record->DataRecordGuid, &gEfiMemorySubClassGuid) &&\r
- (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
- ) {\r
- MemoryArray = (EFI_MEMORY_ARRAY_START_ADDRESS_DATA *) (DataHeader + 1);\r
- ConvertMemorySizeToString (\r
- (UINT32)(RShiftU64((MemoryArray->MemoryArrayEndAddress - MemoryArray->MemoryArrayStartAddress + 1), 20)),\r
- &NewString\r
- );\r
- TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
- HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
- FreePool (NewString);\r
- Find[4] = TRUE;\r
- }\r
+ if (Record->Type == EFI_SMBIOS_TYPE_BIOS_INFORMATION) {\r
+ Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;\r
+ StrIndex = Type0Record->BiosVersion;\r
+ GetOptionalStringByIndex ((CHAR8*)(Type0Record+1), StrIndex, &NewString);\r
+ TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+ FreePool (NewString);\r
+ Find[0] = TRUE;\r
+ } \r
+\r
+ if (Record->Type == EFI_SMBIOS_TYPE_SYSTEM_INFORMATION) {\r
+ Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;\r
+ StrIndex = Type1Record->ProductName;\r
+ GetOptionalStringByIndex ((CHAR8*)(Type1Record+1), StrIndex, &NewString);\r
+ TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+ FreePool (NewString);\r
+ Find[1] = TRUE;\r
}\r
- } while (!EFI_ERROR (Status) && (MonotonicCount != 0) && !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
-\r
+ \r
+ if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
+ Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
+ StrIndex = Type4Record->ProcessorVersion;\r
+ GetOptionalStringByIndex ((CHAR8*)(Type4Record+1), StrIndex, &NewString);\r
+ TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+ FreePool (NewString);\r
+ Find[2] = TRUE;\r
+ } \r
+\r
+ if (Record->Type == EFI_SMBIOS_TYPE_PROCESSOR_INFORMATION) {\r
+ Type4Record = (SMBIOS_TABLE_TYPE4 *) Record;\r
+ ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);\r
+ TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+ FreePool (NewString);\r
+ Find[3] = TRUE;\r
+ } \r
+\r
+ if ( Record->Type == EFI_SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {\r
+ Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;\r
+ ConvertMemorySizeToString (\r
+ (UINT32)(RShiftU64((Type19Record->EndingAddress - Type19Record->StartingAddress + 1), 10)),\r
+ &NewString\r
+ );\r
+ TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
+ HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
+ FreePool (NewString);\r
+ Find[4] = TRUE; \r
+ }\r
+ } while ( !(Find[0] && Find[1] && Find[2] && Find[3] && Find[4]));\r
return ;\r
}\r
\r
+\r
/**\r
Function waits for a given event to fire, or for an optional timeout to expire.\r
\r
- @param Event The event to wait for\r
- @param Timeout An optional timeout value in 100 ns units.\r
+ @param Event The event to wait for\r
+ @param Timeout An optional timeout value in 100 ns units.\r
\r
@retval EFI_SUCCESS Event fired before Timeout expired.\r
@retval EFI_TIME_OUT Timout expired before Event fired..\r
IN UINT64 Timeout OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
UINTN Index;\r
+ EFI_STATUS Status;\r
EFI_EVENT TimerEvent;\r
EFI_EVENT WaitList[2];\r
\r
// Set the timer event\r
//\r
gBS->SetTimer (\r
- TimerEvent,\r
- TimerRelative,\r
- Timeout\r
- );\r
+ TimerEvent,\r
+ TimerRelative,\r
+ Timeout\r
+ );\r
\r
//\r
// Wait for the original event or the timer\r
Function show progress bar to wait for user input.\r
\r
\r
- @param TimeoutDefault The fault time out value before the system continue to boot.\r
+ @param TimeoutDefault The fault time out value before the system continue to boot.\r
\r
@retval EFI_SUCCESS User pressed some key except "Enter"\r
@retval EFI_TIME_OUT Timout expired or user press "Enter"\r
IN UINT16 TimeoutDefault\r
)\r
{\r
- EFI_STATUS Status;\r
CHAR16 *TmpStr;\r
+ UINT16 TimeoutRemain;\r
+ EFI_STATUS Status;\r
+ EFI_INPUT_KEY Key;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color;\r
- EFI_INPUT_KEY Key;\r
- UINT16 TimeoutRemain;\r
\r
if (TimeoutDefault == 0) {\r
return EFI_TIMEOUT;\r