Самостоятельное исправление ошибок в 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: http://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
| Processor | Package | Processor Stepping/PKG | Microcode Update Rev |
| | Pentium 4 Processor | FC-PGA2 | 0xF13/04 | 0x03 |
| | Pentium 4 Processor | FC-PGA2 | 0xF24/04 | 0x0B |
| | Pentium 4 Processor | FC-PGA2 | 0xF12/04 | 0x28 |
| | Pentium 4 Processor | OOI | 0xF12/01 | 0x26 |
| | Pentium 4 Processor | FC-PGA2 | 0xF0A/04 | 0x12 |
| | Pentium 4 Processor | OOI | 0xF0A/01 | 0x10 |
| | Pentium 4 Processor | OOI | 0xF07/01 | 0x0D |
| | Pentium 4 Processor (?) | OOI (?) | 0xF05/01 | 0x0B |
| | Intel Xeon Processor | OOI | 0xF24/02 | 0x0C |
| | Intel Xeon Processor | OOI | 0xF12/02 | 0x27 |
| | Intel Xeon Processor MP | OOI | 0xF11/02 | 0x06 |
| | Intel Xeon Processor | OOI | 0xF0A/02 | 0x11 |
| | Intel Xeon Processor (?) | OOI (?) | 0xF07/02 | 0x08 |
| | Intel Xeon Processor (?) | OOI (?) | 0xF05/02 | 0x0C |
| Pentium III Processor | FC-PGA2 | 0x6B1/10 | 0x1C |
| Pentium III Processor (?) | FC-PGA2 (?) | 0x6B0/10 | 0x04 |
| | Pentium III Processor (?) | FC-PGA (?) | 0x696/10 | 0x01 |
| Pentium III Processor | FC-PGA | 0x68A/10 | 0x01 |
| Pentium III Processor | SECC2 | 0x686/01 | 0x07 |
| Pentium III Processor | FC-PGA | 0x686/10 | 0x08 |
| | Pentium III Processor | SECC2 | 0x683/01 | 0x13 |
| Pentium III Processor | FC-PGA | 0x683/10 | 0x14 |
| Pentium III Processor | SECC/SECC2 | 0x681/01 | 0x0D |
| Pentium III Processor | FC-PGA | 0x681/10 | 0x11 |
| ?????????????????????????????? | SECC/SECC2 (?) | 0x680/01 | 0x14 |
| Pentium III Processor | SECC/SECC2 | 0x673/01 | 0x0E |
| Pentium III Processor | SECC/SECC2 | 0x672/01 | 0x10 |
| ?????????????????????????????? | SECC/SECC2 (?) | 0x671/01 | 0x03 |
| ?????????????????????????????? | SECC/SECC2 (?) | 0x670/01 | 0x06 |
| | Pentium III Xeon Processor | SECC | 0x6A4/04 | 0x01 |
| Pentium III Xeon Processor | SECC | 0x6A1/04 | 0x01 |
| Pentium III Xeon Processor | SECC | 0x6A0/04 | 0x03 |
| Pentium III Xeon Processor | SECC | 0x686/04 | 0x02 |
| | Pentium III Xeon Processor | SECC | 0x683/04 | 0x10 |
| Pentium III Xeon Processor | SECC | 0x681/04 | 0x10 |
| Pentium III Xeon Processor | SECC | 0x673/04 | 0x2E |
| Pentium III Xeon Processor | SECC | 0x672/04 | 0x38 |
| #?????????????????????????????? | SECC | 0x671/04 | 0x14 |
| Pentium II Processor | SECC/SECC2 | 0x653/01 | 0x10 |
| Pentium II Processor | SECC/SECC2 | 0x652/01 | 0x2A |
| Pentium II Processor | SECC/SECC2 | 0x651/01 | 0x40 |
| Pentium II Processor | SECC | 0x650/01 | 0x40 |
| Pentium II Processor | SECC | 0x634/01 | 0x35 |
| #Pentium II Processor (?) | PGA (?) | 0x634/00 | 0x37 |
| Pentium II Processor | SECC | 0x633/01 | 0x34 |
| #Pentium II Processor (?) | PGA (?) | 0x633/00 | 0x36 |
| ?????????????????????????????? | PGA (?) | 0x632/00 | 0x20 |
| ?????????????????????????????? | PGA (?) | 0x630/00 | 0x13 |
| Pentium II Xeon Processor | SECC | 0x653/04 | 0x0B |
| Pentium II Xeon Processor | SECC | 0x652/04 | 0x2B |
| #Pentium II Xeon Processor (?) | SECC (?) | 0x650/04 | 0x19 |
| | Intel Celeron Processor | FC-PGA2 | 0xF13/04 | 0x03 |
| Intel Celeron Processor | FC-PGA2 | 0x6B1/10 | 0x1C |
| Intel Celeron Processor | FC-PGA/2 | 0x68A/10 | 0x01 |
| Intel Celeron Processor | FC-PGA | 0x686/10 | 0x08 |
| Intel Celeron Processor | FC-PGA | 0x683/10 | 0x14 |
| Intel Celeron Processor | PPGA | 0x665/10 | 0x03 |
| Intel Celeron Processor | SEPP | 0x660/01 | 0x0A |
| Intel Celeron Processor | SEPP | 0x651/01 | 0x40 |
| Intel Celeron Processor | SEPP | 0x650/01 | 0x40 |
| | Mobile Pentium 4 Processor | uFC-PGA | 0xF24/08 | 0x0D |
| | Mobile Pentium III Processor | uFC-PGA | 0x6B1/20 | 0x1D |
| | Mobile Pentium III Processor | uFC-PGA | 0x68A/80 | 0x05 |
| | Mobile Pentium III Processor | Micro-PGA2 | 0x68A/20 | 0x04 |
| | Mobile Pentium III Processor | Micro-PGA2 | 0x686/80 | 0x0C |
| | Mobile Pentium III Processor | MMC2 | 0x686/02 | 0x0A |
| Mobile Pentium III Processor | Micro-PGA2 | 0x683/20 | 0x07 |
| Mobile Pentium III Processor | MMC2 | 0x683/08 | 0x08 |
| Mobile Pentium III Processor | Micro-PGA2 | 0x681/20 | 0x0E |
| Mobile Pentium III Processor | MMC2 | 0x681/08 | 0x0F |
| Mobile Pentium III Processor (?) | Micro-PGA2 (?) | 0x680/20 | 0x15 |
| Mobile Pentium III Processor (?) | MMC2 (?) | 0x680/08 | 0x16 |
| #Mobile Pentium II Processor | Mini-Cart | 0x66D/02 | 0x05 |
| #Mobile Pentium II Processor | MMC1/MMC2 | 0x66D/08 | 0x06 |
| Mobile Pentium II Processor | Micro-PGA1 | 0x66D/20 | 0x07 |
| Mobile Pentium II Processor | Mini-Cart | 0x66A/02 | 0x0C |
| Mobile Pentium II Processor | MMC1/MMC2 | 0x66A/08 | 0x0D |
| Mobile Pentium II Processor | Micro-PGA1 | 0x66A/20 | 0x0B |
| #Mobile Pentium II Processor (?) | Mini-Cart (?) | 0x653/02 | 0x0C |
| #Mobile Pentium II Processor (?) | MMC1/MMC2 (?) | 0x653/08 | 0x0D |
| Mobile Pentium II Processor (?) | Mini-Cart (?) | 0x652/02 | 0x2C |
| Mobile Pentium II Processor (?) | MMC1/MMC2 (?) | 0x652/08 | 0x2D |
| #Mobile Pentium II Processor (?) | Mini-Cart (?) | 0x651/02 | 0x41 |
| #Mobile Pentium II Processor (?) | MMC1/MMC2 (?) | 0x651/08 | 0x42 |
| Mobile Pentium II Processor (?) | Mini-Cart (?) | 0x650/02 | 0x41 |
| Mobile Pentium II Processor (?) | MMC1/MMC2 (?) | 0x650/08 | 0x45 |
| #Mobile Pentium II Processor (?) | Micro-PGA1 (?) | 0x650/20 | 0x2E |
| #?????????????????????????????? | ?????????????? | 0x650/80 | 0x2F |
| | Mobile Intel Celeron Processor | uFC-PGA | 0x6B1/20 | 0x1D |
| | Mobile Intel Celeron Processor | uFC-PGA | 0x68A/80 | 0x05 |
| | Mobile Intel Celeron Processor | Micro-PGA2 | 0x68A/20 | 0x04 |
| | Mobile Intel Celeron Processor | Micro-PGA2 | 0x686/20 | 0x0B |
| Mobile Intel Celeron Processor | MMC1/MMC2 | 0x66A/08 | 0x0D |
| Mobile Intel Celeron Processor | Micro-PGA1 | 0x66A/20 | 0x0B |
| Pentium II OverDrive Processor | PGA | x1632/00 | 0x02 |
| Pentium Pro Processor | PGA | 0x619/00 | 0xD2 |
| Pentium Pro Processor | PGA | 0x617/00 | 0xC6 |
| Pentium Pro Processor | PGA | 0x616/00 | 0xC6 |
| Pentium Pro Processor | PGA | 0x612/00 | 0xC6 |
| #Pentium Pro Processor (?) | PGA (?) | 0x611/00 | 0x27 |
Знаками «|» отмечены изменения относительно собранной мною базы
предыдущей (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
Сергей Озеров (ozr@cnt.ru)
Опубликовано 25 августа 1999 года
Последнее обновление 31 августа 2002 года
|