7f6800064f
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.
42 lines
1.1 KiB
Diff
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);
|
|
}
|