Похоже, проект Uniflash загнулся - полтора года без обновлений. Потому, чтобы убить сразу несколько зайцев завожу тут подобную тему, которая не только есть продолжение юнифлеша, но и разбор на его базе процесса перешивки на "атомном" уровне, которое когда-то давно предполагалось при написании статьи по перешивке.
Чтобы отличать его от проекта uniflash, но в то же время отражать прямую преемственность не напрягая фантазию назвал как runiflash.
Итак, приступим. (Скачать исходники юнифлеша можно на родном сайте или здесь.) Излагать буду в "черновом" варианте, потому исправления, дополнения и опровержения приветствуются. После все внесется в статью по перешивке биос.
Процесс перешивки с "практическо-железной" точки зрения представляет собой доступ в те области памяти, которые в "нормальном" режиме недоступны. Чтобы получить к ним доступ (здесь и далее все подразумевает то, как сделано именно в юнифлеше, даже с учетом, что это может быть не самый лучший способ и т.п.) делаются следующие вещи:
1. Переходим в линейный режим памяти. У него могут быть разные названия (Linear/UnReal/Flat), но смысл один и тот же - 32-битный доступ. (в досе, ко всей памяти).
2. "Размапливаем" северный мост (если требуется).
3. "Размапливаем" южный мост (если требуется).
4. "Размапливаем" мультик (если требуется).
5. "Размапливаем" GPIO (если требуется).
Операция "размапливания" подразумевает программирование логики на доступ к самой FlashROM. Все эти процедуры "железозависимые" и с претензиями на реальную универсальность требуют учета всех возможных вариантов использования "защиты от записи". В частности, именно поэтому "размапливание" делится на подобны градации - специфичные для северника-южника-мультика-гпио (в "стандартном" случае размапливание подразумевает лишь южник).
Далее идут процедуры уже конкретно работы с микросхемой, которые так же специфичны для различных типов-производителей флэшек.
После для возможности корректной работы при выходе нужно будет "замапить" все до этого "размапленные" пункты и вернуться в "нормальный" режим (адресации, 16 бит).
Вот коротко так выглядит работа юнифлеша для нашей темы. Главный файл, который ответственный за прошивку - PCI.pas - его и по-тихоньку начнем разбирать.
{$R-} unit PCI; { Unit to communicate with chipsets } interface
uses Award, AMIBIOS, AsusBIOS, Phoenix;
Const PCICfIdx = $CF8; PCICfData = $CFC;
Var NorthFunc, SouthFunc, LPCFunc: Word; NorthPos,SouthPos,PMUPos,CurPCIROM,PCIROMBus,PCIROMDev,PCIROMFun,LPCBase: Byte; CurrentChipset, CurrentPCICard: string; WantToUseAMI, AMIUsed, ChipsetFound, ROMEnabled, PCIROMEnabled: Boolean; WantToUseAsus, AsusUsed: Boolean; AwardUsed: Boolean; {1.42re} PhoenixUsed: Boolean;{1.43re}
PCIROMs: array[1..20] of record MaxSize : LongInt; VenID, DevID : Word; Bus, Pos : Byte; end; BIOSID: array[1..8] of Char; {v1.34}
Procedure OPortD( Prt : Word; Val : LongInt ); Function IPortD( Prt : Word ) : LongInt; Function GetPCIRegD( Bus, Dev, Func, Reg : Byte ) : LongInt; Procedure SetPCIRegD( Bus, Dev, Func, Reg : Byte; Value : LongInt ); Function LocatePIIX : {byte}Boolean; {v1.22 byte->boolean} procedure GetBIOSID; Procedure RomEnable( Map : boolean); procedure ShadowDisable_Aladdin; {v1.31} procedure ShadowRestore_Aladdin; {v1.31}
implementation Uses Tools,Flash,Crt,DMI;
{ PortD[ x ] := y } Procedure OPortD( Prt : Word; Val : LongInt ); Assembler; Asm DB 66H MOV AX,WORD PTR Val MOV DX,Prt DB 66H OUT DX,AX End;
{ y := PortD[ x ] } Function IPortD( Prt : Word ) : LongInt; Assembler; Asm MOV DX,Prt DB 66H IN AX,DX DB 66H MOV DX,AX DB 66H SHR DX,16 End;
Описание дальнейших процедур опускаю и опишу позже, дабы разбираться "от общего к частностям". Потому и переходим сразу к главной процедуре:
Begin if Port[$CFB]<>$FF then {v1.26} Port[$CFB]:=Port[$CFB] or $1; {Set PCI configuration mechanism #1}
{Locate north bridge} For Pos_ := 0 to $FF do If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $08 ) shr 8 ) = $60000 then Break; If Pos_ = $FF then {v1.22} Begin LocatePIIX := False; Exit; End else LocatePIIX:=True; NorthPos := Pos_; {Get north bridge MID & DID} NorthMan := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $00 ); NorthId := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $00 ) shr 16; {Get north bridge rev ID} NorthRev := GetPCIRegD( $00, NorthPos shr 3, NorthPos and $07, $08 );
{Locate south bridge} For Pos_ := 0 to $FF do If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $08 ) shr 8 ) = $60100 then Break; If Pos_ = $FF then {v1.22 for i430MX} For Pos_ := 0 to $FF do If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $08 ) shr 8 ) = $68000 then Break; If Pos_ = $FF then {v1.31 for old chipsets} For Pos_ := 0 to $FF do If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $00 ) and $FFFF ) <> $FFFF then If ( GetPCIRegD( $00, Pos_ shr 3, Pos_ and $07, $08 ) shr 8 ) = $00000 then Break; SouthPos := Pos_; {Get south bridge MID & DID} SouthMan := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $00 ); SouthID := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $00 ) shr 16; {Get south bridge rev ID} SouthRev := GetPCIRegD( $00, SouthPos shr 3, SouthPos and $07, $08 );
CurrentChipset := ''; NorthFunc := 0; {No special treatment necessary} SouthFunc := 0; {Same} LPCFunc := 0; {v1.27} NorthName:=''; SouthName:=''; LPCName:='';
Определяем имя и процедуры размапления (если она нужна) северника по его ревизии.
{Id northbridge} If NorthMan = $8086 {Intel} then Begin case NorthId of {case v1.21} $4A3: if NorthRev>=$10 then NorthName:='i82433NX' else NorthName:='i82433LX'; $122D: NorthName:='i82437FX'; $1235: NorthName:='i82437MX'; $1237: NorthName:='i82441FX'; $1250: NorthName:='i82439HX'; $7030: NorthName:='i82437VX'; $7100: NorthName:='i82439TX'; $7180: NorthName:='i82443LX/EX'; $7190, $7192: NorthName:='i82443BX/ZX'; $71A0, $71A2: NorthName:='i82443GX'; $84C4: NorthName:='i82454KX/GX'; $7120: NorthName:='i82810'; $7122: NorthName:='i82810-DC100'; $7124: NorthName:='i82810E'; $1130: NorthName:='i82815'; $2500: NorthName:='i82820'; $3575: NorthName:='i82830M'; $1A21: NorthName:='i82840'; $1A30: NorthName:='i82845'; $2560: NorthName:='i82845G/P'; $2530: NorthName:='i82850'; $3580: NorthName:='i8285xGM'; $3340: NorthName:='i82855PM'; $2531: NorthName:='i82860'; $2570: NorthName:='i82865'; {v1.34} $2578: NorthName:='i82875'; $255D: NorthName:='iE7205'; $2578: NorthName:='iE7210'; {v1.39} $2588: NorthName:='iE7221'; {v1.39} $3592: NorthName:='iE7320'; {v1.39} $2540: NorthName:='iE7500'; $254C: NorthName:='iE7501'; $2550: NorthName:='iE7505'; $3590: NorthName:='iE7520'; {v1.39} $359E: NorthName:='iE7525'; {v1.39} $0500: NorthName:='iE8870'; {v1.39} $2580: NorthName:='i829xxx'; {v1.37} $2590: NorthName:='i829xxxM'; {v1.39} End; End else
If NorthMan = $1106 {VIA} then Begin case NorthId of {case v1.21} $505: Begin {v1.37} NorthFunc := $0100; {VIA A8/A9 scheme} NorthName:='VT82C505'; End; $576: Begin NorthFunc := $0100; {VIA A8/A9 scheme} NorthName:='VT82C576M'; End; $585: NorthName:='VT82C585VP/VPX'; $595: NorthName:='VT82C595/AMD-640'; $597: NorthName:='VT82C597'; $598: NorthName:='VT82C598(AT)'; $685: Begin NorthFunc := $0100; {VIA A8/A9 scheme} NorthName:='VT82C685'; End; $501: NorthName:='VT8501'; $691: NorthName:='VT82C691/693(A)/694X/T'; $693: NorthName:='VT82C693(A)'; $601: NorthName:='VT8601'; $605: NorthName:='VT8605'; $391: NorthName:='VT8371'; $305: NorthName:='VT8363(A)/8365'; $3099: NorthName:='VT8366(A)'; $3091: NorthName:='VT8633'; $3101: NorthName:='VT8653'; $3102: NorthName:='VT8662'; $3103: NorthName:='VT8615'; $3112: NorthName:='VT8361'; $3133: NorthName:='VT3133'; $3148: NorthName:='VT8751'; $3128: NorthName:='VT8753(A)/8754'; $3189: NorthName:='VT8377'; $3205: NorthName:='VT8378'; End; End else
If NorthMan = $1022 {AMD} then {v1.20} Begin case NorthId of {case v1.21} $7006: NorthName:='AMD-751'; $700E: NorthName:='AMD-761'; $700C: NorthName:='AMD-762'; $7454: NorthName:='AMD-8151'; {v1.36} End; End else
If NorthMan = $1039 {SiS} then Begin SouthFunc:=$0503; {SiS reg. 45 bits 5,2} case NorthId of $496: Begin NorthFunc := $0200; {SiS reg. D0 scheme} SouthFunc := 0; NorthName:='SiS 85C496+497'; End; $406: Begin SouthFunc := $0501; {SiS internal reg. 80h} NorthName:='SiS 501/5101/5501'; End; $5511: Begin SouthFunc := $0502; {SiS internal reg. 50h} NorthName:='SiS 5511'; End; $5571: NorthName:='SiS 5571'; $5591: NorthName:='SiS 5591/5592'; $5596: Begin NorthName:='SiS 5596'; SouthFunc := $0502; {SiS internal reg. 50h} LPCFunc:=LPCDetect; {v1.27} End; $5597: NorthName:='SiS 5597/5598/5581/5120'; $0530: NorthName:='SiS 530'; $0540: Begin SouthFunc := $0504; {SiS reg. 45 bits 7,6} NorthName:='SiS 540'; End; $5600: NorthName:='SiS 600'; $0620: NorthName:='SiS 620'; $0630: Begin NorthName:='SiS 630'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; {v1.27} End; $0635: Begin NorthName:='SiS 635'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0640: Begin NorthName:='SiS 640'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0645: Begin NorthName:='SiS 645'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0646: Begin NorthName:='SiS 645DX'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0648: Begin {v1.31} NorthName:='SiS 648'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0650: Begin NorthName:='SiS 650'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0651: Begin {v1.31} NorthName:='SiS 651'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0655: Begin {v1.31} NorthName:='SiS 655'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0730: Begin NorthName:='SiS 730'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0733: Begin {v1.31} NorthName:='SiS 733'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0735: Begin NorthName:='SiS 735'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0740: Begin NorthName:='SiS 740'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0745: Begin {v1.31} NorthName:='SiS 745'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0746: Begin {v1.31} NorthName:='SiS 746'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0748: Begin {v1.31} NorthName:='SiS 748'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; $0755: Begin {v1.31} NorthName:='SiS 755'; SouthFunc := $0504; {SiS reg. 45 bits 7,6} LPCFunc:=LPCDetect; End; End; End else
If NorthMan = $10B9 {ALi} then Begin case NorthId of $1451: begin NorthFunc := $0300; {ALi Aladdin} NorthName:='M1451'; end; $1489: begin NorthFunc := $0301; {ALi FinALi} NorthName:='M1489'; end; $1521: NorthName:='M1521'; $1531: NorthName:='M1531(B)'; $1541: NorthName:='M1541/1542'; $1561: NorthName:='M1561'; {v1.31} $1621: NorthName:='M1621'; $1631: NorthName:='M1631'; $1632: NorthName:='M1632M'; $1641: NorthName:='M1641'; $1647: NorthName:='M1647'; $1651: NorthName:='M1651'; {v1.31} $1671: NorthName:='M1671'; {v1.31} $1672: NorthName:='M1672'; {v1.31} End; End else
If NorthMan = $1166 {Reliance/ServerWorks} then {v1.25} Begin case NorthId of $0007: NorthName:='Reliance NB6635'; $0008: NorthName:='Reliance NB6536'; End; End else
If NorthMan = $1066 {PicoPower} then {v1.25} Begin case NorthId of $0001: NorthName:='Vesuvius V1-LS'; End; End else
If NorthMan = $1078 {Cyrix} then {v1.25} Begin case NorthId of $0001: NorthName:='MediaGX'; End; End else
If NorthMan = $1045 {OPTi} then {v1.26} Begin case NorthId of $C557: NorthName:='OPTi 82C557(M)'; {v1.37} $C567: NorthName:='OPTi 82C567'; end; End else
If NorthMan = $3388 {HiNT} then {v1.26} Begin case NorthId of $8011: NorthName:='HiNT VXPro-II North'; end; End else
If NorthMan = $1060 {UMC} then {v1.28} Begin case NorthId of $8881: NorthName:='UMC UM8881F'; end; End else
If NorthMan = $1344 {Micron} then {v1.29} Begin case NorthId of $3320: NorthName:='Micron MT8LLN21PADF'; end; End else
If NorthMan = $1080 {Contaq/Cypress} then {v1.29} Begin case NorthId of $0600: begin {CY82C599} NorthFunc := $0400; NorthName:='CY82C599'; end; $C691: NorthName:='CY82C691'; end; End else
If NorthMan = $10DE {nVidia} then {v1.30} Begin case NorthId of $1A4: NorthName:='nVidia IGP'; $1E0: NorthName:='nVidia IGP2'; $D1: NorthName:='nVidia nForce3 Host Bridge'; {v1.41re} $E1: NorthName:='nVidia nForce3 250Gb Host Bridge'; {v1.41re} end; End else
If NorthMan = $1002 {ATI} then {v1.46re} Begin case NorthId of ... тут может быть ваш чипсет ... end; End;
Highlander & Root
Нескромный вопрос - можно уточнить адрес (в цифрах, а не в определения aka "initial BIOS point"/"SMM hook"), по которому будет производится переход в случае выполнения этой подпрограммы?
P.S. И еще очень хотелось бы знать - будет ли вызываться эта подпрограмма вообще (имеется в виду - в обсуждаемой версии)?
Поупражнялись в англицком? Теперь можно и по-русски.
Профессиональный ремонт ноутбуков в Мурманске- notebook51.ru
Rom.by, что в имени тебе моем..?
При чем тут упражнения? Человек спросил на английском, написал, что с русским у него проблемы, вот мы и отвечаем ему на английском.
wiki.rom.by - здесь специально собраны ответы на большинство вопросов!
Когда другие уже закончили, процессоры Intel (R) Pentium (R) продолжают работать, работать и работать...
Здравствуйте скиньте пожалуйста exe файл UniFlash на E-mail:
Не могу прошить никак w39v080A пробовал и AWD и UniFlash, Uni вообще не распознает((
попробуйте flashrom - он умеет этот чип. rom.by/forum/Universalnaja_utilita_dlja_chtenija_zapisi_flash-chipov_-?page=1
Отправить комментарий