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