diff -r a76b4e00e186 tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Tue Dec 16 13:14:25 2008 +0000 +++ b/tools/firmware/hvmloader/hvmloader.c Thu Dec 18 22:38:18 2008 +0900 @@ -423,19 +423,28 @@ { uint8_t devfn; uint16_t class, vendor_id, device_id; + uint16_t bootdev; + uint16_t seq_nr; - for ( devfn = 0; devfn < 128; devfn++ ) - { - class = pci_readw(devfn, PCI_CLASS_DEVICE); - vendor_id = pci_readw(devfn, PCI_VENDOR_ID); - device_id = pci_readw(devfn, PCI_DEVICE_ID); + for (seq_nr=0; seq_nr<3; seq_nr++ ){ + bootdev = cmos_inb(0x3d); + bootdev |= ((cmos_inb(0x38) & 0xf0) << 4); + bootdev >>= 4 * seq_nr; + bootdev &= 0xf; + if ( bootdev == 4 ){ + for ( devfn = 0; devfn < 128; devfn++ ){ + class = pci_readw(devfn, PCI_CLASS_DEVICE); + vendor_id = pci_readw(devfn, PCI_VENDOR_ID); + device_id = pci_readw(devfn, PCI_DEVICE_ID); - /* We're only interested in NICs. */ - if ( (vendor_id != 0xffff) && - (device_id != 0xffff) && - (class == 0x0200) ) - return scan_option_rom( - devfn, vendor_id, device_id, etherboot, copy_rom_dest); + /* We're only interested in NICs. */ + if ( (vendor_id != 0xffff) && + (device_id != 0xffff) && + (class == 0x0200) ) + return scan_option_rom(devfn, vendor_id, + device_id, etherboot, copy_rom_dest); + } + } } return 0;