Здравствуйте. В настоящее время разбираю чипсет 945P. Конкретно регистр C0DRTx (Timing register). Разбираю для того, чтобы написать заплатку на биос - изменение таймингов памяти.
Смутил меня такой момент. Timing register располагается в i945 по смещению 114h. Но это его размещение относительно содержимого регистра MCHBAR, который в свою очередь находится по смещению 44h относительно bus:0,dev:0,func:0.
Не знаю, как добраться до него через регистр MCHBAR. В формате обращения к шине PCI под смещение выделено 8 младших бит, отсюда следует, что просто записать по смещению число 114h не удастся (размерность не та).
Пока действия вырисовываются примерно следующие:
1. Получить доступ к MCHBAR (enable-бит в 1 для b:0,d:0,f:0,o:44h)
2. Взять из него базовый адрес и добавить к нему смещение 114h (Timing Register)
А вот что потом делать с этим полученным адресом? Как его использовать, чтобы все же получить доступ к регистру? Вот на этом и остановился.
Даташит на чипсет можно взять здесь:
[url=http://download.intel.com/design/chipsets/datashts/30146705.pdf
]download.intel.com/design/chipsets/datashts/30146705.pdf[/url]
С форума по ссылке Санты похоже работающий код.
MAIN: pushfd ; Push Flags Register onto the Stack (use 32) push eax push ebx push dx call flatmode ; first, set up FS to access all 4G xor edx,edx ; clear edx xor eax,eax ; clear edx mov eax,080000048h ; (G)MCH Base Address Register mov dx,0CF8h ; set port address out dx,eax ; send address through the port mov dx,0CFCh ; set port data in eax,dx ; fetch data mov ebx,eax ; save the old value and eax,0FFFFFFFEh ; set enable bit to zero or eax,000000001h ; set bit to enable ;or eax,000000000h ; set bit to disable out dx,eax ; send data through port data and ebx,0FFFFC000h ; mask off bits 31:14 inclusive add ebx,250h ; point to the relevant part mov ax,[fs:ebx] ; fetch data at 250h address and ax,07FFh ; set Tras data bit to zero or ax,8800h ; copy data for Tras 17T mov [fs:ebx],ax ; send data with 17T change pop dx pop ebx pop eax popfd ; Pop Stack into Eflags Register retf ; Return Far from Procedure ;---------------------------------------------------------------------- flatmode: ; first, calculate the linear address of GDT push ds push fs xor edx,edx ; clear edx xor eax,eax ; clear edx mov dx,ds ; get the data segment shl edx,4 ; shift it over a bit add [cs:dword GDT+2],edx ; store as GDT linear base addr ; now load the GDT into the GDTR lgdt fword ptr cs:GDT ; load GDT base (286-style 24-bit load) mov bx,8 ;1 * size DESC386 ; point to first descriptor mov eax,cr0 ; prepare to enter protected mode or al,1 ; flip the PE bit cli ; turn off interrupts mov cr0,eax ; we're now in protected mode jmp short $+2 mov fs,bx ; load the FS segment register and al,0FEh ; clear the PE bit again mov cr0,eax ; back to real mode jmp short $+2 pop fs pop ds sti ; resume handling interrupts ret ; ;---------------------------------------------------------------------- GDT: dw 000fh ; limit low dw GDT ; base lo db 0 ; base mid db 0 ; dpltype db 0 ; lim hi db 0 ; base hi ; this is the setup for the 4G segment dw 0ffffh ; limit low dw 0 ; base lo db 0 ; base mid db 092h ; dpltype db 0cfh ; lim hi db 0 ; base hi GDT_END:Мой прокол - я не ушел во flat-режим. Хотя они там так и не догадались сами, просто пришел наш индонезийский гуру Пинчакко и наставил на путь истинный
Cсылка:
rebelshavenforum.com/sis-bin/ultimatebb.cgi?ubb=get_topic;f=52;t=000069
Скопированный код где-то в середине 4-ой страницы
А кому счас легко...
И еще вопрос. Прочитал статью Криса Касперски.
В частности, там есть момент про "Волшебную" последовательность 55 AA 7x. (в boot-блоке). Сказано, что в момент попадания на нее, предварительная инициализация ПК уже проведена - поэтому можно вставлять свой код.
У меня 8 AMI BIOS. Провел поиск по сигнатуре - и не нашел. Проверил на другой восьмерке, то же самое. После чего оставил только 55 АА, но такая последовательность присутствует только вне boot-блока и соответственно для данных целей не пригодна. Не знаю, почему данный код:
означает, что начальная инициализация завершена (т.е. что означает 0AA55). Но тем не менее, чтобы воспользоваться способом, описанным в статье, мне также надо найти место, когда инициализация процессора(начальная) и памяти завершена.
Из того что по этому поводу сделал:
1. Загрузил прошивку в IDA.
2. Перенес бут-блок из 0x7-го в f000:xxxx сегмент (чтобы заработали переходы)
3. Походил по переходам (начиная с точки входа F000:FFF0), прошел чекпоинт D0(первоначальная инициализация процессора) и попал в место, где по всей видимости происходит тест клавиатуры:
Может, конечно, и ошибаюсь. Но похожее на АА55 не нашел.. Так вот хотелось бы знать сигнатуру (и ее пояснение), наличие которой говорило бы о том, что начальная инициализация уже завершена. Т.е. так, чтобы можно было воспользоваться только hex-редактором.
Если кому интересен биос прикрепил.
savely, спасибо. Буду вникать..
xname, с того же форума pdf-ку почитайте. Вот прямая ссылка: lejabeach.com/sisubb/Practical_BIOS_Editing.pdf
-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам
Спасибо
Отправить комментарий