<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:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 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=gb2312">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        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;}
@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:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        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:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:宋体;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle23
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 129.75pt 72.0pt 129.7pt;}
div.WordSection1
        {page:WordSection1;}
--></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="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi Ray,<o:p></o:p></p>
<p class="MsoNormal">Could you help to merge the patch of support 5 level paging iommu to edk2platform branch?<o:p></o:p></p>
<p class="MsoNormal">Do you need more check ?<o:p></o:p></p>
<p class="MsoNormal">Thank you.<o:p></o:p></p>
<p class="MsoNormal">BR<o:p></o:p></p>
<p class="MsoNormal">Sheng Wei<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b>From:</b> Sheng, W <br>
<b>Sent:</b> 2020<span lang="ZH-CN" style="font-family:宋体">年</span>12<span lang="ZH-CN" style="font-family:宋体">月</span>4<span lang="ZH-CN" style="font-family:宋体">日</span> 11:44<br>
<b>To:</b> Huang, Jenny <jenny.huang@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io<br>
<b>Cc:</b> Ni, Ray <ray.ni@intel.com>; Chaganty, Rangasai V <rangasai.v.chaganty@intel.com>; Feng, Roger <roger.feng@intel.com><br>
<b>Subject:</b> RE: [PATCH v5] IntelSiliconPkg/VTd: Add iommu 5 level paging support<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoPlainText">Hi Jenny,<o:p></o:p></p>
<p class="MsoPlainText">Thank you for the review.<o:p></o:p></p>
<p class="MsoPlainText">I add your name under " Reviewed-by " to the patch.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><a id="OWAAMDAC086C12E27431687362E9BB699D829" href="mailto:jiewen.yao@intel.com"><span style="font-family:"Calibri",sans-serif;text-decoration:none">@Yao, Jiewen</span></a>
<o:p></o:p></p>
<p class="MsoPlainText">Do you have more comments about this patch?<o:p></o:p></p>
<p class="MsoPlainText">Thank you.<o:p></o:p></p>
<p class="MsoPlainText">BR<o:p></o:p></p>
<p class="MsoPlainText">Sheng Wei<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">-----Original Message-----</span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">From: Huang, Jenny <<a href="mailto:jenny.huang@intel.com">jenny.huang@intel.com</a>></span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">Sent: 2020</span><span lang="JA" style="font-family:DengXian;mso-fareast-language:JA">年</span><span style="mso-fareast-language:JA">12</span><span lang="JA" style="font-family:DengXian;mso-fareast-language:JA">月</span><span style="mso-fareast-language:JA">4</span><span lang="JA" style="font-family:DengXian;mso-fareast-language:JA">日</span><span style="mso-fareast-language:JA">
 11:33</span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">To: Sheng, W <<a href="mailto:w.sheng@intel.com">w.sheng@intel.com</a>>; Yao, Jiewen <<a href="mailto:jiewen.yao@intel.com">jiewen.yao@intel.com</a>>;</span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA"><a href="mailto:devel@edk2.groups.io">devel@edk2.groups.io</a></span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">Cc: Ni, Ray <<a href="mailto:ray.ni@intel.com">ray.ni@intel.com</a>>; Chaganty, Rangasai V</span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA"><<a href="mailto:rangasai.v.chaganty@intel.com">rangasai.v.chaganty@intel.com</a>>; Feng, Roger <<a href="mailto:roger.feng@intel.com">roger.feng@intel.com</a>></span><o:p></o:p></p>
