public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kubacki, Michael A" <michael.a.kubacki@intel.com>
To: "Gao, Liming" <liming.gao@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Bi, Dandan" <dandan.bi@intel.com>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	"Dong, Eric" <eric.dong@intel.com>,
	Laszlo Ersek <lersek@redhat.com>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Ni, Ray" <ray.ni@intel.com>,
	"Wang, Jian J" <jian.j.wang@intel.com>,
	"Wu, Hao A" <hao.a.wu@intel.com>,
	"Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [PATCH V4 00/10] UEFI Variable SMI Reduction
Date: Tue, 15 Oct 2019 16:15:24 +0000	[thread overview]
Message-ID: <DM6PR11MB3834BBEE3B75334D7DB2DC5EB5930@DM6PR11MB3834.namprd11.prod.outlook.com> (raw)
In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E517150@SHSMSX104.ccr.corp.intel.com>

That sounds good to me.

Thanks,
Michael

> -----Original Message-----
> From: Gao, Liming <liming.gao@intel.com>
> Sent: Monday, October 14, 2019 5:50 PM
> To: Kubacki, Michael A <michael.a.kubacki@intel.com>;
> devel@edk2.groups.io
> Cc: Bi, Dandan <dandan.bi@intel.com>; Ard Biesheuvel
> <ard.biesheuvel@linaro.org>; Dong, Eric <eric.dong@intel.com>; Laszlo Ersek
> <lersek@redhat.com>; Kinney, Michael D <michael.d.kinney@intel.com>; Ni,
> Ray <ray.ni@intel.com>; Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> <hao.a.wu@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>
> Subject: RE: [PATCH V4 00/10] UEFI Variable SMI Reduction
> 
> Michael:
>   I add this feature into edk2-stable2019011 tag planning. Is it ok to you?
> 
> Thanks
> Liming
> >-----Original Message-----
> >From: Kubacki, Michael A
> >Sent: Tuesday, October 15, 2019 7:30 AM
> >To: devel@edk2.groups.io
> >Cc: Bi, Dandan <dandan.bi@intel.com>; Ard Biesheuvel
> ><ard.biesheuvel@linaro.org>; Dong, Eric <eric.dong@intel.com>; Laszlo
> >Ersek <lersek@redhat.com>; Gao, Liming <liming.gao@intel.com>; Kinney,
> >Michael D <michael.d.kinney@intel.com>; Ni, Ray <ray.ni@intel.com>;
> >Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> >Yao, Jiewen <jiewen.yao@intel.com>
> >Subject: [PATCH V4 00/10] UEFI Variable SMI Reduction
> >
> >REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2220
> >
> >V4 Changes:
> > [PATCH V3 7/9] MdeModulePkg/Variable: Add RT GetVariable() cache
> >support
> > * Set
> gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache
> >to FALSE
> >   by default in MdeModulePkg.dec.
> >
> > * Added a new patch to set
> >gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache
> >   to TRUE at the end of the patch series. This allows someone to
> >bisect an issue at
> >   patch #7 or patch #8 in the series with no change in variable caching
> behavior.
> >The
> >   runtime cache variable logic would be applied explicitly in V4 patch #10.
> >
> >V3 Changes:
> > [PATCH V2 1/9] MdeModulePkg/Variable: Consolidate common parsing
> >functions
> > * Removed GUIDs added to VariableStandaloneMm.inf that are not
> required.
> > * Added more details to the commit message describing the criteria of
> >   moving the chosen functions to VariableParsing.c.
> >
> > [PATCH V2 2/9] MdeModulePkg/Variable: Parameterize
> GetNextVariableEx()
> >store list
> > * RenamedGetNextVariableEx () to
> >VariableServiceGetNextVariableInternal ()
> > * Updated comments in VariableServiceGetNextVariableInternal () to
> >refer to
> >   "FindVariablEx ()" instead of "FindVariable ()" since FindVariableEx ()
> >   is not used in the function.
> >
> > [PATCH V2 3/9] MdeModulePkg/Variable: Parameterize
> VARIABLE_INFO_ENTRY
> >buffer
> > * Updated the commit message to clarify the message "structure can be
> >updated
> >   outside the fixed global variable".
> >
> > [edk2-devel] [PATCH V2 4/9] MdeModulePkg/Variable: Add local auth
> >status in VariableParsing
> > * Remove the function InitVariableParsing ()
> > * Remove the mAuthFormat global variable and instead add a BOOLEAN
> >parameter
> >   to all functions that require variable authentication information  to
> >   indicate if authenticated variables are used.
> >   * This allows the authenticated variable status to be tracked in one place
> in
> >     each variable driver in the SMM variable solution
> (VariableSmmRuntimeDxe
> >     and VariableSmm).
> >
> > [edk2-devel] [PATCH V2 5/9] MdeModulePkg/Variable: Add a file for NV
> >variable functions
> > * Added the following non-volatile related functions to
> VariableNonVolatile.c
> >   from Variable.c:
> >   * InitRealNonVolatileVariableStore ()
> >   * InitEmuNonVolatileVariableStore ()
> >   * InitNonVolatileVariableStore ()
> >
> > [edk2-devel] [PATCH V2 7/9] MdeModulePkg/Variable: Add RT
> >GetVariable() cache support
> > * Added a FeaturePCD to control enabling the runtime variable cache -
> >   gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache.
> > * Removed usage of the TimerLib and the wait to acquire
> >   mVariableRuntimeCacheReadLock. Can rely on the UEFI specification
> >   restrictions on Runtime Services callers.
> > * Removed the EFIAPI keyword from internal functions.
> > * Removed PCDs in VariableSmmRuntimeDxe.inf not required.
> > * Removed the HobVariableBackupBase variable no longer required.
> > * Renamed SynchronizeRuntimeVariableCacheEx () to better reflect usage.
> > * Renamed functions in VariableRuntimeCache.c to better reflect usage.
> > * Introduced a local variable in
> FlushPendingRuntimeVariableCacheUpdates ()
> >   to reduce duplication of
> >   mVariableModuleGlobal->VariableGlobal.VariableRuntimeCacheContext.
> > * Corrected the macro used in SmmVariableHandler () to
> >
> SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT.
> > * Remove usage of the
> EDKII_PI_SMM_COMMUNICATION_REGION_TABLE
> >to acquire a
> >   CommBuffer from the EFI System Table and use the same runtime
> >CommBuffer
> >   allocated for variable SMM communicate calls.
> >
> > [PATCH V2 8/9] MdeModulePkg/Variable: Add RT GetNextVariableName()
> >cache support
> > * Removed usage of the TimerLib and the wait to acquire
> >   mVariableRuntimeCacheReadLock. Can rely on the UEFI specification
> >restrictions
> >   on Runtime Services callers.
> >
> > * Added a new patch to disable
> >gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache
> >   for all OvmfPkg package builds as requested by maintainer Laszlo Ersek.
> >
> >V2 Changes:
> >
> >Patch #1 in V1 both moved functions to VariableParsing.c and modified
> >some functionality in those functions. In V2, the functions are first
> >moved and then functionality is modified in subsequent patches. This
> >resulted in the following new patches in the V2 patch series:
> >
> > 1. MdeModulePkg/Variable: Parameterize GetNextVariableEx() store list
> > 2. MdeModulePkg/Variable: Parameterize VARIABLE_INFO_ENTRY buffer
> 3.
> > MdeModulePkg/Variable: Add local auth status in VariableParsing 4.
> > MdeModulePkg/Variable: Add a file for NV variable functions
> >
> >Apart from this refactor in the patches, no functionally impacting
> >changes were made.
> >
> >Overview
> >---------
> >This patch series reduces SMM usage when using VariableSmmRuntimeDxe
> >with VariableSmm. It does so by eliminating SMM usage for runtime
> >service GetVariable () and GetNextVariableName () invocations. Most
> >UEFI variable usage in typical systems after the variable store is
> >initialized (e.g. manufacturing boots) is due to GetVariable ( ) and
> >GetNextVariableName () not SetVariable (). GetVariable () calls can
> >regularly exceed 100 per boot while SetVariable () calls typically
> >remain less than 10 per boot. By focusing on the common case, the
> >majority of overhead associated with SMM can be avoided while still
> >using existing and proven code for operations such as variable
> >authentication that require an isolated execution environment.
> >
> > * Advantage: Reduces overall system SMM usage
> > * Disadvantage: Requires more Runtime data memory usage
> >
> >The runtime cache behavior described for this patch series is enabled
> >by default but can be disabled with a new FeaturePCD added to
> >MdeModulePkg.dec:
> >  gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache
> >
> >The reaminder of this blurb describes the changes and behavior when the
> >PCD is set to TRUE.
> >
> >Initial Performance Observations
> >---------------------------------
> > * With these proposed changes, an Intel Atom based SoC saw GetVariable
> ( )
> >   time for an existing variable reduce from ~220us to ~5us.
> >
> >Major Changes
> >--------------
> > 1. Two UEFI variable caches will be maintained.
> >     a. "Runtime Cache" - Maintained in VariableSmmRuntimeDxe. Used to
> >serve
> >         runtime service GetVariable () and GetNextVariableName () callers.
> >     b. "SMM cache" - Maintained in VariableSmm to service SMM
> GetVariable ()
> >         and GetNextVariableName () callers.
> >         i. A cache in SMRAM is retained so SMM modules do not operate on
> data
> >            outside SMRAM.
> > 2. A new UEFI variable read and write flow will be used as described below.
> >
> >At any given time, the two caches would be coherent. On a variable
> >write, the runtime cache is only updated after validation in SMM and,
> >in the case of a non-volatile UEFI variable, the variable must also be
> >successfully written to non-volatile storage.
> >
> >Prior RFC Feedback Addressed
> >-----------------------------
> >RFC sent Sept. 5, 2019: https://edk2.groups.io/g/devel/message/46939
> >
> >1. UEFI variable data retrieval from a ring 0 buffer
> >
> >   A common concern with this proposed set of changes is the potential
> >security
> >   threat presented by serving runtime services callers from a ring 0 memory
> >   buffer of EfiRuntimeServicesData type. The conclusion was that this
> change
> >   does not fundamentally alter the attack surface. The UEFI variable
> Runtime
> >   Services are invoked from ring 0 and the data already travels through ring
> >   0 buffers (such as the SMM communicate buffer) to reach the caller. Even
> >   today if ring 0 is assumed to be malicious, the malicious code may keep
> one
> >   AP in a loop to monitor the communication data, when the BSP gets an
> >   (authenticated) variable. When the communication buffer is updated
> >and the
> >   status is set to EFI_SUCCESS, the AP may modify the communication
> buffer
> >   contents such the tampered data is returned to the BSP caller. Or an
> >   interrupt handler on the BSP may alter the communication buffer
> contents
> >   before the data is returned to the caller. In summary, this was not found
> to
> >   introduce any attack not possible today.
> >
> >2. VarCheckLib impact
> >
> >   VarCheckLib plays a role in SetVariable () calls. This patch series only
> >   changes GetVariable () behavior. Therefore, VarCheckLib is expected to
> >   have no impact due to these changes.
> >
> >Testing Performed
> >------------------
> >This code was tested with the master branch of edk2 on an Intel Kaby
> >Lake U and Intel Whiskey Lake U reference validation platform. The set
> >of tests performed included:
> >
> >1.  Boot from S5 to Windows 10 OS with SMM variables enabled and
> >    the variable runtime cache enabled.
> >2.  Boot from S5 to Ubuntu 18.04.1 LTS with SMM variable enabled
> >    and the variable runtime cache enabled.
> >3.  Boot from S5 to Windows 10 OS with SMM variables enabled and
> >    the variable runtime cache disabled.
> >4.  Boot from S5 to Ubuntu 18.04.1 LTS with SMM variable enabled
> >    and the variable runtime cache disabled.
> >5.  Boot from S5 to EFI shell with DXE variables enabled.
> >    (commit 2de1f611be broke OvmfPkgIa32X64 boot regardless of
> >     this patch series; testing without this commit was successful) 6.
> >Dump UEFI variable store at shell with dmpstore to verify contents.
> >7.  Dump NvStorage FV from SPI flash after boot to verify contents written.
> >8.  Dump UEFI variable statistics with VariableInfo at shell.
> >9.  Boot with emulated variables enabled.
> >10. Cycles of adding and deleting a UEFI variable to verify cache correctness.
> >11. Set OsIndications to stop at FW UI to verify cache load of non-volatile
> >    contents.
> >
> >Why Keep SMM on Variable Writes
> >--------------------------------
> > * SMM provides a ubiquitous isolated execution environment in x86 for
> >   authenticated UEFI variables.
> > * BIOS region SPI flash write restrictions to SMM in platforms today can
> >   be retained.
> >
> >Today's UEFI Variable Cache (for reference)
> >--------------------------------------------
> > * Maintained in SMRAM via VariableSmm.
> > * A "write-through" cache of variable data in the form of a UEFI variable
> >   store.
> > * Non-volatile and volatile variables are maintained in separate
> >buffers
> >  (variable stores).
> >
> >Runtime & SMM Cache Coherency
> >------------------------------
> >The non-volatile cache should always accurately reflect non-volatile
> >storage contents (done today) and the "SMM cache" and "Runtime cache"
> >should always be coherent on access. The runtime cache is updated by
> >VariableSmm.
> >
> >Updating both caches from within a SMM SetVariable () operation is
> >fairly straightforward but a race condition can occur if an SMI occurs
> >during the execution of runtime code reading from the runtime cache. To
> >handle this case, a runtime cache read lock is introduced that
> >explicitly moves pending updates from SMM to the runtime cache if an
> >SMM update occurs while the runtime cache is locked. Note that it is
> >not expected a Runtime services call will interrupt SMM processing
> >since all CPU cores rendezvous in SMM.
> >
> >New Key Elements for Coherence
> >-------------------------------
> >Runtime DXE (VariableSmmRuntimeDxe)
> > 1. RuntimeCacheReadLock - A global lock used to lock read access to the
> >                           runtime cache.
> > 2. RuntimeCachePendingUpdate - A global flag used to notify runtime
> >code of a
> >                                pending cache update in SMM.
> >
> >SMM (VariableSmm)
> > 1. FlushRuntimeCachePendingUpdate SMI - A SW SMI handler that
> >synchronizes
> >                                         the runtime cache buffer with the SMM
> >                                         cache buffer.
> >
> >Proposed Runtime DXE Read Flow
> >-------------------------------
> > 1. Acquire RuntimeCacheReadLock
> > 2. If RuntimeCachePendingUpdate flag (rare) is set then:
> >     2.a. Trigger FlushRuntimeCachePendingUpdate SMI
> >     2.b. Verify RuntimeCachePendingUpdate flag is cleared  3. Perform
> >read from RuntimeCache  4. Release RuntimeCacheReadLock
> >
> >Proposed FlushRuntimeCachePendingUpdate SMI
> >--------------------------------------------
> > 1. If RuntimeCachePendingUpdate flag is not set:
> >     1.a. Return
> > 2. Copy the data at RuntimeCachePendingOffset of
> >RuntimeCachePendingLength to
> >    RuntimeCache
> > 3. Clear the RuntimeCachePendingUpdate flag
> >
> >Proposed SMM Write Flow
> >------------------------
> > 1. Perform variable authentication and non-volatile write. If either fail,
> >    return an error to the caller.
> > 2. If RuntimeCacheReadLock is set then:
> >     2.a. Set RuntimeCachePendingUpdate flag
> >     2.b. Update RuntimeCachePendingOffset and
> >RuntimeCachePendingLength to
> >          cover the a superset of the pending chunk (for simplicity, the
> >          entire variable store is currently synchronized).
> >3. Else:
> >     3.a. Update RuntimeCache
> >4. Update SmmCache
> >     - Note: RT read cannot occur during SMI processing since all cores are
> >             locked in SMM.
> >
> >Cc: Dandan Bi <dandan.bi@intel.com>
> >Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >Cc: Eric Dong <eric.dong@intel.com>
> >Cc: Laszlo Ersek <lersek@redhat.com>
> >Cc: Liming Gao <liming.gao@intel.com>
> >Cc: Michael D Kinney <michael.d.kinney@intel.com>
> >Cc: Ray Ni <ray.ni@intel.com>
> >Cc: Jian J Wang <jian.j.wang@intel.com>
> >Cc: Hao A Wu <hao.a.wu@intel.com>
> >Cc: Jiewen Yao <jiewen.yao@intel.com>
> >Signed-off-by: Michael Kubacki <michael.a.kubacki@intel.com>
> >
> >Michael Kubacki (10):
> >  MdeModulePkg/Variable: Consolidate common parsing functions
> >  MdeModulePkg/Variable: Parameterize GetNextVariableInternal () stores
> >  MdeModulePkg/Variable: Parameterize VARIABLE_INFO_ENTRY buffer
> >  MdeModulePkg/Variable: Parameterize auth status in VariableParsing
> >  MdeModulePkg/Variable: Add a file for NV variable functions
> >  MdeModulePkg VariableInfo: Always consider RT DXE and SMM stats
> >  MdeModulePkg/Variable: Add RT GetVariable() cache support
> >  MdeModulePkg/Variable: Add RT GetNextVariableName() cache support
> >  OvmfPkg: Disable variable runtime cache
> >  MdeModulePkg: Enable variable runtime cache by default
> >
> > MdeModulePkg/MdeModulePkg.dec                                        |   12 +
> > OvmfPkg/OvmfPkgIa32.dsc                                              |    1 +
> > OvmfPkg/OvmfPkgIa32X64.dsc                                           |    1 +
> > OvmfPkg/OvmfPkgX64.dsc                                               |    1 +
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
> |
> >6 +
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf           |
> 6
> >+
> >
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDx
> e.i
> >nf |   20 +-
> >
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf
> >|    6 +
> > MdeModulePkg/Include/Guid/SmmVariableCommon.h                        |   29 +-
> > MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h                |  151
> +--
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.h
> |
> >67 +
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h         |
> 347
> >+++++
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeCache.h
> >|   51 +
> > MdeModulePkg/Application/VariableInfo/VariableInfo.c                 |   37 +-
> > MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.c                | 1373
> >++++----------------
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableExLib.c           |
> 24
> >+-
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c
> |
> >334 +++++
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c         |
> 786
> >+++++++++++
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeCache.c
> >|  153 +++
> > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c             |
> 120
> >+-
> >
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.
> c
> >|  655 +++++++++-
> > 21 files changed, 2851 insertions(+), 1329 deletions(-)  create mode
> >100644
> MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.h
> > create mode 100644
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.h
> > create mode 100644
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeCache.h
> > create mode 100644
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c
> > create mode 100644
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c
> > create mode 100644
> >MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeCache.c
> >
> >--
> >2.16.2.windows.1
> 


      reply	other threads:[~2019-10-15 16:15 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-14 23:29 [PATCH V4 00/10] UEFI Variable SMI Reduction Kubacki, Michael A
2019-10-14 23:29 ` [PATCH V4 01/10] MdeModulePkg/Variable: Consolidate common parsing functions Kubacki, Michael A
2019-10-16  7:52   ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 02/10] MdeModulePkg/Variable: Parameterize GetNextVariableInternal () stores Kubacki, Michael A
2019-10-16  7:53   ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 03/10] MdeModulePkg/Variable: Parameterize VARIABLE_INFO_ENTRY buffer Kubacki, Michael A
2019-10-16  7:54   ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 04/10] MdeModulePkg/Variable: Parameterize auth status in VariableParsing Kubacki, Michael A
2019-10-17  1:01   ` Wu, Hao A
2019-10-17  1:41     ` Kubacki, Michael A
2019-10-17  1:49       ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 05/10] MdeModulePkg/Variable: Add a file for NV variable functions Kubacki, Michael A
2019-10-16  7:55   ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 06/10] MdeModulePkg VariableInfo: Always consider RT DXE and SMM stats Kubacki, Michael A
2019-10-16  7:56   ` Wu, Hao A
2019-10-14 23:29 ` [PATCH V4 07/10] MdeModulePkg/Variable: Add RT GetVariable() cache support Kubacki, Michael A
2019-10-16  6:46   ` Wang, Jian J
     [not found]   ` <15CE0DB2DE3EB613.1607@groups.io>
2019-10-16  6:54     ` [edk2-devel] " Wang, Jian J
2019-10-17  1:24       ` Kubacki, Michael A
2019-10-17  1:47         ` Wang, Jian J
2019-10-16  7:56   ` Wu, Hao A
2019-10-16 16:44     ` Kubacki, Michael A
2019-10-17 14:23     ` Wang, Jian J
2019-10-17 17:44       ` Kubacki, Michael A
2019-10-14 23:29 ` [PATCH V4 08/10] MdeModulePkg/Variable: Add RT GetNextVariableName() " Kubacki, Michael A
2019-10-16  7:56   ` Wu, Hao A
2019-10-14 23:30 ` [PATCH V4 09/10] OvmfPkg: Disable variable runtime cache Kubacki, Michael A
2019-10-15  7:32   ` Laszlo Ersek
2019-10-14 23:30 ` [PATCH V4 10/10] MdeModulePkg: Enable variable runtime cache by default Kubacki, Michael A
2019-10-15  7:33   ` Laszlo Ersek
2019-10-16  7:57   ` Wu, Hao A
2019-10-15  0:49 ` [PATCH V4 00/10] UEFI Variable SMI Reduction Liming Gao
2019-10-15 16:15   ` Kubacki, Michael A [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DM6PR11MB3834BBEE3B75334D7DB2DC5EB5930@DM6PR11MB3834.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox