public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
@ 2022-04-19  1:58 Min Xu
  2022-04-19  2:07 ` [edk2-devel] " Yao, Jiewen
  0 siblings, 1 reply; 11+ messages in thread
From: Min Xu @ 2022-04-19  1:58 UTC (permalink / raw)
  To: devel
  Cc: Min Xu, Brijesh Singh, Erdem Aktas, James Bottomley, Jiewen Yao,
	Tom Lendacky

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3904

TdxDxe driver is introduced for Intel TDX feature. Unfortunately, this
driver also breaks boot process in SEV-ES guest. The root cause is in
the PciLib which is imported by TdxDxe driver.

In a SEV-ES guest the AmdSevDxe driver performs a
MemEncryptSevClearMmioPageEncMask() call against the
PcdPciExpressBaseAddress range to mark it shared/unencrypted. However,
the TdxDxe driver is loaded before the AmdSevDxe driver, and the PciLib
in TdxDxe is DxePciLibI440FxQ35 which will access the
PcdPciExpressBaseAddress range. Since the range has not been marked
shared/unencrypted, the #VC handler terminates the guest for trying to
do MMIO to an encrypted region.

To fix the issue TdxDxe driver set the PciLib to BasePciLibCf8.inf as
AmdSevDxe driver does.

Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
SEV-Tested-by: Tom Lendacky <thomas.lendacky@amd.com>
TDX-Tested-by: Min Xu <min.m.xu@intel.com>
Signed-off-by: Min Xu <min.m.xu@intel.com>
---
 OvmfPkg/IntelTdx/IntelTdxX64.dsc | 5 ++++-
 OvmfPkg/OvmfPkgX64.dsc           | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
index 245155d41b..f58f14a1d8 100644
--- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc
+++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
@@ -704,7 +704,10 @@
   OvmfPkg/PlatformDxe/Platform.inf
   OvmfPkg/IoMmuDxe/IoMmuDxe.inf
 
-  OvmfPkg/TdxDxe/TdxDxe.inf
+  OvmfPkg/TdxDxe/TdxDxe.inf {
+    <LibraryClasses>
+    PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
+  }
 
   #
   # Variable driver stack (non-SMM)
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index fb2899f8a1..68e7d051d0 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -967,7 +967,10 @@
   }
   OvmfPkg/IoMmuDxe/IoMmuDxe.inf
 
-  OvmfPkg/TdxDxe/TdxDxe.inf
+  OvmfPkg/TdxDxe/TdxDxe.inf {
+    <LibraryClasses>
+    PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
+  }
 
 !if $(SMM_REQUIRE) == TRUE
   OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
-- 
2.29.2.windows.2


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  1:58 [PATCH] OvmfPkg: Set PciLib for TdxDxe driver Min Xu
@ 2022-04-19  2:07 ` Yao, Jiewen
  2022-04-19  2:42   ` Min Xu
  0 siblings, 1 reply; 11+ messages in thread
From: Yao, Jiewen @ 2022-04-19  2:07 UTC (permalink / raw)
  To: devel@edk2.groups.io, Xu, Min M
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

Hi
If TdxDxe breaks SEV, should we skip the TdxDxe in SEV path?

I don't understand why we need use Cfg8.

Thank you
Yao Jiewen


> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Min Xu
> Sent: Tuesday, April 19, 2022 9:58 AM
> To: devel@edk2.groups.io
> Cc: Xu, Min M <min.m.xu@intel.com>; Brijesh Singh <brijesh.singh@amd.com>;
> Aktas, Erdem <erdemaktas@google.com>; James Bottomley
> <jejb@linux.ibm.com>; Yao, Jiewen <jiewen.yao@intel.com>; Tom Lendacky
> <thomas.lendacky@amd.com>
> Subject: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3904
> 
> TdxDxe driver is introduced for Intel TDX feature. Unfortunately, this
> driver also breaks boot process in SEV-ES guest. The root cause is in
> the PciLib which is imported by TdxDxe driver.
> 
> In a SEV-ES guest the AmdSevDxe driver performs a
> MemEncryptSevClearMmioPageEncMask() call against the
> PcdPciExpressBaseAddress range to mark it shared/unencrypted. However,
> the TdxDxe driver is loaded before the AmdSevDxe driver, and the PciLib
> in TdxDxe is DxePciLibI440FxQ35 which will access the
> PcdPciExpressBaseAddress range. Since the range has not been marked
> shared/unencrypted, the #VC handler terminates the guest for trying to
> do MMIO to an encrypted region.
> 
> To fix the issue TdxDxe driver set the PciLib to BasePciLibCf8.inf as
> AmdSevDxe driver does.
> 
> Cc: Brijesh Singh <brijesh.singh@amd.com>
> Cc: Erdem Aktas <erdemaktas@google.com>
> Cc: James Bottomley <jejb@linux.ibm.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Tom Lendacky <thomas.lendacky@amd.com>
> SEV-Tested-by: Tom Lendacky <thomas.lendacky@amd.com>
> TDX-Tested-by: Min Xu <min.m.xu@intel.com>
> Signed-off-by: Min Xu <min.m.xu@intel.com>
> ---
>  OvmfPkg/IntelTdx/IntelTdxX64.dsc | 5 ++++-
>  OvmfPkg/OvmfPkgX64.dsc           | 5 ++++-
>  2 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/OvmfPkg/IntelTdx/IntelTdxX64.dsc
> b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
> index 245155d41b..f58f14a1d8 100644
> --- a/OvmfPkg/IntelTdx/IntelTdxX64.dsc
> +++ b/OvmfPkg/IntelTdx/IntelTdxX64.dsc
> @@ -704,7 +704,10 @@
>    OvmfPkg/PlatformDxe/Platform.inf
>    OvmfPkg/IoMmuDxe/IoMmuDxe.inf
> 
> -  OvmfPkg/TdxDxe/TdxDxe.inf
> +  OvmfPkg/TdxDxe/TdxDxe.inf {
> +    <LibraryClasses>
> +    PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
> +  }
> 
>    #
>    # Variable driver stack (non-SMM)
> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> index fb2899f8a1..68e7d051d0 100644
> --- a/OvmfPkg/OvmfPkgX64.dsc
> +++ b/OvmfPkg/OvmfPkgX64.dsc
> @@ -967,7 +967,10 @@
>    }
>    OvmfPkg/IoMmuDxe/IoMmuDxe.inf
> 
> -  OvmfPkg/TdxDxe/TdxDxe.inf
> +  OvmfPkg/TdxDxe/TdxDxe.inf {
> +    <LibraryClasses>
> +    PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
> +  }
> 
>  !if $(SMM_REQUIRE) == TRUE
>    OvmfPkg/SmmAccess/SmmAccess2Dxe.inf
> --
> 2.29.2.windows.2
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  2:07 ` [edk2-devel] " Yao, Jiewen
@ 2022-04-19  2:42   ` Min Xu
  2022-04-19  2:54     ` Yao, Jiewen
  0 siblings, 1 reply; 11+ messages in thread
