Самостоятельное исправление ошибок в CPU


Данная статья предназначена для сильно продвинутых пользователей, понимающих, что они делают и каковы последствия в случае неудачи. Материал подаётся по принципу "As Is", и автор не несёт никакой ответственности за моральный или материальный ущерб, могущий возникнуть как у читателя после прочтения данного материала, так и у третьей стороны от действий читателя после прочтения данного материала. Максимально возможная техническая неприятность в случае неграмотных действий пользователя или воздействия внешних причин вызовет необходимость перепрошивки флеш-памяти с образом BIOS на внешнем программаторе.

Прочитав статью "Исправление ошибок в CPU", я выполнил указанные в ней действия, загрузив тем самым в область DMI 2-килобайтный блок программного исправления ошибок микроядра CPU. Однако попытка получить спустя полгода новую базу исправлений ошибок (PEP15.PDB, в новых версиях утилиты файл переименован в PEP.DAT; далее по тексту все вхождения "PEP15.PDB" заменены на "PEP.DAT", поскольку к данной статье прилагается новая версия утилиты от Intel, по умолчанию работающая именно с PEP.DAT) -- как от изготовителя процессора (фирмы Intel), так и от продавца -- не увенчались успехом: продавец (фирма "IQ Computers") отвечает, что у него нет доступа к интеловской базе (что в общем-то странно и может означать, на мой взгляд, только то, что торговля процессорами этим продавцом осуществляется по "серым" каналам, не имеюшим официального выхода на Intel), а техсаппорт изготовителя отвечает буквально следующее:


===

From: Intel Customer Support <support@mailbox.cps.intel.com>
Subject: RE: Latest version of P6+ ERRATA corrections base
Date: 10 июня 1999 г. 0:52

01:44 PM
6/9/99

Hello Sergey,
The file is available here:
channel.intel.com/business/ibp/private/integration/downloads/p6bu.htm

The site is password protected. Your Intel(R) rep should be able to assist
you if you do not have the password.
--------
Joseph K
*All brands and trademarks are the property of their respective owners
===

Анализируя возможные пути и способы получения этой базы по неофициальным каналам, я обратил внимание на блоки CPUCODE в Award-BIOS'ах различных фирм-изготовителей материнских плат. Более пристальный анализ формата этих блоков показал, что он либо полностью совпадает с форматом PEP.DAT (как в BIOS'ах от A-Bit, например; имя файла -- CPUCODE.BIN), либо блокам из PEP.DAT предшествует некий заголовок неизвестного мне формата (как в BIOS'ах от ASUS; имя файла -- CPUCODE.EXE, хотя никакого отношения к исполнимым файлам формата *.EXE он не имеет). Каждый 2-килобайтный (2048 байт) блок файла PEP.DAT (или, что то же самое, CPUCODE.BIN) содержит заголовок следующего, насколько мне удалось разобрать сравнительным анализом, формата:

Смещение (16cc.) Длина (10cc.) или формат Описание
+0 двойное слово Номер версии формата (не встречал отличное от 1)
+4 двойное слово Номер версии блока для данного CPUID
+8 4 байта Дата выхода данной версии блока
+8 слово Год выхода (0x9919 -- 1999 год)
+A байт День выхода (0x12 -- 12-е число)
+B байт Месяц выхода (0x12 -- декабрь)
+C слово CPUID процессора, для которого предназначен блок
+E слово Не используется (заполнено нулями)
+10 4 байта ??? Возможно, -- контрольная сумма
+14 двойное слово Номер версии формата (???, не встречал отличное от 1)
+18 двойное слово PKG (Package) процессора
+1C двойное слово Не используется (заполнено нулями)
+20 16 байтов Не используется (заполнено нулями)
+30 до конца блока Содержательная часть (собственно исправлениямикрокода)

Для тех, кто не знает: в слове — 2 байта, в двойном слове — 4 байта, информация записывается в файле "задом наперёд", т.е. сначала идёт младший байт, а за ним — старший. Число 1 в файле представляется в виде двойного слова как 0x01000000.

Руководствуясь вышеизложенным, я вычленил из оригинальной январской 1999 года базы PEP.DAT такие 2-килобайтные блоки и записал их в отдельные файлы, дав каждому из них имя aaaabbcc.BIN, где aaaa — CPUID из заголовка (+C), bb — PKG процессора из заголовка (+18), cc — версия блока для данного CPUID из заголовка (+4). Дату на файлы поставил также по информации из заголовков блоков (+8). После этого я взял файл CPUCODE.EXE ("CBROM имя_файла_с_прошивкой /CPUCODE EXTRACT", на вопрос ответить "CPUCODE.EXE" без кавычек) из последнего BIOS'а от ASUS (v1010 от 16.07.99 для мамок P2B), отрезанием от него заголовка получил CPUCODE.BIN и "распотрошил" его таким же образом в другой директории. В ту же директорию добавил ещё два блока, найденные в DMI-области прошивки (для ASUS'а — по смещениям 0x37000 и 0x37800 относительно начала файла с прошивкой). После этого объединил эти две директории в третьей, оставив из файлов с одинаковыми "aaaabb" в названии только более новые (с бОльшим номером "cc").

