By ТоварищЪ , 15 October 2007
Делаю модуль для BIOS, который реализует Simple Boot Flag (опции загрузки ОС). Этот флаг один байт записываю в CMOS по адресу 50h. Записываю в CMOS один байт по адресу 50h. При загрузке Виста выдает сообщение об ошибке CMOS checksum. Видимо его нужно посчитать и записать. Всё что я знаю - это то, что в CMOS хранятся два checksum: standart и extended. Standart - это сумма с 10h по 2Dh, и хранится он в 2Eh 2Fh. А кто знает про extended?
The content of this field is kept private and will not be shown publicly.

BBCode

  • No HTML tags allowed.
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Web page addresses and email addresses turn into links automatically.

maco

18 years 10 months ago

Вот документ, может подойдет.
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 = <font color="#000000"><font color="#0000ff">0x10</font>; i <= </font><font color="#0000ff">0x2d</font>; ++i)

  sum += s.reg[i];


 s.reg[<font color="#ff0000">0x2e</font>] = (sum >> 8) & 0xff; // checksum high

 s.reg[<font color="#ff0000">0x2f</font>] = (sum & 0xff);      // checksum low

 

 sum = 0;


//#if BX_SUPPORT_ACORP

// for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x7a</font>; ++i)

//  sum += s.reg[i];

//

// s.reg[<font color="#ff0000">0x7b</font>] = (sum >> 8) & 0xff; // checksum high

// s.reg[<font color="#ff0000">0x7c</font>] = (sum & 0xff);      // checksum low

//#else


 for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x79</font>; ++i)

  sum += s.reg[i];


 s.reg[<font color="#ff0000">0x7a</font>] = (sum >> 8) & 0xff; // checksum high

 s.reg[<font color="#ff0000">0x7b</font>] = (sum & 0xff);      // checksum low


//#endif




// // For i815 Award BIOS

// for (i = <font color="#0000ff">0x40</font>; i <= <font color="#0000ff">0x7C</font>; ++i)

//  sum += s.reg[i];

//

// s.reg[<font color="#ff0000">0x7D</font>] = (sum >> 8) & 0xff; // checksum high

// s.reg[<font color="#ff0000">0x7E</font>] = (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 таблицу делать тоже не надо, там просто нужно установить стандартную переменную. 

Мне сказали, что на эту ошибку можно не обращать внимания, пока двигаюсь дальше 

lsvmo

18 years 10 months ago

Доброго времени суток!

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

P.S. На старых компьютерах все срабатывает нормально, а на новых на некоторых возникают такие глюки. В частности на Intel 965RY.

Root

18 years 10 months ago

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

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

lsvmo

18 years 10 months ago

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


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

Надеюсь, стало более понятно.

Root

18 years 10 months ago

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

lsvmo

18 years 10 months ago

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

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

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

lsvmo

18 years 10 months ago

ТоварищЪ,

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