<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:等线;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@等线";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle20
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1118522508;
        mso-list-template-ids:-812620882;}
@list l0:level1
        {mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l1
        {mso-list-id:1468354446;
        mso-list-template-ids:-2017058554;}
@list l2
        {mso-list-id:1972635800;
        mso-list-template-ids:-793053868;}
@list l2:level1
        {mso-level-tab-stop:.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level2
        {mso-level-tab-stop:1.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level3
        {mso-level-tab-stop:1.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level4
        {mso-level-tab-stop:2.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level5
        {mso-level-tab-stop:2.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level6
        {mso-level-tab-stop:3.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level7
        {mso-level-tab-stop:3.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level8
        {mso-level-tab-stop:4.0in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l2:level9
        {mso-level-tab-stop:4.5in;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l3
        {mso-list-id:2095737304;
        mso-list-template-ids:-1962016300;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Jeff,<o:p></o:p></p>
<p class="MsoNormal">RefreshAllBootOption() only modifies/creates the auto-created boot options. For the boot options created by platform boot manager library, they stay with no one touches. And all auto-created boot options are appended in the end of boot
 option list (through BootOrder).<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Jeff Brasen <jbrasen@nvidia.com> <br>
<b>Sent:</b> Thursday, November 7, 2019 12:13 PM<br>
<b>To:</b> afish@apple.com; Ni, Ray <ray.ni@intel.com><br>
<b>Cc:</b> devel@edk2.groups.io; Ashish Singhal <ashishsingha@nvidia.com>; Laszlo Ersek <lersek@redhat.com>; Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>; Gao, Zhichao <zhichao.gao@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com><br>
<b>Subject:</b> RE: [edk2-devel] [PATCH] Support skipping automatic BM enumeration<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">As the suggestions below made sense, we updated our platform boot manager library to behave in this manner and for normal boots everything works well. However the UiApp and boot maintenance applications in EDK2 also call EfiBootManagerRefreshAllBootOption()
 when ever a user goes into the menu which will re-create the skipped boot options with no place for the platform code to intervene.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What about a solution where we add a new Platform library function that allows for override of the behavior of BmEnumerateBootOptions? For example, either a function or protocol that takes the same parameters as this function and only if
 it returns NULL then we continue to the default enumeration code.  Or a function call inserted at the end that would modify the load option array after the system does the standard enumeration.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Jeff<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> <a href="mailto:afish@apple.com">afish@apple.com</a> <<a href="mailto:afish@apple.com">afish@apple.com</a>>
<br>
<b>Sent:</b> Wednesday, November 6, 2019 9:20 AM<br>
<b>To:</b> Ni, Ray <<a href="mailto:ray.ni@intel.com">ray.ni@intel.com</a>><br>
<b>Cc:</b> <a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a>; Jeff Brasen <<a href="mailto:jbrasen@nvidia.com">jbrasen@nvidia.com</a>>; Ashish Singhal <<a href="mailto:ashishsingha@nvidia.com">ashishsingha@nvidia.com</a>>; Laszlo Ersek <<a href="mailto:lersek@redhat.com">lersek@redhat.com</a>>;
 Wang, Jian J <<a href="mailto:jian.j.wang@intel.com">jian.j.wang@intel.com</a>>; Wu, Hao A <<a href="mailto:hao.a.wu@intel.com">hao.a.wu@intel.com</a>>; Gao, Zhichao <<a href="mailto:zhichao.gao@intel.com">zhichao.gao@intel.com</a>>; Mike Kinney <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>><br>
<b>Subject:</b> Re: [edk2-devel] [PATCH] Support skipping automatic BM enumeration<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Ray,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Is there an obvious hook point we could point Jeff and Ashish at? <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Long term it would be a good idea to have a Wiki page to give some guidance on how to customize the BDS. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Andrew Fish<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">On Nov 5, 2019, at 9:20 PM, Ni, Ray <<a href="mailto:ray.ni@intel.com">ray.ni@intel.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Andrew,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">I agree with your opinion.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">It’s expected that Platform Boot Manager lib calls EfiBootManagerRefreshAllBootOption() only in full configuration boot path.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">The full configuration boot path is chosen when hardware changes happen. So it’s not expected EfiBootManagerRefresh…() be<br>
called in every boot.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">So you could:<o:p></o:p></p>
</div>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;margin-bottom:.0001pt;mso-list:l0 level1 lfo3">
Delete the auto-created option pointing to LoadFile instance<o:p></o:p></li><li class="MsoListParagraph" style="margin-top:0in;margin-bottom:0in;margin-bottom:.0001pt;mso-list:l0 level1 lfo3">
Create your own one with customized description.<o:p></o:p></li></ol>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<div>
<p class="MsoNormal"><b>From:</b><span class="apple-converted-space"> </span><a href="mailto:afish@apple.com">afish@apple.com</a> <<a href="mailto:afish@apple.com">afish@apple.com</a>><span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Wednesday, November 6, 2019 10:47 AM<br>
<b>To:</b><span class="apple-converted-space"> </span><a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a>;
<a href="mailto:jbrasen@nvidia.com">jbrasen@nvidia.com</a><br>
<b>Cc:</b><span class="apple-converted-space"> </span>Ashish Singhal <<a href="mailto:ashishsingha@nvidia.com">ashishsingha@nvidia.com</a>>; Laszlo Ersek <<a href="mailto:lersek@redhat.com">lersek@redhat.com</a>>; Ni, Ray <<a href="mailto:ray.ni@intel.com">ray.ni@intel.com</a>>;
 Wang, Jian J <<a href="mailto:jian.j.wang@intel.com">jian.j.wang@intel.com</a>>; Wu, Hao A <<a href="mailto:hao.a.wu@intel.com">hao.a.wu@intel.com</a>>; Gao, Zhichao <<a href="mailto:zhichao.gao@intel.com">zhichao.gao@intel.com</a>>; Kinney, Michael D <<a href="mailto:michael.d.kinney@intel.com">michael.d.kinney@intel.com</a>><br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: [edk2-devel] [PATCH] Support skipping automatic BM enumeration<o:p></o:p></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
<br>
<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal">On Nov 5, 2019, at 7:34 PM, Jeff Brasen <<a href="mailto:jbrasen@nvidia.com"><span style="color:purple">jbrasen@nvidia.com</span></a>> wrote:<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif"><br>
Wouldn't having a variable that we create and delete on every boot put unnecessary stress on the SPI-NOR that the variable store lives on?<br>
What about the alternative approach where we allow the platform code to modify the attributes of the auto created variable to disable it with hidden/!active but still match for detection purposes so that it doesn't delete and recreate the modified variable
 each boot? That way all the logic on what to disable can still be in the platform code and all the existing logic in the boot manager can stay basically the same?<br>
<br>
What changes every boot that forces the variable to need to get modified?<span class="apple-converted-space"> </span><br>
<br>
I would assume the NOR driver is smart enough to not update a variable that is not changing.<span class="apple-converted-space"> </span><br>
<br>
The custom BDS could could only create the variable for this device if it does not exist.<span class="apple-converted-space"> </span><br>
<br>
[JB] The current flow with no changes in the boot manager would be as follows</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
<div>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoNormal" style="mso-list:l2 level1 lfo6"><span style="font-family:"Helvetica",sans-serif">Scan for instance of the boot option in the variables</span><o:p></o:p></li><li class="MsoNormal" style="mso-list:l2 level1 lfo6"><span style="font-family:"Helvetica",sans-serif">It will not be found, so create a new boot option store it to a variable and update BootOrder</span><o:p></o:p></li><li class="MsoNormal" style="mso-list:l2 level1 lfo6"><span style="font-family:"Helvetica",sans-serif">Platform code runs creates the options for the boot option it wants and writes those to variable store</span><o:p></o:p></li><li class="MsoNormal" style="mso-list:l2 level1 lfo6"><span style="font-family:"Helvetica",sans-serif">Delete/disable the boot option in the variable store</span><o:p></o:p></li></ol>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif">When you reboot it won't find the variable so 1/2/4 will re-occur</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif">The code that does this (1/2) is EfiBootManagerRefreshAllBootOption in BmBoot.c</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif">If you modify the variable to disable it with hidden/not active it would delete that and create a new one as well as the code wouldn't recognize that is the same boot option.</span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica",sans-serif">If however we modify EfiBootManagerFindLoadOption to not compare the attributes (at least allow for differences in active and hidden) then the when it refreshes every thing it would see the
 match and not delete/create a new variable in the store and thus we wouldn't have changes every boot.</span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"> </span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</blockquote>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Jeff,<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Sorry if I'm a little off on the sequence of things as the platform I work on day to day has a custom BDS and does not use this library..... I though the patch changed BmEnumerateBootOptions(), so that is going to change how EfiBootManagerRefreshAllBootOption()
 works. I'd also point out the patch as given is invalid as it changed the behavior of the public library API for EfiBootManagerRefreshAllBootOption() [1] so for the patch to be valid it would need to change the comments to reflect the new behavior. This is
 kind of what Laszlo's technical debt comment was about. <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">I think Laszlo advocated having the BDS platform specific code make sure the boot variables are in the correct state. That should happen before the Boot Manager code runs, and it is  not clear to me why the Boot Manager could would need
 to run if you have a valid EFI nvram variable to boot from. <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">I think the question is how is your use case different than the boot variable that Windows installs? If it works kind of the same way then the answer is to have the BDS platform specific code write the boot variable. <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">[1]<o:p></o:p></p>
</div>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">/**<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  The function creates boot options for all possible bootable medias in the following order:<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  1. Removable BlockIo            - The boot option only points to the removable media<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">                                    device, like USB key, DVD, Floppy etc.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  2. Fixed BlockIo                - The boot option only points to a Fixed blockIo device,<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">                                    like HardDisk.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  3. Non-BlockIo SimpleFileSystem - The boot option points to a device supporting<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">                                    SimpleFileSystem Protocol, but not supporting BlockIo<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">                                    protocol.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  4. LoadFile                     - The boot option points to the media supporting<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">                                    LoadFile protocol.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  Reference: UEFI Spec chapter 3.3 Boot Option Variables Default Boot Behavior<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  The function won't delete the boot option not added by itself.<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">**/<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">VOID<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">EFIAPI<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">EfiBootManagerRefreshAllBootOption (<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  VOID<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">  );<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="MsoNormal">Andrew Fish<o:p></o:p></p>
</div>
</div>
</div>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
<br>
<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"><br>
</span><span style="font-family:"Helvetica",sans-serif">Thanks,</span><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"><br>
<br>
</span><span style="font-family:"Helvetica",sans-serif">Andrew Fish</span><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"><br>
<br>
</span><span style="font-family:"Helvetica",sans-serif">Thanks,</span><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"><br>
<br>
</span><span style="font-family:"Helvetica",sans-serif">Jeff</span><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif"><br>
<br>
</span><o:p></o:p></p>
</div>
</div>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif">
<hr size="2" width="100%" align="center">
</span></div>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif">This email message is for the sole use of the intended recipient(s) and may contain confidential information.  Any unauthorized review, use, disclosure or distribution is
 prohibited.  If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message.</span><o:p></o:p></p>
</div>
</div>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:9.0pt;font-family:"Helvetica",sans-serif">
<hr size="2" width="100%" align="center">
</span></div>
</div>
<div>
<div>
<p class="MsoNormal"><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>

<div width="1" style="color:white;clear:both">_._,_._,_</div>
<hr>
Groups.io Links:<p>

You receive all messages sent to this group.


<p>

<a target="_blank" href="https://edk2.groups.io/g/devel/message/50176">View/Reply Online (#50176)</a> |


  


|


  
    <a target="_blank" href="https://groups.io/mt/39747302/1813853">Mute This Topic</a>
  

| <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>



<br>

<a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> |
<a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |

<a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>

 [edk2-devel-archive@redhat.com]<br>
<div width="1" style="color:white;clear:both">_._,_._,_</div>