On April 16, 2022 11:09 PM, Lendacky, Thomas wrote: > On 4/15/22 20:57, Xu, Min M wrote: > > On April 16, 2022 4:52 AM, Lendacky, Thomas wrote: > >> > >> Unfortunately, this driver also breaks SEV-ES. I bypassed the TDX > >> code in the SEC library, but then hit an issue because this driver is > >> loaded before the AmdSevDxe driver. 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 > >> it appears the dependencies result in an MMIO being performed to an > >> address in 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. > >> > > I carefully check the code TdxDxeEntryPoint@TdxDxe.c. > > If the working guest is NOT td guest, before it returns, it just does below: > > 1. check if the GuidHob exists > > 2. Set PcdOvmfHostBridgePciDevId with the information in the GuidHob > > > > SetMmioSharedBit() is called if the working guest is Td guest. So if it is > > sev > guest, SetMmioSharedBit will not be called. > > > > I don't have a SEV-ES in hand. Can you help to add some debug > information in TdxDxe to see what the last code before the exception is > triggered? > > I don't think it is anything in your code, I think it is another library that > is > being loaded based on dependencies. I put a DEBUG statement at the start > of TdxDxeEntryPoint() and never see the output before the crash. > I check the libraries loaded by TdxDxe and AmdSev and find that they load different PciLib. TdxDxe load PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf. AmdSev load PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf.
PciLib is consumed by DxeAcpiTimerLib. In the AcpiTimerLibConstructor@DxeAcpiTimerLib there is below code: mAcpiTimerIoAddr = (PciRead32 (Pmba) & ~PMBA_RTE) + ACPI_TIMER_OFFSET; I think this is the root cause of the exception. There are 2 options to fix this issue. 1. Load AmdSev before TdxDxe 2. Make TdxDxe to import BasePciLibCf8.inf instead of DxePciLibI440FxQ35.inf (just like AmdSev) I tried above 2 options in my Tdx guest and both work. Tom, Can you help to try above 2 options in your SEV guest to see whether they work? > > > > > BTW, have you tried to load AmdSev.inf before TdxDxe.inf? I tried it in my > TDX guest and it works fine. > > Yes, moving AmdSevDxe.inf ahead of TdxDxe.inf does fix this issue. Do you > want to submit the patch or do you want me to? > If above option 2 works, I prefer this option to fix the issue. Because there is still potential issues in option 1. I will submit the patch. Thanks Min -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#88968): https://edk2.groups.io/g/devel/message/88968 Mute This Topic: https://groups.io/mt/90495224/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-