[efi] Avoid requesting zero-length DMA mappings

The UEFI specification does not prohibit zero-length DMA mappings.
However, there is a reasonable chance that at least one implementation
will treat it as an invalid parameter.  As a precaution, avoid calling
EFI_PCI_IO_PROTOCOL.Map() with a length of zero.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2020-11-28 22:44:09 +00:00
parent a2e5cf1a3f
commit a8442750e6

View File

@@ -352,14 +352,20 @@ static int efipci_dma_map ( struct dma_device *dma, struct dma_mapping *map,
break; break;
} }
/* Map buffer */ /* Map buffer (if non-zero length) */
count = len; count = len;
if ( ( efirc = pci_io->Map ( pci_io, op, phys_to_virt ( addr ), &count, if ( len ) {
&bus, &mapping ) ) != 0 ) { if ( ( efirc = pci_io->Map ( pci_io, op, phys_to_virt ( addr ),
rc = -EEFI ( efirc ); &count, &bus, &mapping ) ) != 0 ) {
DBGC ( pci, "EFIPCI " PCI_FMT " cannot map %08lx+%zx: %s\n", rc = -EEFI ( efirc );
PCI_ARGS ( pci ), addr, len, strerror ( rc ) ); DBGC ( pci, "EFIPCI " PCI_FMT " cannot map %08lx+%zx: "
goto err_map; "%s\n", PCI_ARGS ( pci ), addr, len,
strerror ( rc ) );
goto err_map;
}
} else {
bus = addr;
mapping = NULL;
} }
/* Check that full length was mapped. The UEFI specification /* Check that full length was mapped. The UEFI specification
@@ -403,11 +409,9 @@ static void efipci_dma_unmap ( struct dma_device *dma,
container_of ( dma, struct efi_pci_device, pci.dma ); container_of ( dma, struct efi_pci_device, pci.dma );
EFI_PCI_IO_PROTOCOL *pci_io = efipci->io; EFI_PCI_IO_PROTOCOL *pci_io = efipci->io;
/* Sanity check */ /* Unmap buffer (if non-zero length) */
assert ( map->token != NULL ); if ( map->token )
pci_io->Unmap ( pci_io, map->token );
/* Unmap buffer */
pci_io->Unmap ( pci_io, map->token );
/* Clear mapping */ /* Clear mapping */
map->dma = NULL; map->dma = NULL;