]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ioapi] Fail ioremap() when attempting to map a zero bus address
authorMichael Brown <mcb30@ipxe.org>
Wed, 16 Jul 2014 14:27:16 +0000 (15:27 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 16 Jul 2014 14:39:59 +0000 (15:39 +0100)
When a 32-bit iPXE binary is running on a system which allocates PCI
memory BARs above 4GB, our PCI subsystem will return the base address
for any such BARs as zero (with a warning message if DEBUG=pci is
enabled).  Currently, ioremap() will happily map an address pointing
to the start of physical memory, providing no sensible indication of
failure.

Fix by always returning NULL if we are asked to ioremap() a zero bus
address.

With a totally flat memory model (e.g. under EFI), this provides an
accurate failure indication since no PCI peripheral will be mapped to
the zero bus address.

With the librm memory model, there is the possibility of a spurious
NULL return from ioremap() if the bus address happens to be equal to
virt_offset.  Under the current virtual memory map, the NULL virtual
address will always be the start of .textdata, and so this problem
cannot occur; a NULL return from ioremap() will always be an accurate
failure indication.

Debugged-by: Anton D. Kachalov <mouse@yandex-team.ru>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/include/ipxe/x86_io.h

index adb00a6867d401ea96f4026a1b53516ffabad8bc..1fc7f660842f755f50363471d75b27d23491008c 100644 (file)
@@ -45,7 +45,7 @@ IOAPI_INLINE ( x86, bus_to_phys ) ( unsigned long bus_addr ) {
 
 static inline __always_inline void *
 IOAPI_INLINE ( x86, ioremap ) ( unsigned long bus_addr, size_t len __unused ) {
-       return phys_to_virt ( bus_addr );
+       return ( bus_addr ? phys_to_virt ( bus_addr ) : NULL );
 }
 
 static inline __always_inline void