From: "Zhang, Shenglei" <shenglei.zhang@intel.com>
To: devel@edk2.groups.io
Subject: [PATCH] BaseTools/GenBiosId: Add a new tool GenBiosId
Date: Tue, 28 May 2019 09:32:18 +0800 [thread overview]
Message-ID: <20190528013218.40580-1-shenglei.zhang@intel.com> (raw)
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 <shenglei.zhang@intel.com>
---
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.<BR>
+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.<BR>
+# Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
#
# 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.<BR>
+# 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.<BR>
+# 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.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _GEN_BIOS_ID_
+#define _GEN_BIOS_ID_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <Common/UefiBaseTypes.h>
+
+#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.<BR>
+# 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.<BR>
+# Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR>
# 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
next reply other threads:[~2019-05-28 1:32 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-28 1:32 Zhang, Shenglei [this message]
2019-05-28 16:48 ` [edk2-devel] [PATCH] BaseTools/GenBiosId: Add a new tool GenBiosId Michael D Kinney
2019-05-31 6:36 ` Zhang, Shenglei
-- strict thread matches above, loose matches on Subject: below --
2019-06-14 7:38 Zhang, Shenglei
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190528013218.40580-1-shenglei.zhang@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox