runiflash

Похоже, проект 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

Здесь и дальше я буду описывать имеющуюся у себя версию 1.45re.
uses Award, AMIBIOS, AsusBIOS, Phoenix;
... в которой как раз и добавлены другие биосы.
Const
PCICfIdx    = $CF8;
PCICfData   = $CFC;

Стандартные регистры работы с PCI. Здесь и дальше, повторю, приветствуются уточнения разряда "от знающих - малознающим".
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}

Из названия большинства переменных можно понять их назначение. Наши главные теперь - хххFunc - процедуры размапливания для северника, южника и мультика (которые LPC).
PCIROMs: array[1..20] of
          record
            MaxSize      : LongInt;
            VenID, DevID : Word;
            Bus, Pos     : Byte;
          end;
BIOSID: array[1..8] of Char; {v1.34}

Зачем PCIROMs сейчас не скажу (д.з.:) ), а биосайди, думаю, ясно - авардовский 8-символьный идентификатор биоса.
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 );

Ищем на PCI "координаты" северного моста и если его находим, то получаем NorthMan (North Manufacturer ID) и NorthRev (North Revision ID).
{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

SiS поделить на северники и южники сложней из-за любви к одночиповым решениям. Для одночиповых решений происходит детект мультика, чтобы установить для него процедуру размапливания. (Просьба прокомментировать знающим - видимо в "раздельночиповых" решениях бОльшая часть функций мультика была встроена в сам южник).
Плюс по "логике" SiS можно запросто продолжить список нового железа, типа:
$0xxx: Begin NorthName:='SiS xxx';
 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

ALI. Тоже уже бывший производитель.
 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

Вы не видели Pentium-16Mhz??? (или даже 8Mhz, точно уже не помню). Счастливые обладатели подобных чипсетов запросто могли себя таким порадовать.
 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;

Аналогично (подсказать ревизии мостов) по ATI, которая даже не упоминается в последней официальной версии юнифлеша. При чем не только для А64/Р4, но и для Атлонов, те, что А3-А4 были. У АТИ, вроде как, был чипсет даже для слотовых атлонов (типа А1-А2), но не уверен, что он был выпущен.

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

rd480 интересен?:)

Выход обычно есть. Но он не работает.

А подружите с 6100, плз!:) Имеется Foxconn 6100K8MB-RS (GF6100+nF410). В POST: C51MCP51-6A61HFKAC-00. Флэш: SST49LF004B (LPC 4Mb). Прекрасно шьется этим: Awdflash 8.67, Winflash 1.72 и Gwflash 1.08t. Uniflash 1.42re виснет на запуске. Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)". Я бы добавил к последней строчке эти пресловутые "айдишники железа":), но не совсем уверен, что точно понимаю, что же именно нужно. Может это? (кусок из репорта PCI32 1.1)
========================================
Vendor 10DEh Nvidia Corp
Device 02F1h C51 Host Bridge

Vendor 10DEh Nvidia Corp


Device 02FFh C51 Host Bridge

Vendor 10DEh Nvidia Corp
Device 0242h GeForce 6100

Vendor 10DEh Nvidia Corp
Device 0270h MCP51 Host Bridge

Vendor 10DEh Nvidia Corp
Device 0261h MCP51 LPC Bridge

Vendor 10DEh Nvidia Corp
Device 0264h MCP51 SMBus

Vendor 10DEh Nvidia Corp
Device 026Fh MCP51 PCI Bridge

Vendor 1022h Advanced Micro Devices (AMD)
Device 1100h Athlon 64 / Opteron HyperTransport Technology Configuration
========================================

Если это те самые IDs, у меня под рукой еще Jetway K8T800Pro/8237. Тож не работает (хотя ЮМ указан как поддерживаемый в 1.39).

Man is the dream of the dolphine (2469/15.17)

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

>Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)"

Отлично, как раз то, что нужно!

>rd480 интересен?

Конечно (и еще более, чем нВидиа), повторюсь, как и все другие атишные чипсеты (в том числе с неатишными южниками).

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

Добавляем полученные айдишники - например, детект южников будет теперь выглядеть так:

 If SouthMan = $10DE {nVidia} then {v1.30}
  Begin
   SouthFunc:=$1600;
   case SouthId of
    $01B2: begin SouthName:='nVidia MCP/MCP-D';                 SouthFunc:=$1601; end; {v1.41re}
    $0060: begin SouthName:='nVidia MCP2';                      SouthFunc:=$1602; end; {v1.41re}
    $0080: begin SouthName:='nVidia MCP2A/MCP2S';               SouthFunc:=$1602; end; {v1.41re}
    $00D0: begin SouthName:='nVidia nForce3 LPC Bridge';        SouthFunc:=$1602; end; {v1.41re}
    $00E0: begin SouthName:='nVidia nForce3 250Gb LPC Bridge';  SouthFunc:=$1602; end; {v1.41re}
    $0050: begin SouthName:='nVidia nForce4 LPC Bridge';        SouthFunc:=$1602; end; {v1.45re}
    $0030: begin SouthName:='nVidia MCP-04';                    SouthFunc:=$1602; end; {v1.45re}
    $0261: begin SouthName:='nVidia MCP51';{добавлено}          SouthFunc:=$1602; end; {v1.46re}
   end;
  End;

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

Продолжим разбирать юнифлеш. Мы остановились на размапливании нехабовых интеловских южников. "Классическое" размапливание уже разобрано, теперь много более сложный кусок, который очень важен для понимания принципов снятия защиты от записи у "брэндов". Т.е. кусок "шаманских действий", которые нужны, чтобы забороть добавленные "продвинутыми" производителями _дополнительные_ (т.е. помимо "стандартно" имеющихся) железные способы защиты флэшки от перезаписи, без которых невозможно "добраться" (корректно размапить) до флэши.
Именно этот _дополнительный_ код обычно отличает "брэндовые" системы от "простых". И именно поэтому в моих рекомендациях всегда я обязательно советовал - шить только на "небрэндовых" платах (где, соответственно, нет этой _дополнительной_ защиты).

           PIIXReg4:=0;
           if Lo(SouthFunc)=3 then {v1.29}
            begin
              if (BIOSID='6A69KA19') {Abit BF6, BE6-II v1.0 and v1.1}
               or (BIOSID='6A69KA1B') {Abit BE6-II v1.2}
               or (BIOSID='6A69KA1C') {Abit BE6-II v2.0 and BX133-RAID}
               or (BIOSID='2A69KA1Q') {Abit ZM6}
               or (BIOSID='2A69KA1U') then {Abit BE6}
               begin
                 PIIXReg2 := GetPCIRegD( $00, SouthPos shr 3, 4, $40 ); {v1.29}
                 LogWrite('Intel method: PM Base = '+Hl(PIIXReg2));
                 if PIIXReg2=-1 then
                  begin
                    PIIXReg4:=1;
                    SetPCIRegD($00,SouthPos shr 3,3,$40,$6101);
                    SetPCIRegD($00,SouthPos shr 3,3,$80,GetPCIRegD($00,SouthPos shr 3,3,$80) or 1);
                    LogWrite('Intel method: PM Base set to '+Hl(GetPCIRegD($00,SouthPos shr 3,3,$40)));
                    PIIXReg3:=Port[$6134] or LongInt(Port[$6135]) shl 8
                                                             or LongInt(Port[$6136]) shl 16 or LongInt(Port[$6137]) shl 24;
                    LogWrite('Intel method: GPO status '+Hl(PIIXReg3));
                    Port[$6135]:=Port[$6135] and $FD;
                    Port[$6137]:=Port[$6137] and $FB; {Abit BX133-RAID v1.29}
                    LogWrite('Intel method: GPO changed to '+Hl(Port[$6134] or LongInt(Port[$6135]) shl 8
                      or LongInt(Port[$6136]) shl 16 or LongInt(Port[$6137]) shl 24));
                  end;
               end;
             end;
          End else

Не совсем уклюжий, опять же, но код.:)
Итак, ранее (выше, мы разбирали) был детект BIOSID, который как раз и используеются здесь, для "конкретизации" нашего универсального прошивальщика. Это значит, что авторы юнифлеша просто раскопали, как снимается _дополнительная_ защита от записи для конкретных абитовских плат и добавили ее снятие, которое применяется, как видно, только конкретно к этим платам. И применяется банально просто - по биосайди - если оно такое, то кроме "классического" размапливания проводим и _дополнительную_ процедуру (упомянутые "шаманские действия").
ВАЖНО: Что будет, если мы не проведем эти _дополнительные_ действия сказать сложно (как раз такое и происходит, когда прошивальщие "не до конца" знает плату). Можно точно сказать, что корректно прошить микросхему точно НЕ ПОЛУЧИТСЯ. А в большинстве случаев (если не было _дополнительного_ размапливания) не получится даже просто задетектить флэшку. И никакие принудительные установки типа флэши ("-force XXXX" и др. подобные ключики в прошивальщиках) тут не помогут - мы _не_добрались_ до флеши, потому и прошить не сможем.

Теперь по коду _дополнительного_ размапливания Абитов (BF6/BE6-II/ZM6/BX133). Для защиты используется обычные GPO.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPO - General Purpose Output. По-простому это можно описать следующим образом. Помните, в антикварных компьютерах (до Pentium включительно) была просто тьма перемычек? А потом они "куда-то" исчезли, породив ставшие впоследствие стандартными "Jumper Less"-системы. Вот именно "в GPO" они и исчезли. GPO - это те же самые перемычки, только "внутричипсетные". Которые нам и нужно программно переставить в нужное положение. Именно это и делает приведенный _дополнительный_ кусок кода для некоторых абитных плат.


****************************************
Итак, разберем юнифлешовый способ переключения GPO-шных перемычек (установки оных для разрешения записи биоса). Код достаточно странный, но, что есть то есть.:)
Сначала получаем базовый адрес Power Management-a (Rx40 южника, третья функция) для того, чтобы... его потом поменять на свой.:) Почему не пользоваться имеющимся - не знаю, можно предположить - просто для "перестраховки".
Меняем его на свои 6100h (единичка на конце - это ReadOnly бит, потому запишется именно 6100). Теперь мы можем пользоваться областью портов 6100 для "нашего" PowerManagement-a. Предварительно сохраняем "родное" значение базового адреса PM, чтобы после (при выходе и "замапливании") все вернуть на родину.
Включаем доступ к "нашим" регистрам PM - Rx80 (MISCELLANEOUS POWER MANAGEMENT), бит 0 = Power Management IO Space Enable.
Сохраняем на будущее все GPO (т.е. запоминаем положение всех "внутричипсетных" перемычек, чтобы после наших манипуляций вернуть все как было).

GPO лежат смещению 34-37h:
7.2.16. GPOREG—GENERAL PURPOSE OUTPUT REGISTER (IO)
I/O Address: Base + (34h, 35h, 36h, 37h)
Default Value: 7FFFBFFFh
Attribute: Read/Write (Byte accesses only)

Видимо больше по приколу (хотя может и из маниакально-педантических соображений - для "экономии памяти"), но все четыре байта GPO засовываем в одну временную переменную PIIXReg3 (которая Dword).
И, наконец, виртуально снимаем перычку(-и) защиты от записи:
Port[$6135]:=Port[$6135] and $FD;
Port[$6137]:=Port[$6137] and $FB;
Все, "шаманские действия" закончились (про постоянное логгирование по ходу юнифлеша - думаю понятно, потому не комментирую).

Операция получилась мудреная, но, видимо, сказался опыт работы с большим количеством систем, потому логичная привычка максимальной перестраховки и породила такой достаточно "заумный" код.:)
Для сравнения приведу "реальный" код размапливания в самом биосе:

Abit BE6 (ver. 07/05/2000), original.tmp.

15972: pushad
15974: mov    cx,0384Eh ; Rx4E - управление защитой от записи для i82371 (PIIX4)
15977: call   GetPCI
1597A: or     al,004    ; Снимаем "классическую" защиту от записи
1597C: call   SetPCI
1597F: mov    dx,04037h ; Считываем GPO (обычно принятый адрес PM - 4000h)
15982: in     al,dx
15983: jmps   000015985 ; Небольшая задержка
15985: jmps   000015987
15987: and    al,0FBh   ; Снимаем "абитовскую" защиту от записи
15989: out    dx,al
1598A: jmps   00001598C ; Небольшая задержка
1598C: jmps   00001598E
1598E: popad
15990: retf

Как видно, все проще. Но мы же не ищем простых путей.:)

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

apple_rom
там надо будет в специфических типах защиты еще IDшки добавить (точно для каких-то Абитов - надо форум перечитывать)

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

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

и про MSI не забудьте lol
особенно которые старших ревизий на VIA694x

Либо нечему гореть, либо нечем поджечь!

Подсоединил тут Jetway K8T8AS (K8T800Pro/VT8237). U1.40 опознает чипсет и флешку правильно (U1.42re виснет на старте), но вот если сделать дамп прошивки, в файле оказывается мусор. Строка PCI chipset такая: "(1106,0282,00)+ VT8237 + ITE IT8700F/05F".

И из отчета PCI32:
=========================================
Vendor 1106h VIA Technologies Inc
Device 0282h K8T880Pro CPU to PCI Bridge

Vendor 1106h VIA Technologies Inc
Device 3227h VT8237 PCI to ISA Bridge
=========================================

Man is the dream of the dolphine (2469/15.17)

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

вспомнил что же за матери Uniflash - не брал:
MS-6368, Abit ST6/SH6/SA6/SL30T (и пр. абиты на 815-м), были косяки с MS-6337 (я вроде 1-ю ревизию юзал)...

