> -----Original Message-----
> From: Tom Lendacky <thomas.lenda...@amd.com>
> Sent: Friday, April 14, 2023 12:19 AM
> To: Tan, Dun <dun....@intel.com>; devel@edk2.groups.io
> Cc: Ni, Ray <ray...@intel.com>
> Subject: Re: [edk2-devel] [Patch V2 0/8] Use CpuPageTableLib to create and
> update smm page table
> 
> On 4/13/23 04:14, Tan, Dun wrote:
> > Hi Tom,
> >
> > Thank you for your help with testing.
> > For the build failure, it's because that the CpuPageTableLib instance is
> added into OvmfPkg DSC in the last pacth ' OvmfPkg: Add CpuPageTableLib
> required by PiSmmCpuDxe'. I have moved this patch to the head of the patch
> set.
> >
> > For the boot failure, I think it's because that the encrypt mask was not
> applied to the memory used by page table in page table non-leaf entry.
> Initially I thought the encrypt mask would only be applied to the leaf entry 
> in
> AMD SEV feature. So I treated the encryption process as non 1:1 mapping,
> which only applies the encrypt mask to leaf entry. I'm also curious why the
> DxeIpl patch set works good. All the page table non-leaf entries are also not
> encrypted in the DxeIpl page table related patch set.
> 
> Right, and that works for SEV. All non-leaf pagetable entries are treated
> as encrypted regardless of the encryption bit. Since the tables were built
> being mapped encrypted, the pagetable walk works when the non-leaf
> entries don't have the encryption bit set. In this case, though, the 
> encryption
> bit is present in the non-leaf entry and that is the reason why there are
> issues.

