From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.100, mailfrom: ray.ni@intel.com) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by groups.io with SMTP; Tue, 17 Sep 2019 13:06:31 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Sep 2019 13:06:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,518,1559545200"; d="scan'208";a="338102459" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga004.jf.intel.com with ESMTP; 17 Sep 2019 13:06:30 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.439.0; Tue, 17 Sep 2019 13:06:30 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.32]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.140]) with mapi id 14.03.0439.000; Wed, 18 Sep 2019 04:06:27 +0800 From: "Ni, Ray" To: "devel@edk2.groups.io" , "lersek@redhat.com" CC: Achin Gupta , Andrew Fish , Anthony Perard , Ard Biesheuvel , "You, Benjamin" , "Zhang, Chao B" , "Bi, Dandan" , David Woodhouse , "Dong, Eric" , "Dong, Guo" , "Wu, Hao A" , "Carsey, Jaben" , "Wang, Jian J" , "Wu, Jiaxin" , "Yao, Jiewen" , "Justen, Jordan L" , Julien Grall , Leif Lindholm , "Gao, Liming" , "Ma, Maurice" , "Kinney, Michael D" , "Fu, Siyuan" , Supreeth Venkatesh , "Gao, Zhichao" Subject: Re: [edk2-devel] [PATCH 01/35] DO NOT APPLY: edk2: turn standard handle types into pointers to non-VOID Thread-Topic: [edk2-devel] [PATCH 01/35] DO NOT APPLY: edk2: turn standard handle types into pointers to non-VOID Thread-Index: AQHVbZEUkVpJlDI+y0ihQ82nwItyBacwSt3Q Date: Tue, 17 Sep 2019 20:06:26 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5C2E3BE1@SHSMSX104.ccr.corp.intel.com> References: <20190917194935.24322-1-lersek@redhat.com> <20190917194935.24322-2-lersek@redhat.com> In-Reply-To: <20190917194935.24322-2-lersek@redhat.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMjVkZjFmY2UtOWVjNy00Mzk3LWFjMzgtNGMxMzJhYzAyMTJlIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiUk1RWE1xYURFWmhvTE5DcSt1MVwvdkd4QzUrMmlBeVNEWExvVmZBZlpXeFIybnZSczVOa0gwdEZjV2NTaTl4XC9wIn0= x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: ray.ni@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Laszlo, Thank you very much for this work. They are quite helpful to detect potential issues. But without this specific patch being checked in, future break will still h= appen. I don't want it to be checked in ASAP because I know that there are quite a= lot of close source code that may get build break due to this change. Besides that, what prevent you make the decision to check in the changes? Thanks, Ray > -----Original Message----- > From: devel@edk2.groups.io On Behalf Of Laszlo Ers= ek > Sent: Tuesday, September 17, 2019 12:49 PM > To: edk2-devel-groups-io > Cc: Achin Gupta ; Andrew Fish ; Ant= hony Perard ; > Ard Biesheuvel ; You, Benjamin ; Zhang, Chao B > ; Bi, Dandan ; David Woodhou= se ; Dong, Eric > ; Dong, Guo ; Wu, Hao A ; Carsey, Jaben > ; Wang, Jian J ; Wu, Jiaxi= n ; Yao, Jiewen > ; Justen, Jordan L ; Jul= ien Grall ; Leif Lindholm > ; Gao, Liming ; Ma, Mauri= ce ; Kinney, Michael > D ; Ni, Ray ; Fu, Siyuan ; Supreeth Venkatesh > ; Gao, Zhichao > Subject: [edk2-devel] [PATCH 01/35] DO NOT APPLY: edk2: turn standard han= dle types into pointers to non-VOID >=20 > Unfortunately, the UEFI / PI / Shell specs define a number of handle type= s > as pointers to VOID. This is a design mistake; those types should have > been pointers to incomplete union or structure types. Any > pointer-to-object type converts implicitly to, and from, pointer-to-void, > which prevents compilers from catching at least the following two types o= f > mistakes: >=20 > - mixing up one handle type with another (for example, EFI_HANDLE with > EFI_EVENT), >=20 > - getting the depth of indirection wrong (for example, mixing up > (EFI_HANDLE*) with EFI_HANDLE). >=20 > In order to root out such mistakes in the edk2 codebase, introduce > incomplete structure types with unique tags, such as: >=20 > struct EFI_FOOBAR_OBJECT; > typedef struct EFI_FOOBAR_OBJECT *EFI_FOOBAR_HANDLE; >=20 > replacing the spec mandated >=20 > typedef VOID *EFI_FOOBAR_HANDLE; >=20 > (For some types, such as: >=20 > - EFI_ACPI_HANDLE, > - EFI_EVENT, > - EFI_FONT_HANDLE, > - EFI_HANDLE, > - EFI_HII_HANDLE, > - EFI_S3_BOOT_SCRIPT_POSITION, > - SHELL_FILE_HANDLE, >=20 > we connect the actual complete type (the internal, implementation-specifi= c > type) to the typedef. Some of these also demonstrate how the code could > have looked in practice if the specs had used proper opaque (=3Dincomplet= e) > types.) >=20 > Then, unleash "build" on the package DSC files. This causes the compiler > to warn about incompatible pointer assignments, and to stop the build. >=20 > The rest of the series addresses the resultant warnings. Each patch > belongs in one of two categories: >=20 > - semantic cleanups (no functional / behavioral changes), > - actual bugfixes. >=20 > As the subject line of this patch states, this specific patch is *not* > meant to be applied. It is just a "what if" patch that temporarily > isolates the standard types from each other, the way the specs should > have, so that the compiler have more information to work with. >=20 > Cc: Achin Gupta > Cc: Andrew Fish > Cc: Anthony Perard > Cc: Ard Biesheuvel > Cc: Benjamin You > Cc: Chao Zhang > Cc: Dandan Bi > Cc: David Woodhouse > Cc: Eric Dong > Cc: Guo Dong > Cc: Hao A Wu > Cc: Jaben Carsey > Cc: Jian J Wang > Cc: Jian Wang > Cc: Jiaxin Wu > Cc: Jiewen Yao > Cc: Jordan Justen > Cc: Julien Grall > Cc: Leif Lindholm > Cc: Liming Gao > Cc: Maurice Ma > Cc: Michael D Kinney > Cc: Ray Ni > Cc: Siyuan Fu > Cc: Supreeth Venkatesh > Cc: Zhichao Gao > Signed-off-by: Laszlo Ersek > --- > MdePkg/Include/Pi/PiPeiCis.h | 6 ++++-- > MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h | 3 ++- > MdePkg/Include/Protocol/Bis.h | 3 ++- > MdePkg/Include/Protocol/Eap.h | 3 ++- > MdePkg/Include/Protocol/HiiFont.h | 3 +-- > MdePkg/Include/Protocol/MmMp.h | 3 ++- > MdePkg/Include/Protocol/S3SaveState.h | 2 +- > MdePkg/Include/Protocol/Shell.h | 3 ++- > MdePkg/Include/Protocol/UserManager.h | 9 ++++++--- > MdePkg/Include/Uefi/UefiBaseType.h | 6 ++++-- > MdePkg/Include/Uefi/UefiInternalFormRepresentation.h | 3 ++- > MdeModulePkg/Core/Dxe/Event/Event.h | 2 +- > MdeModulePkg/Core/Dxe/Hand/Handle.h | 2 +- > MdeModulePkg/Core/PiSmmCore/PiSmmCore.h | 2 +- > MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.h | 2 +- > MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h | 2 +- > StandaloneMmPkg/Core/StandaloneMmCore.h | 2 +- > 17 files changed, 34 insertions(+), 22 deletions(-) >=20 > diff --git a/MdePkg/Include/Pi/PiPeiCis.h b/MdePkg/Include/Pi/PiPeiCis.h > index d9d4ed7d413a..3e9e82b62ae9 100644 > --- a/MdePkg/Include/Pi/PiPeiCis.h > +++ b/MdePkg/Include/Pi/PiPeiCis.h > @@ -18,12 +18,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > /// > /// The handles of EFI FV. > /// > -typedef VOID *EFI_PEI_FV_HANDLE; > +struct EFI_PEI_FV_OBJECT; > +typedef struct EFI_PEI_FV_OBJECT *EFI_PEI_FV_HANDLE; >=20 > /// > /// The handles of EFI FFS. > /// > -typedef VOID *EFI_PEI_FILE_HANDLE; > +struct EFI_PEI_FILE_OBJECT; > +typedef struct EFI_PEI_FILE_OBJECT *EFI_PEI_FILE_HANDLE; >=20 > /// > /// Declare the forward reference data structure for EFI_PEI_SERVICE. > diff --git a/MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h > b/MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h > index a8e0b24c6c8d..8a1863f3e03d 100644 > --- a/MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h > +++ b/MdePkg/Include/Protocol/AcpiSystemDescriptionTable.h > @@ -16,7 +16,8 @@ > { 0xeb97088e, 0xcfdf, 0x49c6, { 0xbe, 0x4b, 0xd9, 0x6, 0xa5, 0xb2, 0xe= , 0x86 }} >=20 > typedef UINT32 EFI_ACPI_TABLE_VERSION; > -typedef VOID *EFI_ACPI_HANDLE; > +struct EFI_ACPI_OBJECT; > +typedef struct EFI_ACPI_OBJECT *EFI_ACPI_HANDLE; >=20 > #define EFI_ACPI_TABLE_VERSION_NONE (1 << 0) > #define EFI_ACPI_TABLE_VERSION_1_0B (1 << 1) > diff --git a/MdePkg/Include/Protocol/Bis.h b/MdePkg/Include/Protocol/Bis.= h > index 2be6718f4bc2..8eca94512d03 100644 > --- a/MdePkg/Include/Protocol/Bis.h > +++ b/MdePkg/Include/Protocol/Bis.h > @@ -37,7 +37,8 @@ typedef struct _EFI_BIS_PROTOCOL EFI_BIS_PROTOCOL; > // > // Basic types > // > -typedef VOID *BIS_APPLICATION_HANDLE; > +struct BIS_APPLICATION_OBJECT; > +typedef struct BIS_APPLICATION_OBJECT *BIS_APPLICATION_HANDLE; > typedef UINT16 BIS_ALG_ID; > typedef UINT32 BIS_CERT_ID; >=20 > diff --git a/MdePkg/Include/Protocol/Eap.h b/MdePkg/Include/Protocol/Eap.= h > index 203d0f40b0dd..06584ef409d0 100644 > --- a/MdePkg/Include/Protocol/Eap.h > +++ b/MdePkg/Include/Protocol/Eap.h > @@ -28,7 +28,8 @@ typedef struct _EFI_EAP_PROTOCOL EFI_EAP_PROTOCOL; > /// Type for the identification number assigned to the Port by the > /// System in which the Port resides. > /// > -typedef VOID * EFI_PORT_HANDLE; > +struct EFI_PORT_OBJECT; > +typedef struct EFI_PORT_OBJECT *EFI_PORT_HANDLE; >=20 > /// > /// EAP Authentication Method Type (RFC 3748) > diff --git a/MdePkg/Include/Protocol/HiiFont.h b/MdePkg/Include/Protocol/= HiiFont.h > index 1f2e321ea4e2..450cad9ada70 100644 > --- a/MdePkg/Include/Protocol/HiiFont.h > +++ b/MdePkg/Include/Protocol/HiiFont.h > @@ -19,8 +19,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > { 0xe9ca4775, 0x8657, 0x47fc, { 0x97, 0xe7, 0x7e, 0xd6, 0x5a, 0x8, 0x43,= 0x24 } } >=20 > typedef struct _EFI_HII_FONT_PROTOCOL EFI_HII_FONT_PROTOCOL; > - > -typedef VOID *EFI_FONT_HANDLE; > +typedef LIST_ENTRY *EFI_FONT_HANDLE; >=20 > /// > /// EFI_HII_OUT_FLAGS. > diff --git a/MdePkg/Include/Protocol/MmMp.h b/MdePkg/Include/Protocol/MmM= p.h > index beace1386cbe..cd4e0db47e08 100644 > --- a/MdePkg/Include/Protocol/MmMp.h > +++ b/MdePkg/Include/Protocol/MmMp.h > @@ -36,7 +36,8 @@ > // > // Completion token > // > -typedef VOID* MM_COMPLETION; > +struct MM_COMPLETION_OBJECT; > +typedef struct MM_COMPLETION_OBJECT* MM_COMPLETION; >=20 > typedef struct { > MM_COMPLETION Completion; > diff --git a/MdePkg/Include/Protocol/S3SaveState.h b/MdePkg/Include/Proto= col/S3SaveState.h > index c1b8f8b9e08d..235c36be6737 100644 > --- a/MdePkg/Include/Protocol/S3SaveState.h > +++ b/MdePkg/Include/Protocol/S3SaveState.h > @@ -21,7 +21,7 @@ > { 0xe857caf6, 0xc046, 0x45dc, { 0xbe, 0x3f, 0xee, 0x7, 0x65, 0xfb, 0= xa8, 0x87 }} >=20 >=20 > -typedef VOID *EFI_S3_BOOT_SCRIPT_POSITION; > +typedef UINT8 *EFI_S3_BOOT_SCRIPT_POSITION; >=20 > typedef struct _EFI_S3_SAVE_STATE_PROTOCOL EFI_S3_SAVE_STATE_PROTOCOL; >=20 > diff --git a/MdePkg/Include/Protocol/Shell.h b/MdePkg/Include/Protocol/Sh= ell.h > index cfb7878228c5..bf791792b4f2 100644 > --- a/MdePkg/Include/Protocol/Shell.h > +++ b/MdePkg/Include/Protocol/Shell.h > @@ -11,12 +11,13 @@ > #define __EFI_SHELL_PROTOCOL_H__ >=20 > #include > +#include >=20 > #define EFI_SHELL_PROTOCOL_GUID \ > { \ > 0x6302d008, 0x7f9b, 0x4f30, { 0x87, 0xac, 0x60, 0xc9, 0xfe, 0xf5, 0xda= , 0x4e } \ > } > -typedef VOID *SHELL_FILE_HANDLE; > +typedef EFI_FILE_PROTOCOL *SHELL_FILE_HANDLE; >=20 > typedef enum { > /// > diff --git a/MdePkg/Include/Protocol/UserManager.h b/MdePkg/Include/Proto= col/UserManager.h > index 26ac4955f1ec..9abfcffbeebf 100644 > --- a/MdePkg/Include/Protocol/UserManager.h > +++ b/MdePkg/Include/Protocol/UserManager.h > @@ -24,8 +24,10 @@ > 0xbaf1e6de, 0x209e, 0x4adb, { 0x8d, 0x96, 0xfd, 0x8b, 0x71, 0xf3, 0x= f6, 0x83 } \ > } >=20 > -typedef VOID *EFI_USER_PROFILE_HANDLE; > -typedef VOID *EFI_USER_INFO_HANDLE; > +struct EFI_USER_PROFILE_OBJECT; > +typedef struct EFI_USER_PROFILE_OBJECT *EFI_USER_PROFILE_HANDLE; > +struct EFI_USER_INFO_OBJECT; > +typedef struct EFI_USER_INFO_OBJECT *EFI_USER_INFO_HANDLE; >=20 > /// > /// The attributes of the user profile information. > @@ -157,7 +159,8 @@ typedef CHAR16 *EFI_USER_INFO_CREDENTIAL_PROVIDER_NAM= E; > /// Biometric Exchange Formats Framework) specification. > /// > #define EFI_USER_INFO_CBEFF_RECORD 0x0B > -typedef VOID *EFI_USER_INFO_CBEFF; > +struct EFI_USER_INFO_CBEFF_OBJECT; > +typedef struct EFI_USER_INFO_CBEFF_OBJECT *EFI_USER_INFO_CBEFF; > /// > /// Indicates how close of a match the fingerprint must be in order to b= e considered a match. > /// > diff --git a/MdePkg/Include/Uefi/UefiBaseType.h b/MdePkg/Include/Uefi/Uef= iBaseType.h > index a62f13dd064f..be5831991b52 100644 > --- a/MdePkg/Include/Uefi/UefiBaseType.h > +++ b/MdePkg/Include/Uefi/UefiBaseType.h > @@ -28,11 +28,13 @@ typedef RETURN_STATUS EFI_STATUS; > /// > /// A collection of related interfaces. > /// > -typedef VOID *EFI_HANDLE; > +struct EFI_OBJECT; > +typedef struct EFI_OBJECT *EFI_HANDLE; > /// > /// Handle to an event structure. > /// > -typedef VOID *EFI_EVENT; > +struct EFI_EVENT_OBJECT; > +typedef struct EFI_EVENT_OBJECT *EFI_EVENT; > /// > /// Task priority level. > /// > diff --git a/MdePkg/Include/Uefi/UefiInternalFormRepresentation.h > b/MdePkg/Include/Uefi/UefiInternalFormRepresentation.h > index 4a1346a599d0..93bf9e9e0f13 100644 > --- a/MdePkg/Include/Uefi/UefiInternalFormRepresentation.h > +++ b/MdePkg/Include/Uefi/UefiInternalFormRepresentation.h > @@ -20,7 +20,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > /// > /// The following types are currently defined: > /// > -typedef VOID* EFI_HII_HANDLE; > +struct EFI_HII_OBJECT; > +typedef struct EFI_HII_OBJECT* EFI_HII_HANDLE; > typedef CHAR16* EFI_STRING; > typedef UINT16 EFI_IMAGE_ID; > typedef UINT16 EFI_QUESTION_ID; > diff --git a/MdeModulePkg/Core/Dxe/Event/Event.h b/MdeModulePkg/Core/Dxe/= Event/Event.h > index 8141c5003eec..42590cb1dd09 100644 > --- a/MdeModulePkg/Core/Dxe/Event/Event.h > +++ b/MdeModulePkg/Core/Dxe/Event/Event.h > @@ -37,7 +37,7 @@ typedef struct { > } TIMER_EVENT_INFO; >=20 > #define EVENT_SIGNATURE SIGNATURE_32('e','v','n','t') > -typedef struct { > +typedef struct EFI_EVENT_OBJECT { > UINTN Signature; > UINT32 Type; > UINT32 SignalCount; > diff --git a/MdeModulePkg/Core/Dxe/Hand/Handle.h b/MdeModulePkg/Core/Dxe/= Hand/Handle.h > index 83eb2b9f3afe..1f1ab3274e8a 100644 > --- a/MdeModulePkg/Core/Dxe/Hand/Handle.h > +++ b/MdeModulePkg/Core/Dxe/Hand/Handle.h > @@ -15,7 +15,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > /// > /// IHANDLE - contains a list of protocol handles > /// > -typedef struct { > +typedef struct EFI_OBJECT { > UINTN Signature; > /// All handles list of IHANDLE > LIST_ENTRY AllHandles; > diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h b/MdeModulePkg/Core/= PiSmmCore/PiSmmCore.h > index 0908e7f4e9e7..c55da58d465e 100644 > --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h > +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h > @@ -145,7 +145,7 @@ typedef struct { > /// > /// IHANDLE - contains a list of protocol handles > /// > -typedef struct { > +typedef struct EFI_OBJECT { > UINTN Signature; > /// All handles list of IHANDLE > LIST_ENTRY AllHandles; > diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.h > b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.h > index 50d4c96edb63..bfebbb1f8182 100644 > --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.h > +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.h > @@ -88,7 +88,7 @@ struct _EFI_AML_NODE_LIST { > // This buffer should not be freed. > // Size is the total size of this ACPI node buffer. > // > -typedef struct { > +typedef struct EFI_ACPI_OBJECT { > UINT32 Signature; > UINT8 *Buffer; > UINTN Size; > diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h > b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h > index 4a3feab94df5..48972d0fcad6 100644 > --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h > +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h > @@ -274,7 +274,7 @@ typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE { >=20 > #define HII_HANDLE_SIGNATURE SIGNATURE_32 ('h','i','h','l') >=20 > -typedef struct { > +typedef struct EFI_HII_OBJECT { > UINTN Signature; > LIST_ENTRY Handle; > UINTN Key; > diff --git a/StandaloneMmPkg/Core/StandaloneMmCore.h b/StandaloneMmPkg/Co= re/StandaloneMmCore.h > index 4d0eed273f50..dcf91bc5e916 100644 > --- a/StandaloneMmPkg/Core/StandaloneMmCore.h > +++ b/StandaloneMmPkg/Core/StandaloneMmCore.h > @@ -105,7 +105,7 @@ typedef struct { > /// > /// IHANDLE - contains a list of protocol handles > /// > -typedef struct { > +typedef struct EFI_OBJECT { > UINTN Signature; > /// All handles list of IHANDLE > LIST_ENTRY AllHandles; > -- > 2.19.1.3.g30247aa5d201 >=20 >=20 >=20 > -=3D-=3D-=3D-=3D-=3D-=3D > Groups.io Links: You receive all messages sent to this group. >=20 > View/Reply Online (#47388): https://edk2.groups.io/g/devel/message/47388 > Mute This Topic: https://groups.io/mt/34180199/1712937 > Group Owner: devel+owner@edk2.groups.io > Unsubscribe: https://edk2.groups.io/g/devel/unsub [ray.ni@intel.com] > -=3D-=3D-=3D-=3D-=3D-=3D