PS: наверное, есть смысл сделать дебуг ключики вроде /MSI_1 , /MSI_2 и /ABIT_1, /ABIT_2 для тестирования систем защиты от записи некоторых неподдерживаемых мамок...

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

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

VIA c3m266-l:
VT8623 Rev. 00 VEN_1106 DEV_3123 SUBSYS_00000000 REV_00 (VIA Host Bridge)
VT8235         VEN_1106 DEV_0571 SUBSYS_CC011106 REV_06

Шьется штатным awdflash, uniflash 140 нормально работает, про 141 и 142 re докладывал в ветке по их альфе...

Выход обычно есть. Но он не работает.

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

Просьба не воспринимать етот пост как "понт сцылками" ибо вижу ето полезным для менее знающих,ето в добавку УРЛ которые РууТ дал:
:idea: pcidatabase.com/ :idea:

For LINUX : leenooks.com/PCI+id

Мои ID's :

Desktop :

Если что то не надо, модеры-потрите, если нужны дампы то нет проблем.

нужны лишь следующие айдишники:


-> "CPU to Host Bridge" (или чуть другие - все по-разному называют, но смысл такой же) - это для детекта северного моста.
-> "PCI to ISA Bridge" или "LPC Controller" (или чуть другие - все по-разному называют, но смысл такой же) - это для детекта южного моста.

Редактировано apple_rom

Intel(R) 82801EB LPC Interface Controller - 24D0
Chip: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
Full Details
PNP ID
VEN_8086&DEV_24D0&SUBSYS_00000000&REV_02

На будущее: не надо интелов, если только самые-присамые последние (ICH8/9) - они достаточно хорошо докуменитрованы. apple_rom
Добавлено спустя 1 час 41 минуту 5 секунд:
Мои HP PAVILION Лаптоп :

RADEON IGP 320M
Unknown Device and Vender, PNPID: VEN_1002&DEV_4336&SUBSYS_0024103C&REV_00
Full Details
PNP ID
VEN_1002&DEV_4336&SUBSYS_0024103C&REV_00

PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1002&DEV_CAB0&SUBSYS_00000000&REV_13
Full Details
PNP ID
VEN_1002&DEV_CAB0&SUBSYS_00000000&REV_13
Какой смысл от "Unknown Device and Vender" и неизвестной модели ноутбука???. apple_rom

Добавлено спустя 18 часов 8 минут 28 секунд:
еше один из моих десктопов:
VIA Standard Host Bridge
Unknown Device and Vender, PNPID: VEN_1106&DEV_3168&SUBSYS_00000000&REV_82
Full Details
PNP ID
VEN_1106&DEV_3168&SUBSYS_00000000&REV_82

VIA Standard PCI to ISA Bridge
Unknown Device and Vender, PNPID: VEN_1106&DEV_3177&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1106&DEV_3177&SUBSYS_00000000&REV_00

Виашки как и интелы тоже особенно не нужны, тем более, что их нонче свежих то практически и нет. apple_rom

Добавлено спустя 2 часа 11 минут 53 секунды:
еше один десктоп :

SIS PCI to ISA bridge
Unknown Device and Vender, PNPID: VEN_1039&DEV_0008&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1039&DEV_0008&SUBSYS_00000000&REV_00

PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1039&DEV_0735&SUBSYS_00000000&REV_01
Full Details
PNP ID
VEN_1039&DEV_0735&SUBSYS_00000000&REV_01

Если внимательно посмотреть, я писал, что у сисов крайне "рабочекрестьянкая" идентификация - большинство южников имеет айдишник 0008, а северник соответствует своему же числу, итого из приведенного получаем банальный SiS735 (опять же, без модели - зачем?) . apple_rom

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

PCI standard host CPU bridge
Unknown Device and Vender, PNPID: VEN_1022&DEV_1100&SUBSYS_00000000&REV_00
Full Details
PNP ID
VEN_1022&DEV_1100&SUBSYS_00000000&REV_00

PCI standard ISA bridge
Unknown Device and Vender, PNPID: VEN_10DE&DEV_0050&SUBSYS_00000000&REV_A3
Full Details
PNP ID
VEN_10DE&DEV_0050&SUBSYS_00000000&REV_A3
Опять без модели. Хоть по айдишникам понятно - nForce4-система. apple_rom

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

ECS RS482-M
RS482 (CPU-PCI от ATI, остальные - от VEN_1022): VEN_1002 DEV_5950 SUBSYS_00000000 REV_10 
SB450 (3*Std IDE): VEN_1002 DEV_4376?  4379 ? 437A
*SMBus: VEN_1002 DEV_4372 SUBSYS_1B341019 REV_11

Выход обычно есть. Но он не работает.

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

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

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

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