Can you point us which doc here (https://www.amd.com/en/developer/sev.html)
says the page table is encrypted regardless the KEY_ID bits value?
How can the encryption engine know if a chunk of memory belongs to page table?

My understanding to SEV is any physical address field in guest page table 
should have
the KEY_ID bits set if the physical pages are private to guest. Only some pages 
for GMCB
don't have KEY_ID bits set as those are shared between guest and host.

I thought Dun's patch works because all guest memory is marked as shared because
the KEY_ID bits in all entries are not set. Only some pages that're used by GMCB
have the KEY_ID bits set.


> 
> Here is some debug after setting PagingEntry at line 436 of
> UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c:
> 
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF81000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF80000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF83000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF81000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF80000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF83000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF81000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 3FF80000
> *** DEBUG: PageTableLibMapInLevel:437 - PagingEntry = 800003FC01000

Are you testing the SME or SEV?
My understanding is with SME, only the highest C bit should be set indicating
the physical page is encrypted.



> !!!! X64 Exception Type - 0D(#GP - General Protection)  CPU Apic ID -
> 00000000 !!!!
> 
> 0x800003FC01000 isn't mapped and so it fails - I'm not exactly sure how
> the #PF turns into a #GP, though, maybe because the virtual address isn't
> canonical that point.
> 
> Thanks,
> Tom
> 
> >
> > I'll added another patch in my code branch to fix this issue later. In the 
> > new
> commit, from the perspective of CpuPageTableLib, the whole memory can
> be divided into 3 categories: memory used by page table, guest private
> memory and guest shared memory. CpuPageTableLib will always apply the
> encrypt mask to memory used by page table, which means all the non-leaf
> page table entries are encrypted. For guest private memory, this case can be
> treated as non-1:1 mapping. We can apply the encrypt mask by setting the
> input parameter of PageTableMap() API like " Attribute.Uint64 =
> LinearAddress | AddressEncMask". For guest shared memory, this case can
> be treated as normal 1:1 mapping. I'll let you know once the new patch is
> ready.
> >
> > Thanks,
> > Dun
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> Lendacky, Thomas via groups.io
> > Sent: Thursday, April 13, 2023 3:26 AM
> > To: devel@edk2.groups.io; Tan, Dun <dun....@intel.com>
> > Subject: Re: [edk2-devel] [Patch V2 0/8] Use CpuPageTableLib to create
> and update smm page table
> >
> > On 4/12/23 05:17, duntan via groups.io wrote:
> >> Hi Tom,
> >>
> >> This patch set is to change PiSmmCpuDxeSmm code to use
> CpuPageTableLib to create and update SMM page table. The Pcd
> PcdPteMemoryEncryptionAddressOrMask is also used in PiSmmCpuDxeSmm
> code and the whole range covered by page table is mapped encrypted,
> which is different from the situation in DxeIpl module.
> >> So could you also help do a test to make sure the AMD SEV feature still
> works good in SMM with this patch set?
> >> Here is the code branch in my fork repo:
> >> https://github.com/td36/edk2/commits/SmmPageTable_V2
> >
> > Hi Dun,
> >
> > I tested at the final commit of the branch and encountered a #GP with an
> SEV guest. It looks like the CpuPageTableLibrary doesn't take the encryption
> bit into account. For example:
> >
> > Line 436 of UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c
> >     PagingEntry = (IA32_PAGING_ENTRY
> *)(UINTN)IA32_PNLE_PAGE_TABLE_BASE_ADDRESS (&ParentPagingEntry-
> >Pnle);
> >
> > This will get an address with the encryption bit set and then try to
> reference it. When I clear the encryption bit, the code proceeds a bit 
> further,
> but then encounters a #GP in a different location.
> >
> > So it appears that the CpuPageTableLibrary doesn't deal with the
> encryption bit properly.
> >
> > Also, going through a build/test of each individual patch had mixed results.
> >
> >     - With the second patch in the series applied, I get a build error:
> >
> >       /root/kernels/ovmf-dun-build-X64/OvmfPkg/OvmfPkgX64.dsc(...):
> error 4000: Instance of library class [CpuPageTableLib] is not found
> >               in [/root/kernels/ovmf-dun-build-
> X64/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf] [X64]
> >               consumed by module [/root/kernels/ovmf-dun-build-
> X64/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf]
> >
> >       that isn't resolved until the final patch.
> >
> > Thanks,
> > Tom
> >
> >>
> >> Thanks,
> >> Dun
> >>
> >> -----Original Message-----
> >> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> duntan
> >> Sent: Wednesday, April 12, 2023 4:54 PM
> >> To: devel@edk2.groups.io
> >> Subject: [edk2-devel] [Patch V2 0/8] Use CpuPageTableLib to create and
> >> update smm page table
> >>
> >> In V2 patch set:
> >> 1.In 'Refinement to code about updating smm page table', use QuickSort()
> in BaseLib instead or PerformQuickSort() in BaseSortLib.
> >> 2.Remove the patch to add BaseSortLib in DSC file.
> >> 3.Add a new patch to add CpuPageTableLib in UefiCpuPkg.dsc.
> >> 4.Add a temp patch to add CpuPageTableLib in OvmfPkg dsc files for
> >> test(A previous patch I sent before '[Patch V2 4/8] OvmfPkg: Add
> >> CpuPageTableLib required by DxeIpl in DSC file' contains all the
> >> changes in this patch)
> >>
> >> Dun Tan (8):
> >>     OvmfPkg: Add CpuPageTableLib required by PiSmmCpuDxe
> >>     UefiPayloadPkg: Add CpuPageTableLib required by PiSmmCpuDxe
> >>     UefiCpuPkg: Use CpuPageTableLib to convert SMM paging attribute.
> >>     UefiCpuPkg/PiSmmCpuDxeSmm: Avoid setting non-present range to
> RO/NX
> >>     UefiCpuPkg: Extern mSmmShadowStackSize in PiSmmCpuDxeSmm.h
> >>     UefiCpuPkg: Refinement to current smm page table generation code
> >>     UefiCpuPkg: Refinement to code about updating smm page table
> >>     UefiCpuPkg/PiSmmCpuDxeSmm: Remove unnecessary function
> >>
> >>    OvmfPkg/CloudHv/CloudHvX64.dsc                     |   2 +-
> >>    OvmfPkg/OvmfPkgIa32.dsc                            |   3 ++-
> >>    OvmfPkg/OvmfPkgIa32X64.dsc                         |   2 +-
> >>    OvmfPkg/OvmfPkgX64.dsc                             |   2 +-
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/PageTbl.c           |   5 +++--
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c      |   3 +--
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmProfileArch.c    |   2 +-
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c              | 132 
> >> -----------------
> ----------------------------------------------------------------------------------------------
> ---------------------
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c         |   8 ++++++-
> -
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h         |  97
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++-------------------------------------
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf       |   1 +
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/SmmCpuMemoryManagement.c | 629
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++--------------------------
> ----------------------------------------------------------------------------------------------
> ----------------------------------------------------------------------------------------------
> ----------------------------------------------------------------------------------------------
> -----------------------------------------------
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/SmmProfile.c             | 348
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++++++-------------------------------------------------------------------------------
> ----------------------------------------------------------------------------------------------
> --------------------------------------------------
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/X64/PageTbl.c            | 229
> ++++++++++++++++++++++++++++++----------------------------------------------
> ----------------------------------------------------------------------------------------------
> -----------------------------------------------------------
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c       |   3 +--
> >>    UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmProfileArch.c     |  19 ++-------
> ----------
> >>    UefiPayloadPkg/UefiPayloadPkg.dsc                  |   2 +-
> >>    17 files changed, 510 insertions(+), 977 deletions(-)
> >>
> >
> >
> > 
> >
> >


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#102964): https://edk2.groups.io/g/devel/message/102964
Mute This Topic: https://groups.io/mt/98215421/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to