Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n ECX – код типа устройства.
n EDX – код фирмы-изготовителя устройства.
n ESI – индекс (порядковый номер) устройства заданного типа.
n В регистр EDI занесем адрес точки входа в сервис.
В результате выполнения вызова в регистрах процессора будет находиться следующая информация:
n BH – номер шины, к которой подключено устройство;
n BL – номер устройства в старших пяти битах и номер функции в трёх младших;
n AH – код возврата (может принимать значения BAD_VEN-DOR_ID, DEVICE_NOT_FOUND и SUCCESFUL).
Выполняем дальний вызов:
__asm__("lcall (%%edi); cld "
"jc 1f "
"xor %%ah, %%ah "
"1:"
: "=b" (bx),
"=a" (ret)
: "1" (PCIBIOS_FIND_PCI_DEVICE),
"c" (device_id),
"d" (vendor),
"S" ((int) index),
"D" (&pci_indirect)); // адрес точки входа в сервис
Обрабатываем полученный результат:
*bus = (bx >> 8) & 0xff; // номер шины
*dev = (bx & 0xff) >> 3; // номер устройства на шине
*fn = bx & 0x3; // номер функции
return (int) (ret & 0xff00) >> 8;
}
Функция поиска устройства заданного класса pci_bios_find_class() практически не отличается от функции поиска устройства по типу:
static int pci_bios_find_class(u32 class_code, u16 index, struct pci_dev_struct *pd)
{
u16 bx;
u16 ret;
В параметрах функции передается указатель на информационную структуру struct pci_dev_struct *pd.
Перед выполнением дальнего вызова в регистры заносятся следующие данные:
n EAX – запрашиваемая функция сервиса – 0xB103.
n ECX – код класса устройства.
n ESI – индекс (порядковый номер) устройства заданного типа.
n В регистр EDI занесем адрес точки входа в сервис.
Результаты выполнения вызова аналогичны предыдущим: