Запись в CMOS и checksum

Делаю модуль для BIOS, который реализует Simple Boot Flag (опции загрузки ОС). Этот флаг один байт записываю в CMOS по адресу 50h. Записываю в CMOS один байт по адресу 50h. При загрузке Виста выдает сообщение об ошибке CMOS checksum. Видимо его нужно посчитать и записать. Всё что я знаю - это то, что в CMOS хранятся два checksum: standart и extended. Standart - это сумма с 10h по 2Dh, и хранится он в 2Eh 2Fh. А кто знает про extended?

Вот документ, может подойдет.


Цитата:
CMOS 3Eh - AMI - Extended CMOS Checksum, High Byte
Note: this checksum covers locations 34h - 3Dh, but is not used by some
later AMI BIOSes

Цитата:
CMOS 3Fh - AMI - Extended CMOS Checksum, Low Byte
Note: this checksum covers locations 34h - 3Dh, but is not used by some
later AMI BIOSes

Цитата:
CMOS 7Ah - AWARD - EXTENDED CMOS CHECKSUM (high byte)
Note: Award's extended checksum is the arithmetic sum of all the bytes
from 40h (64 decimal) through 79h (121 decimal). [42h-79h for v4.50G]

Цитата:
CMOS 7Bh - AWARD - EXTENDED CMOS CHECKSUM (low byte)
Note: Award's extended checksum is the arithmetic sum of all the bytes
from 40h (64 decimal) through 79h (121 decimal). [42h-79h for v4.50G]

В разных биосах - по разному.
Вот цитата из исходных текстов эмулятора EMU.

void CCmos::checksum_cmos()
{
 unsigned i;
 Bit16u sum;
 
 sum = 0;
 for (i = 0x10; i <= 0x2d; ++i)
  sum += s.reg[i];

 s.reg[0x2e] = (sum >> 8) & 0xff; // checksum high


 s.reg[0x2f] = (sum & 0xff);      // checksum low
 
 sum = 0;

//#if BX_SUPPORT_ACORP
// for (i = 0x40; i <= 0x7a; ++i)
//  sum += s.reg[i];
//
// s.reg[0x7b] = (sum >> 8) & 0xff; // checksum high
// s.reg[0x7c] = (sum & 0xff);      // checksum low
//#else

 for (i = 0x40; i <= 0x79; ++i)
  sum += s.reg[i];

 s.reg[0x7a] = (sum >> 8) & 0xff; // checksum high
 s.reg[0x7b] = (sum & 0xff);      // checksum low

//#endif


// // For i815 Award BIOS
// for (i = 0x40; i <= 0x7C; ++i)
//  sum += s.reg[i];
//
// s.reg[0x7D] = (sum >> 8) & 0xff; // checksum high
// s.reg[0x7E] = (sum & 0xff);      // checksum low
}

Координаты второй КС можно попытаться определить методом сравнения дампов CMOS после выполнения атомарных изменений в SETUP.


Спасибо за документик, maco, и Strelets за код! 
Да, эта часть CMOS у всех разная, даже одного производителя - от версии к версии. В моем случае расклад такой: extended checksum 37+38+..+3D(+40+41+..+XX) => 3E(H),3F(L)
Как оказалось, ошибку выдает злосчастный ErrorLog, этот же модуль и делает подсчет checksum. 
А в EFI BIOS в CMOS писать уже не нужно, и ACPI таблицу делать тоже не надо, там просто нужно установить стандартную переменную. 
Мне сказали, что на эту ошибку можно не обращать внимания, пока двигаюсь дальше 

Доброго времени суток!
В тему CMOS,  проблема в следующем. Считываю все ячейки памяти CMOS в двух случаях через 70 и 71 порты: из под ДОС и в момент инициализации платы расширения (код вставлен в BIOS платы расширения ) . Но во втором случае при внесении изменений в CMOS в BIOS Setup, в считанных данных не отображаются изменения, а в DOS отображаются. В чем может быть пробема. 
P.S. На старых компьютерах все срабатывает нормально, а на новых на некоторых возникают такие глюки. В частности на Intel 965RY.

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

Цитата:
Но во втором случае при внесении изменений в CMOS в BIOS Setup, в считанных данных не отображаются изменения, а в DOS отображаются

что под этим подразумевается? Поподробнее плиз. В шарады играть у меня сейчас охоты нет совсем...

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

Подразумевается следующее.

Программа имеет цикл от 0 до 80h соответтственно запись и чтение по портам 70h и 71h (как везде и написано, их используют, чтобы считать значение ячеек CMOS). Есть .com-файл под DOS, он выводит считанные значения ячеек памяти CMOS. Тот же самый код вставлен в код BIOS инициализации платы PCI-расширения. Собственно, здесь даже не важно куда вставлен код, я его вставлял и в рабочий код платы, то есть код выполняющийся после того как все устройства расширения найдены и инициализированы. Так вот запускаем и то и то. Считываем ячейки памяти CMOS.  Затем заходим по Del (или F2, у кого как) в BIOS Setup. Меняем там что-нибудь, например выключаем наличие CD-ROM в компьютере или меняем порядок дисков для загрузки. Выходим, сохраняя новые значения. Далее опять смотрим результаты работы кода BIOS платы расширения и результаты .com-файла из под DOS. В последнем случае меняются зачения определенных ячеек, а в первом случае на экран выводятся те же значения, что и до изменения настроек в BIOS Setup.
Надеюсь, стало более понятно.

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

видимо, банально не верен Ваш исходный тезис, что БИОС обновляет CMOS сразу после выбора пункта меню Save & Exit в программе CMOS Setup. Реально же судя по всему это происходит после того, как отработают все БИОСы карт расширений, сразу перед или во время формирования и записи ECSD и DMI

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

Так ведь в том то и дело, что это происходит постоянно, а не только сразу после изменения параметров. ТО есть выключаешь компьютер, включаешь, а там опять та же проблема, как будто он читает какие-то умолчальные значения...

Кстати, а область ESCD как-нибудь доступна программно? Также как CMOS через 70 и 71 порты?

Старые версии БИОСа записывали конфигурацию в CMOS, современные - пишут во Флеш. Может быть в Вашем случае изменение порядка загрузки не пишеться в CMOS, т.е. не связано с ним.

ТоварищЪ,
пожалуйста, поподробнее или ссылки какие-нибудь... В какой флеш? В тот же, что и BIOS хранит?... (Я только начинающий, хотя и пролопатил кучу книг.)

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

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

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

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