The Linux PCI core driver provides a useful (and probably overlooked) sysfs interface to read PCI ROM resources. A PCI device that has a ROM resource will have a "rom" sysfs file associated with it, writing anything other than 0 to it will enable one to then read the ROM image from this file.
For example, on my laptop, to find PCI devices that have ROM images associated with them I used:
and this corresponds to my Integrated Graphics Controller:
lspci | grep 02.0
00:02.0 VGA compatible controller: Intel Corporation Mobile GM965/GL960 Integrated Graphics Controller (primary) (rev 0c)
To dump the ROM I used:
echo 1 | sudo tee /sys/devices/pci0000\:00/0000\:00\:02.0/rom
To disassemble this I used ndisasm:
sudo apt-get install nasm
ndisasm -k 0,3 vbios.rom | less
..and just use strings on the ROM image to dump out interesting text, e.g.
00IBM VGA Compatible BIOS.
..and then used a tool like bvi to edit the ROM. Read more