>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 засовываем в одну временную переменную 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
Как видно, все проще. Но мы же не ищем простых путей.
>Uniflash 1.40 при запуске выдает "PCI chipset: (1022,1100,00)+(10DE,0261,A2)"
Отлично, как раз то, что нужно!
>rd480 интересен?
Конечно (и еще более, чем нВидиа), повторюсь, как и все другие атишные чипсеты (в том числе с неатишными южниками).
Добавлено спустя 19 минут 41 секунду:
Добавляем полученные айдишники - например, детект южников будет теперь выглядеть так:
Добавлено спустя 2 часа 35 минут 20 секунд:
Продолжим разбирать юнифлеш. Мы остановились на размапливании нехабовых интеловских южников. "Классическое" размапливание уже разобрано, теперь много более сложный кусок, который очень важен для понимания принципов снятия защиты от записи у "брэндов". Т.е. кусок "шаманских действий", которые нужны, чтобы забороть добавленные "продвинутыми" производителями _дополнительные_ (т.е. помимо "стандартно" имеющихся) железные способы защиты флэшки от перезаписи, без которых невозможно "добраться" (корректно размапить) до флэши.
Именно этот _дополнительный_ код обычно отличает "брэндовые" системы от "простых". И именно поэтому в моих рекомендациях всегда я обязательно советовал - шить только на "небрэндовых" платах (где, соответственно, нет этой _дополнительной_ защиты).
Не совсем уклюжий, опять же, но код.
Итак, ранее (выше, мы разбирали) был детект 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;
Все, "шаманские действия" закончились (про постоянное логгирование по ходу юнифлеша - думаю понятно, потому не комментирую).
Операция получилась мудреная, но, видимо, сказался опыт работы с большим количеством систем, потому логичная привычка максимальной перестраховки и породила такой достаточно "заумный" код.
Для сравнения приведу "реальный" код размапливания в самом биосе:
Как видно, все проще. Но мы же не ищем простых путей.