* Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV [not found] <16EFAF988BEBA4A6.18257@groups.io> @ 2022-05-17 16:26 ` Lendacky, Thomas 2022-05-17 16:29 ` Ard Biesheuvel 0 siblings, 1 reply; 5+ messages in thread From: Lendacky, Thomas @ 2022-05-17 16:26 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Jordan Justen, Gerd Hoffmann, Erdem Aktas, James Bottomley, Michael Roth, Min Xu On 5/16/22 15:24, Lendacky, Thomas via groups.io wrote: > The BaseMemEncryptSevLib functionality was updated to rely on the use of > the OVMF/SEV workarea to check for SEV guests. However, this area is only > updated when running the X64 OVMF build, not the hybrid Ia32/X64 build. > Base SEV support is allowed under the Ia32/X64 build, but it now fails > to boot as a result of the change. > > Update the ResetVector code to check for SEV features when built for > 32-bit mode, not just 64-bit mode (requiring updates to both the Ia32 > and Ia32X64 fdf files). So this is a regression and it would be great if it could be applied to the 202205 release. Can folks take a look and make sure it looks safe to them for applying during hard feature freeze? If it's ok to be applied now, is there a particular process for applying this during hard freeze? Thanks, Tom > > Fixes: f1d1c337e7c0575da7fd248b2dd9cffc755940df > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > Cc: Jiewen Yao <jiewen.yao@intel.com> > Cc: Jordan Justen <jordan.l.justen@intel.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Erdem Aktas <erdemaktas@google.com> > Cc: James Bottomley <jejb@linux.ibm.com> > Cc: Michael Roth <michael.roth@amd.com> > Cc: Min Xu <min.m.xu@intel.com> > Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > --- > OvmfPkg/OvmfPkgIa32.fdf | 11 +++ > OvmfPkg/OvmfPkgIa32X64.fdf | 8 +++ > OvmfPkg/OvmfPkgX64.fdf | 3 +- > OvmfPkg/ResetVector/Ia32/AmdSev.asm | 4 ++ > OvmfPkg/ResetVector/Main.asm | 6 ++ > OvmfPkg/ResetVector/ResetVector.nasmb | 72 ++++++++++---------- > 6 files changed, 67 insertions(+), 37 deletions(-) > > diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf > index 3ab1755749d4..57d13b7130bc 100644 > --- a/OvmfPkg/OvmfPkgIa32.fdf > +++ b/OvmfPkg/OvmfPkgIa32.fdf > @@ -76,6 +76,9 @@ [FD.MEMFD] > 0x007000|0x001000 > gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize > > +0x008000|0x001000 > +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize > + > 0x010000|0x010000 > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize > > @@ -87,6 +90,14 @@ [FD.MEMFD] > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize > FV = DXEFV > > +########################################################################################## > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > +# the SEV STATUS MSR is now saved in the work area) > +# > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > +########################################################################################## > + > ################################################################################ > > [FV.SECFV] > diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf > index e1638fa6ea38..ccde366887a9 100644 > --- a/OvmfPkg/OvmfPkgIa32X64.fdf > +++ b/OvmfPkg/OvmfPkgIa32X64.fdf > @@ -90,6 +90,14 @@ [FD.MEMFD] > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize > FV = DXEFV > > +########################################################################################## > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > +# the SEV STATUS MSR is now saved in the work area) > +# > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > +########################################################################################## > + > ################################################################################ > > [FV.SECFV] > diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf > index aa9a83032d9b..438806fba8f1 100644 > --- a/OvmfPkg/OvmfPkgX64.fdf > +++ b/OvmfPkg/OvmfPkgX64.fdf > @@ -106,7 +106,8 @@ [FD.MEMFD] > FV = DXEFV > > ########################################################################################## > -# Set the SEV-ES specific work area PCDs > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > +# the SEV STATUS MSR is now saved in the work area) > # > SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > index 864d68385342..9350b0406833 100644 > --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > @@ -150,6 +150,8 @@ BITS 32 > SevEsUnexpectedRespTerminate: > TerminateVmgExit TERM_UNEXPECTED_RESP_CODE > > +%ifdef ARCH_X64 > + > ; If SEV-ES is enabled then initialize and make the GHCB page shared > SevClearPageEncMaskForGhcbPage: > ; Check if SEV is enabled > @@ -209,6 +211,8 @@ GetSevCBitMaskAbove31: > GetSevCBitMaskAbove31Exit: > OneTimeCallRet GetSevCBitMaskAbove31 > > +%endif > + > ; Check if Secure Encrypted Virtualization (SEV) features are enabled. > ; > ; Register usage is tight in this routine, so multiple calls for the > diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm > index 5cfc0b5c72b1..46cfa87c4c0a 100644 > --- a/OvmfPkg/ResetVector/Main.asm > +++ b/OvmfPkg/ResetVector/Main.asm > @@ -75,6 +75,12 @@ SearchBfv: > > %ifdef ARCH_IA32 > > + ; > + ; SEV support can be built and run using the Ia32/X64 split environment. > + ; Set the OVMF/SEV work area as appropriate. > + ; > + OneTimeCall CheckSevFeatures > + > ; > ; Restore initial EAX value into the EAX register > ; > diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb > index 9421f4818907..94fbb0a87b37 100644 > --- a/OvmfPkg/ResetVector/ResetVector.nasmb > +++ b/OvmfPkg/ResetVector/ResetVector.nasmb > @@ -47,7 +47,36 @@ > %include "Ia32/SearchForBfvBase.asm" > %include "Ia32/SearchForSecEntry.asm" > > -%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) > +%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) > +%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) > + > +%define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) > +%define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > +%define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > +%define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > +%define SEV_ES_WORK_AREA_SIZE 25 > +%define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > +%define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) > +%define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) > +%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) > +%define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) > +%define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) > +%define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) > +%define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > +%define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > +%define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) > +%define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > +; > +; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used > +; as GHCB shared page and second is used for bookkeeping to support the > +; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM > +; does not need to validate the shared page but it need to validate the > +; bookkeeping page. > +; > +%define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > +%define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > +%define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > +%define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > > %ifdef ARCH_X64 > #include <AutoGen.h> > @@ -94,43 +123,14 @@ > %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 4) > %define TDX_WORK_AREA_GPAW (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 8) > > - %define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) > + %include "X64/IntelTdxMetadata.asm" > + %include "Ia32/Flat32ToFlat64.asm" > + %include "Ia32/PageTables64.asm" > + %include "Ia32/IntelTdx.asm" > + %include "X64/OvmfSevMetadata.asm" > +%endif > > - %define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) > - %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > - %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > - %define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > - %define SEV_ES_WORK_AREA_SIZE 25 > - %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > - %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) > - %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) > - %define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) > - %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) > - %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) > - %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) > - %define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > - %define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > - %define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) > - %define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > - ; > - ; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used > - ; as GHCB shared page and second is used for bookkeeping to support the > - ; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM > - ; does not need to validate the shared page but it need to validate the > - ; bookkeeping page. > - ; > - %define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > - %define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > - %define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > - %define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > - > -%include "X64/IntelTdxMetadata.asm" > -%include "Ia32/Flat32ToFlat64.asm" > %include "Ia32/AmdSev.asm" > -%include "Ia32/PageTables64.asm" > -%include "Ia32/IntelTdx.asm" > -%include "X64/OvmfSevMetadata.asm" > -%endif > > %include "Ia16/Real16ToFlat32.asm" > %include "Ia16/Init16.asm" ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV 2022-05-17 16:26 ` [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV Lendacky, Thomas @ 2022-05-17 16:29 ` Ard Biesheuvel 2022-05-19 22:02 ` Lendacky, Thomas 0 siblings, 1 reply; 5+ messages in thread From: Ard Biesheuvel @ 2022-05-17 16:29 UTC (permalink / raw) To: Tom Lendacky Cc: edk2-devel-groups-io, Ard Biesheuvel, Jiewen Yao, Jordan Justen, Gerd Hoffmann, Erdem Aktas, James Bottomley, Michael Roth, Min Xu On Tue, 17 May 2022 at 18:26, Tom Lendacky <thomas.lendacky@amd.com> wrote: > > On 5/16/22 15:24, Lendacky, Thomas via groups.io wrote: > > The BaseMemEncryptSevLib functionality was updated to rely on the use of > > the OVMF/SEV workarea to check for SEV guests. However, this area is only > > updated when running the X64 OVMF build, not the hybrid Ia32/X64 build. > > Base SEV support is allowed under the Ia32/X64 build, but it now fails > > to boot as a result of the change. > > > > Update the ResetVector code to check for SEV features when built for > > 32-bit mode, not just 64-bit mode (requiring updates to both the Ia32 > > and Ia32X64 fdf files). > > So this is a regression and it would be great if it could be applied to > the 202205 release. Can folks take a look and make sure it looks safe to > them for applying during hard feature freeze? > > If it's ok to be applied now, is there a particular process for applying > this during hard freeze? > For the change itself: Acked-by: Ard Biesheuvel <ardb@kernel.org> and I am fine with taking this during hard freeze, but I'll defer to Liming to make the final call. > > > > > Fixes: f1d1c337e7c0575da7fd248b2dd9cffc755940df > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > Cc: Jiewen Yao <jiewen.yao@intel.com> > > Cc: Jordan Justen <jordan.l.justen@intel.com> > > Cc: Gerd Hoffmann <kraxel@redhat.com> > > Cc: Erdem Aktas <erdemaktas@google.com> > > Cc: James Bottomley <jejb@linux.ibm.com> > > Cc: Michael Roth <michael.roth@amd.com> > > Cc: Min Xu <min.m.xu@intel.com> > > Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > > --- > > OvmfPkg/OvmfPkgIa32.fdf | 11 +++ > > OvmfPkg/OvmfPkgIa32X64.fdf | 8 +++ > > OvmfPkg/OvmfPkgX64.fdf | 3 +- > > OvmfPkg/ResetVector/Ia32/AmdSev.asm | 4 ++ > > OvmfPkg/ResetVector/Main.asm | 6 ++ > > OvmfPkg/ResetVector/ResetVector.nasmb | 72 ++++++++++---------- > > 6 files changed, 67 insertions(+), 37 deletions(-) > > > > diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf > > index 3ab1755749d4..57d13b7130bc 100644 > > --- a/OvmfPkg/OvmfPkgIa32.fdf > > +++ b/OvmfPkg/OvmfPkgIa32.fdf > > @@ -76,6 +76,9 @@ [FD.MEMFD] > > 0x007000|0x001000 > > gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize > > > > +0x008000|0x001000 > > +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize > > + > > 0x010000|0x010000 > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize > > > > @@ -87,6 +90,14 @@ [FD.MEMFD] > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize > > FV = DXEFV > > > > +########################################################################################## > > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > > +# the SEV STATUS MSR is now saved in the work area) > > +# > > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > +########################################################################################## > > + > > ################################################################################ > > > > [FV.SECFV] > > diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf > > index e1638fa6ea38..ccde366887a9 100644 > > --- a/OvmfPkg/OvmfPkgIa32X64.fdf > > +++ b/OvmfPkg/OvmfPkgIa32X64.fdf > > @@ -90,6 +90,14 @@ [FD.MEMFD] > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize > > FV = DXEFV > > > > +########################################################################################## > > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > > +# the SEV STATUS MSR is now saved in the work area) > > +# > > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > +########################################################################################## > > + > > ################################################################################ > > > > [FV.SECFV] > > diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf > > index aa9a83032d9b..438806fba8f1 100644 > > --- a/OvmfPkg/OvmfPkgX64.fdf > > +++ b/OvmfPkg/OvmfPkgX64.fdf > > @@ -106,7 +106,8 @@ [FD.MEMFD] > > FV = DXEFV > > > > ########################################################################################## > > -# Set the SEV-ES specific work area PCDs > > +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the > > +# the SEV STATUS MSR is now saved in the work area) > > # > > SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader > > diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > index 864d68385342..9350b0406833 100644 > > --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > @@ -150,6 +150,8 @@ BITS 32 > > SevEsUnexpectedRespTerminate: > > TerminateVmgExit TERM_UNEXPECTED_RESP_CODE > > > > +%ifdef ARCH_X64 > > + > > ; If SEV-ES is enabled then initialize and make the GHCB page shared > > SevClearPageEncMaskForGhcbPage: > > ; Check if SEV is enabled > > @@ -209,6 +211,8 @@ GetSevCBitMaskAbove31: > > GetSevCBitMaskAbove31Exit: > > OneTimeCallRet GetSevCBitMaskAbove31 > > > > +%endif > > + > > ; Check if Secure Encrypted Virtualization (SEV) features are enabled. > > ; > > ; Register usage is tight in this routine, so multiple calls for the > > diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm > > index 5cfc0b5c72b1..46cfa87c4c0a 100644 > > --- a/OvmfPkg/ResetVector/Main.asm > > +++ b/OvmfPkg/ResetVector/Main.asm > > @@ -75,6 +75,12 @@ SearchBfv: > > > > %ifdef ARCH_IA32 > > > > + ; > > + ; SEV support can be built and run using the Ia32/X64 split environment. > > + ; Set the OVMF/SEV work area as appropriate. > > + ; > > + OneTimeCall CheckSevFeatures > > + > > ; > > ; Restore initial EAX value into the EAX register > > ; > > diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb > > index 9421f4818907..94fbb0a87b37 100644 > > --- a/OvmfPkg/ResetVector/ResetVector.nasmb > > +++ b/OvmfPkg/ResetVector/ResetVector.nasmb > > @@ -47,7 +47,36 @@ > > %include "Ia32/SearchForBfvBase.asm" > > %include "Ia32/SearchForSecEntry.asm" > > > > -%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) > > +%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) > > +%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) > > + > > +%define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) > > +%define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > > +%define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > > +%define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > > +%define SEV_ES_WORK_AREA_SIZE 25 > > +%define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > > +%define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) > > +%define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) > > +%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) > > +%define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) > > +%define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) > > +%define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) > > +%define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > > +%define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > > +%define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) > > +%define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > > +; > > +; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used > > +; as GHCB shared page and second is used for bookkeeping to support the > > +; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM > > +; does not need to validate the shared page but it need to validate the > > +; bookkeeping page. > > +; > > +%define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > > +%define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > > +%define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > > +%define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > > > > %ifdef ARCH_X64 > > #include <AutoGen.h> > > @@ -94,43 +123,14 @@ > > %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 4) > > %define TDX_WORK_AREA_GPAW (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 8) > > > > - %define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) > > + %include "X64/IntelTdxMetadata.asm" > > + %include "Ia32/Flat32ToFlat64.asm" > > + %include "Ia32/PageTables64.asm" > > + %include "Ia32/IntelTdx.asm" > > + %include "X64/OvmfSevMetadata.asm" > > +%endif > > > > - %define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) > > - %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > > - %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > > - %define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > > - %define SEV_ES_WORK_AREA_SIZE 25 > > - %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) > > - %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) > > - %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) > > - %define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) > > - %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) > > - %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) > > - %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) > > - %define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > > - %define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > > - %define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) > > - %define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > > - ; > > - ; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used > > - ; as GHCB shared page and second is used for bookkeeping to support the > > - ; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM > > - ; does not need to validate the shared page but it need to validate the > > - ; bookkeeping page. > > - ; > > - %define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > > - %define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > > - %define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > > - %define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > > - > > -%include "X64/IntelTdxMetadata.asm" > > -%include "Ia32/Flat32ToFlat64.asm" > > %include "Ia32/AmdSev.asm" > > -%include "Ia32/PageTables64.asm" > > -%include "Ia32/IntelTdx.asm" > > -%include "X64/OvmfSevMetadata.asm" > > -%endif > > > > %include "Ia16/Real16ToFlat32.asm" > > %include "Ia16/Init16.asm" ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV 2022-05-17 16:29 ` Ard Biesheuvel @ 2022-05-19 22:02 ` Lendacky, Thomas 2022-05-20 1:43 ` 回复: " gaoliming 0 siblings, 1 reply; 5+ messages in thread From: Lendacky, Thomas @ 2022-05-19 22:02 UTC (permalink / raw) To: Ard Biesheuvel, Liming Gao Cc: edk2-devel-groups-io, Ard Biesheuvel, Jiewen Yao, Jordan Justen, Gerd Hoffmann, Erdem Aktas, James Bottomley, Michael Roth, Min Xu Explicitly adding Liming to the To: line for visibility. Thanks, Tom On 5/17/22 11:29, Ard Biesheuvel wrote: > On Tue, 17 May 2022 at 18:26, Tom Lendacky <thomas.lendacky@amd.com> wrote: >> >> On 5/16/22 15:24, Lendacky, Thomas via groups.io wrote: >>> The BaseMemEncryptSevLib functionality was updated to rely on the use of >>> the OVMF/SEV workarea to check for SEV guests. However, this area is only >>> updated when running the X64 OVMF build, not the hybrid Ia32/X64 build. >>> Base SEV support is allowed under the Ia32/X64 build, but it now fails >>> to boot as a result of the change. >>> >>> Update the ResetVector code to check for SEV features when built for >>> 32-bit mode, not just 64-bit mode (requiring updates to both the Ia32 >>> and Ia32X64 fdf files). >> >> So this is a regression and it would be great if it could be applied to >> the 202205 release. Can folks take a look and make sure it looks safe to >> them for applying during hard feature freeze? >> >> If it's ok to be applied now, is there a particular process for applying >> this during hard freeze? >> > > For the change itself: > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > and I am fine with taking this during hard freeze, but I'll defer to > Liming to make the final call. > > > >> >>> >>> Fixes: f1d1c337e7c0575da7fd248b2dd9cffc755940df >>> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> >>> Cc: Jiewen Yao <jiewen.yao@intel.com> >>> Cc: Jordan Justen <jordan.l.justen@intel.com> >>> Cc: Gerd Hoffmann <kraxel@redhat.com> >>> Cc: Erdem Aktas <erdemaktas@google.com> >>> Cc: James Bottomley <jejb@linux.ibm.com> >>> Cc: Michael Roth <michael.roth@amd.com> >>> Cc: Min Xu <min.m.xu@intel.com> >>> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> >>> --- >>> OvmfPkg/OvmfPkgIa32.fdf | 11 +++ >>> OvmfPkg/OvmfPkgIa32X64.fdf | 8 +++ >>> OvmfPkg/OvmfPkgX64.fdf | 3 +- >>> OvmfPkg/ResetVector/Ia32/AmdSev.asm | 4 ++ >>> OvmfPkg/ResetVector/Main.asm | 6 ++ >>> OvmfPkg/ResetVector/ResetVector.nasmb | 72 ++++++++++---------- >>> 6 files changed, 67 insertions(+), 37 deletions(-) >>> >>> diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf >>> index 3ab1755749d4..57d13b7130bc 100644 >>> --- a/OvmfPkg/OvmfPkgIa32.fdf >>> +++ b/OvmfPkg/OvmfPkgIa32.fdf >>> @@ -76,6 +76,9 @@ [FD.MEMFD] >>> 0x007000|0x001000 >>> gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize >>> >>> +0x008000|0x001000 >>> +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize >>> + >>> 0x010000|0x010000 >>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize >>> >>> @@ -87,6 +90,14 @@ [FD.MEMFD] >>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize >>> FV = DXEFV >>> >>> +########################################################################################## >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the >>> +# the SEV STATUS MSR is now saved in the work area) >>> +# >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> +########################################################################################## >>> + >>> ################################################################################ >>> >>> [FV.SECFV] >>> diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf >>> index e1638fa6ea38..ccde366887a9 100644 >>> --- a/OvmfPkg/OvmfPkgIa32X64.fdf >>> +++ b/OvmfPkg/OvmfPkgIa32X64.fdf >>> @@ -90,6 +90,14 @@ [FD.MEMFD] >>> gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize >>> FV = DXEFV >>> >>> +########################################################################################## >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the >>> +# the SEV STATUS MSR is now saved in the work area) >>> +# >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> +########################################################################################## >>> + >>> ################################################################################ >>> >>> [FV.SECFV] >>> diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf >>> index aa9a83032d9b..438806fba8f1 100644 >>> --- a/OvmfPkg/OvmfPkgX64.fdf >>> +++ b/OvmfPkg/OvmfPkgX64.fdf >>> @@ -106,7 +106,8 @@ [FD.MEMFD] >>> FV = DXEFV >>> >>> ########################################################################################## >>> -# Set the SEV-ES specific work area PCDs >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since the >>> +# the SEV STATUS MSR is now saved in the work area) >>> # >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader >>> diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm b/OvmfPkg/ResetVector/Ia32/AmdSev.asm >>> index 864d68385342..9350b0406833 100644 >>> --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm >>> +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm >>> @@ -150,6 +150,8 @@ BITS 32 >>> SevEsUnexpectedRespTerminate: >>> TerminateVmgExit TERM_UNEXPECTED_RESP_CODE >>> >>> +%ifdef ARCH_X64 >>> + >>> ; If SEV-ES is enabled then initialize and make the GHCB page shared >>> SevClearPageEncMaskForGhcbPage: >>> ; Check if SEV is enabled >>> @@ -209,6 +211,8 @@ GetSevCBitMaskAbove31: >>> GetSevCBitMaskAbove31Exit: >>> OneTimeCallRet GetSevCBitMaskAbove31 >>> >>> +%endif >>> + >>> ; Check if Secure Encrypted Virtualization (SEV) features are enabled. >>> ; >>> ; Register usage is tight in this routine, so multiple calls for the >>> diff --git a/OvmfPkg/ResetVector/Main.asm b/OvmfPkg/ResetVector/Main.asm >>> index 5cfc0b5c72b1..46cfa87c4c0a 100644 >>> --- a/OvmfPkg/ResetVector/Main.asm >>> +++ b/OvmfPkg/ResetVector/Main.asm >>> @@ -75,6 +75,12 @@ SearchBfv: >>> >>> %ifdef ARCH_IA32 >>> >>> + ; >>> + ; SEV support can be built and run using the Ia32/X64 split environment. >>> + ; Set the OVMF/SEV work area as appropriate. >>> + ; >>> + OneTimeCall CheckSevFeatures >>> + >>> ; >>> ; Restore initial EAX value into the EAX register >>> ; >>> diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb b/OvmfPkg/ResetVector/ResetVector.nasmb >>> index 9421f4818907..94fbb0a87b37 100644 >>> --- a/OvmfPkg/ResetVector/ResetVector.nasmb >>> +++ b/OvmfPkg/ResetVector/ResetVector.nasmb >>> @@ -47,7 +47,36 @@ >>> %include "Ia32/SearchForBfvBase.asm" >>> %include "Ia32/SearchForSecEntry.asm" >>> >>> -%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) >>> +%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 (PcdOvmfWorkAreaBase)) >>> +%define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) >>> + >>> +%define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) >>> +%define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) >>> +%define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) >>> +%define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) >>> +%define SEV_ES_WORK_AREA_SIZE 25 >>> +%define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) >>> +%define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) >>> +%define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) >>> +%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) >>> +%define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) >>> +%define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) >>> +%define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) >>> +%define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) >>> +%define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) >>> +%define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) >>> +%define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) >>> +; >>> +; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used >>> +; as GHCB shared page and second is used for bookkeeping to support the >>> +; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM >>> +; does not need to validate the shared page but it need to validate the >>> +; bookkeeping page. >>> +; >>> +%define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) >>> +%define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) >>> +%define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) >>> +%define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) >>> >>> %ifdef ARCH_X64 >>> #include <AutoGen.h> >>> @@ -94,43 +123,14 @@ >>> %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 4) >>> %define TDX_WORK_AREA_GPAW (FixedPcdGet32 (PcdOvmfWorkAreaBase) + 8) >>> >>> - %define PT_ADDR(Offset) (FixedPcdGet32 (PcdOvmfSecPageTablesBase) + (Offset)) >>> + %include "X64/IntelTdxMetadata.asm" >>> + %include "Ia32/Flat32ToFlat64.asm" >>> + %include "Ia32/PageTables64.asm" >>> + %include "Ia32/IntelTdx.asm" >>> + %include "X64/OvmfSevMetadata.asm" >>> +%endif >>> >>> - %define GHCB_PT_ADDR (FixedPcdGet32 (PcdOvmfSecGhcbPageTableBase)) >>> - %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) >>> - %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) >>> - %define SEV_ES_WORK_AREA (FixedPcdGet32 (PcdSevEsWorkAreaBase)) >>> - %define SEV_ES_WORK_AREA_SIZE 25 >>> - %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 (PcdSevEsWorkAreaBase)) >>> - %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 8) >>> - %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 16) >>> - %define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 (PcdSevEsWorkAreaBase) + 24) >>> - %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 (PcdOvmfSecPeiTempRamSize)) >>> - %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 (PcdOvmfSnpSecretsBase)) >>> - %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 (PcdOvmfSnpSecretsSize)) >>> - %define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) >>> - %define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) >>> - %define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 (PcdOvmfSecPageTablesBase)) >>> - %define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) >>> - ; >>> - ; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is used >>> - ; as GHCB shared page and second is used for bookkeeping to support the >>> - ; nested GHCB in SEC phase. The bookkeeping page is mapped private. The VMM >>> - ; does not need to validate the shared page but it need to validate the >>> - ; bookkeeping page. >>> - ; >>> - %define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) >>> - %define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) >>> - %define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) >>> - %define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) >>> - >>> -%include "X64/IntelTdxMetadata.asm" >>> -%include "Ia32/Flat32ToFlat64.asm" >>> %include "Ia32/AmdSev.asm" >>> -%include "Ia32/PageTables64.asm" >>> -%include "Ia32/IntelTdx.asm" >>> -%include "X64/OvmfSevMetadata.asm" >>> -%endif >>> >>> %include "Ia16/Real16ToFlat32.asm" >>> %include "Ia16/Init16.asm" ^ permalink raw reply [flat|nested] 5+ messages in thread
* 回复: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV 2022-05-19 22:02 ` Lendacky, Thomas @ 2022-05-20 1:43 ` gaoliming 2022-05-20 6:36 ` Ard Biesheuvel 0 siblings, 1 reply; 5+ messages in thread From: gaoliming @ 2022-05-20 1:43 UTC (permalink / raw) To: 'Tom Lendacky', 'Ard Biesheuvel' Cc: 'edk2-devel-groups-io', 'Ard Biesheuvel', 'Jiewen Yao', 'Jordan Justen', 'Gerd Hoffmann', 'Erdem Aktas', 'James Bottomley', 'Michael Roth', 'Min Xu' Tom: This patch fixes the regression issue. So, I am OK to merge it for this stable tag. Thanks Liming > -----邮件原件----- > 发件人: Tom Lendacky <thomas.lendacky@amd.com> > 发送时间: 2022年5月20日 6:02 > 收件人: Ard Biesheuvel <ardb@kernel.org>; Liming Gao > <gaoliming@byosoft.com.cn> > 抄送: edk2-devel-groups-io <devel@edk2.groups.io>; Ard Biesheuvel > <ardb+tianocore@kernel.org>; Jiewen Yao <jiewen.yao@intel.com>; Jordan > Justen <jordan.l.justen@intel.com>; Gerd Hoffmann <kraxel@redhat.com>; > Erdem Aktas <erdemaktas@google.com>; James Bottomley > <jejb@linux.ibm.com>; Michael Roth <michael.roth@amd.com>; Min Xu > <min.m.xu@intel.com> > 主题: Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build > work with SEV > > Explicitly adding Liming to the To: line for visibility. > > Thanks, > Tom > > On 5/17/22 11:29, Ard Biesheuvel wrote: > > On Tue, 17 May 2022 at 18:26, Tom Lendacky <thomas.lendacky@amd.com> > wrote: > >> > >> On 5/16/22 15:24, Lendacky, Thomas via groups.io wrote: > >>> The BaseMemEncryptSevLib functionality was updated to rely on the use > of > >>> the OVMF/SEV workarea to check for SEV guests. However, this area is > only > >>> updated when running the X64 OVMF build, not the hybrid Ia32/X64 > build. > >>> Base SEV support is allowed under the Ia32/X64 build, but it now fails > >>> to boot as a result of the change. > >>> > >>> Update the ResetVector code to check for SEV features when built for > >>> 32-bit mode, not just 64-bit mode (requiring updates to both the Ia32 > >>> and Ia32X64 fdf files). > >> > >> So this is a regression and it would be great if it could be applied to > >> the 202205 release. Can folks take a look and make sure it looks safe to > >> them for applying during hard feature freeze? > >> > >> If it's ok to be applied now, is there a particular process for applying > >> this during hard freeze? > >> > > > > For the change itself: > > > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > > > and I am fine with taking this during hard freeze, but I'll defer to > > Liming to make the final call. > > > > > > > >> > >>> > >>> Fixes: f1d1c337e7c0575da7fd248b2dd9cffc755940df > >>> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > >>> Cc: Jiewen Yao <jiewen.yao@intel.com> > >>> Cc: Jordan Justen <jordan.l.justen@intel.com> > >>> Cc: Gerd Hoffmann <kraxel@redhat.com> > >>> Cc: Erdem Aktas <erdemaktas@google.com> > >>> Cc: James Bottomley <jejb@linux.ibm.com> > >>> Cc: Michael Roth <michael.roth@amd.com> > >>> Cc: Min Xu <min.m.xu@intel.com> > >>> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > >>> --- > >>> OvmfPkg/OvmfPkgIa32.fdf | 11 +++ > >>> OvmfPkg/OvmfPkgIa32X64.fdf | 8 +++ > >>> OvmfPkg/OvmfPkgX64.fdf | 3 +- > >>> OvmfPkg/ResetVector/Ia32/AmdSev.asm | 4 ++ > >>> OvmfPkg/ResetVector/Main.asm | 6 ++ > >>> OvmfPkg/ResetVector/ResetVector.nasmb | 72 ++++++++++---------- > >>> 6 files changed, 67 insertions(+), 37 deletions(-) > >>> > >>> diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf > >>> index 3ab1755749d4..57d13b7130bc 100644 > >>> --- a/OvmfPkg/OvmfPkgIa32.fdf > >>> +++ b/OvmfPkg/OvmfPkgIa32.fdf > >>> @@ -76,6 +76,9 @@ [FD.MEMFD] > >>> 0x007000|0x001000 > >>> > gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOv > mfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize > >>> > >>> +0x008000|0x001000 > >>> > +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgToken > SpaceGuid.PcdOvmfWorkAreaSize > >>> + > >>> 0x010000|0x010000 > >>> > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgT > okenSpaceGuid.PcdOvmfSecPeiTempRamSize > >>> > >>> @@ -87,6 +90,14 @@ [FD.MEMFD] > >>> > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgToken > SpaceGuid.PcdOvmfDxeMemFvSize > >>> FV = DXEFV > >>> > >>> > +############################################################# > ############################# > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > the > >>> +# the SEV STATUS MSR is now saved in the work area) > >>> +# > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > $(MEMFD_BASE_ADDRESS) + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> > +############################################################# > ############################# > >>> + > >>> > ############################################################## > ################## > >>> > >>> [FV.SECFV] > >>> diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf > b/OvmfPkg/OvmfPkgIa32X64.fdf > >>> index e1638fa6ea38..ccde366887a9 100644 > >>> --- a/OvmfPkg/OvmfPkgIa32X64.fdf > >>> +++ b/OvmfPkg/OvmfPkgIa32X64.fdf > >>> @@ -90,6 +90,14 @@ [FD.MEMFD] > >>> > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgToken > SpaceGuid.PcdOvmfDxeMemFvSize > >>> FV = DXEFV > >>> > >>> > +############################################################# > ############################# > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > the > >>> +# the SEV STATUS MSR is now saved in the work area) > >>> +# > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > $(MEMFD_BASE_ADDRESS) + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> > +############################################################# > ############################# > >>> + > >>> > ############################################################## > ################## > >>> > >>> [FV.SECFV] > >>> diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf > >>> index aa9a83032d9b..438806fba8f1 100644 > >>> --- a/OvmfPkg/OvmfPkgX64.fdf > >>> +++ b/OvmfPkg/OvmfPkgX64.fdf > >>> @@ -106,7 +106,8 @@ [FD.MEMFD] > >>> FV = DXEFV > >>> > >>> > ############################################################## > ############################ > >>> -# Set the SEV-ES specific work area PCDs > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > the > >>> +# the SEV STATUS MSR is now saved in the work area) > >>> # > >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > $(MEMFD_BASE_ADDRESS) + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > der > >>> diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > >>> index 864d68385342..9350b0406833 100644 > >>> --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > >>> +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > >>> @@ -150,6 +150,8 @@ BITS 32 > >>> SevEsUnexpectedRespTerminate: > >>> TerminateVmgExit TERM_UNEXPECTED_RESP_CODE > >>> > >>> +%ifdef ARCH_X64 > >>> + > >>> ; If SEV-ES is enabled then initialize and make the GHCB page shared > >>> SevClearPageEncMaskForGhcbPage: > >>> ; Check if SEV is enabled > >>> @@ -209,6 +211,8 @@ GetSevCBitMaskAbove31: > >>> GetSevCBitMaskAbove31Exit: > >>> OneTimeCallRet GetSevCBitMaskAbove31 > >>> > >>> +%endif > >>> + > >>> ; Check if Secure Encrypted Virtualization (SEV) features are enabled. > >>> ; > >>> ; Register usage is tight in this routine, so multiple calls for the > >>> diff --git a/OvmfPkg/ResetVector/Main.asm > b/OvmfPkg/ResetVector/Main.asm > >>> index 5cfc0b5c72b1..46cfa87c4c0a 100644 > >>> --- a/OvmfPkg/ResetVector/Main.asm > >>> +++ b/OvmfPkg/ResetVector/Main.asm > >>> @@ -75,6 +75,12 @@ SearchBfv: > >>> > >>> %ifdef ARCH_IA32 > >>> > >>> + ; > >>> + ; SEV support can be built and run using the Ia32/X64 split > environment. > >>> + ; Set the OVMF/SEV work area as appropriate. > >>> + ; > >>> + OneTimeCall CheckSevFeatures > >>> + > >>> ; > >>> ; Restore initial EAX value into the EAX register > >>> ; > >>> diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb > b/OvmfPkg/ResetVector/ResetVector.nasmb > >>> index 9421f4818907..94fbb0a87b37 100644 > >>> --- a/OvmfPkg/ResetVector/ResetVector.nasmb > >>> +++ b/OvmfPkg/ResetVector/ResetVector.nasmb > >>> @@ -47,7 +47,36 @@ > >>> %include "Ia32/SearchForBfvBase.asm" > >>> %include "Ia32/SearchForSecEntry.asm" > >>> > >>> -%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 > (PcdOvmfWorkAreaBase)) > >>> +%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 > (PcdOvmfWorkAreaBase)) > >>> +%define PT_ADDR(Offset) (FixedPcdGet32 > (PcdOvmfSecPageTablesBase) + (Offset)) > >>> + > >>> +%define GHCB_PT_ADDR (FixedPcdGet32 > (PcdOvmfSecGhcbPageTableBase)) > >>> +%define GHCB_BASE (FixedPcdGet32 > (PcdOvmfSecGhcbBase)) > >>> +%define GHCB_SIZE (FixedPcdGet32 > (PcdOvmfSecGhcbSize)) > >>> +%define SEV_ES_WORK_AREA (FixedPcdGet32 > (PcdSevEsWorkAreaBase)) > >>> +%define SEV_ES_WORK_AREA_SIZE 25 > >>> +%define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 > (PcdSevEsWorkAreaBase)) > >>> +%define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 8) > >>> +%define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 16) > >>> +%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 24) > >>> +%define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 > (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 > (PcdOvmfSecPeiTempRamSize)) > >>> +%define SEV_SNP_SECRETS_BASE (FixedPcdGet32 > (PcdOvmfSnpSecretsBase)) > >>> +%define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 > (PcdOvmfSnpSecretsSize)) > >>> +%define CPUID_BASE (FixedPcdGet32 > (PcdOvmfCpuidBase)) > >>> +%define CPUID_SIZE (FixedPcdGet32 > (PcdOvmfCpuidSize)) > >>> +%define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 > (PcdOvmfSecPageTablesBase)) > >>> +%define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 > (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > >>> +; > >>> +; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is > used > >>> +; as GHCB shared page and second is used for bookkeeping to support > the > >>> +; nested GHCB in SEC phase. The bookkeeping page is mapped private. > The VMM > >>> +; does not need to validate the shared page but it need to validate the > >>> +; bookkeeping page. > >>> +; > >>> +%define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > >>> +%define SNP_SEC_MEM_SIZE_DESC_2 > (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > >>> +%define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + > CPUID_SIZE) > >>> +%define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 > (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > >>> > >>> %ifdef ARCH_X64 > >>> #include <AutoGen.h> > >>> @@ -94,43 +123,14 @@ > >>> %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 > (PcdOvmfWorkAreaBase) + 4) > >>> %define TDX_WORK_AREA_GPAW (FixedPcdGet32 > (PcdOvmfWorkAreaBase) + 8) > >>> > >>> - %define PT_ADDR(Offset) (FixedPcdGet32 > (PcdOvmfSecPageTablesBase) + (Offset)) > >>> + %include "X64/IntelTdxMetadata.asm" > >>> + %include "Ia32/Flat32ToFlat64.asm" > >>> + %include "Ia32/PageTables64.asm" > >>> + %include "Ia32/IntelTdx.asm" > >>> + %include "X64/OvmfSevMetadata.asm" > >>> +%endif > >>> > >>> - %define GHCB_PT_ADDR (FixedPcdGet32 > (PcdOvmfSecGhcbPageTableBase)) > >>> - %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > >>> - %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > >>> - %define SEV_ES_WORK_AREA (FixedPcdGet32 > (PcdSevEsWorkAreaBase)) > >>> - %define SEV_ES_WORK_AREA_SIZE 25 > >>> - %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 > (PcdSevEsWorkAreaBase)) > >>> - %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 8) > >>> - %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 16) > >>> - %define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 > (PcdSevEsWorkAreaBase) + 24) > >>> - %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 > (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 > (PcdOvmfSecPeiTempRamSize)) > >>> - %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 > (PcdOvmfSnpSecretsBase)) > >>> - %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 > (PcdOvmfSnpSecretsSize)) > >>> - %define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > >>> - %define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > >>> - %define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 > (PcdOvmfSecPageTablesBase)) > >>> - %define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 > (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > >>> - ; > >>> - ; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page > is used > >>> - ; as GHCB shared page and second is used for bookkeeping to support > the > >>> - ; nested GHCB in SEC phase. The bookkeeping page is mapped private. > The VMM > >>> - ; does not need to validate the shared page but it need to validate the > >>> - ; bookkeeping page. > >>> - ; > >>> - %define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > >>> - %define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - > SNP_SEC_MEM_BASE_DESC_2) > >>> - %define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > >>> - %define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 > (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > >>> - > >>> -%include "X64/IntelTdxMetadata.asm" > >>> -%include "Ia32/Flat32ToFlat64.asm" > >>> %include "Ia32/AmdSev.asm" > >>> -%include "Ia32/PageTables64.asm" > >>> -%include "Ia32/IntelTdx.asm" > >>> -%include "X64/OvmfSevMetadata.asm" > >>> -%endif > >>> > >>> %include "Ia16/Real16ToFlat32.asm" > >>> %include "Ia16/Init16.asm" ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV 2022-05-20 1:43 ` 回复: " gaoliming @ 2022-05-20 6:36 ` Ard Biesheuvel 0 siblings, 0 replies; 5+ messages in thread From: Ard Biesheuvel @ 2022-05-20 6:36 UTC (permalink / raw) To: edk2-devel-groups-io, Liming Gao (Byosoft address) Cc: Tom Lendacky, Ard Biesheuvel, Jiewen Yao, Jordan Justen, Gerd Hoffmann, Erdem Aktas, James Bottomley, Michael Roth, Min Xu On Fri, 20 May 2022 at 03:44, gaoliming <gaoliming@byosoft.com.cn> wrote: > > Tom: > This patch fixes the regression issue. So, I am OK to merge it for this stable tag. > Merged as #2910 Thanks all, > > -----邮件原件----- > > 发件人: Tom Lendacky <thomas.lendacky@amd.com> > > 发送时间: 2022年5月20日 6:02 > > 收件人: Ard Biesheuvel <ardb@kernel.org>; Liming Gao > > <gaoliming@byosoft.com.cn> > > 抄送: edk2-devel-groups-io <devel@edk2.groups.io>; Ard Biesheuvel > > <ardb+tianocore@kernel.org>; Jiewen Yao <jiewen.yao@intel.com>; Jordan > > Justen <jordan.l.justen@intel.com>; Gerd Hoffmann <kraxel@redhat.com>; > > Erdem Aktas <erdemaktas@google.com>; James Bottomley > > <jejb@linux.ibm.com>; Michael Roth <michael.roth@amd.com>; Min Xu > > <min.m.xu@intel.com> > > 主题: Re: [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build > > work with SEV > > > > Explicitly adding Liming to the To: line for visibility. > > > > Thanks, > > Tom > > > > On 5/17/22 11:29, Ard Biesheuvel wrote: > > > On Tue, 17 May 2022 at 18:26, Tom Lendacky <thomas.lendacky@amd.com> > > wrote: > > >> > > >> On 5/16/22 15:24, Lendacky, Thomas via groups.io wrote: > > >>> The BaseMemEncryptSevLib functionality was updated to rely on the use > > of > > >>> the OVMF/SEV workarea to check for SEV guests. However, this area is > > only > > >>> updated when running the X64 OVMF build, not the hybrid Ia32/X64 > > build. > > >>> Base SEV support is allowed under the Ia32/X64 build, but it now fails > > >>> to boot as a result of the change. > > >>> > > >>> Update the ResetVector code to check for SEV features when built for > > >>> 32-bit mode, not just 64-bit mode (requiring updates to both the Ia32 > > >>> and Ia32X64 fdf files). > > >> > > >> So this is a regression and it would be great if it could be applied to > > >> the 202205 release. Can folks take a look and make sure it looks safe to > > >> them for applying during hard feature freeze? > > >> > > >> If it's ok to be applied now, is there a particular process for applying > > >> this during hard freeze? > > >> > > > > > > For the change itself: > > > > > > Acked-by: Ard Biesheuvel <ardb@kernel.org> > > > > > > and I am fine with taking this during hard freeze, but I'll defer to > > > Liming to make the final call. > > > > > > > > > > > >> > > >>> > > >>> Fixes: f1d1c337e7c0575da7fd248b2dd9cffc755940df > > >>> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > > >>> Cc: Jiewen Yao <jiewen.yao@intel.com> > > >>> Cc: Jordan Justen <jordan.l.justen@intel.com> > > >>> Cc: Gerd Hoffmann <kraxel@redhat.com> > > >>> Cc: Erdem Aktas <erdemaktas@google.com> > > >>> Cc: James Bottomley <jejb@linux.ibm.com> > > >>> Cc: Michael Roth <michael.roth@amd.com> > > >>> Cc: Min Xu <min.m.xu@intel.com> > > >>> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> > > >>> --- > > >>> OvmfPkg/OvmfPkgIa32.fdf | 11 +++ > > >>> OvmfPkg/OvmfPkgIa32X64.fdf | 8 +++ > > >>> OvmfPkg/OvmfPkgX64.fdf | 3 +- > > >>> OvmfPkg/ResetVector/Ia32/AmdSev.asm | 4 ++ > > >>> OvmfPkg/ResetVector/Main.asm | 6 ++ > > >>> OvmfPkg/ResetVector/ResetVector.nasmb | 72 ++++++++++---------- > > >>> 6 files changed, 67 insertions(+), 37 deletions(-) > > >>> > > >>> diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf > > >>> index 3ab1755749d4..57d13b7130bc 100644 > > >>> --- a/OvmfPkg/OvmfPkgIa32.fdf > > >>> +++ b/OvmfPkg/OvmfPkgIa32.fdf > > >>> @@ -76,6 +76,9 @@ [FD.MEMFD] > > >>> 0x007000|0x001000 > > >>> > > gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress|gUefiOv > > mfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize > > >>> > > >>> +0x008000|0x001000 > > >>> > > +gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase|gUefiOvmfPkgToken > > SpaceGuid.PcdOvmfWorkAreaSize > > >>> + > > >>> 0x010000|0x010000 > > >>> > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgT > > okenSpaceGuid.PcdOvmfSecPeiTempRamSize > > >>> > > >>> @@ -87,6 +90,14 @@ [FD.MEMFD] > > >>> > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgToken > > SpaceGuid.PcdOvmfDxeMemFvSize > > >>> FV = DXEFV > > >>> > > >>> > > +############################################################# > > ############################# > > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > > the > > >>> +# the SEV STATUS MSR is now saved in the work area) > > >>> +# > > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > > $(MEMFD_BASE_ADDRESS) + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> > > +############################################################# > > ############################# > > >>> + > > >>> > > ############################################################## > > ################## > > >>> > > >>> [FV.SECFV] > > >>> diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf > > b/OvmfPkg/OvmfPkgIa32X64.fdf > > >>> index e1638fa6ea38..ccde366887a9 100644 > > >>> --- a/OvmfPkg/OvmfPkgIa32X64.fdf > > >>> +++ b/OvmfPkg/OvmfPkgIa32X64.fdf > > >>> @@ -90,6 +90,14 @@ [FD.MEMFD] > > >>> > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgToken > > SpaceGuid.PcdOvmfDxeMemFvSize > > >>> FV = DXEFV > > >>> > > >>> > > +############################################################# > > ############################# > > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > > the > > >>> +# the SEV STATUS MSR is now saved in the work area) > > >>> +# > > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > > $(MEMFD_BASE_ADDRESS) + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> +SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> > > +############################################################# > > ############################# > > >>> + > > >>> > > ############################################################## > > ################## > > >>> > > >>> [FV.SECFV] > > >>> diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf > > >>> index aa9a83032d9b..438806fba8f1 100644 > > >>> --- a/OvmfPkg/OvmfPkgX64.fdf > > >>> +++ b/OvmfPkg/OvmfPkgX64.fdf > > >>> @@ -106,7 +106,8 @@ [FD.MEMFD] > > >>> FV = DXEFV > > >>> > > >>> > > ############################################################## > > ############################ > > >>> -# Set the SEV-ES specific work area PCDs > > >>> +# Set the SEV-ES specific work area PCDs (used for all forms of SEV since > > the > > >>> +# the SEV STATUS MSR is now saved in the work area) > > >>> # > > >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase = > > $(MEMFD_BASE_ADDRESS) + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase + > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> SET gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaSize = > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaSize - > > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHea > > der > > >>> diff --git a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > >>> index 864d68385342..9350b0406833 100644 > > >>> --- a/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > >>> +++ b/OvmfPkg/ResetVector/Ia32/AmdSev.asm > > >>> @@ -150,6 +150,8 @@ BITS 32 > > >>> SevEsUnexpectedRespTerminate: > > >>> TerminateVmgExit TERM_UNEXPECTED_RESP_CODE > > >>> > > >>> +%ifdef ARCH_X64 > > >>> + > > >>> ; If SEV-ES is enabled then initialize and make the GHCB page shared > > >>> SevClearPageEncMaskForGhcbPage: > > >>> ; Check if SEV is enabled > > >>> @@ -209,6 +211,8 @@ GetSevCBitMaskAbove31: > > >>> GetSevCBitMaskAbove31Exit: > > >>> OneTimeCallRet GetSevCBitMaskAbove31 > > >>> > > >>> +%endif > > >>> + > > >>> ; Check if Secure Encrypted Virtualization (SEV) features are enabled. > > >>> ; > > >>> ; Register usage is tight in this routine, so multiple calls for the > > >>> diff --git a/OvmfPkg/ResetVector/Main.asm > > b/OvmfPkg/ResetVector/Main.asm > > >>> index 5cfc0b5c72b1..46cfa87c4c0a 100644 > > >>> --- a/OvmfPkg/ResetVector/Main.asm > > >>> +++ b/OvmfPkg/ResetVector/Main.asm > > >>> @@ -75,6 +75,12 @@ SearchBfv: > > >>> > > >>> %ifdef ARCH_IA32 > > >>> > > >>> + ; > > >>> + ; SEV support can be built and run using the Ia32/X64 split > > environment. > > >>> + ; Set the OVMF/SEV work area as appropriate. > > >>> + ; > > >>> + OneTimeCall CheckSevFeatures > > >>> + > > >>> ; > > >>> ; Restore initial EAX value into the EAX register > > >>> ; > > >>> diff --git a/OvmfPkg/ResetVector/ResetVector.nasmb > > b/OvmfPkg/ResetVector/ResetVector.nasmb > > >>> index 9421f4818907..94fbb0a87b37 100644 > > >>> --- a/OvmfPkg/ResetVector/ResetVector.nasmb > > >>> +++ b/OvmfPkg/ResetVector/ResetVector.nasmb > > >>> @@ -47,7 +47,36 @@ > > >>> %include "Ia32/SearchForBfvBase.asm" > > >>> %include "Ia32/SearchForSecEntry.asm" > > >>> > > >>> -%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 > > (PcdOvmfWorkAreaBase)) > > >>> +%define WORK_AREA_GUEST_TYPE (FixedPcdGet32 > > (PcdOvmfWorkAreaBase)) > > >>> +%define PT_ADDR(Offset) (FixedPcdGet32 > > (PcdOvmfSecPageTablesBase) + (Offset)) > > >>> + > > >>> +%define GHCB_PT_ADDR (FixedPcdGet32 > > (PcdOvmfSecGhcbPageTableBase)) > > >>> +%define GHCB_BASE (FixedPcdGet32 > > (PcdOvmfSecGhcbBase)) > > >>> +%define GHCB_SIZE (FixedPcdGet32 > > (PcdOvmfSecGhcbSize)) > > >>> +%define SEV_ES_WORK_AREA (FixedPcdGet32 > > (PcdSevEsWorkAreaBase)) > > >>> +%define SEV_ES_WORK_AREA_SIZE 25 > > >>> +%define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 > > (PcdSevEsWorkAreaBase)) > > >>> +%define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 8) > > >>> +%define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 16) > > >>> +%define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 24) > > >>> +%define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 > > (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 > > (PcdOvmfSecPeiTempRamSize)) > > >>> +%define SEV_SNP_SECRETS_BASE (FixedPcdGet32 > > (PcdOvmfSnpSecretsBase)) > > >>> +%define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 > > (PcdOvmfSnpSecretsSize)) > > >>> +%define CPUID_BASE (FixedPcdGet32 > > (PcdOvmfCpuidBase)) > > >>> +%define CPUID_SIZE (FixedPcdGet32 > > (PcdOvmfCpuidSize)) > > >>> +%define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 > > (PcdOvmfSecPageTablesBase)) > > >>> +%define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 > > (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > > >>> +; > > >>> +; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page is > > used > > >>> +; as GHCB shared page and second is used for bookkeeping to support > > the > > >>> +; nested GHCB in SEC phase. The bookkeeping page is mapped private. > > The VMM > > >>> +; does not need to validate the shared page but it need to validate the > > >>> +; bookkeeping page. > > >>> +; > > >>> +%define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > > >>> +%define SNP_SEC_MEM_SIZE_DESC_2 > > (SEV_SNP_SECRETS_BASE - SNP_SEC_MEM_BASE_DESC_2) > > >>> +%define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + > > CPUID_SIZE) > > >>> +%define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 > > (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > > >>> > > >>> %ifdef ARCH_X64 > > >>> #include <AutoGen.h> > > >>> @@ -94,43 +123,14 @@ > > >>> %define TDX_WORK_AREA_PGTBL_READY (FixedPcdGet32 > > (PcdOvmfWorkAreaBase) + 4) > > >>> %define TDX_WORK_AREA_GPAW (FixedPcdGet32 > > (PcdOvmfWorkAreaBase) + 8) > > >>> > > >>> - %define PT_ADDR(Offset) (FixedPcdGet32 > > (PcdOvmfSecPageTablesBase) + (Offset)) > > >>> + %include "X64/IntelTdxMetadata.asm" > > >>> + %include "Ia32/Flat32ToFlat64.asm" > > >>> + %include "Ia32/PageTables64.asm" > > >>> + %include "Ia32/IntelTdx.asm" > > >>> + %include "X64/OvmfSevMetadata.asm" > > >>> +%endif > > >>> > > >>> - %define GHCB_PT_ADDR (FixedPcdGet32 > > (PcdOvmfSecGhcbPageTableBase)) > > >>> - %define GHCB_BASE (FixedPcdGet32 (PcdOvmfSecGhcbBase)) > > >>> - %define GHCB_SIZE (FixedPcdGet32 (PcdOvmfSecGhcbSize)) > > >>> - %define SEV_ES_WORK_AREA (FixedPcdGet32 > > (PcdSevEsWorkAreaBase)) > > >>> - %define SEV_ES_WORK_AREA_SIZE 25 > > >>> - %define SEV_ES_WORK_AREA_STATUS_MSR (FixedPcdGet32 > > (PcdSevEsWorkAreaBase)) > > >>> - %define SEV_ES_WORK_AREA_RDRAND (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 8) > > >>> - %define SEV_ES_WORK_AREA_ENC_MASK (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 16) > > >>> - %define SEV_ES_WORK_AREA_RECEIVED_VC (FixedPcdGet32 > > (PcdSevEsWorkAreaBase) + 24) > > >>> - %define SEV_ES_VC_TOP_OF_STACK (FixedPcdGet32 > > (PcdOvmfSecPeiTempRamBase) + FixedPcdGet32 > > (PcdOvmfSecPeiTempRamSize)) > > >>> - %define SEV_SNP_SECRETS_BASE (FixedPcdGet32 > > (PcdOvmfSnpSecretsBase)) > > >>> - %define SEV_SNP_SECRETS_SIZE (FixedPcdGet32 > > (PcdOvmfSnpSecretsSize)) > > >>> - %define CPUID_BASE (FixedPcdGet32 (PcdOvmfCpuidBase)) > > >>> - %define CPUID_SIZE (FixedPcdGet32 (PcdOvmfCpuidSize)) > > >>> - %define SNP_SEC_MEM_BASE_DESC_1 (FixedPcdGet32 > > (PcdOvmfSecPageTablesBase)) > > >>> - %define SNP_SEC_MEM_SIZE_DESC_1 (FixedPcdGet32 > > (PcdOvmfSecGhcbBase) - SNP_SEC_MEM_BASE_DESC_1) > > >>> - ; > > >>> - ; The PcdOvmfSecGhcbBase reserves two GHCB pages. The first page > > is used > > >>> - ; as GHCB shared page and second is used for bookkeeping to support > > the > > >>> - ; nested GHCB in SEC phase. The bookkeeping page is mapped private. > > The VMM > > >>> - ; does not need to validate the shared page but it need to validate the > > >>> - ; bookkeeping page. > > >>> - ; > > >>> - %define SNP_SEC_MEM_BASE_DESC_2 (GHCB_BASE + 0x1000) > > >>> - %define SNP_SEC_MEM_SIZE_DESC_2 (SEV_SNP_SECRETS_BASE - > > SNP_SEC_MEM_BASE_DESC_2) > > >>> - %define SNP_SEC_MEM_BASE_DESC_3 (CPUID_BASE + CPUID_SIZE) > > >>> - %define SNP_SEC_MEM_SIZE_DESC_3 (FixedPcdGet32 > > (PcdOvmfPeiMemFvBase) - SNP_SEC_MEM_BASE_DESC_3) > > >>> - > > >>> -%include "X64/IntelTdxMetadata.asm" > > >>> -%include "Ia32/Flat32ToFlat64.asm" > > >>> %include "Ia32/AmdSev.asm" > > >>> -%include "Ia32/PageTables64.asm" > > >>> -%include "Ia32/IntelTdx.asm" > > >>> -%include "X64/OvmfSevMetadata.asm" > > >>> -%endif > > >>> > > >>> %include "Ia16/Real16ToFlat32.asm" > > >>> %include "Ia16/Init16.asm" > > > > > > > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-05-20 6:36 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <16EFAF988BEBA4A6.18257@groups.io> 2022-05-17 16:26 ` [edk2-devel] [PATCH] OvmfPkg: Make an Ia32/X64 hybrid build work with SEV Lendacky, Thomas 2022-05-17 16:29 ` Ard Biesheuvel 2022-05-19 22:02 ` Lendacky, Thomas 2022-05-20 1:43 ` 回复: " gaoliming 2022-05-20 6:36 ` Ard Biesheuvel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox