From nobody Sat May 11 23:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+66913+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+66913+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1604382449; cv=none; d=zohomail.com; s=zohoarc; b=dI/PfdESI0iNX8Y0dTJoO8M0jc4WH1P8C33I+MueJSSZjDoebxbiPTr2zA5pK9hsNuWsfFKWvxhBfUWdChpOAs4PToSZG6xeYbb8c5wXh1HXkGdujhA7QwwumSid8s4Hgz5UhFr11TIvTfPOeA8OGgY3Pg20iJcQv6wks/YRAiI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604382449; h=Cc:Date:From:List-Id:List-Unsubscribe:Message-ID:Reply-To:Sender:Subject:To; bh=t9y+95NvzKSul8STbUW0H+2PZ1irj7Xdp1fNGuoZoLA=; b=HlQAEnDRpx4ASNe4IM/vXQcLTjRRtA5L5ooyCb3fVs6xhKhQwTK/Iz3s8AWMykd+tXUTZyH4QYabEJ9waVz/8fklCAQOZxq9yzHdSY7EfBtpvZVwNEJsgeCouzUDH0c7rlMoxBETiPDvEFE9pKl+e6S2d2N/jHXUePgqbe4yjhk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+66913+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 16043824496971020.8251602556084; Mon, 2 Nov 2020 21:47:29 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id nf0GYY1788612xJByNrZ0Ql4; Mon, 02 Nov 2020 21:47:29 -0800 X-Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web11.278.1604382448501367968 for ; Mon, 02 Nov 2020 21:47:28 -0800 IronPort-SDR: fiAHNZJLcP/rq117NLk4anmXcfCzrzfLmzt2SKFeNHTXh72GpIiXB1WKdWvBgLMnzolcUtChXc A01QU69Ul9YA== X-IronPort-AV: E=McAfee;i="6000,8403,9793"; a="230632373" X-IronPort-AV: E=Sophos;i="5.77,447,1596524400"; d="scan'208";a="230632373" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Nov 2020 21:47:27 -0800 IronPort-SDR: zkPtSeUPVVXEpqbckDiFgCYdfjfJ9UWe6PedTm6ddeePCAAil5tnM+eJoSt3TT5+/7TT+2wJ71 CpZUR5DHwwog== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.77,447,1596524400"; d="scan'208";a="538322733" X-Received: from chinghux-desk1.gar.corp.intel.com ([10.5.215.141]) by orsmga005.jf.intel.com with ESMTP; 02 Nov 2020 21:47:25 -0800 From: "GregX Yeh" To: devel@edk2.groups.io Cc: Bob Feng , Liming Gao Subject: [edk2-devel] [PATCH] BaseTools/FMMT: Replace file failure when FV level over 2 Date: Tue, 3 Nov 2020 13:47:11 +0800 Message-Id: <20201103054711.22836-1-gregx.yeh@intel.com> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,gregx.yeh@intel.com X-Gm-Message-State: gE5Z1reRHqPMiPXwsaKovNQTx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1604382449; bh=yCidBmvEgFOBmP3RMBsjJTWXFMKdBbFQHC7XxqndNN8=; h=Cc:Date:From:Reply-To:Subject:To; b=eOjBA/v+UcRXgacpHVj0IICdLr7I651d8Thg/9ty0xBmnG/hr93svmPrsJGPhf2D2kL n9KnzpJMerjDukHmhNCcBtzYTmIvRtEe+nOHeAzivoXEe2wABxY2s7snn7tv4cOKqvU6e ml3M23kEMc8T+05RG0F5SkHBwc7uczX5Hlg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Fixed replace file failure when FFS in multi level FV and FV level over 2. Signed-off-by: GregX Yeh Cc: Bob Feng Cc: Liming Gao --- BaseTools/Source/C/FMMT/FirmwareModuleManagement.c | 2 +- BaseTools/Source/C/FMMT/FirmwareModuleManagement.h | 3 +- BaseTools/Source/C/FMMT/FmmtLib.c | 171 ++++++++++++++---= ---- 3 files changed, 118 insertions(+), 58 deletions(-) diff --git a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c b/BaseTools= /Source/C/FMMT/FirmwareModuleManagement.c index 38056153fb..dfad02838b 100644 --- a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c +++ b/BaseTools/Source/C/FMMT/FirmwareModuleManagement.c @@ -615,7 +615,7 @@ static UINT32 FindFile(FV_INFORMATION *FvInFd, UINT8 Fv= Level, CHAR8 *File, UINT3 return 0; } LibAscii2Unicode(File, UIName); - for (Index =3D 0; Index <=3D FvInFd->FfsNumbers; Index++) { + for (Index =3D 0; Index < FvInFd->FfsNumbers; Index++) { // // Compare the New File Name with UI Name of FFS // NOTE: The UI Name is Unicode, but the New File Name is Ascii. diff --git a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.h b/BaseTools= /Source/C/FMMT/FirmwareModuleManagement.h index 9d09c9160a..da9eb1a4b9 100644 --- a/BaseTools/Source/C/FMMT/FirmwareModuleManagement.h +++ b/BaseTools/Source/C/FMMT/FirmwareModuleManagement.h @@ -2,7 +2,7 @@ =20 Structures and functions declaration. =20 - Copyright (c) 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -284,6 +284,7 @@ typedef struct _FFS_INFOMATION{ UINT8 *Depex; UINT32 DepexLen; BOOLEAN FfsFoundFlag; + UINT8 FvLevel; struct _FFS_INFOMATION *Next; } FFS_INFORMATION; =20 diff --git a/BaseTools/Source/C/FMMT/FmmtLib.c b/BaseTools/Source/C/FMMT/Fm= mtLib.c index b945e9b63d..9bccd634bb 100644 --- a/BaseTools/Source/C/FMMT/FmmtLib.c +++ b/BaseTools/Source/C/FMMT/FmmtLib.c @@ -523,7 +523,7 @@ LibReadFvHeader ( FvExtHeader->FvName.Data4[6], FvExtHeader->FvName.Data4[7]); LibExtractFvUiName(FvExtHeader, &FvUiName); - if (FvUiName !=3D NULL && FvLevel =3D=3D 1) { + if (FvUiName !=3D NULL && (FvLevel - 1) !=3D 0) { printf("%sFV UI Name: %s\n\n", BlankSpace, FvUiName); } free(FvUiName); @@ -709,10 +709,10 @@ LibGenFfsFile ( free(FfsFileName); FfsFileName =3D NULL; =20 - CurrentFv->FfsNumbers =3D *FfsCount; - *FfsCount +=3D 1; =20 + CurrentFv->FfsNumbers =3D *FfsCount; + if (ErasePolarity) { CurrentFile->State =3D (UINT8)~(CurrentFile->State); } @@ -789,7 +789,8 @@ LibParseSection ( UINT8 *FvCount, BOOLEAN ViewFlag, BOOLEAN ErasePolarity, - BOOLEAN *IsFfsGenerated + BOOLEAN *IsFfsGenerated, + UINT32 *FfsIndex ) { UINT32 ParsedLength; @@ -1147,19 +1148,21 @@ LibParseSection ( return EFI_SECTION_ERROR; } =20 - Status =3D LibParseSection ( UncompressedBuffer, - UncompressedLength, - CurrentFv, - FvName, - CurrentFile, - Level, - &LocalEncapData, - FfsLevel, - FfsCount, - FvCount, - ViewFlag, - ErasePolarity, - IsFfsGenerated); + Status =3D LibParseSection (UncompressedBuffer, + UncompressedLength, + CurrentFv, + FvName, + CurrentFile, + Level, + &LocalEncapData, + FfsLevel, + FfsCount, + FvCount, + ViewFlag, + ErasePolarity, + IsFfsGenerated, + FfsIndex + ); =20 if (CompressionType =3D=3D EFI_STANDARD_COMPRESSION) { // @@ -1216,7 +1219,8 @@ LibParseSection ( FvCount, ViewFlag, ErasePolarity, - IsFfsGenerated + IsFfsGenerated, + FfsIndex ); if (EFI_ERROR(Status)) { Error(NULL, 0, 0003, "parse of decoded GUIDED section failed", N= ULL); @@ -1471,7 +1475,8 @@ LibParseSection ( FvCount, ViewFlag, ErasePolarity, - IsFfsGenerated + IsFfsGenerated, + FfsIndex ); if (EFI_ERROR (Status)) { Error (NULL, 0, 0003, "parse of decoded GUIDED section failed", = NULL); @@ -1491,7 +1496,8 @@ LibParseSection ( FvCount, ViewFlag, ErasePolarity, - IsFfsGenerated + IsFfsGenerated, + FfsIndex ); if (ExtractionTool !=3D NULL) { free (ExtractionTool); @@ -1527,6 +1533,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } =20 @@ -1538,6 +1545,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } =20 @@ -1549,6 +1557,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } =20 @@ -1560,6 +1569,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } break; @@ -1571,6 +1581,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } break; @@ -1582,6 +1593,7 @@ LibParseSection ( if (!*IsFfsGenerated) { LibGenFfsFile(CurrentFile, CurrentFv, FvName, Level, FfsCount, E= rasePolarity); *IsFfsGenerated =3D TRUE; + *FfsIndex =3D *FfsCount; } } break; @@ -1665,11 +1677,11 @@ LibParseSection ( // If Ffs file has been generated, then the FfsCount should decrease= 1. // if (*IsFfsGenerated) { - memcpy (CurrentFv->FfsAttuibutes[*FfsCount -1].UiName, UIName, UIN= ameSize); - CurrentFv->FfsAttuibutes[*FfsCount -1].UiNameSize =3D UINameSize; + memcpy (CurrentFv->FfsAttuibutes[*FfsIndex - 1].UiName, UIName, UI= NameSize); + CurrentFv->FfsAttuibutes[*FfsIndex - 1].UiNameSize =3D UINameSize; } else { - memcpy (CurrentFv->FfsAttuibutes[*FfsCount].UiName, UIName, UIName= Size); - CurrentFv->FfsAttuibutes[*FfsCount].UiNameSize =3D UINameSize; + memcpy (CurrentFv->FfsAttuibutes[*FfsIndex].UiName, UIName, UIName= Size); + CurrentFv->FfsAttuibutes[*FfsIndex].UiNameSize =3D UINameSize; } =20 HasDepexSection =3D FALSE; @@ -1682,7 +1694,9 @@ LibParseSection ( } =20 ParsedLength +=3D SectionLength; - FirstInFlag =3D FALSE; + if (Type !=3D EFI_SECTION_PEI_DEPEX && Type !=3D EFI_SECTION_DXE_DEPEX= ) { + FirstInFlag =3D FALSE; + } // // We make then next section begin on a 4-byte boundary // @@ -1872,12 +1886,14 @@ LibGetFileInfo ( BOOLEAN IsGeneratedFfs; UINT32 FfsFileHeaderSize; CHAR8 *BlankChar; + UINT32 FfsIndex; =20 Status =3D EFI_SUCCESS; =20 LocalEncapData =3D NULL; EncapDataNeedUpdateFlag =3D TRUE; IsGeneratedFfs =3D FALSE; + FfsIndex =3D 0xFFFFFFFF; BlankChar =3D NULL; =20 FfsFileHeaderSize =3D GetFfsHeaderLength ((EFI_FFS_FILE_HEADER *) Curre= ntFile); @@ -2083,24 +2099,25 @@ LibGetFileInfo ( } else if( CurrentFile->Type =3D=3D EFI_FV_FILETYPE_FFS_PAD){ //EFI_FV_FILETYPE_FFS_PAD } else { - // - // All other files have sections - // - Status =3D LibParseSection ( - (UINT8 *) ((UINTN) CurrentFile + FfsFileHeaderSize), - FileLength - FfsFileHeaderSize, - CurrentFv, - FvName, - CurrentFile, - Level, - &LocalEncapData, - Level, - FfsCount, - FvCount, - ViewFlag, - ErasePolarity, - &IsGeneratedFfs - ); + // + // All other files have sections + // + Status =3D LibParseSection ( + (UINT8 *) ((UINTN) CurrentFile + FfsFileHeaderSize), + FileLength - FfsFileHeaderSize, + CurrentFv, + FvName, + CurrentFile, + Level, + &LocalEncapData, + Level, + FfsCount, + FvCount, + ViewFlag, + ErasePolarity, + &IsGeneratedFfs, + &FfsIndex + ); } if (EFI_ERROR (Status)) { printf ("ERROR: Parsing the FFS file.\n"); @@ -2144,6 +2161,7 @@ LibGetFvInfo ( EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHdrPtr; EFI_FIRMWARE_VOLUME_HEADER *FvHdr; UINT8 PreFvId; + UINT8 GuidBuffer[PRINTED_GUID_BUFFER_SIZE]; =20 NumberOfFiles =3D 0; Key =3D 0; @@ -2344,9 +2362,10 @@ LibGetFvInfo ( =20 CurrentFv->FfsAttuibutes[*FfsCount].FvLevel =3D CurrentFv->FvLevel; CurrentFv->FfsAttuibutes[*FfsCount].FvId =3D PreFvId; - if (CurrentFv->FvLevel > CurrentFv->MulFvLevel) { + if (CurrentFv->FvLevel > CurrentFv->MulFvLevel) { CurrentFv->MulFvLevel =3D CurrentFv->FvLevel; - } + } + PrintGuidToBuffer (&(CurrentFile->Name), GuidBuffer, PRINTED_GUID_BUFF= ER_SIZE, FALSE); // // Display info about this file // @@ -4198,10 +4217,13 @@ LibEncapNewFvFile( UINT32 header; UINT8 AlignN; UINT8 AlignV[1] =3D {0xFF}; + UINT32 EntryFvId; + AlignN =3D 0; Id =3D 0; InputFileSize =3D 0; TmpFileSize =3D 0; + AlignmentFileSize =3D 0; EncapFvIndex =3D 0; Index =3D 0; OuterIndex =3D 0; @@ -4224,7 +4246,7 @@ LibEncapNewFvFile( IsLargeFile =3D FALSE; OutputFileSize =3D 0; LargeFileSize =3D 0x1000000; - + EntryFvId =3D 0; =20 OutputFileNameList =3D (FFS_INFORMATION *)malloc(sizeof(FFS_INFORMATION)= ); if (OutputFileNameList =3D=3D NULL) { @@ -4240,6 +4262,7 @@ LibEncapNewFvFile( OutputFileNameList->Depex =3D NULL; OutputFileNameList->DepexLen =3D 0; OutputFileNameList->FfsFoundFlag =3D FALSE; + OutputFileNameList->FvLevel =3D 0; =20 ChildFileNameList =3D (FFS_INFORMATION *)malloc(sizeof(FFS_INFORMATION)); if (ChildFileNameList =3D=3D NULL) { @@ -4258,12 +4281,16 @@ LibEncapNewFvFile( // // Encapsulate from the lowest FFS file level. // - LocalEncapData =3D CurrentEncapData; - if (LocalEncapData =3D=3D NULL) { - LocalEncapData =3D FvInFd->EncapData; - } - Level =3D LocalEncapData->Level; - Type =3D LocalEncapData->Type; + LocalEncapData =3D CurrentEncapData; + if (LocalEncapData =3D=3D NULL) { + LocalEncapData =3D FvInFd->EncapData; + EntryFvId =3D 0xFFFFFFFF; + } else { + EntryFvId =3D LocalEncapData->FvId; + } + + Level =3D LocalEncapData->Level; + Type =3D LocalEncapData->Type; =20 if (CurrentEncapData =3D=3D NULL) { LocalEncapData =3D FvInFd->EncapData; @@ -4278,6 +4305,7 @@ LibEncapNewFvFile( ChildFileNameList->ParentLevel =3D LocalEncapDataTemp->Lev= el -1; if (FvInFd->ChildFvFFS =3D=3D NULL) { FvInFd->ChildFvFFS =3D ChildFileNameList; + NewFileNameList =3D FvInFd->ChildFvFFS; } else { NewFileNameList =3D FvInFd->ChildFvFFS; while (NewFileNameList->Next !=3D NULL) { @@ -4325,6 +4353,12 @@ LibEncapNewFvFile( Type =3D LocalEncapData->Type; } LocalEncapData =3D LocalEncapData->NextNode; + if (LocalEncapData =3D=3D NULL) { + if (Type =3D=3D FMMT_ENCAP_TREE_FV) { + ParentLevel =3D Level; + ParentType =3D Type; + } + } } } else { LocalEncapData =3D CurrentEncapData; @@ -4349,6 +4383,28 @@ LibEncapNewFvFile( LocalEncapDataTemp =3D LocalEncapDataTemp->RightNode; } } + + if (LocalEncapData->FvId > EntryFvId && LocalEncapData->Type =3D=3D = FMMT_ENCAP_TREE_FFS) { + LocalEncapDataTemp =3D LocalEncapData->RightNode; + + while (LocalEncapDataTemp !=3D NULL) { + LocalEncapDataNext =3D LocalEncapDataTemp->NextNode; + if (LocalEncapDataNext !=3D NULL && LocalEncapDataNext->NextNode= !=3D NULL) { + LibEncapNewFvFile(FvInFd, TemDir, LocalEncapDataTemp, LocalEnc= apDataTemp->Level - 1, &ChildFileNameList); + if (FvInFd->ChildFvFFS =3D=3D NULL) { + FvInFd->ChildFvFFS =3D ChildFileNameList; + } else { + NewFileNameList =3D FvInFd->ChildFvFFS; + while (NewFileNameList->Next !=3D NULL) { + NewFileNameList =3D NewFileNameList->Next; + } + NewFileNameList->Next =3D ChildFileNameList; + } + } + LocalEncapDataTemp =3D LocalEncapDataTemp->RightNode; + } + } + if (LocalEncapData->Level > Level) { if (LocalEncapData->Type =3D=3D FMMT_ENCAP_TREE_FFS) { ParentLevel =3D Level; @@ -4485,12 +4541,12 @@ LibEncapNewFvFile( // FfsFoundFlag =3D FALSE; IsRootFv =3D FALSE; - for (Index=3D0; Index <=3D FvInFd->FfsNumbers; Index++) { + for (Index=3D0; Index < FvInFd->FfsNumbers; Index++) { if (OutputFileNameList !=3D NULL && OutputFileNameList->FFSNam= e !=3D NULL && OutputFileNameList->IsFFS =3D=3D FALSE){ break; } if (OutputFileNameList !=3D NULL && OutputFileNameList->FFSNam= e !=3D NULL && OutputFileNameList->IsFFS =3D=3D TRUE){ - if (Index =3D=3D EncapFvIndex) { + if (Index =3D=3D EncapFvStart) { if (FirstInFlag) { Status =3D LibAddFfsFileToFvInf (OutputFileNam= eList->FFSName, InfFile, TRUE); FirstInFlag =3D FALSE; @@ -4601,7 +4657,7 @@ LibEncapNewFvFile( } } // The Fv may has multiple level (> 2), when it is in the FvLevel = =3D=3D 2, we set the IsLastLevelFfs Flag - if (Index <=3DFvInFd->FfsNumbers && FvInFd->FfsAttuibutes[Index].Fv= Level <=3D FvInFd->MulFvLevel) { + if (Index < FvInFd->FfsNumbers && FvInFd->FfsAttuibutes[Index].FvLe= vel <=3D FvInFd->MulFvLevel) { if (FvInFd->FfsAttuibutes[Index].FvLevel =3D=3D 2) { IsLastLevelFfs =3D FALSE; } @@ -4777,6 +4833,7 @@ LibEncapNewFvFile( for (Id =3D FvInFd->FfsNumbers; Id <=3D FvInFd->FfsNumbers; Id--)= { if ((memcmp(&FvInFd->FfsAttuibutes[Id].GuidName, &(LocalEncap= Data->FvExtHeader->FvName), sizeof(EFI_GUID)) =3D=3D 0)){ if (access(FvInFd->FfsAttuibutes[Id].FfsName, 0) !=3D -1)= { + OutputFileNameList->FvLevel =3D FvInFd->FfsAttuibutes= [Id].FvLevel; Status =3D LibFmmtDeleteFile(FvInFd->FfsAttuibutes[Id= ].FfsName); if (EFI_ERROR(Status)) { Error("FMMT", 0, 0004, "error while encapsulate F= D Image", "Delete the specified file failed!"); @@ -5079,7 +5136,9 @@ LibEncapNewFvFile( } else { if (OutputFileNameList !=3D NULL && OutputFileNameList->FFSName != =3D NULL && OutputFileNameList->IsFFS =3D=3D TRUE) { *OutputFile =3D OutputFileNameList; - return EFI_SUCCESS; + if (OutputFileNameList->FvLevel < 2) { + return EFI_SUCCESS; + } } LocalEncapData =3D CurrentEncapData; } --=20 2.16.2.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#66913): https://edk2.groups.io/g/devel/message/66913 Mute This Topic: https://groups.io/mt/78000880/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-