From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web09.8397.1655995501149663513 for ; Thu, 23 Jun 2022 07:45:01 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=dGJaW8jK; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: jason1.lin@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1655995501; x=1687531501; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=NXH8JuvziSnLCm6QEC0PYDkr09pvnkQaAnDLiWZlNb8=; b=dGJaW8jKcLWUTI57Ejf3R1ApCRgM4fddCAtNpktgdqMcBe8f+GofMB+k O8wQuhohHqwG6tDnqMmS6xYRy5QpUueZQhp1JU2iKRSZtZ6pwq7NUn1rk 6Dg1/SgoUnmFMXcU+tD6LDmWmEMe5RH38OwuP4iU5auPA0gFWrus7RzPJ xCm88KCJPgqazCfNhaW3kOdADCRzJjA6EyLPViJyu8FB89c0zjj5VnmHk wK9Njn3M39vuwSkI8ciquzP6aZay3+QLC/Nd888ve/UzrlV4x1hTIsH9s cqzGPFbFqikh5a7hdMK+EnIcs8HtiEQphINCEWV/doHBP58x2Ila/V9Lt g==; X-IronPort-AV: E=McAfee;i="6400,9594,10386"; a="278286880" X-IronPort-AV: E=Sophos;i="5.92,216,1650956400"; d="scan'208";a="278286880" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jun 2022 07:45:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,216,1650956400"; d="scan'208";a="538912525" Received: from linjaso1-desk1.gar.corp.intel.com ([10.5.215.41]) by orsmga003.jf.intel.com with ESMTP; 23 Jun 2022 07:44:58 -0700 From: "Lin, Jason1" To: devel@edk2.groups.io Cc: Jason1 Lin , Bob Feng , Liming Gao , Yuwei Chen , Isaac W Oram , Rangasai V Chaganty , Dakota Chiang Subject: [PATCH v2 1/2] [edk2-platforms] Silicon/Intel/FitGen: Support multiple Startup ACM Type 2 entries in FitGen tool Date: Thu, 23 Jun 2022 22:44:53 +0800 Message-Id: <20220623144453.3172-1-jason1.lin@intel.com> X-Mailer: git-send-email 2.26.2.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Jason1 Lin REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3958 Within current FitGen tool there had limitation only allow one S-ACM to generate the Type 2 entry. This code change is used to support multiple type 2 entries up to 0x20. Signed-off-by: Jason1 Lin Cc: Bob Feng Cc: Liming Gao Cc: Yuwei Chen Cc: Isaac W Oram Cc: Rangasai V Chaganty Cc: Dakota Chiang --- Silicon/Intel/Tools/FitGen/FitGen.c | 89 +++++++++++--------- Silicon/Intel/Tools/FitGen/FitGen.h | 4 +- 2 files changed, 50 insertions(+), 43 deletions(-) diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c b/Silicon/Intel/Tools/FitG= en/FitGen.c index 4de72ea422..eac8fa8715 100644 --- a/Silicon/Intel/Tools/FitGen/FitGen.c +++ b/Silicon/Intel/Tools/FitGen/FitGen.c @@ -2,7 +2,7 @@ This utility is part of build process for IA32/X64 FD.=0D It generates FIT table.=0D =0D -Copyright (c) 2010-2021, Intel Corporation. All rights reserved.
=0D +Copyright (c) 2010-2022, Intel Corporation. All rights reserved.
=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D **/=0D @@ -204,6 +204,7 @@ typedef struct { =0D #define MAX_BIOS_MODULE_ENTRY 0x20=0D #define MAX_MICROCODE_ENTRY 0x20=0D +#define MAX_STARTUP_ACM_ENTRY 0x20=0D #define MAX_OPTIONAL_ENTRY 0x20=0D #define MAX_PORT_ENTRY 0x20=0D =0D @@ -255,11 +256,12 @@ typedef struct { UINT32 FitEntryNumber;=0D UINT32 BiosModuleNumber;=0D UINT32 MicrocodeNumber;=0D + UINT32 StartupAcmNumber;=0D UINT32 OptionalModuleNumber;=0D UINT32 PortModuleNumber;=0D UINT32 GlobalVersion;=0D UINT32 FitHeaderVersion;=0D - FIT_TABLE_CONTEXT_ENTRY StartupAcm;=0D + FIT_TABLE_CONTEXT_ENTRY StartupAcm[MAX_STARTUP_ACM_ENTRY];=0D UINT32 StartupAcmVersion;=0D FIT_TABLE_CONTEXT_ENTRY DiagnstAcm;=0D UINT32 DiagnstAcmVersion;=0D @@ -1149,14 +1151,15 @@ Returns: Error (NULL, 0, 0, "-I Parameter incorrect, Header Type unsuppor= ted!", NULL);=0D return 0;=0D case FIT_TABLE_TYPE_STARTUP_ACM:=0D - if (gFitTableContext.StartupAcm.Type !=3D 0) {=0D - Error (NULL, 0, 0, "-I Parameter incorrect, Duplicated Startup= Acm!", NULL);=0D + if (gFitTableContext.StartupAcmNumber >=3D MAX_STARTUP_ACM_ENTRY= ) {=0D + Error (NULL, 0, 0, "-I Parameter incorrect, too many StartupAc= m!", NULL);=0D return 0;=0D }=0D - gFitTableContext.StartupAcm.Type =3D FIT_TABLE_TYPE_STARTUP_A= CM;=0D - gFitTableContext.StartupAcm.Address =3D (UINT32)BiosInfoStruct[B= iosInfoIndex].Address;=0D - gFitTableContext.StartupAcm.Size =3D (UINT32)BiosInfoStruct[B= iosInfoIndex].Size;=0D - gFitTableContext.StartupAcmVersion =3D BiosInfoStruct[BiosInfoI= ndex].Version;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].T= ype =3D FIT_TABLE_TYPE_STARTUP_ACM;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].A= ddress =3D (UINT32)BiosInfoStruct[BiosInfoIndex].Address;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].S= ize =3D (UINT32)BiosInfoStruct[BiosInfoIndex].Size;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].V= ersion =3D BiosInfoStruct[BiosInfoIndex].Version;=0D + gFitTableContext.StartupAcmNumber ++;=0D gFitTableContext.FitEntryNumber ++;=0D break;=0D case FIT_TABLE_TYPE_DIAGNST_ACM:=0D @@ -1351,16 +1354,15 @@ Returns: //=0D // 1. StartupAcm=0D //=0D - do {=0D + while (TRUE) {=0D if ((Index + 1 >=3D argc) ||=0D ((strcmp (argv[Index], "-S") !=3D 0) &&=0D (strcmp (argv[Index], "-s") !=3D 0)) ) {=0D - if (BiosInfoExist && (gFitTableContext.StartupAcm.Type =3D=3D FIT_TA= BLE_TYPE_STARTUP_ACM)) {=0D - break;=0D + if (gFitTableContext.StartupAcmNumber =3D=3D 0) {=0D + printf ("-S not found. WARNING!\n");=0D }=0D // Error (NULL, 0, 0, "-S Parameter incorrect, expect -S!", NULL);=0D // return 0;=0D - printf ("-S not found. WARNING!\n");=0D break;=0D }=0D if (IsGuidData (argv[Index + 1], &Guid)) {=0D @@ -1381,14 +1383,13 @@ Returns: FileSize =3D xtoi (argv[Index + 2]);=0D Index +=3D 3;=0D }=0D - if (gFitTableContext.StartupAcm.Type !=3D 0) {=0D - Error (NULL, 0, 0, "-S Parameter incorrect, Duplicated StartupAcm!",= NULL);=0D + if (gFitTableContext.StartupAcmNumber >=3D MAX_STARTUP_ACM_ENTRY) {=0D + Error (NULL, 0, 0, "-S Parameter incorrect, too many StartupAcm!", N= ULL);=0D return 0;=0D }=0D - gFitTableContext.StartupAcm.Type =3D FIT_TABLE_TYPE_STARTUP_ACM;=0D - gFitTableContext.StartupAcm.Address =3D (UINT32) (UINTN) FileBuffer;=0D - gFitTableContext.StartupAcm.Size =3D FileSize;=0D - gFitTableContext.FitEntryNumber ++;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Type = =3D FIT_TABLE_TYPE_STARTUP_ACM;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Address= =3D (UINT32) (UINTN) FileBuffer;=0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Size = =3D FileSize;=0D =0D //=0D // 1.1 StartupAcm version=0D @@ -1407,7 +1408,10 @@ Returns: gFitTableContext.StartupAcmVersion =3D xtoi (argv[Index + 1]);=0D Index +=3D 2;=0D }=0D - } while (FALSE);=0D +=0D + gFitTableContext.StartupAcmNumber ++;=0D + gFitTableContext.FitEntryNumber ++;=0D + }=0D =0D //=0D // 1.5. DiagnosticsAcm=0D @@ -1890,7 +1894,9 @@ Returns: //=0D // Final: Check StartupAcm in BiosModule.=0D //=0D - CheckOverlap (gFitTableContext.StartupAcm.Address, gFitTableContext.Star= tupAcm.Size);=0D + for (Index =3D 0; Index < (INTN)gFitTableContext.StartupAcmNumber; Index= ++) {=0D + CheckOverlap (gFitTableContext.StartupAcm[Index].Address, gFitTableCon= text.StartupAcm[Index].Size);=0D + }=0D FitEntryNumber =3D gFitTableContext.FitEntryNumber;=0D for (Index =3D 0; Index < (INTN)gFitTableContext.OptionalModuleNumber; I= ndex++) {=0D if ((gFitTableContext.OptionalModule[Index].Type =3D=3D FIT_TABLE_TYPE= _BIOS_POLICY) ||=0D @@ -2178,8 +2184,8 @@ Returns: }=0D printf ("Total FIT Entry number: 0x%x\n", gFitTableContext.FitEntryNumbe= r);=0D printf ("FitHeader version: 0x%04x\n", gFitTableContext.FitHeaderVersion= );=0D - if (gFitTableContext.StartupAcm.Address !=3D 0) {=0D - printf ("StartupAcm - (0x%08x, 0x%08x, 0x%04x)\n", gFitTableContext.St= artupAcm.Address, gFitTableContext.StartupAcm.Size, gFitTableContext.Startu= pAcmVersion);=0D + for (Index =3D 0; Index < gFitTableContext.StartupAcmNumber; Index++) {= =0D + printf ("StartupAcm[%d] - (0x%08x, 0x%08x, 0x%04x)\n", Index, gFitTabl= eContext.StartupAcm[Index].Address, gFitTableContext.StartupAcm[Index].Size= , gFitTableContext.StartupAcmVersion);=0D }=0D if (gFitTableContext.DiagnstAcm.Address !=3D 0) {=0D printf ("DiagnosticAcm - (0x%08x, 0x%08x, 0x%04x)\n", gFitTableContext= .DiagnstAcm.Address, gFitTableContext.DiagnstAcm.Size, gFitTableContext.Dia= gnstAcmVersion);=0D @@ -2809,8 +2815,8 @@ Returns: //=0D // 4. StartupAcm=0D //=0D - if (gFitTableContext.StartupAcm.Address !=3D 0) {=0D - FitEntry[FitIndex].Address =3D gFitTableContext.StartupAcm= .Address;=0D + for (Index =3D 0; Index < gFitTableContext.StartupAcmNumber; Index++) {= =0D + FitEntry[FitIndex].Address =3D gFitTableContext.StartupAcm= [Index].Address;=0D *(UINT32 *)&FitEntry[FitIndex].Size[0] =3D 0; //gFitTableContext.Start= upAcm.Size / 16;=0D FitEntry[FitIndex].Version =3D (UINT16)gFitTableContext.St= artupAcmVersion;=0D FitEntry[FitIndex].Type =3D FIT_TABLE_TYPE_STARTUP_ACM;= =0D @@ -3110,7 +3116,7 @@ GetFitEntryInfo ( =0D Routine Description:=0D =0D - Fill the FIT table information to Fvrecovery=0D + Get the FIT table information from Fvrecovery=0D =0D Arguments:=0D =0D @@ -3164,8 +3170,8 @@ Returns: gFitTableContext.MicrocodeNumber ++;=0D break;=0D case FIT_TABLE_TYPE_STARTUP_ACM:=0D - gFitTableContext.StartupAcm.Address =3D (UINT32)FitEntry[FitIndex].A= ddress;=0D - gFitTableContext.StartupAcmVersion =3D FitEntry[FitIndex].Version;= =0D + gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Addre= ss =3D (UINT32)FitEntry[FitIndex].Address;=0D + gFitTableContext.StartupAcmVersion = =3D FitEntry[FitIndex].Version;=0D break;=0D case FIT_TABLE_TYPE_BIOS_MODULE:=0D gFitTableContext.BiosModule[gFitTableContext.BiosModuleNumber].Addre= ss =3D (UINT32)FitEntry[FitIndex].Address;=0D @@ -3232,6 +3238,7 @@ Returns: UINT32 FdFileSize;=0D =0D UINT8 *AcmBuffer;=0D + INTN Index;=0D UINT32 FixedFitLocation;=0D =0D FileBufferRaw =3D NULL;=0D @@ -3323,22 +3330,23 @@ Returns: //=0D // Get ACM buffer=0D //=0D - if (gFitTableContext.StartupAcm.Address !=3D 0) {=0D - AcmBuffer =3D FLASH_TO_MEMORY(gFitTableContext.StartupAcm.Address, F= dFileBuffer, FdFileSize);=0D - if ((AcmBuffer < FdFileBuffer) || (AcmBuffer + gFitTableContext.Star= tupAcm.Size > FdFileBuffer + FdFileSize)) {=0D - printf ("ACM out of range - can not validate it\n");=0D - AcmBuffer =3D NULL;=0D - }=0D + for (Index =3D 0; Index < (INTN)gFitTableContext.StartupAcmNumber; Ind= ex ++) {=0D + if (gFitTableContext.StartupAcm[Index].Address !=3D 0) {=0D + AcmBuffer =3D FLASH_TO_MEMORY(gFitTableContext.StartupAcm[Index].A= ddress, FdFileBuffer, FdFileSize);=0D + if ((AcmBuffer < FdFileBuffer) || (AcmBuffer + gFitTableContext.St= artupAcm[Index].Size > FdFileBuffer + FdFileSize)) {=0D + printf ("ACM out of range - can not validate it\n");=0D + AcmBuffer =3D NULL;=0D + }=0D =0D - if (AcmBuffer !=3D NULL) {=0D - if (CheckAcm ((ACM_FORMAT *)AcmBuffer, gFitTableContext.StartupAcm= .Size)) {=0D - DumpAcm ((ACM_FORMAT *)AcmBuffer);=0D - } else {=0D - Status =3D STATUS_ERROR;=0D - goto exitFunc;=0D + if (AcmBuffer !=3D NULL) {=0D + if (CheckAcm ((ACM_FORMAT *)AcmBuffer, gFitTableContext.StartupA= cm[Index].Size)) {=0D + DumpAcm ((ACM_FORMAT *)AcmBuffer);=0D + } else {=0D + Status =3D STATUS_ERROR;=0D + goto exitFunc;=0D + }=0D }=0D }=0D -=0D }=0D =0D //=0D @@ -3576,4 +3584,3 @@ Returns: =0D return u;=0D }=0D -=0D diff --git a/Silicon/Intel/Tools/FitGen/FitGen.h b/Silicon/Intel/Tools/FitG= en/FitGen.h index 5add6a8870..b7de0a6b2d 100644 --- a/Silicon/Intel/Tools/FitGen/FitGen.h +++ b/Silicon/Intel/Tools/FitGen/FitGen.h @@ -1,7 +1,7 @@ /**@file=0D Definitions for the FitGen utility.=0D =0D -Copyright (c) 2010-2020, Intel Corporation. All rights reserved.
=0D +Copyright (c) 2010-2022, Intel Corporation. All rights reserved.
=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D **/=0D @@ -31,7 +31,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent // Utility version information=0D //=0D #define UTILITY_MAJOR_VERSION 0=0D -#define UTILITY_MINOR_VERSION 64=0D +#define UTILITY_MINOR_VERSION 65=0D #define UTILITY_DATE __DATE__=0D =0D //=0D --=20 2.26.2.windows.1