LinuxForum.Fans
Тема

Ошибки в libpciaccess и libpci

Автор: YUKLA 1 сообщений 704 просмотров
#135748

В процессе работы над моим проектом, я нашел как минимум две ошибки в перечисленных выше библиотеках. Может быть, кто-нибудь возьмется написать Error Report? :cool:

Итак.
1.
Библиотека libpciaccess версии 0.12.1 на

text
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 данными - не правильно загружаются прерывания, не заполняются размеры областей памяти и так далее.

Пришлось перейти на вариант

text
    for(dev=pacc->devices; dev; dev=dev->next) {
        pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES....);}

В этом случае все структуры заполняются правильно.

С уважением.

Войдите или зарегистрируйтесь, чтобы ответить.