From: Min Xu @ 2022-04-19  2:42 UTC (permalink / raw)
  To: Yao, Jiewen, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

On April 19, 2022 10:08 AM, Yao Jiewen wrote:
> 
> If TdxDxe breaks SEV, should we skip the TdxDxe in SEV path?
> 
> I don't understand why we need use Cfg8.
> 
In TdxDxe driver we need to relocate APs and it requires the TdxMailboxLib. 
The lib chain is that TdxMailbox ->  SynchronizationLib -> TimerLib (which is DxeAcpiTimerLib) -> PciLib (Which was DxePciLibI440FxQ35).
TdxDxe driver was loaded before AmdSevDxe so its lib constructors are called even it is in SEV-ES guest. In other words those lib constructor cannot be skipped in SEV-ES guest.

The analysis of the root cause (why DxePciLibI440FxQ35 trigger the broken) is in below link:
https://edk2.groups.io/g/devel/message/88968

Thanks
Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  2:42   ` Min Xu
@ 2022-04-19  2:54     ` Yao, Jiewen
  2022-04-19  3:05       ` Min Xu
  0 siblings, 1 reply; 11+ messages in thread
From: Yao, Jiewen @ 2022-04-19  2:54 UTC (permalink / raw)
  To: Xu, Min M, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

Why does TdxDxe call TdxMailbox in an SEV platform?
Or why does TdxMailbox call SynchronizationLib in an SEV platform?

There are many places we can do CcProbe to stop action. Why we need do it in DSC?

In general, DSC lib override should be the last option, because it requires the platform integrator aware such tricky thing. I strongly discourage to use this, although it is architecturally support. 

I do believe we have many other ways to achieve the same goal.

Thank you
Yao Jiewen


> -----Original Message-----
> From: Xu, Min M <min.m.xu@intel.com>
> Sent: Tuesday, April 19, 2022 10:42 AM
> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> Lendacky <thomas.lendacky@amd.com>
> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> On April 19, 2022 10:08 AM, Yao Jiewen wrote:
> >
> > If TdxDxe breaks SEV, should we skip the TdxDxe in SEV path?
> >
> > I don't understand why we need use Cfg8.
> >
> In TdxDxe driver we need to relocate APs and it requires the TdxMailboxLib.
> The lib chain is that TdxMailbox ->  SynchronizationLib -> TimerLib (which is
> DxeAcpiTimerLib) -> PciLib (Which was DxePciLibI440FxQ35).
> TdxDxe driver was loaded before AmdSevDxe so its lib constructors are called
> even it is in SEV-ES guest. In other words those lib constructor cannot be skipped
> in SEV-ES guest.
> 
> The analysis of the root cause (why DxePciLibI440FxQ35 trigger the broken) is in
> below link:
> https://edk2.groups.io/g/devel/message/88968
> 
> Thanks
> Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  2:54     ` Yao, Jiewen
@ 2022-04-19  3:05       ` Min Xu
  2022-04-19  4:15         ` Yao, Jiewen
  0 siblings, 1 reply; 11+ messages in thread
