Всем доброго времени суток.
Хочется немного с БИОСом разобраться.
Допустим, у меня есть прошивка, и я знаю смещение в ней,
с которого начинается небольшой участок неиспользуемой
информации. Туда нужно записать сигнатуру, по какой буду
проверять (из ПЗУ сетевой карты) та ли прошивка находится
Теперь чего у меня не получается:
Написал код (точнее почти весь скопировал из 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
А если что-то получится, так хочу около сигнатуры небольшой ключ
записывать. Будет что то вроде БИОСовского пассворда, но поинтересней.
Посмотрите, кому не лень.
Ошибка в использовании команды 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)?
Я имел введу дебужить можна... Посмотрите как все проходит? Если "все как по маслу"-смотрите куда и что вы пишите? Посмотрите там ли тень флешки? Прочитайте... научитесь стирать флешу, а потом и запись... блоками
п.с. стандартная схема от простого к сложному.
Что сказали татары прийдя на Русь? "Сдавайтесь русские-нас орда!"
И что им ответили русские?
"А нас-рать!" ) (с)
Отправить комментарий