Приветствую.
Где-то 2 месяца назад занялся осдевом, раскурил пачку мануалов, и перешёл к практике. А практика следующая:
Есть код:
Код:
#define outportl(p, l) asm("outl %d0, %w1"::"a"(l), "d"(p))
#define inportl(l, p) asm("inl %w1, %d0":"=a"(l):"d"(p))
int pci_read(char bus, char slot, char func, char offset){
int address = (int)((((int)bus & 0xFF) << 16) | (((int)slot & 0xFF) << 11) | (((int)func & 0xFF) << 8) | (offset & 0xfc) | ((int)0x80000000));
outportl(PCI_CONFIG_ADDRESS, address);
inportl(address, PCI_CONFIG_DATA);
return address;
}
short video_find_pci(){
char bus, buscount=1, slot, bar;
char ht, cc, sc;
for(bus=0; bus<buscount; bus++){
for(slot=0; slot<32; slot++){
ht = (pci_read(bus, slot, 0, 0x0C) >> 16) & 0xFF;
if(ht == 0x01) {buscount++; continue;}
if(ht == 0x02) continue;
cc = (pci_read(bus, slot, 0, 0x08) >> 24) & 0xFF;
sc = (pci_read(bus, slot, 0, 0x08) >> 16) & 0xFF;
if(((cc == 0x00) && (sc == 0x01)) || (cc == 0x03))
return ((short)bus << 8) | (short)slot;
}
}
return 0xFFFF;
}
Код ищет PCI-видеокарточки.
На 7 контрольных устройствах (виртуалбокс, варя, 2 нетбука, ноутбук, планшет и домашний сервер-файлопомойка) он сработал идеально, но на компьютере друга решил, что видеокарточки нет. Причины обнаружить не удалось. Согласен, что 7/8 - хороший результат для новичка, но хотелось бы 100% детекта. Собственно, какие варианты, почему не работает?
И ещё вопрос в тему: как определить, какой из BAR-ов является LFB? Пока что делаю это по определению, какой из них выделяет больше всего памяти, но чую чакрами, что это не есть правильно.