После прочтения спецификации PCI мне просто нужно вызвать функции BIOS BIOS через заданный вектор прерывания (1Ah). Однако это усложняется конфигурацией PCI, которая должна произойти заранее.
Пространство конфигурации PCI, по-видимому, не использует явный адрес для доступа, но вызывает функции BIOS.
РЕДАКТИРОВАТЬ: На самом деле, оказывается, BIOS делает гораздо больше, чем я знал. Все, что мне нужно было сделать, это перечислить шину PCI, пока я не нашел устройство контроллера IDE и идентификатор поставщика. Единственной необходимой сборкой были упаковщики портов ввода / вывода.
pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff };
for ( bus = 0; bus < 0xffff; ++bus ) {
for ( slot = 0; slot < 0xffff; ++slot ) {
for ( func = 0; func < 0xff; ++func ) {
uint16_t dev_id = _pci_read_config_data( bus, slot, func, 0x00, PCI_READ_CONFIG_WORD );
uint16_t vend_id = _pci_read_config_data( bus, slot, func, 0x02, PCI_READ_CONFIG_WORD );
if ((vendor == vend_id) && (device == dev_id)) {
dev.bus = bus;
dev.device = slot;
dev.function = func;
return dev;
}
}
}
}