libpciaccess/libpciaccess-0.10.6-rom-sanity.patch
Adam Jackson 7f6800064f - libpciaccess-0.10.6-rom-sanity.patch: If we hit the /dev/mem path for
reading a device's ROM, verify that it looks like it at least might
    belong to the device in question by checking vendor and device ID
    match. Fixes vbetool post hanging forever (and thus blocking boot) on
    some dual-gpu laptops.
2009-08-05 15:52:45 +00:00

42 lines
1.1 KiB
Diff

diff -up libpciaccess-0.10.6/src/linux_devmem.c.jx libpciaccess-0.10.6/src/linux_devmem.c
--- libpciaccess-0.10.6/src/linux_devmem.c.jx 2008-10-15 18:35:54.000000000 -0400
+++ libpciaccess-0.10.6/src/linux_devmem.c 2009-08-05 11:43:14.000000000 -0400
@@ -50,6 +50,30 @@
#include "pciaccess_private.h"
#include "linux_devmem.h"
+static int
+rom_sanity_check(struct pci_device *info, void *buffer)
+{
+ unsigned char *bios = buffer;
+ int offset;
+ unsigned short vendor, device;
+
+ if (bios[0] != 0x55 || bios[1] != 0xAA)
+ return 0;
+
+ offset = (bios[0x19] << 8) + bios[0x18];
+
+ if (bios[offset] != 'P' ||
+ bios[offset+1] != 'C' ||
+ bios[offset+2] != 'I' ||
+ bios[offset+3] != 'R')
+ return 0;
+
+ vendor = (bios[offset+5] << 8) + bios[offset+4];
+ device = (bios[offset+7] << 8) + bios[offset+6];
+
+ return (info->vendor_id == vendor) && (info->device_id == device);
+}
+
/**
* Read a device's expansion ROM using /dev/mem.
*
@@ -152,5 +176,5 @@ pci_device_linux_devmem_read_rom(struct
}
}
- return err;
+ return rom_sanity_check(dev, buffer);
}