From: Min Xu @ 2022-04-19  3:05 UTC (permalink / raw)
  To: Yao, Jiewen, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

On April 19, 2022 10:54 AM, Yao Jiewen wrote:
> 
> Why does TdxDxe call TdxMailbox in an SEV platform?
> Or why does TdxMailbox call SynchronizationLib in an SEV platform?
>
TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform. The problem is in the lib constructor. When TdxDxe driver is loaded, before its entry point is called, the lib constructors will be called even in a SEV platform.
> 
> There are many places we can do CcProbe to stop action. Why we need do it
> in DSC?
So we cannot stop the lib constructor with CcProbe in this case.

Thanks
Min 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  3:05       ` Min Xu
@ 2022-04-19  4:15         ` Yao, Jiewen
  2022-04-19  4:39           ` Min Xu
  0 siblings, 1 reply; 11+ messages in thread
From: Yao, Jiewen @ 2022-04-19  4:15 UTC (permalink / raw)
  To: Xu, Min M, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

Do you mean, with SEV introduced, OVMF cannot use PCI express any more?

Thank you
Yao Jiewen


> -----Original Message-----
> From: Xu, Min M <min.m.xu@intel.com>
> Sent: Tuesday, April 19, 2022 11:05 AM
> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> Lendacky <thomas.lendacky@amd.com>
> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> On April 19, 2022 10:54 AM, Yao Jiewen wrote:
> >
> > Why does TdxDxe call TdxMailbox in an SEV platform?
> > Or why does TdxMailbox call SynchronizationLib in an SEV platform?
> >
> TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform. The
> problem is in the lib constructor. When TdxDxe driver is loaded, before its entry
> point is called, the lib constructors will be called even in a SEV platform.
> >
> > There are many places we can do CcProbe to stop action. Why we need do it
> > in DSC?
> So we cannot stop the lib constructor with CcProbe in this case.
> 
> Thanks
> Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  4:15         ` Yao, Jiewen
@ 2022-04-19  4:39           ` Min Xu
  2022-04-19  4:47             ` Yao, Jiewen
       [not found]             ` <16E732CAB3014272.17418@groups.io>
  0 siblings, 2 replies; 11+ messages in thread
From: Min Xu @ 2022-04-19  4:39 UTC (permalink / raw)
  To: Yao, Jiewen, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

In AmdSevDxe's entry point it clears the C-bit from PcdPciExpressBaseAddress and other memory spaces if needed. Please see https://github.com/tianocore/edk2/blob/master/OvmfPkg/AmdSevDxe/AmdSevDxe.c#L81-L95. After that OVMF can use PCI express.

This broken is caused by the call sequence of TdxDxe driver and AmdSevDxe driver. Currently TdxDxe driver is loaded before AmdSevDxe, so in SEV-ES guest the C-bit of PcdPciExpressBaseAddress hasn't been cleared. In this situation the access to PciExpressBaseAddress trigger exceptions (lib constructor in TdxDxe).

There are 2 options to fix this issue.
1. Adjust the load sequence of AmdSevDxe and TdxDxe (Load AmdSevDxe before TdxDxe)
2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf (just like AmdSevDxe)

Tom and I tested above 2 options in SEV and TDX and all work.

> -----Original Message-----
> From: Yao, Jiewen <jiewen.yao@intel.com>
> Sent: Tuesday, April 19, 2022 12:16 PM
> To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> Lendacky <thomas.lendacky@amd.com>
> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> Do you mean, with SEV introduced, OVMF cannot use PCI express any more?
> 
> Thank you
> Yao Jiewen
> 
> 
> > -----Original Message-----
> > From: Xu, Min M <min.m.xu@intel.com>
> > Sent: Tuesday, April 19, 2022 11:05 AM
> > To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> > Lendacky <thomas.lendacky@amd.com>
> > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe
> > driver
> >
> > On April 19, 2022 10:54 AM, Yao Jiewen wrote:
> > >
> > > Why does TdxDxe call TdxMailbox in an SEV platform?
> > > Or why does TdxMailbox call SynchronizationLib in an SEV platform?
> > >
> > TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform.
> > The problem is in the lib constructor. When TdxDxe driver is loaded,
> > before its entry point is called, the lib constructors will be called even in a
> SEV platform.
> > >
> > > There are many places we can do CcProbe to stop action. Why we need
> > > do it in DSC?
> > So we cannot stop the lib constructor with CcProbe in this case.
> >
> > Thanks
> > Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  4:39           ` Min Xu
@ 2022-04-19  4:47             ` Yao, Jiewen
  2022-04-19 13:23               ` Lendacky, Thomas
       [not found]             ` <16E732CAB3014272.17418@groups.io>
  1 sibling, 1 reply; 11+ messages in thread
From: Yao, Jiewen @ 2022-04-19  4:47 UTC (permalink / raw)
  To: Xu, Min M, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

Can SEV clear the C-bit in SEC phase?

I think that is right way to ensure PCI Express can always be accessed by anyone.


> -----Original Message-----
> From: Xu, Min M <min.m.xu@intel.com>
> Sent: Tuesday, April 19, 2022 12:39 PM
> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> Lendacky <thomas.lendacky@amd.com>
> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> In AmdSevDxe's entry point it clears the C-bit from PcdPciExpressBaseAddress
> and other memory spaces if needed. Please see
> https://github.com/tianocore/edk2/blob/master/OvmfPkg/AmdSevDxe/AmdSev
> Dxe.c#L81-L95. After that OVMF can use PCI express.
> 
> This broken is caused by the call sequence of TdxDxe driver and AmdSevDxe
> driver. Currently TdxDxe driver is loaded before AmdSevDxe, so in SEV-ES guest
> the C-bit of PcdPciExpressBaseAddress hasn't been cleared. In this situation the
> access to PciExpressBaseAddress trigger exceptions (lib constructor in TdxDxe).
> 
> There are 2 options to fix this issue.
> 1. Adjust the load sequence of AmdSevDxe and TdxDxe (Load AmdSevDxe before
> TdxDxe)
> 2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf
> (just like AmdSevDxe)
> 
> Tom and I tested above 2 options in SEV and TDX and all work.
> 
> > -----Original Message-----
> > From: Yao, Jiewen <jiewen.yao@intel.com>
> > Sent: Tuesday, April 19, 2022 12:16 PM
> > To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
> > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> > Lendacky <thomas.lendacky@amd.com>
> > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> >
> > Do you mean, with SEV introduced, OVMF cannot use PCI express any more?
> >
> > Thank you
> > Yao Jiewen
> >
> >
> > > -----Original Message-----
> > > From: Xu, Min M <min.m.xu@intel.com>
> > > Sent: Tuesday, April 19, 2022 11:05 AM
> > > To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> > > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> > > Lendacky <thomas.lendacky@amd.com>
> > > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe
> > > driver
> > >
> > > On April 19, 2022 10:54 AM, Yao Jiewen wrote:
> > > >
> > > > Why does TdxDxe call TdxMailbox in an SEV platform?
> > > > Or why does TdxMailbox call SynchronizationLib in an SEV platform?
> > > >
> > > TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform.
> > > The problem is in the lib constructor. When TdxDxe driver is loaded,
> > > before its entry point is called, the lib constructors will be called even in a
> > SEV platform.
> > > >
> > > > There are many places we can do CcProbe to stop action. Why we need
> > > > do it in DSC?
> > > So we cannot stop the lib constructor with CcProbe in this case.
> > >
> > > Thanks
> > > Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
       [not found]             ` <16E732CAB3014272.17418@groups.io>
