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

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

[code:1]
.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
[/code:1]

А если что-то получится, так хочу около сигнатуры небольшой ключ
записывать. Будет что то вроде БИОСовского пассворда, но поинтересней.
Посмотрите, кому не лень.
The content of this field is kept private and will not be shown publicly.

BBCode

  • No HTML tags allowed.
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Web page addresses and email addresses turn into links automatically.
Ошибка в использовании команды 0х50 (в надежде, что это Erase), предназначенной для хабовых винбондов.
Для работы с "нормальными" старенькими "параллельными" флэшами внимательно курим GENFLASH.PAS (GenPageProgB) и, собственно, в первую очередь, даташит на W29EE011 (с чего и надо было начать - там никаких 0х50 нету, а есть 0х80 + 0х10).

lukash

19 years 2 months ago

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

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

Нашел даташит и с командами разобрался.
Но по-прежнему ничего не получается. В чем может быть еще ошибка?
Добрый совет:
Напишите аналогичное для ДОСА :)
и ребут...

lukash

19 years 2 months ago

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

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

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

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

lukash

19 years 2 months ago

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