<p class="MsoPlainText">> <span style="mso-fareast-language:JA">Subject: RE: [PATCH v5] IntelSiliconPkg/VTd: Add iommu 5 level paging support</span><o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Reviewed-by: Jenny Huang < <a href="mailto:jenny.huang@intel.com">
<span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> From: Sheng, W <<a href="mailto:w.sheng@intel.com"><span style="color:windowtext;text-decoration:none">w.sheng@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> Sent: Tuesday, December 1, 2020 7:03 PM<o:p></o:p></p>
<p class="MsoPlainText">> To: Yao, Jiewen <<a href="mailto:jiewen.yao@intel.com"><span style="color:windowtext;text-decoration:none">jiewen.yao@intel.com</span></a>>;
<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a><o:p></o:p></p>
<p class="MsoPlainText">> Cc: Ni, Ray <<a href="mailto:ray.ni@intel.com"><span style="color:windowtext;text-decoration:none">ray.ni@intel.com</span></a>>; Chaganty, Rangasai V<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:rangasai.v.chaganty@intel.com"><span style="color:windowtext;text-decoration:none">rangasai.v.chaganty@intel.com</span></a>>; Huang, Jenny <<a href="mailto:jenny.huang@intel.com"><span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>>;<o:p></o:p></p>
<p class="MsoPlainText">> Feng, Roger <<a href="mailto:roger.feng@intel.com"><span style="color:windowtext;text-decoration:none">roger.feng@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> Subject: [PATCH v5] IntelSiliconPkg/VTd: Add iommu 5 level paging support<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Hi Jiewen,<o:p></o:p></p>
<p class="MsoPlainText">> About the patch of support 5 level paging iommu.<o:p></o:p></p>
<p class="MsoPlainText">> Thank you for giving the review comments.<o:p></o:p></p>
<p class="MsoPlainText">> I have done all the update.<o:p></o:p></p>
<p class="MsoPlainText">> Could you give "review by" on this patch ?<o:p></o:p></p>
<p class="MsoPlainText">> Thank you.<o:p></o:p></p>
<p class="MsoPlainText">> BR<o:p></o:p></p>
<p class="MsoPlainText">> Sheng Wei<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> > From: Sheng, W<o:p></o:p></p>
<p class="MsoPlainText">> > Sent: 2020<span lang="ZH-CN" style="font-family:DengXian">年</span>11<span lang="ZH-CN" style="font-family:DengXian">月</span>24<span lang="ZH-CN" style="font-family:DengXian">日</span> 13:44<o:p></o:p></p>
<p class="MsoPlainText">> > To: Yao, Jiewen <<a href="mailto:jiewen.yao@intel.com"><span style="color:windowtext;text-decoration:none">jiewen.yao@intel.com</span></a>>;
<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a><o:p></o:p></p>
<p class="MsoPlainText">> > Cc: Ni, Ray <<a href="mailto:ray.ni@intel.com"><span style="color:windowtext;text-decoration:none">ray.ni@intel.com</span></a>>; Chaganty, Rangasai V<o:p></o:p></p>
<p class="MsoPlainText">> > <<a href="mailto:rangasai.v.chaganty@intel.com"><span style="color:windowtext;text-decoration:none">rangasai.v.chaganty@intel.com</span></a>>; Huang, Jenny <<a href="mailto:jenny.huang@intel.com"><span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > Subject: RE: [PATCH v4] IntelSiliconPkg/VTd: Add iommu 5 level paging<o:p></o:p></p>
<p class="MsoPlainText">> > support<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Hi Jiewen, All,<o:p></o:p></p>
<p class="MsoPlainText">> > Thank you for the review. I just check and update the patch.<o:p></o:p></p>
<p class="MsoPlainText">> > <a href="https://edk2.groups.io/g/devel/message/67865?p=,,,20,0,0,0::relevance">
<span style="color:windowtext;text-decoration:none">https://edk2.groups.io/g/devel/message/67865?p=,,,20,0,0,0::relevance</span></a>,<o:p></o:p></p>
<p class="MsoPlainText">> > ,posteri<o:p></o:p></p>
<p class="MsoPlainText">> > d%3A2558558,20,2,0,78471874<o:p></o:p></p>
<p class="MsoPlainText">> > Could we continue the patch review ?<o:p></o:p></p>
<p class="MsoPlainText">> > BR<o:p></o:p></p>
<p class="MsoPlainText">> > Sheng Wei<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > > -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> > > From: Yao, Jiewen <<a href="mailto:jiewen.yao@intel.com"><span style="color:windowtext;text-decoration:none">jiewen.yao@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > Sent: 2020<span lang="ZH-CN" style="font-family:DengXian">年</span>11<span lang="ZH-CN" style="font-family:DengXian">月</span>23<span lang="ZH-CN" style="font-family:DengXian">日</span> 16:44<o:p></o:p></p>
<p class="MsoPlainText">> > > To: Sheng, W <<a href="mailto:w.sheng@intel.com"><span style="color:windowtext;text-decoration:none">w.sheng@intel.com</span></a>>;
<a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a><o:p></o:p></p>
<p class="MsoPlainText">> > > Cc: Ni, Ray <<a href="mailto:ray.ni@intel.com"><span style="color:windowtext;text-decoration:none">ray.ni@intel.com</span></a>>; Chaganty, Rangasai V<o:p></o:p></p>
<p class="MsoPlainText">> > > <<a href="mailto:rangasai.v.chaganty@intel.com"><span style="color:windowtext;text-decoration:none">rangasai.v.chaganty@intel.com</span></a>>; Huang, Jenny<o:p></o:p></p>
<p class="MsoPlainText">> > > <<a href="mailto:jenny.huang@intel.com"><span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > Subject: RE: [PATCH v4] IntelSiliconPkg/VTd: Add iommu 5 level<o:p></o:p></p>
<p class="MsoPlainText">> > > paging support<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > Thanks.<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > I only reviewed the policy part. Comment below:<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > 1) I recommend you can merge below 2 if into one - if<o:p></o:p></p>
<p class="MsoPlainText">> > > ((mAcpiDmarTable-<o:p></o:p></p>
<p class="MsoPlainText">> > > >HostAddressWidth <= 48) &&<o:p></o:p></p>
<p class="MsoPlainText">> > > (mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) != 0)) {<o:p></o:p></p>
<p class="MsoPlainText">> > > You can use 2 lines, but there is no need to use 2 if.<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > +      if (mAcpiDmarTable->HostAddressWidth <= 48) {<o:p></o:p></p>
<p class="MsoPlainText">> > > +        if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) != 0)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> > > +          mVtdUnitInformation[VtdIndex].Is5LevelPaging = FALSE;<o:p></o:p></p>
<p class="MsoPlainText">> > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > 2) I think below code has typo.<o:p></o:p></p>
<p class="MsoPlainText">> > > The DEBUG message about 4-level and 5-level should be reversed.<o:p></o:p></p>
<p class="MsoPlainText">> > > Also we should use DEBUG_INFO instead of DEBUG_ERROR.<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > +    if (mVtdUnitInformation[VtdIndex].Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > +      ContextEntry->Bits.AddressWidth = 0x3;<o:p></o:p></p>
<p class="MsoPlainText">> > > +      DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > +    } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > +      ContextEntry->Bits.AddressWidth = 0x2;<o:p></o:p></p>
<p class="MsoPlainText">> > > +      DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> > > > From: Sheng, W <<a href="mailto:w.sheng@intel.com"><span style="color:windowtext;text-decoration:none">w.sheng@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Sent: Monday, November 23, 2020 4:04 PM<o:p></o:p></p>
<p class="MsoPlainText">> > > > To: <a href="mailto:devel@edk2.groups.io"><span style="color:windowtext;text-decoration:none">devel@edk2.groups.io</span></a><o:p></o:p></p>
<p class="MsoPlainText">> > > > Cc: Ni, Ray <<a href="mailto:ray.ni@intel.com"><span style="color:windowtext;text-decoration:none">ray.ni@intel.com</span></a>>; Chaganty, Rangasai V<o:p></o:p></p>
<p class="MsoPlainText">> > > > <<a href="mailto:rangasai.v.chaganty@intel.com"><span style="color:windowtext;text-decoration:none">rangasai.v.chaganty@intel.com</span></a>>; Yao, Jiewen<o:p></o:p></p>
<p class="MsoPlainText">> > > > <<a href="mailto:jiewen.yao@intel.com"><span style="color:windowtext;text-decoration:none">jiewen.yao@intel.com</span></a>>; Huang, Jenny <<a href="mailto:jenny.huang@intel.com"><span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Subject: [PATCH v4] IntelSiliconPkg/VTd: Add iommu 5 level paging<o:p></o:p></p>
<p class="MsoPlainText">> > > > support<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > Support iommu 5 level paging for translation table.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > REF: <a href="https://bugzilla.tianocore.org/show_bug.cgi?id=3067">
<span style="color:windowtext;text-decoration:none">https://bugzilla.tianocore.org/show_bug.cgi?id=3067</span></a><o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > Signed-off-by: Sheng Wei <<a href="mailto:w.sheng@intel.com"><span style="color:windowtext;text-decoration:none">w.sheng@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Cc: Ray Ni <<a href="mailto:ray.ni@intel.com"><span style="color:windowtext;text-decoration:none">ray.ni@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Cc: Rangasai V Chaganty <<a href="mailto:rangasai.v.chaganty@intel.com"><span style="color:windowtext;text-decoration:none">rangasai.v.chaganty@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Cc: Jiewen Yao <<a href="mailto:jiewen.yao@intel.com"><span style="color:windowtext;text-decoration:none">jiewen.yao@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > Cc: Jenny Huang <<a href="mailto:jenny.huang@intel.com"><span style="color:windowtext;text-decoration:none">jenny.huang@intel.com</span></a>><o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > >  .../Feature/VTd/IntelVTdDxe/DmaProtection.c        |   4 +-<o:p></o:p></p>
<p class="MsoPlainText">> > > >  .../Feature/VTd/IntelVTdDxe/DmaProtection.h        |  19 +-<o:p></o:p></p>
<p class="MsoPlainText">> > > >  .../Feature/VTd/IntelVTdDxe/TranslationTable.c     | 281<o:p></o:p></p>
<p class="MsoPlainText">> > +++++++++++++++--<o:p></o:p></p>
<p class="MsoPlainText">> > > > ----<o:p></o:p></p>
<p class="MsoPlainText">> > > >  .../Feature/VTd/IntelVTdDxe/TranslationTableEx.c   |  31 ++-<o:p></o:p></p>
<p class="MsoPlainText">> > > >  .../Feature/VTd/IntelVTdDxe/VtdReg.c               |  10 +-<o:p></o:p></p>
<p class="MsoPlainText">> > > >  5 files changed, 245 insertions(+), 100 deletions(-)<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > index 9b6135ef..628565ee 100644<o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -523,10 +523,10 @@ SetupVtd (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    for (Index = 0; Index < mVtdUnitNumber; Index++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      DEBUG ((DEBUG_INFO,"VTD Unit %d (Segment: %04x)\n", Index,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[Index].Segment));<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (mVtdUnitInformation[Index].ExtRootEntryTable != NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpDmarExtContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[Index].ExtRootEntryTable);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpDmarExtContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[Index].ExtRootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[Index].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (mVtdUnitInformation[Index].RootEntryTable != NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpDmarContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[Index].RootEntryTable);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpDmarContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[Index].RootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[Index].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > h<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > h<o:p></o:p></p>
<p class="MsoPlainText">> > > > index a3331db8..f641cea0 100644<o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > h<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/DmaProtection.<o:p></o:p></p>
<p class="MsoPlainText">> > > > h<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -77,6 +77,7 @@ typedef struct {<o:p></o:p></p>
<p class="MsoPlainText">> > > >    BOOLEAN                          HasDirtyContext;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    BOOLEAN                          HasDirtyPages;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    PCI_DEVICE_INFORMATION           PciDeviceInfo;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  BOOLEAN                          Is5LevelPaging;<o:p></o:p></p>
<p class="MsoPlainText">> > > >  } VTD_UNIT_INFORMATION;<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >  //<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -375,31 +376,37 @@ ParseDmarAcpiTableRmrr (<o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR context entry table.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  RootEntry DMAR root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  RootEntry       DMAR root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging  If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpDmarContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VTD_ROOT_ENTRY *RootEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VTD_ROOT_ENTRY *RootEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    );<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR extended context entry table.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  ExtRootEntry DMAR extended root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  ExtRootEntry    DMAR extended root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging  If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpDmarExtContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VTD_EXT_ROOT_ENTRY *ExtRootEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VTD_EXT_ROOT_ENTRY *ExtRootEntry,  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    );<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  SecondLevelPagingEntry The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  SecondLevelPagingEntry  The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging          If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpSecondLevelPagingEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VOID *SecondLevelPagingEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VOID *SecondLevelPagingEntry,  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    );<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > > diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/Translatio<o:p></o:p></p>
<p class="MsoPlainText">> > > > nT<o:p></o:p></p>
<p class="MsoPlainText">> > > > ab<o:p></o:p></p>
<p class="MsoPlainText">> > > > le.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/Translatio<o:p></o:p></p>
<p class="MsoPlainText">> > > > nT<o:p></o:p></p>
<p class="MsoPlainText">> > > > ab<o:p></o:p></p>
<p class="MsoPlainText">> > > > le.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > index 201d663d..6c786b40 100644<o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/Translatio<o:p></o:p></p>
<p class="MsoPlainText">> > > > nT<o:p></o:p></p>
<p class="MsoPlainText">> > > > ab<o:p></o:p></p>
<p class="MsoPlainText">> > > > le.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/Translatio<o:p></o:p></p>
<p class="MsoPlainText">> > > > nT ab le.c @@ -128,11 +128,26 @@ CreateContextEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >      DEBUG ((DEBUG_INFO,"Source: S%04x B%02x D%02x F%02x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Segment, SourceId.Bits.Bus,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SourceId.Bits.Device, SourceId.Bits.Function));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) == 0)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    mVtdUnitInformation[VtdIndex].Is5LevelPaging = FALSE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT3) != 0)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      mVtdUnitInformation[VtdIndex].Is5LevelPaging = TRUE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (mAcpiDmarTable->HostAddressWidth <= 48) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW &<o:p></o:p></p>
<p class="MsoPlainText">> > > > + BIT2) != 0)<o:p></o:p></p>
<p class="MsoPlainText">> > {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          mVtdUnitInformation[VtdIndex].Is5LevelPaging = FALSE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    } else if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW &<o:p></o:p></p>
<p class="MsoPlainText">> > > > + BIT2) ==<o:p></o:p></p>
<p class="MsoPlainText">> > > > 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "!!!! Page-table type is not supported<o:p></o:p></p>
<p class="MsoPlainText">> > > > + on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return EFI_UNSUPPORTED;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    ContextEntry->Bits.AddressWidth = 0x2;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if (mVtdUnitInformation[VtdIndex].Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      ContextEntry->Bits.AddressWidth = 0x3;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      ContextEntry->Bits.AddressWidth = 0x2;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)mVtdUnitInformation[VtdIndex].RootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > EFI_PAGES_TO_SIZE(EntryTablePages));<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -148,6 +163,7 @@ CreateContextEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]  MemoryBase                  The base of the memory.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]  MemoryLimit                 The limit of the memory.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]  IoMmuAccess                 The IOMMU access.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging              If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    @return The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -157,16 +173,23 @@ CreateSecondLevelPagingEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN UINT64                        MemoryBase,<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN UINT64                        MemoryLimit,<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN UINT64                        IoMmuAccess<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN UINT64                        IoMmuAccess,<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN BOOLEAN                       Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Index5;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index4;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index3;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index2;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Lvl5Start;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Lvl5End;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Lvl4PagesStart;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Lvl4PagesEnd;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Lvl4Start;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Lvl4End;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Lvl3Start;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Lvl3End;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl5PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl4PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl3PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl2PtEntry; @@ -184,7 +207,7<o:p></o:p></p>
<p class="MsoPlainText">> > > @@<o:p></o:p></p>
<p class="MsoPlainText">> > > > CreateSecondLevelPagingEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (SecondLevelPagingEntry == NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      SecondLevelPagingEntry = AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (SecondLevelPagingEntry == NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DEBUG ((DEBUG_ERROR,"Could not Alloc LVL4 PT. \n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG ((DEBUG_ERROR,"Could not Alloc LVL4 or LVL5 PT.<o:p></o:p></p>
<p class="MsoPlainText">> > > > + \n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > >      FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)SecondLevelPagingEntry, EFI_PAGES_TO_SIZE(1)); @@ -197,66<o:p></o:p></p>
<p class="MsoPlainText">> > > > +220,109 @@ CreateSecondLevelPagingEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >      return SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  Lvl4Start = RShiftU64 (BaseAddress, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  Lvl4End = RShiftU64 (EndAddress - 1, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  if (Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl5Start = RShiftU64 (BaseAddress, 48) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl5End = RShiftU64 (EndAddress - 1, 48) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    DEBUG ((DEBUG_INFO,"  Lvl5Start - 0x%x, Lvl5End - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > + Lvl5Start,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl5End));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  DEBUG ((DEBUG_INFO,"  Lvl4Start - 0x%x, Lvl4End - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4Start, Lvl4End));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4Start = RShiftU64 (BaseAddress, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4End = RShiftU64 (EndAddress - 1, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  Lvl4PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  for (Index4 = Lvl4Start; Index4 <= Lvl4End; Index4++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      Lvl4PtEntry[Index4].Uint64 = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL<o:p></o:p></p>
<p class="MsoPlainText">> > > > (0x%x)!!!!!!\n", Index4));<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> (UINTN)Lvl4PtEntry[Index4].Uint64,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      SetSecondLevelPagingEntryAttribute (&Lvl4PtEntry[Index4],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4PagesStart = (Lvl5Start<<9) | Lvl4Start;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4PagesEnd = (Lvl5End<<9) | Lvl4End;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    DEBUG ((DEBUG_INFO,"  Lvl4PagesStart - 0x%x, Lvl4PagesEnd -<o:p></o:p></p>
<p class="MsoPlainText">> > > > + 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PagesStart, Lvl4PagesEnd));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -    Lvl3Start = RShiftU64 (BaseAddress, 30) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if (ALIGN_VALUE_LOW(BaseAddress + SIZE_1GB, SIZE_1GB) <=<o:p></o:p></p>
<p class="MsoPlainText">> > > > EndAddress) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      Lvl3End = SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) - 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      Lvl3End = RShiftU64 (EndAddress - 1, 30) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl5PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl5Start = RShiftU64 (BaseAddress, 48) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl5End = Lvl5Start;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4Start = RShiftU64 (BaseAddress, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4End = RShiftU64 (EndAddress - 1, 39) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    DEBUG ((DEBUG_INFO,"  Lvl4Start - 0x%x, Lvl4End - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > + Lvl4Start,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4End));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    Lvl4PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  for (Index5 = Lvl5Start; Index5 <= Lvl5End; Index5++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if (Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl5PtEntry[Index5].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl5PtEntry[Index5].Uint64 = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if (Lvl5PtEntry[Index5].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL<o:p></o:p></p>
<p class="MsoPlainText">> > > > (0x%x)!!!!!!\n", Index5));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)Lvl5PtEntry[Index5].Uint64,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        SetSecondLevelPagingEntryAttribute (&Lvl5PtEntry[Index5],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl4Start = Lvl4PagesStart & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (((Index5+1)<<9) > Lvl4PagesEnd) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl4End = SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) -<o:p></o:p></p>
<p class="MsoPlainText">> 1;;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl4PagesStart = (Index5+1)<<9;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl4End = Lvl4PagesEnd & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG ((DEBUG_INFO,"  Lvl5(0x%x): Lvl4Start - 0x%x, Lvl4End<o:p></o:p></p>
<p class="MsoPlainText">> > > > + - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index5, Lvl4Start, Lvl4End));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl4PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl5PtEntry[Index5].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl5PtEntry[Index5].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    DEBUG ((DEBUG_INFO,"  Lvl4(0x%x): Lvl3Start - 0x%x, Lvl3End -<o:p></o:p></p>
<p class="MsoPlainText">> 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index4, Lvl3Start, Lvl3End));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -    Lvl3PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PtEntry[Index4].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    for (Index3 = Lvl3Start; Index3 <= Lvl3End; Index3++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        Lvl3PtEntry[Index3].Uint64 = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -          DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL3 PAGE FAIL (0x%x,<o:p></o:p></p>
<p class="MsoPlainText">> > > > 0x%x)!!!!!!\n", Index4, Index3));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    for (Index4 = Lvl4Start; Index4 <= Lvl4End; Index4++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl4PtEntry[Index4].Uint64 = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL4 PAGE FAIL<o:p></o:p></p>
<p class="MsoPlainText">> > > > (0x%x)!!!!!!\n", Index4));<o:p></o:p></p>
<p class="MsoPlainText">> > > >            ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoPlainText">> > > >            return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > >          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> (UINTN)Lvl3PtEntry[Index3].Uint64,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        SetSecondLevelPagingEntryAttribute (&Lvl3PtEntry[Index3],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)Lvl4PtEntry[Index4].Uint64,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        SetSecondLevelPagingEntryAttribute (&Lvl4PtEntry[Index4],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl3Start = RShiftU64 (BaseAddress, 30) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (ALIGN_VALUE_LOW(BaseAddress + SIZE_1GB, SIZE_1GB) <=<o:p></o:p></p>
<p class="MsoPlainText">> > > > EndAddress) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl3End = SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) -<o:p></o:p></p>
<p class="MsoPlainText">> 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl3End = RShiftU64 (EndAddress - 1, 30) & 0x1FF;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG ((DEBUG_INFO,"  Lvl4(0x%x): Lvl3Start - 0x%x, Lvl3End<o:p></o:p></p>
<p class="MsoPlainText">> > > > + - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index4, Lvl3Start, Lvl3End));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -      Lvl2PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl3PtEntry[Index3].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      for (Index2 = 0; Index2 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        Lvl2PtEntry[Index2].Uint64 = BaseAddress;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        SetSecondLevelPagingEntryAttribute (&Lvl2PtEntry[Index2],<o:p></o:p></p>
<p class="MsoPlainText">> > > > IoMmuAccess);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        Lvl2PtEntry[Index2].Bits.PageSize = 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        BaseAddress += SIZE_2MB;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl3PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PtEntry[Index4].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      for (Index3 = Lvl3Start; Index3 <= Lvl3End; Index3++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          Lvl3PtEntry[Index3].Uint64 = (UINT64)(UINTN)AllocateZeroPages<o:p></o:p></p>
<p class="MsoPlainText">> (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL3 PAGE FAIL<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (0x%x,<o:p></o:p></p>
<p class="MsoPlainText">> > > > 0x%x)!!!!!!\n", Index4, Index3));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)Lvl3PtEntry[Index3].Uint64,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          SetSecondLevelPagingEntryAttribute<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (&Lvl3PtEntry[Index3],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl2PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl3PtEntry[Index3].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        for (Index2 = 0; Index2 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          Lvl2PtEntry[Index2].Uint64 = BaseAddress;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          SetSecondLevelPagingEntryAttribute<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (&Lvl2PtEntry[Index2],<o:p></o:p></p>
<p class="MsoPlainText">> > > > IoMmuAccess);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          Lvl2PtEntry[Index2].Bits.PageSize = 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          BaseAddress += SIZE_2MB;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          if (BaseAddress >= MemoryLimit) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            break;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        FlushPageTableMemory (VtdIndex, (UINTN)Lvl2PtEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > >          if (BaseAddress >= MemoryLimit) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >            break;<o:p></o:p></p>
<p class="MsoPlainText">> > > >          }<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      FlushPageTableMemory (VtdIndex, (UINTN)Lvl2PtEntry, SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)&Lvl3PtEntry[Lvl3Start],<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl3PtEntry[Lvl3End + 1] - (UINTN)&Lvl3PtEntry[Lvl3Start]);<o:p></o:p></p>
<p class="MsoPlainText">> > > >        if (BaseAddress >= MemoryLimit) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >          break;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    FlushPageTableMemory (VtdIndex, (UINTN)&Lvl3PtEntry[Lvl3Start],<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl3PtEntry[Lvl3End + 1] - (UINTN)&Lvl3PtEntry[Lvl3Start]);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if (BaseAddress >= MemoryLimit) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      break;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)&Lvl4PtEntry[Lvl4Start],<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl4PtEntry[Lvl4End + 1] - (UINTN)&Lvl4PtEntry[Lvl4Start]);<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  FlushPageTableMemory (VtdIndex, (UINTN)&Lvl4PtEntry[Lvl4Start],<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl4PtEntry[Lvl4End + 1] -<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl4PtEntry[Lvl4Start]);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  FlushPageTableMemory (VtdIndex, (UINTN)&Lvl5PtEntry[Lvl5Start],<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl5PtEntry[Lvl5End + 1] -<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)&Lvl5PtEntry[Lvl5Start]);<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    return SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >  }<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -266,26 +332,28 @@ CreateSecondLevelPagingEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]  VtdIndex                    The index of the VTd engine.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]  IoMmuAccess                 The IOMMU access.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging              If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    @return The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VTD_SECOND_LEVEL_PAGING_ENTRY *<o:p></o:p></p>
<p class="MsoPlainText">> > > >  CreateSecondLevelPagingEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN UINTN   VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN UINT64  IoMmuAccess<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN UINT64  IoMmuAccess,<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    SecondLevelPagingEntry = NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  SecondLevelPagingEntry = CreateSecondLevelPagingEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (VtdIndex, SecondLevelPagingEntry, 0, mBelow4GMemoryLimit,<o:p></o:p></p>
<p class="MsoPlainText">> > > > IoMmuAccess);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  SecondLevelPagingEntry = CreateSecondLevelPagingEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry, 0, mBelow4GMemoryLimit, IoMmuAccess,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (SecondLevelPagingEntry == NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (mAbove4GMemoryLimit != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      ASSERT (mAbove4GMemoryLimit > BASE_4GB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    SecondLevelPagingEntry = CreateSecondLevelPagingEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry, SIZE_4GB, mAbove4GMemoryLimit,<o:p></o:p></p>
<p class="MsoPlainText">> > IoMmuAccess);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    SecondLevelPagingEntry = CreateSecondLevelPagingEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry, SIZE_4GB, mAbove4GMemoryLimit,<o:p></o:p></p>
<p class="MsoPlainText">> > > > IoMmuAccess, Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (SecondLevelPagingEntry == NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -326,11 +394,13 @@ SetupTranslationTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR context entry table.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  RootEntry DMAR root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  RootEntry       DMAR root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging  If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpDmarContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VTD_ROOT_ENTRY *RootEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VTD_ROOT_ENTRY *RootEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                 Index;<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -359,7 +429,7 @@ DumpDmarContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >        if (ContextEntry[Index2].Bits.Present == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >          continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpSecondLevelPagingEntry ((VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry[Index2].Bits.SecondLevelP<o:p></o:p></p>
<p class="MsoPlainText">> > > > ag<o:p></o:p></p>
<p class="MsoPlainText">> > > > e<o:p></o:p></p>
<p class="MsoPlainText">> > > > TranslationPointerLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > ContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpSecondLevelPagingEntry ((VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry[Index2].Bits.SecondLevelP<o:p></o:p></p>
<p class="MsoPlainText">> > > > ag<o:p></o:p></p>
<p class="MsoPlainText">> > > > e<o:p></o:p></p>
<p class="MsoPlainText">> > > > TranslationPointerLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > ContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi),<o:p></o:p></p>
<p class="MsoPlainText">> > > > Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > >    DEBUG ((DEBUG_INFO,"=========================\n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -368,17 +438,22 @@ DumpDmarContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  SecondLevelPagingEntry The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  SecondLevelPagingEntry  The second level paging entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging          If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpSecondLevelPagingEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VOID *SecondLevelPagingEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VOID *SecondLevelPagingEntry,  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Index5;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index4;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index3;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index2;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                          Index1;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                          Lvl5IndexEnd;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl5PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl4PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl3PtEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    VTD_SECOND_LEVEL_PAGING_ENTRY  *Lvl2PtEntry; @@ -386,38<o:p></o:p></p>
<p class="MsoPlainText">> +461,53<o:p></o:p></p>
<p class="MsoPlainText">> > > @@<o:p></o:p></p>
<p class="MsoPlainText">> > > > DumpSecondLevelPagingEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    DEBUG ((DEBUG_VERBOSE,"================\n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > >    DEBUG ((DEBUG_VERBOSE,"DMAR Second Level Page Table:\n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry Base - 0x%x,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Is5LevelPaging - %d\n", SecondLevelPagingEntry, Is5LevelPaging));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry Base - 0x%x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  Lvl5IndexEnd = Is5LevelPaging ?<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY) : 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Lvl4PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  for (Index4 = 0; Index4 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index4++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if (Lvl4PtEntry[Index4].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DEBUG ((DEBUG_VERBOSE,"  Lvl4Pt Entry(0x%03x) - 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > Index4,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PtEntry[Index4].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    Lvl3PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PtEntry[Index4].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    for (Index3 = 0; Index3 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index3++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      if (Lvl3PtEntry[Index3].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        DEBUG ((DEBUG_VERBOSE,"    Lvl3Pt Entry(0x%03x) - 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index3, Lvl3PtEntry[Index3].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  Lvl5PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  for (Index5 = 0; Index5 < Lvl5IndexEnd; Index5++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if (Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl5PtEntry[Index5].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        DEBUG ((DEBUG_VERBOSE,"  Lvl5Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> > > > + 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index5, Lvl5PtEntry[Index5].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl5PtEntry[Index5].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >          continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl4PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl5PtEntry[Index5].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl5PtEntry[Index5].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -      Lvl2PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl3PtEntry[Index3].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      for (Index2 = 0; Index2 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        if (Lvl2PtEntry[Index2].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -          DEBUG ((DEBUG_VERBOSE,"      Lvl2Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index2, Lvl2PtEntry[Index2].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    for (Index4 = 0; Index4 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index4++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl4PtEntry[Index4].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        DEBUG ((DEBUG_VERBOSE,"  Lvl4Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> > > > + 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index4, Lvl4PtEntry[Index4].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (Lvl4PtEntry[Index4].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      Lvl3PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl4PtEntry[Index4].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl4PtEntry[Index4].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      for (Index3 = 0; Index3 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index3++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if (Lvl3PtEntry[Index3].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          DEBUG ((DEBUG_VERBOSE,"   Lvl3Pt Entry(0x%03x) - 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index3, Lvl3PtEntry[Index3].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > >          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        if (Lvl2PtEntry[Index2].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if (Lvl3PtEntry[Index3].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >            continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > >          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -        if (Lvl2PtEntry[Index2].Bits.PageSize == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -          Lvl1PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl2PtEntry[Index2].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl2PtEntry[Index2].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > -          for (Index1 = 0; Index1 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index1++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -            if (Lvl1PtEntry[Index1].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -              DEBUG ((DEBUG_VERBOSE,"        Lvl1Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> > > 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index1, Lvl1PtEntry[Index1].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        Lvl2PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl3PtEntry[Index3].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl3PtEntry[Index3].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        for (Index2 = 0; Index2 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index2++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          if (Lvl2PtEntry[Index2].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            DEBUG ((DEBUG_VERBOSE,"    Lvl2Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index2, Lvl2PtEntry[Index2].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          if (Lvl2PtEntry[Index2].Uint64 == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          if (Lvl2PtEntry[Index2].Bits.PageSize == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            Lvl1PtEntry = (VTD_SECOND_LEVEL_PAGING_ENTRY<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(Lvl2PtEntry[Index2].Bits.AddressLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > Lvl2PtEntry[Index2].Bits.AddressHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +            for (Index1 = 0; Index1 <<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB/sizeof(VTD_SECOND_LEVEL_PAGING_ENTRY); Index1++) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +              if (Lvl1PtEntry[Index1].Uint64 != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +                DEBUG ((DEBUG_VERBOSE,"      Lvl1Pt Entry(0x%03x) -<o:p></o:p></p>
<p class="MsoPlainText">> > > 0x%016lx\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index1, Lvl1PtEntry[Index1].Uint64));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +              }<o:p></o:p></p>
<p class="MsoPlainText">> > > >              }<o:p></o:p></p>
<p class="MsoPlainText">> > > >            }<o:p></o:p></p>
<p class="MsoPlainText">> > > >          }<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -510,6 +600,7 @@ PageAttributeToLength (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]   VtdIndex                 The index used to identify a VTd<o:p></o:p></p>
<p class="MsoPlainText">> engine.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]   SecondLevelPagingEntry   The second level paging entry in<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTd table for the device.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[in]   Address                  The address to be checked.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]   Is5LevelPaging           If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >    @param[out]  PageAttributes           The page attribute of the page<o:p></o:p></p>
<p class="MsoPlainText">> entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    @return The page entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -519,6 +610,7 @@ GetSecondLevelPageTableEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN  UINTN                         VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN  VTD_SECOND_LEVEL_PAGING_ENTRY *SecondLevelPagingEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > >    IN  PHYSICAL_ADDRESS              Address,<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN  BOOLEAN                       Is5LevelPaging,<o:p></o:p></p>
<p class="MsoPlainText">> > > >    OUT PAGE_ATTRIBUTE                *PageAttribute<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -526,17 +618,38 @@ GetSecondLevelPageTableEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                 Index2;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                 Index3;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                 Index4;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINTN                 Index5;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINT64                *L1PageTable;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINT64                *L2PageTable;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINT64                *L3PageTable;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINT64                *L4PageTable;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  UINT64                *L5PageTable;<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > +  Index5 = ((UINTN)RShiftU64 (Address, 48)) &<o:p></o:p></p>
<p class="MsoPlainText">> > > > + PAGING_VTD_INDEX_MASK;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Index4 = ((UINTN)RShiftU64 (Address, 39)) &<o:p></o:p></p>
<p class="MsoPlainText">> PAGING_VTD_INDEX_MASK;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Index3 = ((UINTN)Address >> 30) & PAGING_VTD_INDEX_MASK;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Index2 = ((UINTN)Address >> 21) & PAGING_VTD_INDEX_MASK;<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Index1 = ((UINTN)Address >> 12) & PAGING_VTD_INDEX_MASK;<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  L4PageTable = (UINT64 *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  if (Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    L5PageTable = (UINT64 *)SecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if (L5PageTable[Index5] == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      L5PageTable[Index5] = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (L5PageTable[Index5] == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        DEBUG ((DEBUG_ERROR,"!!!!!! ALLOCATE LVL5 PAGE FAIL<o:p></o:p></p>
<p class="MsoPlainText">> > > > (0x%x)!!!!!!\n", Index4));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        ASSERT(FALSE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        *PageAttribute = PageNone;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      FlushPageTableMemory (VtdIndex, (UINTN)L5PageTable[Index5],<o:p></o:p></p>
<p class="MsoPlainText">> > > > SIZE_4KB);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      SetSecondLevelPagingEntryAttribute<o:p></o:p></p>
<p class="MsoPlainText">> > > > ((VTD_SECOND_LEVEL_PAGING_ENTRY *)&L5PageTable[Index5],<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (UINTN)&L5PageTable[Index5],<o:p></o:p></p>
<p class="MsoPlainText">> > > > sizeof(L5PageTable[Index5]));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    L4PageTable = (UINT64 *)(UINTN)(L5PageTable[Index5] &<o:p></o:p></p>
<p class="MsoPlainText">> > > > PAGING_4K_ADDRESS_MASK_64);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    L4PageTable = (UINT64 *)SecondLevelPagingEntry;  }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (L4PageTable[Index4] == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      L4PageTable[Index4] = (UINT64)(UINTN)AllocateZeroPages (1);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (L4PageTable[Index4] == 0) { @@ -785,7 +898,7 @@<o:p></o:p></p>
<p class="MsoPlainText">> > > > SetSecondLevelPagingAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    while (Length != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    PageEntry = GetSecondLevelPageTableEntry (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry, BaseAddress, &PageAttribute);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    PageEntry = GetSecondLevelPageTableEntry (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SecondLevelPagingEntry, BaseAddress,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging, &PageAttribute);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (PageEntry == NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >        DEBUG ((DEBUG_ERROR, "PageEntry - NULL\n"));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return RETURN_UNSUPPORTED;<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -913,7 +1026,7 @@ SetAccessAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (ExtContextEntry != NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (ExtContextEntry->Bits.Present == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      SecondLevelPagingEntry = CreateSecondLevelPagingEntry (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> 0);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      SecondLevelPagingEntry = CreateSecondLevelPagingEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (VtdIndex, 0,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >        DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry - 0x%x (S%04x<o:p></o:p></p>
<p class="MsoPlainText">> > > > B%02x D%02x F%02x) New\n", SecondLevelPagingEntry, Segment,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        Pt = (UINT64)RShiftU64<o:p></o:p></p>
<p class="MsoPlainText">> > > > ((UINT64)(UINTN)SecondLevelPagingEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > 12);<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -922,7 +1035,7 @@ SetAccessAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > >        ExtContextEntry->Bits.DomainIdentifier = DomainIdentifier;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        ExtContextEntry->Bits.Present = 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        FlushPageTableMemory (VtdIndex, (UINTN)ExtContextEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > sizeof(*ExtContextEntry));<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpDmarExtContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[VtdIndex].ExtRootEntryTable);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpDmarExtContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[VtdIndex].ExtRootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >        mVtdUnitInformation[VtdIndex].HasDirtyContext = TRUE;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > >        SecondLevelPagingEntry = (VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry-<o:p></o:p></p>
<p class="MsoPlainText">> > > > >Bits.SecondLevelPageTranslationPointerLo, ExtContextEntry-<o:p></o:p></p>
<p class="MsoPlainText">> > > > >Bits.SecondLevelPageTranslationPointerHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -930,7 +1043,7 @@ SetAccessAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > >    } else if (ContextEntry != NULL) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (ContextEntry->Bits.Present == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      SecondLevelPagingEntry = CreateSecondLevelPagingEntry (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> 0);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      SecondLevelPagingEntry = CreateSecondLevelPagingEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > + (VtdIndex, 0,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >        DEBUG ((DEBUG_VERBOSE,"SecondLevelPagingEntry - 0x%x (S%04x<o:p></o:p></p>
<p class="MsoPlainText">> > > > B%02x D%02x F%02x) New\n", SecondLevelPagingEntry, Segment,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        Pt = (UINT64)RShiftU64<o:p></o:p></p>
<p class="MsoPlainText">> > > > ((UINT64)(UINTN)SecondLevelPagingEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > 12);<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -939,7 +1052,7 @@ SetAccessAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > >        ContextEntry->Bits.DomainIdentifier = DomainIdentifier;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        ContextEntry->Bits.Present = 1;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        FlushPageTableMemory (VtdIndex, (UINTN)ContextEntry,<o:p></o:p></p>
<p class="MsoPlainText">> > > > sizeof(*ContextEntry));<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpDmarContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[VtdIndex].RootEntryTable);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpDmarContextEntryTable<o:p></o:p></p>
<p class="MsoPlainText">> > > > (mVtdUnitInformation[VtdIndex].RootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >        mVtdUnitInformation[VtdIndex].HasDirtyContext = TRUE;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > >        SecondLevelPagingEntry = (VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ContextEntry-<o:p></o:p></p>
<p class="MsoPlainText">> > > > >Bits.SecondLevelPageTranslationPointerLo, ContextEntry-<o:p></o:p></p>
<p class="MsoPlainText">> > > > >Bits.SecondLevelPageTranslationPointerHi);<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -1000,7 +1113,7 @@ AlwaysEnablePageAttribute (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    if (mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >      DEBUG((DEBUG_INFO, "CreateSecondLevelPagingEntry - %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry =<o:p></o:p></p>
<p class="MsoPlainText">> > > > CreateSecondLevelPagingEntry (VtdIndex, EDKII_IOMMU_ACCESS_READ |<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_WRITE);<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry =<o:p></o:p></p>
<p class="MsoPlainText">> > > > CreateSecondLevelPagingEntry (VtdIndex, EDKII_IOMMU_ACCESS_READ |<o:p></o:p></p>
<p class="MsoPlainText">> > > > EDKII_IOMMU_ACCESS_WRITE,<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    SecondLevelPagingEntry =<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].FixedSecondLevelPagingEntry;<o:p></o:p></p>
<p class="MsoPlainText">> > > > diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableEx.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableEx.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > index 0ed9e3ca..a4466891 100644<o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableEx.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/TranslationTableEx.<o:p></o:p></p>
<p class="MsoPlainText">> > > > c<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -78,11 +78,28 @@ CreateExtContextEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >      DEBUG ((DEBUG_INFO,"DOMAIN: S%04x, B%02x D%02x F%02x\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > mVtdUnitInformation[VtdIndex].Segment, SourceId.Bits.Bus,<o:p></o:p></p>
<p class="MsoPlainText">> > > > SourceId.Bits.Device, SourceId.Bits.Function));<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT2) == 0)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    mVtdUnitInformation[VtdIndex].Is5LevelPaging = FALSE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW & BIT3) != 0)<o:p></o:p></p>
<p class="MsoPlainText">> {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      mVtdUnitInformation[VtdIndex].Is5LevelPaging = TRUE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      if (mAcpiDmarTable->HostAddressWidth <= 48) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW &<o:p></o:p></p>
<p class="MsoPlainText">> > > > + BIT2) != 0)<o:p></o:p></p>
<p class="MsoPlainText">> > {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +          mVtdUnitInformation[VtdIndex].Is5LevelPaging = FALSE;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    } else if ((mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW &<o:p></o:p></p>
<p class="MsoPlainText">> > > > + BIT2) ==<o:p></o:p></p>
<p class="MsoPlainText">> > > > 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "!!!! Page-table type is not supported<o:p></o:p></p>
<p class="MsoPlainText">> > > > + on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return EFI_UNSUPPORTED;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    ExtContextEntry->Bits.AddressWidth = 0x2;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if (mVtdUnitInformation[VtdIndex].Is5LevelPaging) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      ExtContextEntry->Bits.AddressWidth = 0x3;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "Using 4-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    } else {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      ExtContextEntry->Bits.AddressWidth = 0x2;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "Using 5-level page-table on VTD %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > VtdIndex));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > > +<o:p></o:p></p>
<p class="MsoPlainText">> > > >    }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >    FlushPageTableMemory (VtdIndex,<o:p></o:p></p>
<p class="MsoPlainText">> > > > (UINTN)mVtdUnitInformation[VtdIndex].ExtRootEntryTable,<o:p></o:p></p>
<p class="MsoPlainText">> > > > EFI_PAGES_TO_SIZE(EntryTablePages));<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -93,11 +110,13 @@ CreateExtContextEntry (<o:p></o:p></p>
<p class="MsoPlainText">> > > >  /**<o:p></o:p></p>
<p class="MsoPlainText">> > > >    Dump DMAR extended context entry table.<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > -  @param[in]  ExtRootEntry DMAR extended root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  ExtRootEntry    DMAR extended root entry.<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  @param[in]  Is5LevelPaging  If it is the 5 level paging.<o:p></o:p></p>
<p class="MsoPlainText">> > > >  **/<o:p></o:p></p>
<p class="MsoPlainText">> > > >  VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > >  DumpDmarExtContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > > -  IN VTD_EXT_ROOT_ENTRY *ExtRootEntry<o:p></o:p></p>
<p class="MsoPlainText">> > > > +  IN VTD_EXT_ROOT_ENTRY *ExtRootEntry,  IN BOOLEAN Is5LevelPaging<o:p></o:p></p>
<p class="MsoPlainText">> > > >    )<o:p></o:p></p>
<p class="MsoPlainText">> > > >  {<o:p></o:p></p>
<p class="MsoPlainText">> > > >    UINTN                 Index;<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -127,7 +146,7 @@ DumpDmarExtContextEntryTable (<o:p></o:p></p>
<p class="MsoPlainText">> > > >        if (ExtContextEntry[Index2].Bits.Present == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >          continue;<o:p></o:p></p>
<p class="MsoPlainText">> > > >        }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DumpSecondLevelPagingEntry ((VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry[Index2].Bits.SecondLev<o:p></o:p></p>
<p class="MsoPlainText">> > > > el<o:p></o:p></p>
<p class="MsoPlainText">> > > > Pa<o:p></o:p></p>
<p class="MsoPlainText">> > > > geTranslationPointerLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > ExtContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi))<o:p></o:p></p>
<p class="MsoPlainText">> > > > ;<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DumpSecondLevelPagingEntry ((VOID<o:p></o:p></p>
<p class="MsoPlainText">> > > > *)(UINTN)VTD_64BITS_ADDRESS(ExtContextEntry[Index2].Bits.SecondLev<o:p></o:p></p>
<p class="MsoPlainText">> > > > el<o:p></o:p></p>
<p class="MsoPlainText">> > > > Pa<o:p></o:p></p>
<p class="MsoPlainText">> > > > geTranslationPointerLo,<o:p></o:p></p>
<p class="MsoPlainText">> > > > ExtContextEntry[Index2].Bits.SecondLevelPageTranslationPointerHi),<o:p></o:p></p>
<p class="MsoPlainText">> > > > Is5LevelPaging);<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > >      if (ExtRootEntry[Index].Bits.UpperPresent == 0) { diff --git<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > index 699639ba..686d235f 100644<o:p></o:p></p>
<p class="MsoPlainText">> > > > ---<o:p></o:p></p>
<p class="MsoPlainText">> > > > a/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg.c<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++ b/Silicon/Intel/IntelSiliconPkg/Feature/VTd/IntelVTdDxe/VtdReg<o:p></o:p></p>
<p class="MsoPlainText">> > > > +++ .c<o:p></o:p></p>
<p class="MsoPlainText">> > > > @@ -174,8 +174,14 @@ PrepareVtdConfig (<o:p></o:p></p>
<p class="MsoPlainText">> > > >      if ((mVtdUnitInformation[Index].CapReg.Bits.SLLPS & BIT0) == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > >        DEBUG((DEBUG_WARN, "!!!! 2MB super page is not supported on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", Index));<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > > -    if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT2) == 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > -      DEBUG((DEBUG_ERROR, "!!!! 4-level page-table is not supported on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", Index));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT3) != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_INFO, "Support 5-level page-table on VTD<o:p></o:p></p>
<p class="MsoPlainText">> > > > + %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & BIT2) != 0) {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_INFO, "Support 4-level page-table on VTD<o:p></o:p></p>
<p class="MsoPlainText">> > > > + %d\n",<o:p></o:p></p>
<p class="MsoPlainText">> > > > Index));<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    }<o:p></o:p></p>
<p class="MsoPlainText">> > > > +    if ((mVtdUnitInformation[Index].CapReg.Bits.SAGAW & (BIT3 |<o:p></o:p></p>
<p class="MsoPlainText">> > > > + BIT2)) == 0)<o:p></o:p></p>
<p class="MsoPlainText">> > > > {<o:p></o:p></p>
<p class="MsoPlainText">> > > > +      DEBUG((DEBUG_ERROR, "!!!! Page-table type 0x%X is not<o:p></o:p></p>
<p class="MsoPlainText">> > > > + supported on<o:p></o:p></p>
<p class="MsoPlainText">> > > > VTD %d !!!!\n", Index, mVtdUnitInformation[Index].CapReg.Bits.SAGAW));<o:p></o:p></p>
<p class="MsoPlainText">> > > >        return ;<o:p></o:p></p>
<p class="MsoPlainText">> > > >      }<o:p></o:p></p>
<p class="MsoPlainText">> > > ><o:p></o:p></p>
<p class="MsoPlainText">> > > > --<o:p></o:p></p>
<p class="MsoPlainText">> > > > 2.16.2.windows.1<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
</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/68486">View/Reply Online (#68486)</a> |    |  <a target="_blank" href="https://groups.io/mt/78651896/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><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>