|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] MdeModulePkg: mark completion of PCI enumeration in PciEnumeratorLight
On Thu, Feb 12, 2015 at 11:46:04AM +0100, Laszlo Ersek wrote:
> On 02/11/15 21:23, Wei Liu wrote:
> > I had an issue when trying to boot Xen HVM guest with latest OVMF
> > master. Guest crashed with memory violation, and the bisection pointed
> > to 66b280df2 ("OvmfPkg: AcpiPlatformDxe: make dependency on PCI
> > enumeration explicit"). That commit made AcpiPlatformDxe depend on PCI
> > enumeration using gEfiPciEnumerationCompleteProtocolGuid, which is a
> > very reasonable change.
> >
> > The real culprit is that Xen HVM is using PciEnumeratorLight which
> > doesn't install gEfiPciEnumerationCompleteProtocolGuid. This, in
> > combination with 66b280df2, makes AcpiPlatformDxe not able to be loaded,
> > resulting in guest crash.
> >
> > The fix is to install gEfiPciEnumerationCompleteProtocolGuid in
> > PciEnumeratorLight.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> > Cc: Feng Tian <feng.tian@xxxxxxxxx>
> > Cc: Anthony Perard <anthony.perard@xxxxxxxxxx>
> > Cc: Laszlo Ersek <lersek@xxxxxxxxxx>
> > Cc: Jordan Justen <jordan.l.justen@xxxxxxxxx>
> > ---
> > MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c | 15 ++++++++++++++-
> > 1 file changed, 14 insertions(+), 1 deletion(-)
> >
> > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> > index 9e7ac74..7659585 100644
> > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
> > @@ -2256,6 +2256,7 @@ PciEnumeratorLight (
> > {
> >
> > EFI_STATUS Status;
> > + EFI_HANDLE HostBridgeHandle;
> > EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
> > PCI_IO_DEVICE *RootBridgeDev;
> > UINT16 MinBus;
> > @@ -2288,6 +2289,11 @@ PciEnumeratorLight (
> > return Status;
> > }
> >
> > + //
> > + // Get the host bridge handle
> > + //
> > + HostBridgeHandle = PciRootBridgeIo->ParentHandle;
> > +
> > Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **)
> > &Descriptors);
> >
> > if (EFI_ERROR (Status)) {
> > @@ -2348,7 +2354,14 @@ PciEnumeratorLight (
> > Descriptors++;
> > }
> >
> > - return EFI_SUCCESS;
> > + Status = gBS->InstallProtocolInterface (
> > + &HostBridgeHandle,
> > + &gEfiPciEnumerationCompleteProtocolGuid,
> > + EFI_NATIVE_INTERFACE,
> > + NULL
> > + );
> > +
> > + return Status;
> > }
> >
> > /**
> >
>
> I think this could result in several installations of
> gEfiPciEnumerationCompleteProtocolGuid. See the beginning of the
> PciEnumerator() function.
>
> If gFullEnumeration is TRUE to begin with (which is the QEMU case), then
> the protocol will be installed at the end of PciEnumerator() first. At
> that point we flip gFullEnumeration to FALSE, which implies that further
> invocations of PciEnumerator() are possible and allowed. So at the next
> call gFullEnumeration will be false, ie. we'll call
> PciEnumeratorLight(). With the above patch PciEnumeratorLight() would
> add the 2nd (and possibly further) instances of
> EfiPciEnumerationCompleteProtocol.
>
Right. Xen guest starts with gFullEnumeration set to FALSE which means
that protocol never gets installed.
> I'll submit an alternative patch for OvmfPkg soon.
>
Thanks. I'm just about to write a patch as Ray suggested but now I will
wait for your patch. :-)
Wei.
> Thanks
> Laszlo
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |