mirror of https://github.com/acidanthera/audk.git
ArmVirtualizationPkg/PciHostBridgeDxe: skip 0 AddrLen in SubmitResources()
According to Volume 5 of the PI spec, 10.8.2 PCI Host Bridge Resource Allocation Protocol, SubmitResources(), It is considered an error if no resource requests are submitted for a PCI root bridge. If a PCI root bridge does not require any resources, a zero-length resource request must explicitly be submitted. Under MdeModulePkg/Bus/Pci/PciBusDxe/, we have: PciHostBridgeResourceAllocator() [PciLib.c] ConstructAcpiResourceRequestor(..., &AcpiConfig) [PciEnumerator.c] PciResAlloc->SubmitResources(..., &AcpiConfig) ASSERT_EFI_ERROR () If ConstructAcpiResourceRequestor() finds no resources to request (for example because no PCI devices are on the root bridge), it places a zero-length EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR followed by an EFI_ACPI_END_TAG_DESCRIPTOR in "AcpiConfig"; satisfying the PI spec. However, PciHostBridgeDxe's SubmitResources() function does not expect such input; the following part of the code rejects it: switch (Ptr->ResType) { case 0: // // Check invalid Address Sapce Granularity // if (Ptr->AddrSpaceGranularity != 32) { return EFI_INVALID_PARAMETER; } Skip EFI_ACPI_ADDRESS_SPACE_DESCRIPTORs with zero AddrLen early. Also, allow PciHostBridgeResourceAllocator() to proceed to the AllocateResources phase by setting "ResourceSubmited" to TRUE. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Olivier Martin <Olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16907 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
b9a44dcae3
commit
1a1d637695
|
@ -929,12 +929,19 @@ SubmitResources(
|
||||||
while (List != &HostBridgeInstance->Head) {
|
while (List != &HostBridgeInstance->Head) {
|
||||||
RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List);
|
RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List);
|
||||||
if (RootBridgeHandle == RootBridgeInstance->Handle) {
|
if (RootBridgeHandle == RootBridgeInstance->Handle) {
|
||||||
while ( *Temp == 0x8A) {
|
for (;
|
||||||
|
*Temp == 0x8A;
|
||||||
|
Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR)
|
||||||
|
) {
|
||||||
Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp ;
|
Ptr = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *) Temp ;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check Address Length
|
// Check Address Length
|
||||||
//
|
//
|
||||||
|
if (Ptr->AddrLen == 0) {
|
||||||
|
HostBridgeInstance->ResourceSubmited = TRUE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (Ptr->AddrLen > 0xffffffff) {
|
if (Ptr->AddrLen > 0xffffffff) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
@ -1002,8 +1009,6 @@ SubmitResources(
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
Temp += sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue