Чтение/запись BIOS

Всем доброго времени суток.
Хочется немного с БИОСом разобраться.
Допустим, у меня есть прошивка, и я знаю смещение в ней,
с которого начинается небольшой участок неиспользуемой
информации. Туда нужно записать сигнатуру, по какой буду
проверять (из ПЗУ сетевой карты) та ли прошивка находится

в ПЗУ БИОСа. Затем затереть те участки флешки, по которым
прошивальшик определяет тип микросхемы, и подправить
контрольную суму.

Теперь чего у меня не получается:
Написал код (точнее почти весь скопировал из UNIFLASHа),
который переходит в UnReal, открывает А20, и затем выводит
из тени (i430VX) память флешки (Winbond W29EE011).
Затем пробую стереть ее (так проверяю добрался я до флешки
или нет - если да, то не будет машина стартовать:)) этими
специальными для моей флеш командами (взял их тоже с
исходников UNIFLASHа). Но ничего не происходит (новый дамп,
сделанный UNIFLASHем совпадает со старым, да и машина по-прежнему работает). На мат. плате (KAIMEI KM-T5-V2) запись на флеш разрешена.

.model tiny
.386p
.code

CONFIG_ADDR	EQU	0cf8h
ROMBase     EQU	0FFFE0000h

org	100h

begin:

; turn on A20
in al, 92
or al, 2
out 92, al

call FlatRealOn
cmp al,0
jz @@err

mov	cx, 4eh
call	PCI_Read
or    al, 44h 
call	PCI_Write
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov addr,ROMBase+5555h
mov data,0aah
call FOMemB
mov addr,ROMBase+2aaah
mov data,55h
call FOMemB
mov addr,ROMBase+5555h
mov data,80h                  ;Erase setup
call FOMemB


mov addr,ROMBase+5555h
mov data,0aah
call FOMemB
mov addr,ROMBase+2aaah
mov data,55h
call FOMemB
mov addr,ROMBase;+5555h
mov data,50h                  ;Erase sector
call FOMemB

mov addr,ROMBase+5555h
mov data,0aah
call FOMemB
mov addr,ROMBase+2aaah
mov data,55h
call FOMemB
mov addr,ROMBase+5555h
mov data,0f0h                 ;Reset
call FOMemB

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		
mov	cx, 4eh
call	PCI_Read
and     al,0fh
call	PCI_Write

call FlatRealOff

@@err:

int 20h

;Enable flat real mode
FlatRealOn: 
;check for protected (V86) mode
SMSW    AX
TEST    AL,1
JNZ     @error

;switch to flat real mode
DB      66H
MOV     BX,DS                               ;EBX=DS
DB      66H
SHL     BX,4                                ;EBX=DS*16
DB      66H
MOV     SI,OFFSET TmpGDT
DW      0                                   ;ESI=OFFSET TmpGDT
DB      66H
ADD     BX,SI                               ;EBX=linear addr of TmpGDT structure
MOV     WORD PTR DS:[SI],10H                ;GDT limit
MOV     DS:[SI+2],BX                        ;GDT linear addr lo
DB      66H
SHR     BX,16   ;BX=Hi(EBX)
MOV     DS:[SI+4],BX                        ;GDT linear addr hi
XOR     DX,DX
MOV     DS:[SI+10],DX                       ;segment base bits 0-15
DEC     DX
MOV     WORD PTR DS:[SI+8],DX               ;segment limit bits 0..15 (actually 12-27)
MOV     WORD PTR DS:[SI+12],09200H          ;segment base bits 16-23, R/W,DT1,DPL0,P=1
MOV     WORD PTR DS:[SI+14],008FH           ;segment limit bits 16-19 (actually 28-31)
                                            ;D=0,G=1(4K), segment base bits 24-31
LGDT    fword ptr DS:TmpGDT  ;Load GDTR
INC     AX                   ;PM on
CLI
LMSW    AX                   ;switch to PM
MOV     BX,08H               ;flat segment
MOV     ES,BX                ;ES=flat. NOTE:DS=flat->error??!!
DB      0FH,20H,0C0H         ;MOV EAX,CR0
DEC     AX                   ;PM off
DB      0FH,22H,0C0H         ;MOV CR0,EAX
STI
MOV     AL,1
JMP     @exit
@error: XOR     AL,AL
@exit:
ret

;Disable flat real mode
;NOTE: It is assumed that FlatRealOn has been previously called !!
FlatRealOff:
MOV     SI,OFFSET TmpGDT
MOV     BYTE PTR DS:[SI+14],00H ;segment limit bits 16-19 (actually 28-31)
                                ;D=0,G=0(byte), segment base bits 24-31