Оставшиеся в итоге в третьей директории 2-килобайтные файлы *.BIN я отсортировал по имени и объединил их в одну базу с помощью стандартной команды "COPY": "COPY /b xxx1+xxx2+...xxxN PEP.DAT" (без кавычек, разумеется). Эту базу следует использовать вместо оригинальной январской 1999 года базы. Проверено на материнской плате A-Bit i440BX-6 Rev1.0 с процессором Celeron-333 (CPUID 0x0660).

Следует иметь в виду, что запись корректирующих микрокод блоков с использованием базы PEP.DAT производится в область DMI флеш-памяти только для установленных в материнскую плату на момент запуска утилиты процессоров. После замены процессора на процессор с другим CPUID утилиту необходимо запускать повторно. Также необходим повторный запуск утилиты после очистки DMI (запуск AWDFLASH.EXE с ключом /CD). Однако для 2-мегабитных (256-килобайтных) BIOS'ов существует способ прописать всю базу непосредственно в файл прошивки. Для того надо переименовать файл PEP.DAT в CPUCODE.BIN и выполнить следующую команду: "CBROM имя_файла_с_прошивкой /CPUCODE CPUCODE.BIN", без кавычек. К сожалению, этот способ не подходит для 1-мегабитных (128-килобайтных) BIOS'ов, поскольку вся база просто не влезает в этот BIOS (как я понимаю, именно этим обстоятельством и был вызван переход на 2-мегабитные BIOS'ы). Невозможно также применить этот способ и для Award-BIOS'ов от ASUS, ибо файл должен называться не CPUCODE.BIN, а CPUCODE.EXE, и в нём базе должен предшествовать заголовок, формата которого я не знаю. Работоспособность этого способа в части подмены оригинального CPUCODE проверено на файле прошивки от материнской платы A-Bit i440BX-6 Rev2.0, но саму прошивку я никуда не заливал (за неимением такой мамки). Как называется файл в вашем BIOS'е, вы можете посмотреть командой "CBROM имя_файла_с_прошивкой /D".

Позднее я таким же методом распотрошил более новую базу версии 5.01 и обнаружил два новых процессора, не вошедших в предыдущую мою сборку. (Сколько я потом потрошил этих баз — не пишу за ненадобностью).

Для наглядности я привожу ниже таблицу поддерживаемых процессоров (таблица идёт на замену аналогичной в документации к утилите заливки изменений микрокода от Intel), отсортированную по Stepping/PKG.

Table 1.

Processor steppings (revisions) and microcode update revisions includes in current base

ProcessorPackageProcessor Stepping/PKGMicrocode Update Rev
| Pentium 4 ProcessorFC-PGA20xF13/040x03
| Pentium 4 ProcessorFC-PGA20xF24/040x0B
| Pentium 4 ProcessorFC-PGA20xF12/040x28
| Pentium 4 ProcessorOOI0xF12/010x26
| Pentium 4 ProcessorFC-PGA20xF0A/040x12
| Pentium 4 ProcessorOOI0xF0A/010x10
| Pentium 4 ProcessorOOI0xF07/010x0D
| Pentium 4 Processor (?)OOI (?)0xF05/010x0B
| Intel Xeon ProcessorOOI0xF24/020x0C
| Intel Xeon ProcessorOOI0xF12/020x27
| Intel Xeon Processor MPOOI0xF11/020x06
| Intel Xeon ProcessorOOI0xF0A/020x11
| Intel Xeon Processor (?)OOI (?)0xF07/020x08
| Intel Xeon Processor (?)OOI (?)0xF05/020x0C
Pentium III ProcessorFC-PGA20x6B1/100x1C
Pentium III Processor (?)FC-PGA2 (?)0x6B0/100x04
| Pentium III Processor (?)FC-PGA (?)0x696/100x01
Pentium III ProcessorFC-PGA0x68A/100x01
Pentium III ProcessorSECC2 0x686/010x07
Pentium III ProcessorFC-PGA0x686/100x08
| Pentium III ProcessorSECC20x683/010x13
Pentium III ProcessorFC-PGA0x683/100x14
Pentium III ProcessorSECC/SECC20x681/010x0D
Pentium III ProcessorFC-PGA0x681/100x11
??????????????????????????????SECC/SECC2 (?)0x680/010x14
Pentium III ProcessorSECC/SECC20x673/010x0E
Pentium III ProcessorSECC/SECC20x672/010x10
??????????????????????????????SECC/SECC2 (?)0x671/010x03
??????????????????????????????SECC/SECC2 (?)0x670/010x06
| Pentium III Xeon ProcessorSECC0x6A4/040x01
Pentium III Xeon ProcessorSECC0x6A1/040x01
Pentium III Xeon ProcessorSECC0x6A0/040x03
Pentium III Xeon ProcessorSECC0x686/040x02
| Pentium III Xeon ProcessorSECC0x683/040x10
Pentium III Xeon ProcessorSECC0x681/040x10
Pentium III Xeon ProcessorSECC0x673/040x2E
Pentium III Xeon ProcessorSECC0x672/040x38
#??????????????????????????????SECC0x671/040x14
Pentium II ProcessorSECC/SECC20x653/010x10
Pentium II ProcessorSECC/SECC20x652/010x2A
Pentium II ProcessorSECC/SECC20x651/010x40
Pentium II ProcessorSECC0x650/010x40
Pentium II ProcessorSECC0x634/010x35
#Pentium II Processor (?)PGA (?)0x634/000x37
Pentium II ProcessorSECC 0x633/010x34
#Pentium II Processor (?)PGA (?)0x633/000x36
??????????????????????????????PGA (?)0x632/000x20
??????????????????????????????PGA (?)0x630/000x13
Pentium II Xeon ProcessorSECC0x653/040x0B
Pentium II Xeon ProcessorSECC0x652/040x2B
#Pentium II Xeon Processor (?)SECC (?)0x650/040x19
| Intel Celeron ProcessorFC-PGA20xF13/040x03
Intel Celeron ProcessorFC-PGA20x6B1/100x1C
Intel Celeron ProcessorFC-PGA/20x68A/100x01
Intel Celeron ProcessorFC-PGA0x686/100x08
Intel Celeron ProcessorFC-PGA0x683/100x14
Intel Celeron ProcessorPPGA0x665/100x03
Intel Celeron ProcessorSEPP0x660/010x0A
Intel Celeron ProcessorSEPP0x651/010x40
Intel Celeron ProcessorSEPP0x650/010x40
| Mobile Pentium 4 ProcessoruFC-PGA0xF24/080x0D
| Mobile Pentium III ProcessoruFC-PGA0x6B1/200x1D
| Mobile Pentium III ProcessoruFC-PGA0x68A/800x05
| Mobile Pentium III ProcessorMicro-PGA20x68A/200x04
| Mobile Pentium III ProcessorMicro-PGA20x686/800x0C
| Mobile Pentium III ProcessorMMC20x686/020x0A
Mobile Pentium III ProcessorMicro-PGA20x683/200x07
Mobile Pentium III ProcessorMMC20x683/080x08
Mobile Pentium III ProcessorMicro-PGA20x681/200x0E
Mobile Pentium III ProcessorMMC20x681/080x0F
Mobile Pentium III Processor (?)Micro-PGA2 (?)0x680/200x15
Mobile Pentium III Processor (?)MMC2 (?)0x680/080x16
#Mobile Pentium II ProcessorMini-Cart0x66D/020x05
#Mobile Pentium II ProcessorMMC1/MMC20x66D/080x06
Mobile Pentium II ProcessorMicro-PGA10x66D/200x07
Mobile Pentium II ProcessorMini-Cart 0x66A/020x0C
Mobile Pentium II ProcessorMMC1/MMC2 0x66A/080x0D
Mobile Pentium II ProcessorMicro-PGA10x66A/200x0B
#Mobile Pentium II Processor (?)Mini-Cart (?)0x653/020x0C
#Mobile Pentium II Processor (?)MMC1/MMC2 (?)0x653/080x0D
Mobile Pentium II Processor (?)Mini-Cart (?)0x652/020x2C
Mobile Pentium II Processor (?)MMC1/MMC2 (?)0x652/080x2D
#Mobile Pentium II Processor (?)Mini-Cart (?)0x651/020x41
#Mobile Pentium II Processor (?)MMC1/MMC2 (?)0x651/080x42
Mobile Pentium II Processor (?)Mini-Cart (?)0x650/020x41
Mobile Pentium II Processor (?)MMC1/MMC2 (?)0x650/080x45
#Mobile Pentium II Processor (?)Micro-PGA1 (?)0x650/200x2E
#????????????????????????????????????????????0x650/800x2F
| Mobile Intel Celeron ProcessoruFC-PGA0x6B1/200x1D
| Mobile Intel Celeron ProcessoruFC-PGA0x68A/800x05
| Mobile Intel Celeron ProcessorMicro-PGA20x68A/200x04
| Mobile Intel Celeron ProcessorMicro-PGA20x686/200x0B
Mobile Intel Celeron ProcessorMMC1/MMC2 0x66A/080x0D
Mobile Intel Celeron ProcessorMicro-PGA10x66A/200x0B
Pentium II OverDrive ProcessorPGAx1632/000x02
Pentium Pro ProcessorPGA0x619/000xD2
Pentium Pro ProcessorPGA0x617/000xC6
Pentium Pro ProcessorPGA0x616/000xC6
Pentium Pro ProcessorPGA0x612/000xC6
#Pentium Pro Processor (?)PGA (?)0x611/000x27

Знаками «|» отмечены изменения относительно собранной мною базы предыдущей (10/05/01) версии. В базу включены все блоки из официальной базы от Intel по состоянию на 29 мая 2002 года.

Вопросами вместо имени отмечены модели, которых нет в официальных базах от Intel, но которые (изменения ядра для них) присутствуют в BIOS'ах ряда материнских плат и/или в модулях UPDATE.SYS операционных систем Win-9x/NT. Знаками «(?)» отмечены параметры, полученные эмпирически из 16-ричных значений Stepping/PKG заголовка соответствующего блока, ибо в приложенном к базе v6.08 от Intel хелпе ссылок на эти процессоры нет. Знаками «#» отмечены модели, которых нет ни в официальных базах от Intel, ни в просмотренных мною BIOS'ах, но блоки коррекции для которых присутствуют в модулях UPDATE.SYS операционных систем Win-98SE и/или Win-2000 (Win-NT5) SP1.

К данной статье прилагаются следующие файлы:

checkup6.zip (40 Kb) — Processor Update Utility for Intel(R) P6 Family Microprocessors v6.08 May 29, 2002. Copyright 1995-2002, Intel Corporation. (Только исполняемые файлы, без базы).

pep.zip (102 Kb) — на основе базы v6.08 от 29 мая 2002 (вместо старого архива pep15.zip). Положите PEP.DAT в один каталог с CHECKUP6.EXE

content.zip (192 Kb) — 2-килобайтные блоки, входящие в состав этой базы. Можете их использовать при формировании новой базы по алгоритму, описанному выше, когда у вас появится доступ к BIOS'у с более новой версией CPUCODE.

modbin.zip (59.68 Kb) — Award'овская утилита для исправления ряда настроек в Award-BIOS'ах до версии 4.50PG (для версий 6.00 и выше практически неприменима). Версия 4.50.77 от 1999 года.

«Новый» modbin (modbin6_2.00.00beta.zip / 79 КБ) — проверено корректно работает с биосами 6.00.

cbrom.zip (34.59 Kb) — новая версия утилиты CBROM, присланная (не мне) техподдержкой ABit. Версия 2.07 от 2000 года. Отличается тем, что отображает версии блоков коррекции ошибок, выбирая их из области DMI и из CPUCODE.BIN (но не ASUS'овского CPUCODE.EXE) файла прошивки. Работоспособна на новых версиях BIOS'ов от A-Bit'а (мамки BE6-II).

Кстати, по поводу A-Bit'а: в новых его мамках используется формат BIOS'а, несовместимый со старым, и его не берут старые утилиты от AWARD'а (MODBIN, CBROM ругаются на контрольную сумму), и для работы с этими BIOS'ами выпущена новая версия AWDFLASH'а — 7.52C. Соответственно, для работы с этими BIOS'ами надо применять новые версии MODBIN'а и CBROM'а (MODBIN ищите сами, а новая версия CBROM'а приложена к данной статье).

Автор будет благодарен тому, кто пришлёт ему более новую версию утилиты MODBIN (новее приложенной с данной статье), только сначала просьба связаться e-mail'ом: возможно, с момента последней правки статьи данная или более новая версия у меня уже появилась.

А пока что приложенная к данной статье утилита MODBIN понимает только такие 2-мегабитные (256-килобайтные) BIOS'ы, в которых собственно BIOS (файл "original.tmp" или как его переименовали разработчики мамки) начинается со смещения 0x20000 относительно начала дампа прошивки (точнее, с этого смещения начинается заголовок LHA-архива). Кто хочет, может поэкспериментировать с BIOS'ом мамки A-Bit BE6-II BEH_QJ.BIN или более новым BEH_QY.BIN по такому алгоритму: с помощью CBROM'а "вынуть" из BIOS'а все дополнительные части в отдельные файлы, затем с помощью того же CBROM'а удалить из BIOS'а все части, кроме 0-й (0-я часть принципиально этой утилитой не удаляется), после чего HIEW'ом или какой-либо аналогичной утилитой переместить оригинальный BIOS (0-я часть) со смещения 0x0 на смещение 0x20000 от начала файла прошивки, затем CBROM'ом восстановить в этот файл все ранее удалённые компоненты (желательно — в том же порядке) и попробовать прошить (я надеюсь, вы обеспечили себе возможность отката, если эта руками скомпонованная прошивка не заведётся? — рекомендую иметь под руками запасной флеш с заведомо рабочей прошивкой) то, что получилось, во флеш мамки BE6-II. MODBIN, приложенный к статье, такой руками скомпонованный файл прошивки точно видит, но у меня нет гарантии, что в новых BIOS'ах от A-Bit'а ещё что-либо не добавлено (типа добавления ещё одной контрольной суммы или ещё чего). В любом случае, все эксперименты, описанные в этом абзаце, вы выполняете исключительно на свой страх и риск (у автора нет запасного флеша для экспериментов, равно как нет и данной мамки), но если всё-таки кто сподобится поэкспериментировать, не сочтите за труд поделиться результатами...

Пока обнаружена только одна материнская плата, запуск на которой процедуры обновления DMI (само обновление, а не проверка его необходимости) приводит к разрушению (расписыванию 0xFF) BIOS'а — это P3B-F. Ради справедливости следует отметить, что формат DMI во флеше этой мамки нестандартен, и стандартные авардовские процедуры коррекции DMI либо вообще этого DMI не видят, либо отказываются вносить туда изменения. Ну а вот в интелевской утилите, которая используется для прописывания в DMI блока коррекции ERRATA, этой проверки, похоже, просто не сделали, отчего запарывание BIOS'а и происходит.

Список выявленных ошибок процессоров Intel с отметками, исправлены ли они, будут ли исправлены или исправления не планируются, смотрите по ссылкам с официального сайта компании Intel: www.intel.com




Дополнительно

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.