art_zh wrote:1) Еще раз: "универсальный" код вообще на этих чипсетах не работает. Поправьте меня у кого RS880/SB800 или Гудзон. А приведенный прямой код - хотя бы на трех досках проверен.
2) В истинности какого из моих утверждений Вы сомневаетесь?
В истинности утверждения 1). На проблемы с выключением жаловался только
yogev_ezra, но там проблемы с выключением даже из-под Linux и понятна причина - ACPI нет, а APM не работает из-за того, что в Колибри кривой возврат в реальный режим. Если бы сообщение о нерабочести прозвучало заблаговременно в какой-нибудь теме, кто-нибудь из специалистов - возможно, я - скорее всего, заинтересовался бы - например, попросил/а бы для начала подробнее описать симптомы и приложить дамп таблиц ACPI. А так, когда единственный репортер явно необъективен и никто больше не жалуется, я оставляю за собой право просто не верить в репорт.
Универсальность простого кода выключения через порты для конкретного чипсета - это заблуждение. Есть, к примеру, такой чипсет i440FX, он примечателен тем, что его очень любят эмулировать эмуляторы - например, Bochs, qemu, VirtualBox дружно работают именно с ним. Но код выключения использует разные константы. В Bochs/qemu итоговый код выключения, в предположении, что BIOS не изменила базовый адрес, такой:
Code: Select all
mov dx,0B004h
mov ax,2000h
out dx,ax
В VirtualBox, в том же предположении, - такой:
Code: Select all
mov dx,4004h
mov ax,3400h
out dx,ax
Каким образом различать эти случаи без таблиц ACPI? Порт достать ещё можно, он хранится в PCI-устройстве 8086:7113 в конфигурационном пространстве по смещению 40h - между прочим, это многих интеловских чипсетов касается, так что BIOS спокойно может назначить что-нибудь своё - а вот значение есть только внутри DSDT. Проверка PCI-идентификаторов, скажем, северного моста не подойдёт, они одинаковы.
Между прочим, и код из
viewtopic.php?p=38002#p38002, и код из
viewtopic.php?p=38269#p38269 - это
и есть код ACPI, прямо по спецификации: взять регистр PM1a_CNT_BLK - практически всегда регистры ACPI объединяются в один блок, поскольку этот регистр в FADT перечислен третьим, то и в блоке он идёт третьим, то есть по смещению +4 - и записать туда значение, в котором установлен 13-й бит - он называется SLP_EN - а биты 10-12, называемые SLP_TYPx, кодируют тип сна. Конкретное кодирование может быть совершенно любым - к примеру, в Bochs/qemu 0 означает выключение, а VirtualBox считает, что раз выключение в ACPI называется S5, то и кодировать его можно числом 5.
В частности, поэтому очень странно, что "не работает" универсальный код - если там нет чисто кодерской ошибки, то он на данной машине просто-напросто сводится ровно к неуниверсальному.