bz home

Меряем температуру процессора на ASUS A7N8X (ASB100/nForce2)

Сказка о материнских платах

После поистине ужасной смерти моей горячо (только в переносном смысле!) любимой материнской платы на KT133 пришлось купить новую. Ею оказалась ASUS A7N8X. Хорошая весчь, что говорится rock solid, но одна засада меня таки догнала. За долгое время я уже привык, что в уголочке экрана маячат циферки, показывающие мне температуру процессора и обороты кулера на нём. Нравится мне на них медитировать. Пользовался я плагином StHWMon к XCenter. А тут беда — не поддерживается моя платка. Прошёлся по закромам родины, но — увы и ах! — нету поддержки ASUS-а, хоть ты тресни.

Долго ли, кототко ли я горевал, да таки взялся сам эту поддержку реализовывать. Узнал много нового про причины такой нелюбви к ASUS-ам (неплохо бы на свои чипы документацию открывать), про шину SMBus (оказывается живёт уже много лет в каждом компьютере!) и I2C, про шину PCI и работу с ней, о проекте lm-sensors... По ходу дела нашёл глюку в библиотеке iopl32 в связке с OpenWatcom.

В результате сотворил плагин, чтобы показывал мне заветные цифры и возрадовался. А кому сказка понравилась и захотелось себе под ту же плату поддержки с заветными цифрами — я поделился с общественностью, модуль свой автору StHWMon отправил.

Вот такая получилась сказка с трагическим началом, но счастливым концом.

Правда, как я посмотрю, страничка с StHWMon что-то совсем протухла, выложу-ка я его тут у себя.

Про iopl32 и OpenWatcom

Ну и в назидание потомкам, чтобы сохранить в анналах.

Когда создавалась библиотека iopl32, автор не мог предположить от Watcom-а такого коварства, которое случилось впоследствии. Что же, давно это было. Дело в том, что функция enterIOPL32 портит регистр edx, так что получившийся после работы оптимизатора код глючит. При этом скомпилированное с отладочной информацией работает как надо (это потому что при компиляции с отладкой все регистры сохраняются и восстанавливаются на каждый вызов функции принудительно). К счастью поправить эту беду весьма просто, достаточно заменить в iopl32.h строку

#pragma aux enterIOPL32 "_enterIOPL32" parm caller [] value [eax]

на вот такую:

#pragma aux enterIOPL32 "_enterIOPL32" parm caller [] value [eax] modify [edx]

и всё будет хорошо. Хотя почему автор не позаботился о сохранении содержимого испорченного регистра изначально, я лично так и не понял. Я бы сделал чисто из соображений аккуратности — проще сразу о таких вещах заботиться, чем потом глюки в отладчике ловить. Подумаешь, что в то время Watcom-у это было несущественно и всё работало, не сбивать же руку из-за такой мелочи.