Прошу прощения, вы вызов ROMSCAN может и не произойти?
Меня сейчас ROMSCAN как таковой пока не интересует
Проблема появляется ещё раньше - после посткода 13 идет обозначенный мною "Базовый цикл" по перечислению устройств на PCI шине
Вызывается Add_Device, натыкается на видеокарту, инициализирует ConfigSpace выдеокарты и, самое интересное, вызывается ROMCOPY которвй, как я понял, что то делает с чипсетом и появляется возможность стянуть из видеокарты ROM в основную память
Я вставлял повсюду отладочные куски
Вот как проходит код
1) Видеокарта находится - есть переход по проверке КлассаУстройства
2) Есть проход по секциям инициализации BAR,ROM,INT,MEM,IO (сами процедуры типа GO_XXXX я еще не дебагил)
3) Есть запись в ControlRegister и далее следующий за ним вызов COPYROM
Далее в COPYROM на первой же проверке
(эта та которая у меня
cmp word ptr [bx], AA55 Проверяем сигнатуру
jne SIG_ERR Неверная сигнатура - выход
)
вываливаемся - тоесть не находим сигнатуру
Вот принципиальная проблема "слепоты" биос - он не имеет доступ к Видео-ROM
Мне кажется что проблема в неправильной инициализации регисров BAR и регистра ROM видеокарты
Сейчас я выложу их код (GO_MEM и GO_ROM) но сам я его понять не могу - читал спецификацию PCI и в инглише и на русском и версии 2.0 и версии 2.2
НИКАК не могу понять механизм выделения памяти !
Записав все 11111 в регистр и считав его содержимое можно узнать размер требуемой памяти, но КАК определить адрес?? Пример - видеопамять 000A0000-000AFFFF всегда именно такая
Вот засада то!
Я уже заканчиваю свою мини прогу по полной расшифровке ConfigSpace включая полный анализ BAR
Только так на практике я смогу порнять механизм
А пока - увы
GO_MEM
.3ED8 6650 push eax
.3EDA 6653 push ebx
.3EDC 6651 push ecx
.3EDE 6652 push edx
.3EE0 80E1F0 and cl, F0
.3EE3 66BB10000000 mov ebx, 00000010
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EF1(U)
|
.3EE9 6685CB test ebx, ecx
.3EEC 7505 jne 3EF3
.3EEE 66D1E3 shl ebx, 01
.3EF1 EBF6 jmp 3EE9
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EEC(C)
|
.3EF3 6681FB00010000 cmp ebx, 00000100
.3EFA 770C ja 3F08
.3EFC 66BB00010000 mov ebx, 00000100
.3F02 66B900FFFFFF mov ecx, FFFFFF00
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EFA(C)
|
.3F08 668B165C3C mov edx, [3C5C]
.3F0D 6623D1 and edx, ecx
.3F10 663B165C3C cmp edx, [3C5C]
.3F15 7408 je 3F1F
.3F17 6603D3 add edx, ebx
.3F1A 6689165C3C mov [3C5C], edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3F15(C)
|
.3F1F 66011E5C3C add [3C5C], ebx
.3F24 8D5D09 lea bx, [di+09]
.3F27 03D8 add bx, ax
.3F29 668917 mov [bx], edx
.3F2C 668BCA mov ecx, edx
.3F2F E829FF call PCI_Write
.3F32 665A pop edx
.3F34 6659 pop ecx
.3F36 665B pop ebx
.3F38 6658 pop eax
.3F3A C3 ret
примечание - переменная [3C5C] по умолчанию = E0000000
GO_ROM
.3F86 6650 push eax
.3F88 6653 push ebx
.3F8A 6651 push ecx
.3F8C 6652 push edx
.3F8E 56 push si
.3F8F 80E1F0 and cl, F0
.3F92 66BB00080000 mov ebx, 00000800
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FA0(U)
|
.3F98 6685CB test ebx, ecx
.3F9B 7505 jne 3FA2
.3F9D 66D1E3 shl ebx, 01
.3FA0 EBF6 jmp 3F98
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3F9B(C)
|
.3FA2 6681FB00000100 cmp ebx, 00010000
.3FA9 760C jbe 3FB7
.3FAB 66B90000FFFF mov ecx, FFFF0000
.3FB1 66BB00000100 mov ebx, 00010000
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FA9(C)
|
.3FB7 668B14 mov edx, [si]
.3FBA 6623D1 and edx, ecx
.3FBD 663B14 cmp edx, [si]
.3FC0 7406 je 3FC8
.3FC2 6603D3 add edx, ebx
.3FC5 668914 mov [si], edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FC0(C)
|
.3FC8 66011C add [si], ebx
.3FCB 668BCA mov ecx, edx
.3FCE 80C901 or cl, 01
.3FD1 8D5D09 lea bx, [di+09]
.3FD4 03D8 add bx, ax
.3FD6 66890F mov [bx], ecx
.3FD9 E87FFE call PCI_Write
.3FDC 5E pop si
.3FDD 665A pop edx
.3FDF 6659 pop ecx
.3FE1 665B pop ebx
.3FE3 6658 pop eax
.3FE5 C3 ret
примечание - переменная [si], по умолчанию = 000C0000
icbook Спасибо что отозвались
Меня сейчас ROMSCAN как таковой пока не интересует
Проблема появляется ещё раньше - после посткода 13 идет обозначенный мною "Базовый цикл" по перечислению устройств на PCI шине
Вызывается Add_Device, натыкается на видеокарту, инициализирует ConfigSpace выдеокарты и, самое интересное, вызывается ROMCOPY которвй, как я понял, что то делает с чипсетом и появляется возможность стянуть из видеокарты ROM в основную память
Я вставлял повсюду отладочные куски
Вот как проходит код
1) Видеокарта находится - есть переход по проверке КлассаУстройства
2) Есть проход по секциям инициализации BAR,ROM,INT,MEM,IO (сами процедуры типа GO_XXXX я еще не дебагил)
3) Есть запись в ControlRegister и далее следующий за ним вызов COPYROM
Далее в COPYROM на первой же проверке
(эта та которая у меня
cmp word ptr [bx], AA55 Проверяем сигнатуру
jne SIG_ERR Неверная сигнатура - выход
)
вываливаемся - тоесть не находим сигнатуру
Вот принципиальная проблема "слепоты" биос - он не имеет доступ к Видео-ROM
Мне кажется что проблема в неправильной инициализации регисров BAR и регистра ROM видеокарты
Сейчас я выложу их код (GO_MEM и GO_ROM) но сам я его понять не могу - читал спецификацию PCI и в инглише и на русском и версии 2.0 и версии 2.2
НИКАК не могу понять механизм выделения памяти !
Записав все 11111 в регистр и считав его содержимое можно узнать размер требуемой памяти, но КАК определить адрес?? Пример - видеопамять 000A0000-000AFFFF всегда именно такая
Вот засада то!
Я уже заканчиваю свою мини прогу по полной расшифровке ConfigSpace включая полный анализ BAR
Только так на практике я смогу порнять механизм
А пока - увы
GO_MEM
примечание - переменная [3C5C] по умолчанию = E0000000
GO_ROM
примечание - переменная [si], по умолчанию = 000C0000