From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: shenglei.zhang@intel.com) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by groups.io with SMTP; Mon, 27 May 2019 18:32:23 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 May 2019 18:32:22 -0700 X-ExtLoop1: 1 Received: from shenglei-dev.ccr.corp.intel.com ([10.239.158.52]) by fmsmga005.fm.intel.com with ESMTP; 27 May 2019 18:32:21 -0700 From: "Zhang, Shenglei" To: devel@edk2.groups.io Subject: [PATCH] BaseTools/GenBiosId: Add a new tool GenBiosId Date: Tue, 28 May 2019 09:32:18 +0800 Message-Id: <20190528013218.40580-1-shenglei.zhang@intel.com> X-Mailer: git-send-email 2.18.0.windows.1 GenBiosId is a tool to generate the BIOS ID binary file which uses the data from the configuration file. https://bugzilla.tianocore.org/show_bug.cgi?id=1846 Signed-off-by: Shenglei Zhang --- BaseTools/Source/C/GenBiosId/GenBiosId.c | 627 +++++++++++++++++++++++ BaseTools/Source/C/GNUmakefile | 3 +- BaseTools/Source/C/GenBiosId/BiosId.env | 27 + BaseTools/Source/C/GenBiosId/GNUmakefile | 14 + BaseTools/Source/C/GenBiosId/GenBiosId.h | 105 ++++ BaseTools/Source/C/GenBiosId/Makefile | 14 + BaseTools/Source/C/Makefile | 3 +- 7 files changed, 791 insertions(+), 2 deletions(-) create mode 100644 BaseTools/Source/C/GenBiosId/GenBiosId.c create mode 100644 BaseTools/Source/C/GenBiosId/BiosId.env create mode 100644 BaseTools/Source/C/GenBiosId/GNUmakefile create mode 100644 BaseTools/Source/C/GenBiosId/GenBiosId.h create mode 100644 BaseTools/Source/C/GenBiosId/Makefile diff --git a/BaseTools/Source/C/GenBiosId/GenBiosId.c b/BaseTools/Source/C/GenBiosId/GenBiosId.c new file mode 100644 index 000000000000..21d71d4ebd51 --- /dev/null +++ b/BaseTools/Source/C/GenBiosId/GenBiosId.c @@ -0,0 +1,627 @@ +/** @file +This tool generates the BIOS ID binary file using the data from the configuration file. + +Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "GenBiosId.h" + +CHAR8 InputFileName[FILE_NAME_SIZE]; +CHAR8 OutputFileName[FILE_NAME_SIZE]; +CHAR8 OutputBatchFileName[FILE_NAME_SIZE]; + +FILE *InputFile; +FILE *OutputFile; +FILE *OutputBatchFile; + +BIOS_ID_IMAGE BiosIdImage = { + { '$', 'I', 'B', 'I', 'O', 'S', 'I', '$' }, + { + { ATOU (' '), ATOU (' '), ATOU (' '), ATOU (' '), ATOU (' '), ATOU (' '), ATOU (' ') }, + ATOU (' '), + ATOU ('.'), + { ATOU (' '), ATOU (' '), ATOU (' ') }, + ATOU ('.'), + { ATOU ('0'), ATOU ('0'), ATOU ('0'), ATOU ('0') }, + ATOU ('.'), + ATOU (' '), + { ATOU ('0'), ATOU ('0') }, + ATOU ('.'), + { ATOU ('0'), ATOU ('0'), ATOU ('0'), ATOU ('0'), ATOU ('0'), + ATOU ('0'), ATOU ('0'), ATOU ('0'), ATOU ('0'), ATOU ('0') }, + ATOU ('\0') + } +}; + +VOID +PrintBanner ( + VOID + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + printf ("\n"); + printf ("GenBiosId utility, version: v1.0 05/27/2018 \n"); + printf ("Copyright (c) 2019, Intel Corporation. All rights reserved. \n"); + printf ("\n"); +} + +VOID +PrintUsage ( + VOID + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + +--*/ +{ + printf ("Usage:\n"); + printf ("GenBiosId -i ConfigFile -o OutputFile [-ob OutputBatchFile] \n"); + printf ("\n"); +} + +CHAR8 * +StripLeadingWhiteSpace ( + IN CHAR8 *StrInput + ) +/*++ + +Routine Description: + + Strip the leading whitespoace off the given ASCII string. + +Arguments: + + StrInput - the ASCII string that should be processed. + +Returns: + + A pointer to the first non-whitespace character in the given string, + or NULL if the string was all whitespace. + +--*/ +{ + if (StrInput == NULL) { + return NULL; + } + + while (*StrInput != 0) { + if ((*StrInput == ' ') || (*StrInput == '\t') || (*StrInput == '\n')) { + ++StrInput; + } else { + return StrInput; + } + } + + return NULL; +} + +VOID +ConvertToUnicode ( + IN CHAR8 *StrAscii, + OUT CHAR16 *StrUnicode + ) +/*++ + +Routine Description: + + Convert the given ASCII string to Unicode without appending terminating 0x0000. + +Arguments: + + StrAscii - the source ASCII string, null-terminated. + + StrUnicode - the resulted Unicode string will be put here, without the terminating 0x0000. + +Returns: + +--*/ +{ + if ((StrAscii == NULL) || (StrUnicode == NULL)) { + return; + } + + while (*StrAscii != 0) { + *StrUnicode = ATOU (*StrAscii); + ++StrAscii; + ++StrUnicode; + } +} + +VOID +FillTimeStamp ( + OUT CHAR16 *StrTimeStampUnicode + ) +/*++ + +Routine Description: + The function generates the current timestamp in "YYMMDDHHMM" format + and puts it into the Unicode string supplied, without the null-terminator. + +Arguments: + + StrTimeStampUnicode - The Unicode string which is filled on return with the current timestamp. + +Returns: + +--*/ +{ + struct tm *Time; + time_t CurTime; + CHAR8 StrTime[11]; + + // + // Fetch the current time based on UTC timezone + // + time (&CurTime); + Time = gmtime (&CurTime); + + if (NULL == Time) { + return; + } + + sprintf ( + StrTime, + "%02d%02d%02d%02d%02d", + (Time->tm_year + 1900) % 100, // Year is 1900-based, need only 2 digits. + Time->tm_mon + 1, // Month is zero based. + Time->tm_mday, + Time->tm_hour, + Time->tm_min + ); + + ConvertToUnicode (StrTime, StrTimeStampUnicode); +} + +VOID +ConvertToAscii ( + IN CHAR16 *StrUnicode, + OUT CHAR8 *StrAscii + ) +/*++ + +Routine Description: + + Convert the given Unicode string to ASCII with appending terminating 0x00. + +Arguments: + + StrUnicode - the source Unicode string, null-terminated. + + StrAscii - the resulted ASCII string will be put here, with the terminating 0x00. + +Returns: + +--*/ +{ + if ((StrUnicode == NULL) || (StrAscii == NULL)) { + return; + } + + while (*StrUnicode != 0) { + *StrAscii = UTOA (*StrUnicode); + ++StrUnicode; + ++StrAscii; + } + *StrAscii = 0; +} + +VOID +PrintUnicodeString ( + IN CHAR16 *StrUnicode + ) +/*++ + +Routine Description: + + Print the given Unicode string. + +Arguments: + + StrUnicode - the null-terminated Unicode string to print. + +Returns: + +--*/ +{ + if (StrUnicode == NULL) { + return; + } + + while (*StrUnicode != 0) { + putchar ((CHAR8)(*StrUnicode)); + ++StrUnicode; + } +} + +EFI_STATUS +ParseInputFile ( + VOID + ) +/*++ + +Routine Description: + + Parse the BIOS ID definition file and fill the BIOS ID structure, including timestamp. + +Arguments: + +Returns: + + EFI_SUCCESS - The input file was parsed successfully. + + EFI_INVALID_PARAMETER - The input file has incorrect format. + +--*/ +{ + CHAR8 StrLine[MAX_LINE_SIZE]; + CHAR8 StrFieldName[MAX_LINE_SIZE]; + CHAR8 StrFieldValue[MAX_LINE_SIZE]; + CHAR8 *Str; + UINT16 FieldsSet; + CHAR8 FormatString[MAX_FORMAT_STRING_SIZE]; + + FieldsSet = 0; + Str = NULL; + + // + // Generate the format string for sscanf() function. + // + sprintf (FormatString, "%%%us = %%%us", (unsigned int) sizeof (StrFieldName) - 1, (unsigned int) sizeof (StrFieldValue) - 1); + + while (fgets (StrLine, sizeof (StrLine) - 1, InputFile) != NULL) { + Str = StripLeadingWhiteSpace (StrLine); + + // + // Check for whitespace string. + // + if (Str == NULL) { + continue; + } + + // + // Check for comment string. + // + if (*Str == '#') { + continue; + } + + if (sscanf (Str, FormatString, StrFieldName, StrFieldValue) != 2) { + continue; + } + + if (strcmp (StrFieldName, NAME_BOARD_ID) == 0) { + if (strlen (StrFieldValue) == CHARS_BOARD_ID) { + ConvertToUnicode (StrFieldValue, BiosIdImage.BiosIdString.BoardId); + FieldsSet |= FIELD_BOARD_ID; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_BOARD_ID, CHARS_BOARD_ID); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_BOARD_REV) == 0) { + if (strlen (StrFieldValue) == CHARS_BOARD_REV) { + ConvertToUnicode (StrFieldValue, &(BiosIdImage.BiosIdString.BoardRev)); + FieldsSet |= FIELD_BOARD_REV; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_BOARD_REV, CHARS_BOARD_REV); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_BOARD_EXT) == 0) { + if (strlen (StrFieldValue) == CHARS_BOARD_EXT) { + ConvertToUnicode (StrFieldValue, BiosIdImage.BiosIdString.BoardExt); + FieldsSet |= FIELD_BOARD_EXT; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_BOARD_EXT, CHARS_BOARD_EXT); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_BUILD_TYPE) == 0) { + if (strlen (StrFieldValue) == CHARS_BUILD_TYPE) { + if ((strcmp (StrFieldValue, "D") == 0) || + (strcmp (StrFieldValue, "A") == 0) || + (strcmp (StrFieldValue, "B") == 0) || + (strcmp (StrFieldValue, "P") == 0)) { + ConvertToUnicode (StrFieldValue, &(BiosIdImage.BiosIdString.BuildType)); + FieldsSet |= FIELD_BUILD_TYPE; + } else { + printf ("Error: value of %s should be one of %s, %s, %s or %s\n", NAME_BUILD_TYPE, "D", "A", "B", "P"); + return EFI_INVALID_PARAMETER; + } + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_BUILD_TYPE, CHARS_BUILD_TYPE); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_VERSION_MAJOR) == 0) { + if (strlen (StrFieldValue) == CHARS_VERSION_MAJOR) { + ConvertToUnicode (StrFieldValue, BiosIdImage.BiosIdString.VersionMajor); + FieldsSet |= FIELD_VERSION_MAJOR; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_VERSION_MAJOR, CHARS_VERSION_MAJOR); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_VERSION_MINOR) == 0) { + if (strlen (StrFieldValue) == CHARS_VERSION_MINOR) { + ConvertToUnicode (StrFieldValue, BiosIdImage.BiosIdString.VersionMinor); + FieldsSet |= FIELD_VERSION_MINOR; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_VERSION_MINOR, CHARS_VERSION_MINOR); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_DATE) == 0) { + if (strlen (StrFieldValue) == CHARS_DATE) { + ConvertToUnicode (StrFieldValue, BiosIdImage.BiosIdString.TimeStamp); + FieldsSet |= FIELD_DATE; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_DATE, CHARS_DATE); + return EFI_INVALID_PARAMETER; + } + } + + if (strcmp (StrFieldName, NAME_TIME) == 0) { + if (strlen (StrFieldValue) == CHARS_TIME) { + ConvertToUnicode (StrFieldValue, &(BiosIdImage.BiosIdString.TimeStamp[CHARS_DATE])); + FieldsSet |= FIELD_TIME; + } else { + printf ("Error: value of %s should have exactly %d chars\n", NAME_TIME, CHARS_TIME); + return EFI_INVALID_PARAMETER; + } + } + + } + + if ((FieldsSet & (FIELD_DATE | FIELD_TIME)) != (FIELD_DATE | FIELD_TIME)) { + // + // Fill the timestamp. + // + FillTimeStamp (BiosIdImage.BiosIdString.TimeStamp); + FieldsSet |= (FIELD_DATE | FIELD_TIME); + } + + // + // Exit if not all fields were supplied. + // + if ((FieldsSet & FIELD_ALL) != FIELD_ALL) { + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +WriteOutputFile ( + VOID + ) +/*++ + +Routine Description: + + Write the BIOS ID structure to the output file. + +Arguments: + +Returns: + + EFI_SUCCESS - The output file was created successfully. + + EFI_DEVICE_ERROR - There was a file write error. + +--*/ +{ + if (fwrite (&BiosIdImage, sizeof (BIOS_ID_IMAGE), 1, OutputFile) != 1) { + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +EFI_STATUS +WriteOutputBatchFile ( + VOID + ) +/*++ + +Routine Description: + + Write "SET BIOS_ID=" and BIOS ID string to the batch file. + +Arguments: + +Returns: + + EFI_SUCCESS - The output batch file was created successfully. + + EFI_DEVICE_ERROR - There was a file write error. + +--*/ +{ +#ifndef __GNUC__ + CHAR8 BatchFileContent[MAX_LINE_SIZE] = "SET BIOS_ID="; +#else + CHAR8 BatchFileContent[MAX_LINE_SIZE] = "export BIOS_ID="; +#endif + + CHAR8 BiosIdString[sizeof (BIOS_ID_STRING)]; + + ConvertToAscii ((CHAR16 *) (&(BiosIdImage.BiosIdString)), BiosIdString); + strcat (BatchFileContent, BiosIdString); + + if (fwrite (BatchFileContent, strlen (BatchFileContent), 1, OutputBatchFile) != 1) { + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +int +main ( + IN int argc, + IN CHAR8 *argv[] + ) +/*++ + +Routine Description: + +Arguments: + + argc - Number of command-line arguments. + + argv - Array of command-line arguments. + +Returns: + + 0 - The operation completed successfully. + + -1 - An error occurred. + +--*/ +{ + int Status; + + Status = 0; + + PrintBanner (); + + if ((argc != 5) && (argc != 7)) { + PrintUsage (); + Status = -1; + goto Done; + } + + if (strcmp (argv[1], "-i") == 0) { + if (strlen (argv[2])> sizeof (InputFileName) - 1) { + printf ("The InputFileName %s is too long \n", argv[2]); + Status = -1; + goto Done; + } + strncpy (InputFileName, argv[2], sizeof (InputFileName) - 1); + InputFileName[sizeof (InputFileName) - 1] = 0; + } else { + PrintUsage (); + Status = -1; + goto Done; + } + + if (strcmp (argv[3], "-o") == 0) { + if (strlen (argv[4])> sizeof (OutputFileName) - 1) { + printf ("OutputFileName %s is too long \n", argv[4]); + Status = -1; + goto Done; + } + strncpy (OutputFileName, argv[4], sizeof (OutputFileName) - 1); + OutputFileName[sizeof (OutputFileName) - 1] = 0; + } else { + PrintUsage (); + Status = -1; + goto Done; + } + + if (argc == 7) { + if (strcmp (argv[5], "-ob") == 0) { + if (strlen (argv[6])> sizeof (OutputBatchFileName) - 1) { + printf ("The OutputBatchFileName %s is too long \n", argv[6]); + Status = -1; + goto Done; + } + strncpy (OutputBatchFileName, argv[6], sizeof (OutputBatchFileName) - 1); + OutputBatchFileName[sizeof (OutputBatchFileName) - 1] = 0; + } else { + PrintUsage (); + Status = -1; + goto Done; + } + } + + InputFile = NULL; + OutputFile = NULL; + OutputBatchFile = NULL; + + InputFile = fopen (InputFileName, "r"); + if (InputFile == NULL) { + printf ("Error opening input file: %s\n", InputFileName); + Status = -1; + goto Done; + } + + OutputFile = fopen (OutputFileName, "wb"); + if (OutputFile == NULL) { + printf ("Error creating output file: %s\n", OutputFileName); + Status = -1; + goto Done; + } + + if (argc == 7) { + OutputBatchFile = fopen (OutputBatchFileName, "wb"); + if (OutputBatchFile == NULL) { + printf ("Error creating output batch file: %s\n", OutputBatchFileName); + Status = -1; + goto Done; + } + } + + if (ParseInputFile () != EFI_SUCCESS) { + printf ("Invalid config file format: %s\n", InputFileName); + Status = -1; + goto Done; + } + + if (WriteOutputFile () != EFI_SUCCESS) { + printf ("Can't write output file: %s\n", OutputFileName); + Status = -1; + goto Done; + } + + if (argc == 7) { + if (WriteOutputBatchFile () != EFI_SUCCESS) { + printf ("Can't write output batch file: %s\n", OutputBatchFileName); + Status = -1; + goto Done; + } + } + + printf ("BIOS ID created: "); + PrintUnicodeString ((CHAR16 *)(&(BiosIdImage.BiosIdString))); + printf ("\n"); + printf ("BIOS ID binary file created: %s\n", OutputFileName); + +Done: + + if (InputFile != NULL) { + fclose (InputFile); + } + + if (OutputFile != NULL) { + fclose (OutputFile); + } + + if (OutputBatchFile != NULL) { + fclose (OutputBatchFile); + } + + return Status; +} + diff --git a/BaseTools/Source/C/GNUmakefile b/BaseTools/Source/C/GNUmakefile index 37bcce519c7e..9dbf1a4b06db 100644 --- a/BaseTools/Source/C/GNUmakefile +++ b/BaseTools/Source/C/GNUmakefile @@ -1,7 +1,7 @@ ## @file # GNU/Linux makefile for C tools build. # -# Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -47,6 +47,7 @@ VFRAUTOGEN = VfrCompile/VfrLexer.h APPLICATIONS = \ BrotliCompress \ VfrCompile \ + GenBiosId \ EfiRom \ GenFfs \ GenFv \ diff --git a/BaseTools/Source/C/GenBiosId/BiosId.env b/BaseTools/Source/C/GenBiosId/BiosId.env new file mode 100644 index 000000000000..de54273107bd --- /dev/null +++ b/BaseTools/Source/C/GenBiosId/BiosId.env @@ -0,0 +1,27 @@ +## @file +# This file is used to define the BIOS ID parameters of the build. +# This file is processed by GenBiosId. +# Here, it is just a template and can be customized by user. +# +# BIOS ID string format: +# $(BOARD_ID)$(BOARD_REV).$(BOARD_EXT).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM +# All fields must have a fixed length. YYMMDDHHMM is UTC time. +# Example: "OVMF.000.0008.D03.1501301017" +# +# If DATE is specified for YYMMDD and TIME is specified for HHMM like below, +# GenBiosId will use the value of DATE and TIME to fill YYMMDDHHMM, +# otherwise GenBiosId will fill YYMMDDHHMM with current UTC time of the build machine. +# DATE = 150130 +# TIME = 1017 +# +# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +BOARD_ID = OVMF +BOARD_REV = 1 +BOARD_EXT = 000 +BUILD_TYPE = D +VERSION_MAJOR = 0008 +VERSION_MINOR = 03 diff --git a/BaseTools/Source/C/GenBiosId/GNUmakefile b/BaseTools/Source/C/GenBiosId/GNUmakefile new file mode 100644 index 000000000000..90a918c13f96 --- /dev/null +++ b/BaseTools/Source/C/GenBiosId/GNUmakefile @@ -0,0 +1,14 @@ +## @file +# makefile for building the GenBiosId utility. +# +# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## +MAKEROOT ?= .. + +APPNAME = GenBiosId + +OBJECTS = GenBiosId.o + +include $(MAKEROOT)/Makefiles/app.makefile diff --git a/BaseTools/Source/C/GenBiosId/GenBiosId.h b/BaseTools/Source/C/GenBiosId/GenBiosId.h new file mode 100644 index 000000000000..660fba77e90b --- /dev/null +++ b/BaseTools/Source/C/GenBiosId/GenBiosId.h @@ -0,0 +1,105 @@ +/** @file +Definitions for the GenBiosId tool. + +Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _GEN_BIOS_ID_ +#define _GEN_BIOS_ID_ + +#include +#include +#include +#include +#include + +#define FILE_NAME_SIZE 256 +#define MAX_LINE_SIZE 256 +#define MAX_FORMAT_STRING_SIZE 64 + +#define ATOU(a) (CHAR16) ((UINT8) (a)) +#define UTOA(a) (CHAR8) ((UINT16) (a)) + +// +// BIOS ID field names. +// +#define NAME_BOARD_ID "BOARD_ID" +#define NAME_BOARD_REV "BOARD_REV" +#define NAME_BOARD_EXT "BOARD_EXT" +#define NAME_BUILD_TYPE "BUILD_TYPE" +#define NAME_VERSION_MAJOR "VERSION_MAJOR" +#define NAME_VERSION_MINOR "VERSION_MINOR" +#define NAME_DATE "DATE" +#define NAME_TIME "TIME" + +// +// Number of ASCII characters in each field +// +#define CHARS_BOARD_ID 7 +#define CHARS_BOARD_REV 1 +#define CHARS_BOARD_EXT 3 +#define CHARS_BUILD_TYPE 1 +#define CHARS_VERSION_MAJOR 4 +#define CHARS_VERSION_MINOR 2 +#define CHARS_DATE 6 +#define CHARS_TIME 4 + +#define FIELD_BOARD_ID 0x0001 +#define FIELD_BOARD_REV 0x0002 +#define FIELD_BOARD_EXT 0x0004 +#define FIELD_BUILD_TYPE 0x0008 +#define FIELD_VERSION_MAJOR 0x0010 +#define FIELD_VERSION_MINOR 0x0020 +#define FIELD_DATE 0x0040 +#define FIELD_TIME 0x0080 + +#define FIELD_ALL ( \ + FIELD_BOARD_ID | \ + FIELD_BOARD_REV | \ + FIELD_BOARD_EXT | \ + FIELD_BUILD_TYPE | \ + FIELD_VERSION_MAJOR | \ + FIELD_VERSION_MINOR | \ + FIELD_DATE | \ + FIELD_TIME) + +// +// BIOS ID string format: +// +// $(BOARD_ID)$(BOARD_REV).$(BOARD_EXT).$(VERSION_MAJOR).$(BUILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM +// +// Example: "TRFTCRB1.000.0008.D03.1501301017" +// +// The format should be same as platform BIOS ID definition +// +#pragma pack(1) + +typedef struct { + CHAR16 BoardId[7]; // "TRFTCRB" + CHAR16 BoardRev; // "1" + CHAR16 Dot1; // "." + CHAR16 BoardExt[3]; // "000" + CHAR16 Dot2; // "." + CHAR16 VersionMajor[4]; // "0008" + CHAR16 Dot3; // "." + CHAR16 BuildType; // "D" + CHAR16 VersionMinor[2]; // "03" + CHAR16 Dot4; // "." + CHAR16 TimeStamp[10]; // "YYMMDDHHMM" + CHAR16 NullTerminator; // 0x0000 +} BIOS_ID_STRING; + +// +// A signature precedes the BIOS ID string in the FV to enable search by external tools. +// +typedef struct { + UINT8 Signature[8]; // "$IBIOSI$" + BIOS_ID_STRING BiosIdString; // "TRFTCRB1.000.0008.D03.1501301017" +} BIOS_ID_IMAGE; + +#pragma pack() + + +#endif // _GEN_BIOS_ID_ diff --git a/BaseTools/Source/C/GenBiosId/Makefile b/BaseTools/Source/C/GenBiosId/Makefile new file mode 100644 index 000000000000..967a1809b635 --- /dev/null +++ b/BaseTools/Source/C/GenBiosId/Makefile @@ -0,0 +1,14 @@ +## @file +# makefile for building the GenBiosId utility. +# +# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: BSD-2-Clause-Patent +# +!INCLUDE ..\Makefiles\ms.common + +APPNAME = GenBiosId + +OBJECTS = GenBiosId.obj + +!INCLUDE ..\Makefiles\ms.app + diff --git a/BaseTools/Source/C/Makefile b/BaseTools/Source/C/Makefile index 217fc2b91d7b..748565bba9ff 100644 --- a/BaseTools/Source/C/Makefile +++ b/BaseTools/Source/C/Makefile @@ -1,7 +1,7 @@ ## @file # Windows makefile for C tools build. # -# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent # HOST_ARCH = IA32 @@ -12,6 +12,7 @@ LIBRARIES = Common APPLICATIONS = \ VfrCompile \ BrotliCompress \ + GenBiosId \ EfiRom \ GenCrc32 \ GenFfs \ -- 2.18.0.windows.1