• Matthew Garrett's avatar
    efi: Allow disabling PCI busmastering on bridges during boot · 4444f854
    Matthew Garrett authored
    Add an option to disable the busmaster bit in the control register on
    all PCI bridges before calling ExitBootServices() and passing control
    to the runtime kernel. System firmware may configure the IOMMU to prevent
    malicious PCI devices from being able to attack the OS via DMA. However,
    since firmware can't guarantee that the OS is IOMMU-aware, it will tear
    down IOMMU configuration when ExitBootServices() is called. This leaves
    a window between where a hostile device could still cause damage before
    Linux configures the IOMMU again.
    
    If CONFIG_EFI_DISABLE_PCI_DMA is enabled or "efi=disable_early_pci_dma"
    is passed on the command line, the EFI stub will clear the busmaster bit
    on all PCI bridges before ExitBootServices() is called. This will
    prevent any malicious PCI devices from being able to perform DMA until
    the kernel reenables busmastering after configuring the IOMMU.
    
    This option may cause failures with some poorly behaved hardware and
    should not be enabled without testing. The kernel commandline options
    "efi=disable_early_pci_dma" or "efi=no_disable_early_pci_dma" may be
    used to override the default. Note that PCI devices downstream from PCI
    bridges are disconnected from their drivers first, using the UEFI
    driver model API, so that DMA can be disabled safely at the bridge
    level.
    
    [ardb: disconnect PCI I/O handles first, as suggested by Arvind]
    Co-developed-by: default avatarMatthew Garrett <mjg59@google.com>
    Signed-off-by: default avatarMatthew Garrett <mjg59@google.com>
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arvind Sankar <nivedita@alum.mit.edu>
    Cc: Matthew Garrett <matthewgarrett@google.com>
    Cc: linux-efi@vger.kernel.org
    Link: https://lkml.kernel.org/r/20200103113953.9571-18-ardb@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    4444f854
efi.h 51 KB