В процессе работы над моим проектом, я нашел как минимум две ошибки в перечисленных выше библиотеках. Может быть, кто-нибудь возьмется написать Error Report? :cool:
Итак.
1. Библиотека libpciaccess версии 0.12.1 на
Linux localhost 2.6.32-hardened-r34 #1 SMP PREEMPT Thu Feb 24 13:01:00 EET 2011 i686 Intel(R) Pentium(R) Dual CPU T2330 @ 1.60GHz GenuineIntel GNU/Linuxне правильно заполняет данные о прерываниях. Т.е., она берет их из config space по смещению 0x3C, а нужно брать из файла /sys/bus/pci/devices/xxx:xx:xx.x/irq, как это делает libpci.
Проблема заключается в том, что в config space (как в /sys, так и в /proc) находятся необновленные данные. Т.е, kernel в процессе загрузки и инициализации устройства обновляет данные о назначенном устройству прерывании в своих внутренних таблицах, но не в PCI config space.
2. Эта же библиотека. Не верно заполняются флаги ресурса (is_IO, is_prefetchable и is_64 в структуре struct pci_mem_region). Мне удалось наблюдать только заполнение флага is_IO. Все остальные никогда не заполняются.
Видимо - это просто еще не доделали. Как не доделали и работу с ресурсом типа Flash ROM.
3. Библиотека libpci в составе pciutils 3.1.4. Неверная работа функции pci_fill_info в случае, если указатель на PCI устройство создан функцией pci_get_dev. Ни одна комбинация flags в функции pci_fill_info не дает полноценного заполнения структуры struct pci_dev данными - не правильно загружаются прерывания, не заполняются размеры областей памяти и так далее.
Пришлось перейти на вариант
for(dev=pacc->devices; dev; dev=dev->next) {
pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES....);}
В этом случае все структуры заполняются правильно.
С уважением.