diff -ur ../xorg-build/lib/libpciaccess/src/linux_devmem.c libpciaccess/src/linux_devmem.c --- ../xorg-build/lib/libpciaccess/src/linux_devmem.c 2008-11-25 06:42:15.000000000 -0500 +++ libpciaccess/src/linux_devmem.c 2008-12-05 00:34:34.000000000 -0500 @@ -125,7 +125,7 @@ size_t bytes; for (bytes = 0; bytes < rom_size; /* empty */) { - const ssize_t got = pread(fd, buffer, rom_size - bytes, + const ssize_t got = pread64(fd, buffer, rom_size - bytes, rom_base + bytes); if (got == -1) { err = errno; diff -ur ../xorg-build/lib/libpciaccess/src/linux_sysfs.c libpciaccess/src/linux_sysfs.c --- ../xorg-build/lib/libpciaccess/src/linux_sysfs.c 2008-11-25 06:42:15.000000000 -0500 +++ libpciaccess/src/linux_sysfs.c 2008-12-05 00:51:38.000000000 -0500 @@ -365,6 +365,10 @@ write( fd, "0", 1 ); close( fd ); + if (total_bytes < rom_size) { + /* Failed to read entire ROM, falling back to /dev/mem */ + err = pci_device_linux_devmem_read_rom(dev, buffer); + } return err; }