(+Ard)

On 09/06/18 21:08, Nikita Leshenko wrote:
> Hi,
> 
> We ran into a bug in EDK2 relating to PCI-Express in PciBusDxe. Here's the 
> flow
> of the bug:
> 
> 1. PciBusDxe/PciEnumeratorSupport.c: Function BarExisted probes a BAR. It 
> raises
>    TPL to TPL_HIGH_LEVEL to avoid timer interrupts while probing the BAR and
>    calls PciIo->Pci.Write.
> 2. BasePciExpressLib/PciExpressLib.c: The write reaches PciExpressWrite32, 
> which
>    calls GetPciExpressBaseAddress.
> 3. GetPciExpressBaseAddress retrieves the address from 
> PcdPciExpressBaseAddress.
> 4. Reading the PCD calls DxePcdGet64 -> GetWorker ->
>    EfiAcquireLock(&mPcdDatabaseLock), which is at TPL_NOTIFY level. This 
> crashes
>    the firmware because step 1 raised the TPL to TPL_HIGH_LEVEL.
> 
> This doesn't happen when PcdPciExpressBaseAddress is fixed at build (because
> then the read is optimized to a static global variable), but when the PCD is
> dynamic PCI-Express is broken.
> 
> Does anybody have a suggestion for fixing it?
> 
> Options we thought about:
> - Change mPcdDatabaseLock.Tpl to TPL_HIGH_LEVEL
> - Don't use a PCD for the base address, put it in a static global variable and
>   create functions to set and retrieve it.

In the ArmVirtPkg platforms, we also set "PcdPciExpressBaseAddress"
dynamically. And, we implemented your second option above; see:

  ArmVirtPkg/Library/BaseCachingPciExpressLib/

Relevant commits:

- ad3359eb43a9 ("ArmVirtualizationPkg: clone BasePciExpressLib, cache
PCIe config base", 2015-02-23)
- a06d0bb58eb9 ("ArmVirtPkg/BaseCachingPciExpressLib: depend on
PciPcdProducerLib", 2016-04-12)

(In fact, commit ad3359eb43a9 documents the exact issue you report here.)

Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to