diff options
author | Michael Brown | 2014-09-04 17:03:10 +0200 |
---|---|---|
committer | Michael Brown | 2014-09-04 17:03:52 +0200 |
commit | 3bb910caa8cfb07c8d2858e70065dc2904ecaf99 (patch) | |
tree | 9e6c64e0ef619730f8dd7941153e673b4b55a818 /src/interface | |
parent | [efi] Avoid returning uninitialised data from PCI configuration space reads (diff) | |
download | ipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.tar.gz ipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.tar.xz ipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.zip |
[efi] Make EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL optional
Some UEFI systems (observed with a Hyper-V virtual machine) do not
provide EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. Make this an optional
protocol (and fail any attempts to access PCI configuration space via
the root bridge if the protocol is missing).
Reported-by: Colin Blacker <Colin.Blacker@computerplanet.co.uk>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface')
-rw-r--r-- | src/interface/efi/efi_pci.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c index 033eae87..86c781d8 100644 --- a/src/interface/efi/efi_pci.c +++ b/src/interface/efi/efi_pci.c @@ -59,7 +59,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); /** PCI root bridge I/O protocol */ static EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *efipci; -EFI_REQUIRE_PROTOCOL ( EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL, &efipci ); +EFI_REQUEST_PROTOCOL ( EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL, &efipci ); static unsigned long efipci_address ( struct pci_device *pci, unsigned long location ) { @@ -74,6 +74,9 @@ int efipci_read ( struct pci_device *pci, unsigned long location, EFI_STATUS efirc; int rc; + if ( ! efipci ) + return -ENOTSUP; + if ( ( efirc = efipci->Pci.Read ( efipci, EFIPCI_WIDTH ( location ), efipci_address ( pci, location ), 1, value ) ) != 0 ) { @@ -92,6 +95,9 @@ int efipci_write ( struct pci_device *pci, unsigned long location, EFI_STATUS efirc; int rc; + if ( ! efipci ) + return -ENOTSUP; + if ( ( efirc = efipci->Pci.Write ( efipci, EFIPCI_WIDTH ( location ), efipci_address ( pci, location ), 1, &value ) ) != 0 ) { |