@ 2022-04-19  5:06               ` Yao, Jiewen
  2022-04-21 16:12                 ` Lendacky, Thomas
  0 siblings, 1 reply; 11+ messages in thread
From: Yao, Jiewen @ 2022-04-19  5:06 UTC (permalink / raw)
  To: devel@edk2.groups.io, Yao, Jiewen, Xu, Min M
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley, Tom Lendacky

OK. Let me describe what I think.

PCI Express BAR need to be initialized by someone in the platform.
This initialization may require CFG8. That is understandable.

A good design is that: After the PCIE BAR is initialized, it can be accessed.
Requires additional step (such as clear C-bit) means the PCIE BAR is not fully initialized originally. I don't think it is a good idea.

So far, the problem is TdxDxe, but what if a PEI driver also wants to use access PCIE space? It may run into same problem.

I think the best way is to clear C-bit in PciExBarInitialization(), as SEV specific step to finish initialization. https://github.com/tianocore/edk2/blob/master/OvmfPkg/Library/PlatformInitLib/Platform.c#L261

As such, no matter how many drivers want to use PCIE, they can.


Splitting PCIE bar programming and C bit clearing is a big problem. In this window, no one can actually touch the PCIE bar, although it seems being initialized...


Thank you
Yao Jiewen

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Yao, Jiewen
> Sent: Tuesday, April 19, 2022 12:47 PM
> To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> Lendacky <thomas.lendacky@amd.com>
> Subject: Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> 
> Can SEV clear the C-bit in SEC phase?
> 
> I think that is right way to ensure PCI Express can always be accessed by anyone.
> 
> 
> > -----Original Message-----
> > From: Xu, Min M <min.m.xu@intel.com>
> > Sent: Tuesday, April 19, 2022 12:39 PM
> > To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> > Lendacky <thomas.lendacky@amd.com>
> > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> >
> > In AmdSevDxe's entry point it clears the C-bit from PcdPciExpressBaseAddress
> > and other memory spaces if needed. Please see
> >
> https://github.com/tianocore/edk2/blob/master/OvmfPkg/AmdSevDxe/AmdSev
> > Dxe.c#L81-L95. After that OVMF can use PCI express.
> >
> > This broken is caused by the call sequence of TdxDxe driver and AmdSevDxe
> > driver. Currently TdxDxe driver is loaded before AmdSevDxe, so in SEV-ES guest
> > the C-bit of PcdPciExpressBaseAddress hasn't been cleared. In this situation
> the
> > access to PciExpressBaseAddress trigger exceptions (lib constructor in TdxDxe).
> >
> > There are 2 options to fix this issue.
> > 1. Adjust the load sequence of AmdSevDxe and TdxDxe (Load AmdSevDxe
> before
> > TdxDxe)
> > 2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf
> > (just like AmdSevDxe)
> >
> > Tom and I tested above 2 options in SEV and TDX and all work.
> >
> > > -----Original Message-----
> > > From: Yao, Jiewen <jiewen.yao@intel.com>
> > > Sent: Tuesday, April 19, 2022 12:16 PM
> > > To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
> > > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
> > > Lendacky <thomas.lendacky@amd.com>
> > > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
> > >
> > > Do you mean, with SEV introduced, OVMF cannot use PCI express any more?
> > >
> > > Thank you
> > > Yao Jiewen
> > >
> > >
> > > > -----Original Message-----
> > > > From: Xu, Min M <min.m.xu@intel.com>
> > > > Sent: Tuesday, April 19, 2022 11:05 AM
> > > > To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
> > > > Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
> > > > <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>;
> Tom
> > > > Lendacky <thomas.lendacky@amd.com>
> > > > Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe
> > > > driver
> > > >
> > > > On April 19, 2022 10:54 AM, Yao Jiewen wrote:
> > > > >
> > > > > Why does TdxDxe call TdxMailbox in an SEV platform?
> > > > > Or why does TdxMailbox call SynchronizationLib in an SEV platform?
> > > > >
> > > > TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform.
> > > > The problem is in the lib constructor. When TdxDxe driver is loaded,
> > > > before its entry point is called, the lib constructors will be called even in a
> > > SEV platform.
> > > > >
> > > > > There are many places we can do CcProbe to stop action. Why we need
> > > > > do it in DSC?
> > > > So we cannot stop the lib constructor with CcProbe in this case.
> > > >
> > > > Thanks
> > > > Min
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  4:47             ` Yao, Jiewen
@ 2022-04-19 13:23               ` Lendacky, Thomas
  0 siblings, 0 replies; 11+ messages in thread
