From nobody Mon Feb 9 03:12:40 2026 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+86461+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+86461+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1644370395; cv=none; d=zohomail.com; s=zohoarc; b=fJpvp1q+AsDmYuCnA8Gl2d+wHKIlGfvgJxdhgXlSbb0a2T2KBqHYCC4vHiVkK5DFprQwzcnuVGAc2QBBlLtreZ2ppG0X8FV4VgKIjOfWX2teM4iwj5xPOht4noSb1dJL1TemzTbrhdaq4MWOOnBhW5qpooagt4I/Iaw1/ykIjes= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1644370395; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=57h4GvH2Ol924D4iAyjRP6zzy59I3mL+++cVu5nnxqM=; b=bXsCuLbP6YKWgEEDPOXktRr8iqc9FKWNWHohpmB+ewL+N6d2biccHDwgJxaoezYBrSfqp4gsZ5IhjvWjQ/ZAfkaevQZqJwiaoCHXiXQT/zLQO/KSvhAacCQQfuZiO3i5UmYxtpMkuaX8mKU/IdP58kB+w/5luPagcAZIYqwr9SI= 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+86461+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1644370395952933.5488697224064; Tue, 8 Feb 2022 17:33:15 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id YWoNYY1788612x3FleD7bfLa; Tue, 08 Feb 2022 17:33:15 -0800 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.20833.1644370394547600602 for ; Tue, 08 Feb 2022 17:33:14 -0800 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3BED914BF; Tue, 8 Feb 2022 17:33:14 -0800 (PST) X-Received: from u203013-lin.austin.arm.com (u203013-lin.austin.arm.com [10.118.28.29]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 30DF53F718; Tue, 8 Feb 2022 17:33:14 -0800 (PST) From: "Joseph Hemann" To: devel@edk2.groups.io Cc: G Edhaya Chandran , Barton Gao , Carolyn Gjertsen , Samer El-Haj-Mahmoud , Eric Jin , Arvin Chen , Supreeth Venkatesh , Stuart Yoder Subject: [edk2-devel] [PATCH V3 5/6] uefi-sct/SctPkg: TCG2 Protocol: add GetEventLog test Date: Tue, 8 Feb 2022 19:33:05 -0600 Message-Id: <20220209013306.425846-6-Joseph.hemann@arm.com> In-Reply-To: <20220209013306.425846-1-Joseph.hemann@arm.com> References: <20220209013306.425846-1-Joseph.hemann@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: 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,joseph.hemann@arm.com X-Gm-Message-State: 1pJhzh0TRPrzY16oQShfzp1Lx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1644370395; bh=chMJnjn0S642YP6QKbcAhKH0wj0znELjOCsMdSeKLQA=; h=Cc:Date:From:Reply-To:Subject:To; b=eUdrq13F4MEfxrXtdg1WtDWri9YigD/+lemAC+vwsvz+hJKiVMYXw/hrqI1oLxsE+nf PpYA7Zavac2du80Cbs2kci7lxxdO0uY5KNu5hAlID1K6TUWURKWNLeDabEjAUwTdEEP8w rUpvrpmOl6Xe/jC6yi3ydPS1uJHU0x8k5Zg= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1644370397834100021 Content-Type: text/plain; charset="utf-8" -add initial TCG2 protocol test for GetEventLog() -checkpoint for test function with invalid eventlog format -checkpoint for test function with valid eventlog format V2: -Change checkpoint names from HashLogExtendEvent to GetEventLog Cc: G Edhaya Chandran Cc: Barton Gao Cc: Carolyn Gjertsen Cc: Samer El-Haj-Mahmoud Cc: Eric Jin Cc: Arvin Chen Cc: Supreeth Venkatesh Cc: Stuart Yoder Signed-off-by: Joseph Hemann Change-Id: I5ca3a46b3d36e8f11848a788f6cfdcabeb5b04c8 --- .../SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.h | 20 +++ .../UEFI/EFI/Protocol/TCG2/BlackBoxTest/TCG2ProtocolBBTest.h | 15 ++ uefi-sct/SctPkg/UEFI/Protocol/TCG2.h | 46 ++++= +++ .../SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.c | 8 ++ .../Protocol/TCG2/BlackBoxTest/TCG2ProtocolBBTestConformance.c | 204 ++++= +++++++++++++++++++++++- 5 files changed, 292 insertions(+), 1 deletion(-) diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/G= uid.h b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.h index 45c2b2b22282..d3a18aeebf09 100644 --- a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.h +++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.h @@ -80,3 +80,23 @@ extern EFI_GUID gTcg2ConformanceTestAssertionGuid010; { 0x9cd6d636, 0x603a, 0x4b78, {0x80, 0xa3, 0xa3, 0xb9, 0xcc, 0x6a, 0x0b, 0= x08 }} =20 extern EFI_GUID gTcg2ConformanceTestAssertionGuid011; + +#define EFI_TEST_TCG2CONFORMANCE_ASSERTION_012_GUID \ +{ 0x0a938567, 0xb234, 0xad21, {0x2a, 0xa6, 0x11, 0x65, 0xaa, 0xde, 0x12, 0= xc2 }} + +extern EFI_GUID gTcg2ConformanceTestAssertionGuid012; + +#define EFI_TEST_TCG2CONFORMANCE_ASSERTION_013_GUID \ +{ 0x45fa1a42, 0x912a, 0x5124, {0x84, 0xf4, 0x41, 0x67, 0xab, 0xb5, 0x89, 0= x90 }} + +extern EFI_GUID gTcg2ConformanceTestAssertionGuid013; + +#define EFI_TEST_TCG2CONFORMANCE_ASSERTION_014_GUID \ +{ 0xfc80408e, 0x9a3c, 0x4054, {0x96, 0xf9, 0x31, 0x23, 0x35, 0xc2, 0x31, 0= x35 }} + +extern EFI_GUID gTcg2ConformanceTestAssertionGuid014; + +#define EFI_TEST_TCG2CONFORMANCE_ASSERTION_015_GUID \ +{ 0xa76d2903, 0xbbcc, 0x8a72, {0x90, 0x23, 0xd3, 0xaa, 0xba, 0xb1, 0x52, 0= x13 }} + +extern EFI_GUID gTcg2ConformanceTestAssertionGuid015; diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/T= CG2ProtocolBBTest.h b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/Black= BoxTest/TCG2ProtocolBBTest.h index 1b56852eea1f..d9c2309462d7 100644 --- a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/TCG2Prot= ocolBBTest.h +++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/TCG2Prot= ocolBBTest.h @@ -45,6 +45,8 @@ Abstract: =20 #define EV_POST_CODE 0x01 =20 +#define EV_NO_ACTION 0x03 + #define EFI_TCG2_EXTEND_ONLY 0x0000000000000001 =20 #define PE_COFF_IMAGE 0x0000000000000010 @@ -97,6 +99,19 @@ BBTestHashLogExtendEventConformanceTestCheckpoint2 ( IN EFI_TCG2_PROTOCOL *TCG2 ); =20 +EFI_STATUS +BBTestGetEventLogConformanceTestCheckpoint1 ( + IN EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib, + IN EFI_TCG2_PROTOCOL *TCG2 + ); + +EFI_STATUS +BBTestGetEventLogConformanceTestCheckpoint2 ( + IN EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib, + IN EFI_TCG2_PROTOCOL *TCG2 + ); + + EFI_STATUS BBTestGetCapabilityConformanceTest ( IN EFI_BB_TEST_PROTOCOL *This, diff --git a/uefi-sct/SctPkg/UEFI/Protocol/TCG2.h b/uefi-sct/SctPkg/UEFI/Pr= otocol/TCG2.h index 923549e2e96b..ac66fa0e107d 100644 --- a/uefi-sct/SctPkg/UEFI/Protocol/TCG2.h +++ b/uefi-sct/SctPkg/UEFI/Protocol/TCG2.h @@ -50,6 +50,8 @@ Abstract: =20 #define EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 0x00000002 =20 +#define HASH_NUMBER 0x04 + typedef struct _EFI_TCG2_PROTOCOL EFI_TCG2_PROTOCOL; =20 typedef UINT64 EFI_PHYSICAL_ADDRESS; @@ -114,6 +116,50 @@ typedef struct tdEFI_TCG2_EVENT { UINT8 Event[]; } EFI_TCG2_EVENT; =20 +typedef struct { + UINT16 hashAlg; + UINT8 digest[]; +} TPMT_HA; + +typedef struct tdTPML_DIGEST_VALUES { + UINT32 Count; // number of digests + TPMT_HA Digests[HASH_NUMBER]; // Count digests +} TPML_DIGEST_VALUES; + +// This Declaration is for parsing the eventlog header which is defined to= be 20 bytes in TCG EFI Protocol Spec +typedef UINT8 TCG_DIGEST[20]; + +typedef struct tdTCG_PCR_EVENT2 { + TCG_PCRINDEX PCRIndex; // PCRIndex event extended to + TCG_EVENTTYPE EventType; // Type of event (see [2]) + TPML_DIGEST_VALUES Digests; // List of digests extended to //PCRIndex + UINT32 EventSize; // Size of the event data + UINT8 *Event; // The event data +} TCG_PCR_EVENT2; + +typedef struct tdTCG_PCR_EVENT { + UINT32 PCRIndex; // PCRIndex event extended to + UINT32 EventType; // Type of event (see EFI specs) + TCG_DIGEST Digest; // Value extended into PCRIndex + UINT32 EventSize; // Size of the event data + UINT8 Event[0]; // The event data +} TCG_PCR_EVENT; +// Structure to be added to the Event Log + +typedef struct tdTCG_EfiSpecIdEventAlgorithmSize { + UINT16 algorithmId; + UINT16 digestSize; +} TCG_EfiSpecIdEventAlgorithmSize; + +typedef struct tdTCG_EfiSpecIdEventStruct { + UINT8 signature[16]; + UINT32 platformClass; + UINT8 specVersionMinor; + UINT8 specVersionMajor; + UINT8 specErrata; + UINT8 uintnSize; +} TCG_EfiSpecIDEventStruct; + typedef EFI_STATUS (EFIAPI * EFI_TCG2_HASH_LOG_EXTEND_EVENT) ( diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/G= uid.c b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.c index ed013744e209..b5a4e5c7218e 100644 --- a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.c +++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/Guid.c @@ -49,3 +49,11 @@ EFI_GUID gTcg2ConformanceTestAssertionGuid009 =3D EFI_TE= ST_TCG2CONFORMANCE_ASSERTI EFI_GUID gTcg2ConformanceTestAssertionGuid010 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_010_GUID; =20 EFI_GUID gTcg2ConformanceTestAssertionGuid011 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_011_GUID; + +EFI_GUID gTcg2ConformanceTestAssertionGuid012 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_012_GUID; + +EFI_GUID gTcg2ConformanceTestAssertionGuid013 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_013_GUID; + +EFI_GUID gTcg2ConformanceTestAssertionGuid014 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_014_GUID; + +EFI_GUID gTcg2ConformanceTestAssertionGuid015 =3D EFI_TEST_TCG2CONFORMANCE= _ASSERTION_015_GUID; diff --git a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/T= CG2ProtocolBBTestConformance.c b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol= /TCG2/BlackBoxTest/TCG2ProtocolBBTestConformance.c index c95aa4a6a043..0f84839d0238 100644 --- a/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/TCG2Prot= ocolBBTestConformance.c +++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/Protocol/TCG2/BlackBoxTest/TCG2Prot= ocolBBTestConformance.c @@ -137,7 +137,7 @@ BBTestGetActivePcrBanksConformanceTest ( =20 /** * @brief Entrypoint for HashLogExtendEvent() Function Test. - * 2 checkpoints will be tested. + * 4 checkpoints will be tested. * @param This a pointer of EFI_BB_TEST_PROTOCOL * @param ClientInterface A pointer to the interface array under test * @param TestLevel Test "thoroughness" control @@ -183,6 +183,12 @@ BBTestHashLogExtendEventConformanceTest ( //Test with correct size field BBTestHashLogExtendEventConformanceTestCheckpoint2 (StandardLib, TCG2); =20 + // Test GetEventLog using invalid EventLog Format + BBTestGetEventLogConformanceTestCheckpoint1 (StandardLib, TCG2); + + // Test GetEventLog using valid EventLog Format + BBTestGetEventLogConformanceTestCheckpoint2 (StandardLib, TCG2); + return EFI_SUCCESS; } =20 @@ -770,3 +776,199 @@ BBTestHashLogExtendEventConformanceTestCheckpoint2 ( =20 return EFI_SUCCESS; } + +#define EFI_TCG2_INVALID_EVENT_LOG_FORMAT 0x20 + +EFI_STATUS +BBTestGetEventLogConformanceTestCheckpoint1 ( + IN EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib, + IN EFI_TCG2_PROTOCOL *TCG2 + ) +{ + EFI_TEST_ASSERTION AssertionType; + EFI_STATUS Status; + EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat; + EFI_PHYSICAL_ADDRESS *EventLogLocation; + EFI_PHYSICAL_ADDRESS *EventLogLastEntry; + BOOLEAN *EventLogTruncated; + + // Ensure Get EventLog returns Invalid Parameter when passed invalid for= mat + EventLogFormat =3D EFI_TCG2_INVALID_EVENT_LOG_FORMAT; + + Status =3D TCG2->GetEventLog ( + TCG2, + EventLogFormat, + EventLogLocation, + EventLogLastEntry, + EventLogTruncated); + + if (EFI_INVALID_PARAMETER !=3D Status) { + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } else { + AssertionType =3D EFI_TEST_ASSERTION_PASSED; + } + + StandardLib->RecordAssertion ( + StandardLib, + AssertionType, + gTcg2ConformanceTestAssertionGuid012, + L"TCG2_PROTOCOL.GetEventLog - GetEventLog() should return= EFI_INVALID_PARAMETER when passed in invalid EventLog Format", + L"%a:%d: Status - %r", + __FILE__, + (UINTN)__LINE__, + Status + ); + + return EFI_SUCCESS; +} + +EFI_STATUS +BBTestGetEventLogConformanceTestCheckpoint2 ( + IN EFI_STANDARD_TEST_LIBRARY_PROTOCOL *StandardLib, + IN EFI_TCG2_PROTOCOL *TCG2 + ) +{ + EFI_TEST_ASSERTION AssertionType; + EFI_STATUS Status; + EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat; + EFI_PHYSICAL_ADDRESS EventLogLocation; + EFI_PHYSICAL_ADDRESS EventLogLastEntry; + BOOLEAN EventLogTruncated; + TCG_PCR_EVENT *EventLogHeader; + TCG_EfiSpecIDEventStruct *EventLogHeaderSpecEvent; + TCG_PCR_EVENT2 *LastEvent; + UINT8 *data =3D "Spec ID Event03\0\0"; + + EventLogFormat =3D EFI_TCG2_EVENT_LOG_FORMAT_TCG_2; + + // Call GetEventLog with valid EventLogFormat + Status =3D TCG2->GetEventLog ( + TCG2, + EventLogFormat, + &EventLogLocation, + &EventLogLastEntry, + &EventLogTruncated); + + AssertionType =3D EFI_TEST_ASSERTION_PASSED; + + // Verify GetEventLog returns EFI_SUCCESS + if (Status !=3D EFI_SUCCESS) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: GetEventLog sho= uld return EFI_SUCCESS with valid EventLogFormat, Status =3D %r", + Status + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + + } + + StandardLib->RecordAssertion ( + StandardLib, + AssertionType, + gTcg2ConformanceTestAssertionGuid013, + L"TCG2_PROTOCOL.GetEventLog - GetEventLog() should return= EFI_SUCCESS", + L"%a:%d: Status - %r", + __FILE__, + (UINTN)__LINE__, + Status + ); + + // If GetEventLog doesn't return EFI_SUCCESS abort test + if (Status !=3D EFI_SUCCESS) { + return Status; + } + + EventLogHeader =3D (TCG_PCR_EVENT *) EventLogLocation; + EventLogHeaderSpecEvent =3D (TCG_EfiSpecIDEventStruct *) EventLogHeader-= >Event; + + AssertionType =3D EFI_TEST_ASSERTION_PASSED; + + + // Verify valid eventlog header is returned + // Verify EventLogHeader PCR index =3D=3D 0 + if (EventLogHeader->PCRIndex !=3D 0) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: EventLogHeader = should have PCR index =3D=3D 0" + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } + + // Verify EventLogHeader event type =3D EV_NO_ACTION + if (EventLogHeader->EventType !=3D EV_NO_ACTION) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: EventLogHeader = should be EventType =3D=3D EV_NO_ACTION" + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } + + // Verify EventLog Signature + Status =3D SctStrCmp(EventLogHeaderSpecEvent->signature, data); + + if (Status !=3D EFI_SUCCESS) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: EventLogHeader = Signature did not match \'Spec ID Event03\'" + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } + + StandardLib->RecordAssertion ( + StandardLib, + AssertionType, + gTcg2ConformanceTestAssertionGuid014, + L"TCG2_PROTOCOL.GetEventLog - GetEventLog() should return= correct EventLogHeader", + L"%a:%d: Status - %r", + __FILE__, + (UINTN)__LINE__, + Status + ); + + + // Verify Event recorded in checkpoint2 was recorded in Eventlog + LastEvent =3D (TCG_PCR_EVENT2 *) EventLogLastEntry; + + // Verify Last Event PCR =3D 16 + if (LastEvent->PCRIndex !=3D 16) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: PCR Index of La= st event should be 16" + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } + + // Verify last event type =3D EV_POST_CODE + if (LastEvent->EventType !=3D EV_POST_CODE) { + StandardLib->RecordMessage ( + StandardLib, + EFI_VERBOSE_LEVEL_DEFAULT, + L"\r\nTCG2 Protocol GetEventLog Test: PCR Index of la= st event should be type EV_POST_CODE" + ); + + AssertionType =3D EFI_TEST_ASSERTION_FAILED; + } + + StandardLib->RecordAssertion ( + StandardLib, + AssertionType, + gTcg2ConformanceTestAssertionGuid015, + L"TCG2_PROTOCOL.GetEventLog - GetEventLog() should record= Event from Checkpoint2 as last EventLogEntry", + L"%a:%d: Status - %r", + __FILE__, + (UINTN)__LINE__, + Status + ); + + return EFI_SUCCESS; +} --=20 2.25.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 (#86461): https://edk2.groups.io/g/devel/message/86461 Mute This Topic: https://groups.io/mt/89012620/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-