1 /** @file 2 * 3 * Copyright (c) 2016, Hisilicon Limited. All rights reserved. 4 * Copyright (c) 2016, Linaro Limited. All rights reserved. 5 * 6 * This program and the accompanying materials 7 * are licensed and made available under the terms and conditions of the BSD License 8 * which accompanies this distribution. The full text of the license may be found at 9 * http://opensource.org/licenses/bsd-license.php 10 * 11 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 * 14 **/ 15 16 #include <Uefi.h> 17 #include <PiPei.h> 18 #include <Library/BaseLib.h> 19 #include <Library/BaseMemoryLib.h> 20 #include <Library/DebugLib.h> 21 #include <Library/PcdLib.h> 22 #include <Library/HobLib.h> 23 #include <Library/PrintLib.h> 24 #include <Library/SerialPortLib.h> 25 26 #include <Guid/VersionInfoHobGuid.h> 27 28 struct MonthDescription { 29 CONST CHAR8* MonthStr; 30 UINT32 MonthInt; 31 } gMonthDescription[] = { 32 { "Jan", 1 }, 33 { "Feb", 2 }, 34 { "Mar", 3 }, 35 { "Apr", 4 }, 36 { "May", 5 }, 37 { "Jun", 6 }, 38 { "Jul", 7 }, 39 { "Aug", 8 }, 40 { "Sep", 9 }, 41 { "Oct", 10 }, 42 { "Nov", 11 }, 43 { "Dec", 12 }, 44 { "???", 1 }, // Use 1 as default month 45 }; 46 47 VOID GetReleaseTime (EFI_TIME *Time) 48 { 49 CONST CHAR8 *ReleaseDate = __DATE__; 50 CONST CHAR8 *ReleaseTime = __TIME__; 51 UINTN i; 52 53 for(i=0;i<12;i++) 54 { 55 if(0 == AsciiStrnCmp(ReleaseDate, gMonthDescription[i].MonthStr, 3)) 56 { 57 break; 58 } 59 } 60 Time->Month = gMonthDescription[i].MonthInt; 61 Time->Day = AsciiStrDecimalToUintn(ReleaseDate+4); 62 Time->Year = AsciiStrDecimalToUintn(ReleaseDate+7); 63 Time->Hour = AsciiStrDecimalToUintn(ReleaseTime); 64 Time->Minute = AsciiStrDecimalToUintn(ReleaseTime+3); 65 Time->Second = AsciiStrDecimalToUintn(ReleaseTime+6); 66 67 return; 68 } 69 70 EFI_STATUS 71 EFIAPI 72 VersionInfoEntry ( 73 IN EFI_PEI_FILE_HANDLE FileHandle, 74 IN CONST EFI_PEI_SERVICES **PeiServices 75 ) 76 { 77 CHAR8 Buffer[100]; 78 UINTN CharCount; 79 VERSION_INFO *VersionInfo; 80 EFI_TIME Time = {0}; 81 CONST CHAR16 *ReleaseString = 82 (CHAR16 *) FixedPcdGetPtr (PcdFirmwareVersionString); 83 84 GetReleaseTime (&Time); 85 86 CharCount = AsciiSPrint ( 87 Buffer, 88 sizeof (Buffer), 89 "\n\rBoot firmware (version %s built at %t)\n\r\n\r", 90 ReleaseString, 91 &Time 92 ); 93 SerialPortWrite ((UINT8 *) Buffer, CharCount); 94 95 VersionInfo = BuildGuidHob (&gVersionInfoHobGuid, 96 sizeof (VERSION_INFO) - 97 sizeof (VersionInfo->String) + 98 StrSize (ReleaseString)); 99 if (VersionInfo == NULL) { 100 DEBUG ((EFI_D_ERROR, "[%a]:[%d] Build HOB failed!\n", __FILE__, __LINE__)); 101 return EFI_OUT_OF_RESOURCES; 102 } 103 104 CopyMem (&VersionInfo->BuildTime, &Time, sizeof (EFI_TIME)); 105 CopyMem (VersionInfo->String, ReleaseString, StrSize (ReleaseString)); 106 107 return EFI_SUCCESS; 108 } 109