From: Lendacky, Thomas @ 2022-04-19 13:23 UTC (permalink / raw)
  To: Yao, Jiewen, Xu, Min M, devel@edk2.groups.io
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley

On 4/18/22 23:47, Yao, Jiewen wrote:
> Can SEV clear the C-bit in SEC phase?

Not really. IIRC, even if cleared in the SEC phase, the DXE phase replaces 
the page tables and it has to be cleared again.

Thanks,
Tom

> 
> I think that is right way to ensure PCI Express can always be accessed by anyone.
> 
> 
>> -----Original Message-----
>> From: Xu, Min M <min.m.xu@intel.com>
>> Sent: Tuesday, April 19, 2022 12:39 PM
>> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>> Lendacky <thomas.lendacky@amd.com>
>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
>>
>> In AmdSevDxe's entry point it clears the C-bit from PcdPciExpressBaseAddress
>> and other memory spaces if needed. Please see
>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Ftianocore%2Fedk2%2Fblob%2Fmaster%2FOvmfPkg%2FAmdSevDxe%2FAmdSev&amp;data=04%7C01%7Cthomas.lendacky%40amd.com%7Cc39c49fd4e944900bdb708da21bfac91%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637859404370071519%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&amp;sdata=9sxJnGXyaiHTdIzS%2BTzziBnwTAsKvSLFRMmHT4HGe60%3D&amp;reserved=0
>> Dxe.c#L81-L95. After that OVMF can use PCI express.
>>
>> This broken is caused by the call sequence of TdxDxe driver and AmdSevDxe
>> driver. Currently TdxDxe driver is loaded before AmdSevDxe, so in SEV-ES guest
>> the C-bit of PcdPciExpressBaseAddress hasn't been cleared. In this situation the
>> access to PciExpressBaseAddress trigger exceptions (lib constructor in TdxDxe).
>>
>> There are 2 options to fix this issue.
>> 1. Adjust the load sequence of AmdSevDxe and TdxDxe (Load AmdSevDxe before
>> TdxDxe)
>> 2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf
>> (just like AmdSevDxe)
>>
>> Tom and I tested above 2 options in SEV and TDX and all work.
>>
>>> -----Original Message-----
>>> From: Yao, Jiewen <jiewen.yao@intel.com>
>>> Sent: Tuesday, April 19, 2022 12:16 PM
>>> To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
>>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>>> Lendacky <thomas.lendacky@amd.com>
>>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
>>>
>>> Do you mean, with SEV introduced, OVMF cannot use PCI express any more?
>>>
>>> Thank you
>>> Yao Jiewen
>>>
>>>
>>>> -----Original Message-----
>>>> From: Xu, Min M <min.m.xu@intel.com>
>>>> Sent: Tuesday, April 19, 2022 11:05 AM
>>>> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
>>>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>>>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>>>> Lendacky <thomas.lendacky@amd.com>
>>>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe
>>>> driver
>>>>
>>>> On April 19, 2022 10:54 AM, Yao Jiewen wrote:
>>>>>
>>>>> Why does TdxDxe call TdxMailbox in an SEV platform?
>>>>> Or why does TdxMailbox call SynchronizationLib in an SEV platform?
>>>>>
>>>> TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform.
>>>> The problem is in the lib constructor. When TdxDxe driver is loaded,
>>>> before its entry point is called, the lib constructors will be called even in a
>>> SEV platform.
>>>>>
>>>>> There are many places we can do CcProbe to stop action. Why we need
>>>>> do it in DSC?
>>>> So we cannot stop the lib constructor with CcProbe in this case.
>>>>
>>>> Thanks
>>>> Min

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
  2022-04-19  5:06               ` Yao, Jiewen
@ 2022-04-21 16:12                 ` Lendacky, Thomas
  0 siblings, 0 replies; 11+ messages in thread
