Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n в регистре BH – номер шины;
n в BL – номер устройства в старших пяти битах и номер функции в трёх младших;
n в AH – код возврата (DEVICE_NOT_FOUND или SUCCESFUL):
__asm__("lcall (%%edi); cld "
"jc 1f "
"xor %%ah, %%ah "
"1:"
: "=b" (bx),
"=a" (ret)
: "1" (PCIBIOS_FIND_PCI_CLASS_CODE),
"c" (class_code),
"S" ((int) index),
"D" (&pci_indirect)); // адрес точки входа в сервис
Заносим в структру struct pci_dev_struct *pd координаты устройства:
pd->bus = (bx >> 8) & 0xff; // номер шины
pd->dev = (bx & 0xff) >> 3; // номер устройства на шине
pd->fn = bx & 0x03; // номер функции
return (int) (ret & 0xff00) >> 8;
}
После того как устройство заданного типа найдено, необходимо получить данные, находящиеся в его конфигурационном пространстве (см. «Конфигурационное пространство устройства PCI»). Сделаем это при помощи функции pci_bios_read():
static int pci_bios_read(int bus, int dev, int fn, int reg, int len, u32 *value)
{
u32 result = 0;
u32 bx;
Параметрами функции являются координаты устройства (bus – номер шины, dev – номер устройства, fn – номер функции), смещение в конфигурационном пространстве (reg) и размер данных для считывания (len, байт/слово/двойное слово). В последний параметр мы поместим считанное из конфигурационного пространства значение, поэтому этот параметр передается по ссылке.
Проверяем правильность переданных параметров:
if (bus > 255 || dev > 31 || fn > 7 || reg > 255)
return -EINVAL;
Для чтения информации из конфигурационного пространства устройства PCI BIOS предоставляет следующие функции [6]:
n 0xB108 – чтение байта;
n 0xB109 – чтение слова;
n 0xB10A – чтение двойного слова.
Эти функции отличаются только размером считываемых данных – байт, слово или двойное слово. Перед вызовом функции в регистры процессора помещается следующая информация:
n EAX – код функции;
n BH – номер шины, к которой подключено устройство;
n BL – номер устройства в старших пяти битах и номер функции в трёх младших битах;