LGDT    fword ptr DS:TmpGDT     ;Load GDTR
SMSW    AX
INC      AX                 ;PM on
CLI
LMSW    AX                  ;switch to PM
MOV     BX,08H              ;non-flat segment
MOV     ES,BX               ;ES=normal
DB      0FH,20H,0C0H        ;MOV EAX,CR0
DEC     AX                  ;PM off
DB      0FH,22H,0C0H        ;MOV CR0,EAX
STI
ret

PCI_Read:
mov	ax,8000H	    ;enable PCI config.
shl	eax,16
mov	ax,cx
and	al,NOT 03h	    ;32 bit access for PCI
mov	dx,CONFIG_ADDR	    ;index is 0cf8h
out	dx,eax
add	dl,4		    ;start from 0cfch
mov	al,cl
and	al,03h
add	dl,al		    ;byte index to read
in	al,dx
ret

PCI_Write:	
xchg	ax,cx
shl	ecx,16		    ;save value
xchg	ax,cx               ;restore cx
mov	ax,8000H	    ;enable PCI config.
shl	eax,16
mov	ax,cx
and	al,NOT 03h	    ;32 bit access for PCI
mov	dx,CONFIG_ADDR	    ;index is 0cf8h
out	dx,eax
add	dl,4	            ;start from 0cfch
mov	al,cl
and	al,03h
add	dl,al               ;byte index to read
mov	eax,ecx
shr	eax,16
out	dx,al
ret

FIMemB:
XOR    AX,AX
MOV    ES,AX
DB     66H
MOV    SI,WORD PTR Addr    ;MOV ESI,Addr
DB     26H,67H,8AH,06H     ;MOV AL,ES:[ESI]
ret

FIMemW:
XOR    AX,AX
MOV    ES,AX
DB     66H
MOV    SI,WORD PTR Addr    ;MOV ESI,Addr
DB     26H,67H,8BH,06H     ;MOV AX,ES:[ESI]
ret

FOMemB:
XOR    AX,AX
MOV    ES,AX
DB     66H
MOV    SI,WORD PTR Addr    ;MOV ESI,Addr
MOV    AL,BYTE PTR Data
DB     26H,67H,88H,06H     ;MOV ES:[ESI],AL
ret

FOMemW:
XOR    AX,AX
MOV    ES,AX
DB     66H
MOV    SI,WORD PTR Addr    ;MOV ESI,Addr
MOV    AX,Data
DB     26H,67H,89H,06H     ;MOV ES:[ESI],AX
ret

TmpGDT   db      8 dup (?)
Addr     dd      ?
Data     dw      ?

end	begin

А если что-то получится, так хочу около сигнатуры небольшой ключ
записывать. Будет что то вроде БИОСовского пассворда, но поинтересней.
Посмотрите, кому не лень.

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

Ошибка в использовании команды 0х50 (в надежде, что это Erase), предназначенной для хабовых винбондов.
Для работы с "нормальными" старенькими "параллельными" флэшами внимательно курим GENFLASH.PAS (GenPageProgB) и, собственно, в первую очередь, даташит на W29EE011 (с чего и надо было начать - там никаких 0х50 нету, а есть 0х80 + 0х10).

Спасибо, сейчас поправлю и попробую стереть.

Добавлено спустя 2 часа 15 минут 17 секунд:

Нашел даташит и с командами разобрался.
Но по-прежнему ничего не получается. В чем может быть еще ошибка?

Добрый совет:
Напишите аналогичное для ДОСА:)
и ребут...

Что сказали татары прийдя на Русь? "Сдавайтесь русские-нас орда!"
И что им ответили русские?
"А нас-рать!" ) (с)

Так это ведь и так для ДОСа. Или я чего то не понял. Можно подробнее.

Добавлено спустя 1 час 57 минут 19 секунд:

Пробовал еще на Macronix MX28F1000P (Erase blok=60h, erase chip=20h), но опять же ничего.

Вроде как разобрался с GenPageProgB. Она вызывает MoveLinBlockB, которая просто копирует содержимое буфера в адресное пространство флэшки. Сделал так же, но не работает:(

Еще один вопрос. Почему в GenPageProgB перед записью посылается команда А0 - Enable Data Protection Flow, а не Disable (80+20)?

Я имел введу дебужить можна... Посмотрите как все проходит? Если "все как по маслу"-смотрите куда и что вы пишите? Посмотрите там ли тень флешки? Прочитайте... научитесь стирать флешу, а потом и запись... блоками:)
п.с. стандартная схема от простого к сложному.

Что сказали татары прийдя на Русь? "Сдавайтесь русские-нас орда!"
И что им ответили русские?
"А нас-рать!" ) (с)

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

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые 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.

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

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