From: Lendacky, Thomas @ 2022-04-21 16:12 UTC (permalink / raw)
  To: Yao, Jiewen, devel@edk2.groups.io, Xu, Min M
  Cc: Brijesh Singh, Aktas, Erdem, James Bottomley

On 4/19/22 00:06, Yao, Jiewen wrote:
> OK. Let me describe what I think.
> 
> PCI Express BAR need to be initialized by someone in the platform.
> This initialization may require CFG8. That is understandable.
> 
> A good design is that: After the PCIE BAR is initialized, it can be accessed.
> Requires additional step (such as clear C-bit) means the PCIE BAR is not fully initialized originally. I don't think it is a good idea.
> 
> So far, the problem is TdxDxe, but what if a PEI driver also wants to use access PCIE space? It may run into same problem.
> 
> I think the best way is to clear C-bit in PciExBarInitialization(), as SEV specific step to finish initialization. https://github.com/tianocore/edk2/blob/master/OvmfPkg/Library/PlatformInitLib/Platform.c#L261
> 
> As such, no matter how many drivers want to use PCIE, they can.
> 
> 
> Splitting PCIE bar programming and C bit clearing is a big problem. In this window, no one can actually touch the PCIE bar, although it seems being initialized...

I tried this approach and it does not work. It is because new page tables 
are used in the DXE phase and so the c-bit has to be cleared in the new 
page tables vs the page tables used in PEI.

