Интеловский чипсет. Регистр MCHBAR

Здравствуйте. В настоящее время разбираю чипсет 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]


Правда это даташит на 915 чипсет, но в данном случае роли не играет (на 945 - ссылка битая).

Аватар пользователя savely

С форума по ссылке Санты похоже работающий код.

 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-блока и соответственно для данных целей не пригодна. Не знаю, почему данный код:

0007078D: 26813F55AA       cmp   w,es:[bx],0AA55 ;"?U"
00070792: 7410             je    0000707A4   -------- (7)

означает, что начальная инициализация завершена (т.е. что означает 0AA55). Но тем не менее, чтобы воспользоваться способом, описанным в статье, мне также надо найти место, когда инициализация процессора(начальная) и памяти завершена.
Из того что по этому поводу сделал:
1. Загрузил прошивку в IDA.
2. Перенес бут-блок из 0x7-го в f000:xxxx сегмент (чтобы заработали переходы)
3. Походил по переходам (начиная с точки входа F000:FFF0), прошел чекпоинт D0(первоначальная инициализация процессора) и попал в место, где по всей видимости происходит тест клавиатуры:
_F000:10B4                 mov     ah, 0DDh ; '¦'
_F000:10B6 
_F000:10B6 loc_F10B6:                              ; CODE XREF: _F000:10B2j
_F000:10B6                 mov     al, 0D1h ; 'T'  ;
_F000:10B8                 out     64h, al         ; AT Keyboard controller 8042.
_F000:10BA 
_F000:10BA loc_F10BA:                              ; CODE XREF: _F000:10C4j
_F000:10BA                 jcxz    $+2
_F000:10BC                 in      al, 64h         ; AT Keyboard controller 8042.
_F000:10BE                 cmp     al, 0FFh
_F000:10C0                 jz      loc_F10C6
_F000:10C2                 test    al, 2
_F000:10C4                 jnz     loc_F10BA
_F000:10C6 
_F000:10C6 loc_F10C6:                              ; CODE XREF: _F000:10C0j
_F000:10C6                 mov     al, ah
_F000:10C8                 out     60h, al         ; AT Keyboard controller 8042.
_F000:10CA                 jmp     short sub_F10A5

Может, конечно, и ошибаюсь. Но похожее на АА55 не нашел.. Так вот хотелось бы знать сигнатуру (и ее пояснение), наличие которой говорило бы о том, что начальная инициализация уже завершена. Т.е. так, чтобы можно было воспользоваться только hex-редактором.
Если кому интересен биос прикрепил.

savely, спасибо. Буду вникать..

Аватар пользователя Santa

xname, с того же форума pdf-ку почитайте. Вот прямая ссылка: lejabeach.com/sisubb/Practical_BIOS_Editing.pdf

-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам

Цитата:
pdf-ку почитайте.

Спасибо:). К сожалению сейчас не могу себе позволить такой объем, т.к. плачу за траффик, но при первой возможности ознакомлюсь.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей