Reviewed-by: Yuwei Chen<yuwei.c...@intel.com> > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Lin, > Jason1 > Sent: Friday, July 1, 2022 11:10 PM > To: devel@edk2.groups.io > Cc: Lin, Jason1 <jason1....@intel.com>; Feng, Bob C <bob.c.f...@intel.com>; > Gao, Liming <gaolim...@byosoft.com.cn>; Chen, Christine > <yuwei.c...@intel.com>; Oram, Isaac W <isaac.w.o...@intel.com>; > Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Chiang, Dakota > <dakota.chi...@intel.com> > Subject: [edk2-devel] [PATCH v3 1/3] [edk2-platforms] Silicon/Intel/FitGen: > Support multiple Startup ACM Type 2 entries in FitGen tool > > From: Jason1 Lin <jason1....@intel.com> > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3958 > > 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 <jason1....@intel.com> > Cc: Bob Feng <bob.c.f...@intel.com> > Cc: Liming Gao <gaolim...@byosoft.com.cn> > Cc: Yuwei Chen <yuwei.c...@intel.com> > Cc: Isaac W Oram <isaac.w.o...@intel.com> > Cc: Rangasai V Chaganty <rangasai.v.chaga...@intel.com> > Cc: Dakota Chiang <dakota.chi...@intel.com> > --- > 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/FitGen/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. It generates FIT > table. - > Copyright (c) 2010-2021, Intel Corporation. All rights > reserved.<BR>+Copyright (c) 2010-2022, Intel Corporation. All rights > reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/@@ -204,6 > +204,7 @@ typedef struct { > #define MAX_BIOS_MODULE_ENTRY 0x20 #define > MAX_MICROCODE_ENTRY 0x20+#define MAX_STARTUP_ACM_ENTRY 0x20 > #define MAX_OPTIONAL_ENTRY 0x20 #define MAX_PORT_ENTRY 0x20 > @@ -255,11 +256,12 @@ typedef struct { > UINT32 FitEntryNumber; UINT32 > BiosModuleNumber; UINT32 MicrocodeNumber;+ UINT32 > StartupAcmNumber; UINT32 OptionalModuleNumber; UINT32 > PortModuleNumber; UINT32 GlobalVersion; UINT32 > FitHeaderVersion;- FIT_TABLE_CONTEXT_ENTRY StartupAcm;+ > FIT_TABLE_CONTEXT_ENTRY StartupAcm[MAX_STARTUP_ACM_ENTRY]; > UINT32 StartupAcmVersion; FIT_TABLE_CONTEXT_ENTRY > DiagnstAcm; UINT32 DiagnstAcmVersion;@@ -1149,14 > +1151,15 > @@ Returns: > Error (NULL, 0, 0, "-I Parameter incorrect, Header Type > unsupported!", > NULL); return 0; case FIT_TABLE_TYPE_STARTUP_ACM:- > if > (gFitTableContext.StartupAcm.Type != 0) {- Error (NULL, 0, 0, "-I > Parameter incorrect, Duplicated StartupAcm!", NULL);+ if > (gFitTableContext.StartupAcmNumber >= MAX_STARTUP_ACM_ENTRY) {+ > Error (NULL, 0, 0, "-I Parameter incorrect, too many StartupAcm!", NULL); > return 0; }- gFitTableContext.StartupAcm.Type = > FIT_TABLE_TYPE_STARTUP_ACM;- > gFitTableContext.StartupAcm.Address = > (UINT32)BiosInfoStruct[BiosInfoIndex].Address;- > gFitTableContext.StartupAcm.Size = > (UINT32)BiosInfoStruct[BiosInfoIndex].Size;- > gFitTableContext.StartupAcmVersion = > BiosInfoStruct[BiosInfoIndex].Version;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Type = > FIT_TABLE_TYPE_STARTUP_ACM;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Address > = (UINT32)BiosInfoStruct[BiosInfoIndex].Address;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Size = > (UINT32)BiosInfoStruct[BiosInfoIndex].Size;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Version > = BiosInfoStruct[BiosInfoIndex].Version;+ > gFitTableContext.StartupAcmNumber ++; > gFitTableContext.FitEntryNumber ++; break; case > FIT_TABLE_TYPE_DIAGNST_ACM:@@ -1351,16 +1354,15 @@ Returns: > // // 1. StartupAcm //- do {+ while (TRUE) { if ((Index + 1 >= > argc) || > ((strcmp (argv[Index], "-S") != 0) && (strcmp (argv[Index], "-s") != > 0)) ) {- > if (BiosInfoExist && (gFitTableContext.StartupAcm.Type == > FIT_TABLE_TYPE_STARTUP_ACM)) {- break;+ if > (gFitTableContext.StartupAcmNumber == 0) {+ printf ("-S not found. > WARNING!\n"); } // Error (NULL, 0, 0, "-S Parameter incorrect, > expect - > S!", NULL); // return 0;- printf ("-S not found. WARNING!\n"); > break; } if (IsGuidData (argv[Index + 1], &Guid)) {@@ -1381,14 > +1383,13 > @@ Returns: > FileSize = xtoi (argv[Index + 2]); Index += 3; }- if > (gFitTableContext.StartupAcm.Type != 0) {- Error (NULL, 0, 0, "-S > Parameter > incorrect, Duplicated StartupAcm!", NULL);+ if > (gFitTableContext.StartupAcmNumber >= MAX_STARTUP_ACM_ENTRY) {+ > Error (NULL, 0, 0, "-S Parameter incorrect, too many StartupAcm!", NULL); > return 0; }- gFitTableContext.StartupAcm.Type = > FIT_TABLE_TYPE_STARTUP_ACM;- gFitTableContext.StartupAcm.Address = > (UINT32) (UINTN) FileBuffer;- gFitTableContext.StartupAcm.Size = FileSize;- > gFitTableContext.FitEntryNumber ++;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Type = > FIT_TABLE_TYPE_STARTUP_ACM;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Address > = (UINT32) (UINTN) FileBuffer;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Size = > FileSize; // // 1.1 StartupAcm version@@ -1407,7 +1408,10 @@ Returns: > gFitTableContext.StartupAcmVersion = xtoi (argv[Index + 1]); > Index += > 2; }- } while (FALSE);++ gFitTableContext.StartupAcmNumber ++;+ > gFitTableContext.FitEntryNumber ++;+ } // // 1.5. DiagnosticsAcm@@ - > 1890,7 +1894,9 @@ Returns: > // // Final: Check StartupAcm in BiosModule. //- CheckOverlap > (gFitTableContext.StartupAcm.Address, gFitTableContext.StartupAcm.Size);+ > for (Index = 0; Index < (INTN)gFitTableContext.StartupAcmNumber; Index++) > {+ CheckOverlap (gFitTableContext.StartupAcm[Index].Address, > gFitTableContext.StartupAcm[Index].Size);+ } FitEntryNumber = > gFitTableContext.FitEntryNumber; for (Index = 0; Index < > (INTN)gFitTableContext.OptionalModuleNumber; Index++) { if > ((gFitTableContext.OptionalModule[Index].Type == > FIT_TABLE_TYPE_BIOS_POLICY) ||@@ -2178,8 +2184,8 @@ Returns: > } printf ("Total FIT Entry number: 0x%x\n", > gFitTableContext.FitEntryNumber); printf ("FitHeader version: 0x%04x\n", > gFitTableContext.FitHeaderVersion);- if > (gFitTableContext.StartupAcm.Address != 0) {- printf ("StartupAcm - > (0x%08x, 0x%08x, 0x%04x)\n", gFitTableContext.StartupAcm.Address, > gFitTableContext.StartupAcm.Size, gFitTableContext.StartupAcmVersion);+ > for (Index = 0; Index < gFitTableContext.StartupAcmNumber; Index++) {+ > printf ("StartupAcm[%d] - (0x%08x, 0x%08x, 0x%04x)\n", Index, > gFitTableContext.StartupAcm[Index].Address, > gFitTableContext.StartupAcm[Index].Size, > gFitTableContext.StartupAcmVersion); } if > (gFitTableContext.DiagnstAcm.Address != 0) { printf ("DiagnosticAcm - > (0x%08x, 0x%08x, 0x%04x)\n", gFitTableContext.DiagnstAcm.Address, > gFitTableContext.DiagnstAcm.Size, > gFitTableContext.DiagnstAcmVersion);@@ -2809,8 +2815,8 @@ Returns: > // // 4. StartupAcm //- if (gFitTableContext.StartupAcm.Address != 0) > {- > FitEntry[FitIndex].Address = gFitTableContext.StartupAcm.Address;+ > for (Index = 0; Index < gFitTableContext.StartupAcmNumber; Index++) {+ > FitEntry[FitIndex].Address = > gFitTableContext.StartupAcm[Index].Address; *(UINT32 > *)&FitEntry[FitIndex].Size[0] = 0; //gFitTableContext.StartupAcm.Size / 16; > FitEntry[FitIndex].Version = > (UINT16)gFitTableContext.StartupAcmVersion; FitEntry[FitIndex].Type > = FIT_TABLE_TYPE_STARTUP_ACM;@@ -3110,7 +3116,7 @@ GetFitEntryInfo > ( > Routine Description: - Fill the FIT table information to Fvrecovery+ Get > the > FIT table information from Fvrecovery Arguments: @@ -3164,8 +3170,8 @@ > Returns: > gFitTableContext.MicrocodeNumber ++; break; case > FIT_TABLE_TYPE_STARTUP_ACM:- gFitTableContext.StartupAcm.Address = > (UINT32)FitEntry[FitIndex].Address;- gFitTableContext.StartupAcmVersion > = FitEntry[FitIndex].Version;+ > gFitTableContext.StartupAcm[gFitTableContext.StartupAcmNumber].Address > = (UINT32)FitEntry[FitIndex].Address;+ > gFitTableContext.StartupAcmVersion = > FitEntry[FitIndex].Version; break; case FIT_TABLE_TYPE_BIOS_MODULE: > gFitTableContext.BiosModule[gFitTableContext.BiosModuleNumber].Address > = (UINT32)FitEntry[FitIndex].Address;@@ -3232,6 +3238,7 @@ Returns: > UINT32 FdFileSize; UINT8 > *AcmBuffer;+ INTN > Index; UINT32 FixedFitLocation; FileBufferRaw = > NULL;@@ - > 3323,22 +3330,23 @@ Returns: > // // Get ACM buffer //- if > (gFitTableContext.StartupAcm.Address != > 0) {- AcmBuffer = > FLASH_TO_MEMORY(gFitTableContext.StartupAcm.Address, FdFileBuffer, > FdFileSize);- if ((AcmBuffer < FdFileBuffer) || (AcmBuffer + > gFitTableContext.StartupAcm.Size > FdFileBuffer + FdFileSize)) {- > printf > ("ACM out of range - can not validate it\n");- AcmBuffer = NULL;- > }+ > for (Index = 0; Index < (INTN)gFitTableContext.StartupAcmNumber; Index ++) > {+ if (gFitTableContext.StartupAcm[Index].Address != 0) {+ > AcmBuffer = > FLASH_TO_MEMORY(gFitTableContext.StartupAcm[Index].Address, > FdFileBuffer, FdFileSize);+ if ((AcmBuffer < FdFileBuffer) || > (AcmBuffer + > gFitTableContext.StartupAcm[Index].Size > FdFileBuffer + FdFileSize)) {+ > printf ("ACM out of range - can not validate it\n");+ AcmBuffer = > NULL;+ } - if (AcmBuffer != NULL) {- if (CheckAcm > ((ACM_FORMAT > *)AcmBuffer, gFitTableContext.StartupAcm.Size)) {- DumpAcm > ((ACM_FORMAT *)AcmBuffer);- } else {- Status = STATUS_ERROR;- > goto exitFunc;+ if (AcmBuffer != NULL) {+ if (CheckAcm > ((ACM_FORMAT *)AcmBuffer, gFitTableContext.StartupAcm[Index].Size)) {+ > DumpAcm ((ACM_FORMAT *)AcmBuffer);+ } else {+ Status = > STATUS_ERROR;+ goto exitFunc;+ } } }- } > //@@ - > 3576,4 +3584,3 @@ Returns: > return u; }-diff --git a/Silicon/Intel/Tools/FitGen/FitGen.h > b/Silicon/Intel/Tools/FitGen/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 Definitions for the FitGen utility. -Copyright (c) 2010-2020, Intel > Corporation. All rights reserved.<BR>+Copyright (c) 2010-2022, Intel > Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause- > Patent **/@@ -31,7 +31,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > // Utility version information // #define UTILITY_MAJOR_VERSION 0-#define > UTILITY_MINOR_VERSION 64+#define UTILITY_MINOR_VERSION 65 #define > UTILITY_DATE __DATE__ //-- > 2.37.0.windows.1 > > > > -=-=-=-=-=-= > Groups.io Links: You receive all messages sent to this group. > View/Reply Online (#90988): https://edk2.groups.io/g/devel/message/90988 > Mute This Topic: https://groups.io/mt/92111640/4546272 > Group Owner: devel+ow...@edk2.groups.io > Unsubscribe: https://edk2.groups.io/g/devel/unsub [yuwei.c...@intel.com] > -=-=-=-=-=-= >
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#91020): https://edk2.groups.io/g/devel/message/91020 Mute This Topic: https://groups.io/mt/92111640/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-