Thanks,
Tom

> 
> 
> Thank you
> Yao Jiewen
> 
>> -----Original Message-----
>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Yao, Jiewen
>> Sent: Tuesday, April 19, 2022 12:47 PM
>> To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>> Lendacky <thomas.lendacky@amd.com>
>> Subject: Re: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
>>
>> Can SEV clear the C-bit in SEC phase?
>>
>> I think that is right way to ensure PCI Express can always be accessed by anyone.
>>
>>
>>> -----Original Message-----
>>> From: Xu, Min M <min.m.xu@intel.com>
>>> Sent: Tuesday, April 19, 2022 12:39 PM
>>> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
>>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>>> Lendacky <thomas.lendacky@amd.com>
>>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
>>>
>>> In AmdSevDxe's entry point it clears the C-bit from PcdPciExpressBaseAddress
>>> and other memory spaces if needed. Please see
>>>
>> https://github.com/tianocore/edk2/blob/master/OvmfPkg/AmdSevDxe/AmdSev
>>> Dxe.c#L81-L95. After that OVMF can use PCI express.
>>>
>>> This broken is caused by the call sequence of TdxDxe driver and AmdSevDxe
>>> driver. Currently TdxDxe driver is loaded before AmdSevDxe, so in SEV-ES guest
>>> the C-bit of PcdPciExpressBaseAddress hasn't been cleared. In this situation
>> the
>>> access to PciExpressBaseAddress trigger exceptions (lib constructor in TdxDxe).
>>>
>>> There are 2 options to fix this issue.
>>> 1. Adjust the load sequence of AmdSevDxe and TdxDxe (Load AmdSevDxe
>> before
>>> TdxDxe)
>>> 2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf
>>> (just like AmdSevDxe)
>>>
>>> Tom and I tested above 2 options in SEV and TDX and all work.
>>>
>>>> -----Original Message-----
>>>> From: Yao, Jiewen <jiewen.yao@intel.com>
>>>> Sent: Tuesday, April 19, 2022 12:16 PM
>>>> To: Xu, Min M <min.m.xu@intel.com>; devel@edk2.groups.io
>>>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>>>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>; Tom
>>>> Lendacky <thomas.lendacky@amd.com>
>>>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe driver
>>>>
>>>> Do you mean, with SEV introduced, OVMF cannot use PCI express any more?
>>>>
>>>> Thank you
>>>> Yao Jiewen
>>>>
>>>>
>>>>> -----Original Message-----
>>>>> From: Xu, Min M <min.m.xu@intel.com>
>>>>> Sent: Tuesday, April 19, 2022 11:05 AM
>>>>> To: Yao, Jiewen <jiewen.yao@intel.com>; devel@edk2.groups.io
>>>>> Cc: Brijesh Singh <brijesh.singh@amd.com>; Aktas, Erdem
>>>>> <erdemaktas@google.com>; James Bottomley <jejb@linux.ibm.com>;
>> Tom
>>>>> Lendacky <thomas.lendacky@amd.com>
>>>>> Subject: RE: [edk2-devel] [PATCH] OvmfPkg: Set PciLib for TdxDxe
>>>>> driver
>>>>>
>>>>> On April 19, 2022 10:54 AM, Yao Jiewen wrote:
>>>>>>
>>>>>> Why does TdxDxe call TdxMailbox in an SEV platform?
>>>>>> Or why does TdxMailbox call SynchronizationLib in an SEV platform?
>>>>>>
>>>>> TdxDxe will not call TdxMailbox/SynchronizationLib in SEV platform.
>>>>> The problem is in the lib constructor. When TdxDxe driver is loaded,
>>>>> before its entry point is called, the lib constructors will be called even in a
>>>> SEV platform.
>>>>>>
>>>>>> There are many places we can do CcProbe to stop action. Why we need
>>>>>> do it in DSC?
>>>>> So we cannot stop the lib constructor with CcProbe in this case.
>>>>>
>>>>> Thanks
>>>>> Min
>>
>>
>> 
>>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-04-21 16:12 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-19  1:58 [PATCH] OvmfPkg: Set PciLib for TdxDxe driver Min Xu
2022-04-19  2:07 ` [edk2-devel] " Yao, Jiewen
2022-04-19  2:42   ` Min Xu
2022-04-19  2:54     ` Yao, Jiewen
2022-04-19  3:05       ` Min Xu
2022-04-19  4:15         ` Yao, Jiewen
2022-04-19  4:39           ` Min Xu
2022-04-19  4:47             ` Yao, Jiewen
2022-04-19 13:23               ` Lendacky, Thomas
     [not found]             ` <16E732CAB3014272.17418@groups.io>
2022-04-19  5:06               ` Yao, Jiewen
2022-04-21 16:12                 ` Lendacky, Thomas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox