Page 2 of 3

Re: Выключение ПК.

Posted: Fri Sep 30, 2011 10:22 pm
by art_zh
CleverMouse wrote:Ключевое слово - "некоторых". Я так понимаю, что подмена с выключения на рестарт была вызвана именно желанием представить свою позицию в более выгодном свете, чтобы избавиться от упоминания, что это работает только на одиночных чипсетах.
Ключевое слово "подмена" некорректно. Я привел рестарт в качестве наглядного примера прямого PM.
В остальном Вы правы - у меня пока нет гарантии, что недокументированный (вычисленный полуэмпирическим способом) адрес в dx будет правильно работать на всех Феномах и Fusion.
CleverMouse wrote:Когда выясняется, что некоторый код якобы где-то не работает, ВНЕЗАПНО именно в сообщении, критикующем этот код и предлагающем свой подход... скажем так, это вызывает некоторые сомнения в истинности утверждения.
1) Еще раз: "универсальный" код вообще на этих чипсетах не работает. Поправьте меня у кого RS880/SB800 или Гудзон. А приведенный прямой код - хотя бы на трех досках проверен.

2) В истинности какого из моих утверждений Вы сомневаетесь?

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 12:36 pm
by VaStaNi
Serge wrote:art_zh
А если надо кеши сбросить и винты запарковать ? У меня материнка отключается когда винт уже явно останавливается.
Ну зачем же ты так необъективно?
Ведь если мы говорим об ОС, а это вроде так на этом форуме, то завершение дисковых операций предварительно и до выключения, равно, как и завершение процессов (имеется ввиду корректно + важных + системных) на совести разрабов этой ОСи!
Никакой ACPI или еще что то на блюдечке и готовое не решает эту и другие подобные идеологические, концептуальные вещи, я бы сказал культурности и корректности работы ОСи.
Второе. Парковать диски, как дословное понимание сути механических процессов в винте, решены производителями давно, уже лет 10 наверное как. Это понятие для обывателя можно отнести в категорию архаизмов.

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 12:37 pm
by VaStaNi
CleverMouse wrote:Последние две фразы art_zh инициировали бурную флудильню
CleverMouse wrote:Ключевое слово - "некоторых". Я так понимаю, что подмена с выключения на рестарт была вызвана именно желанием представить свою позицию в более выгодном свете, чтобы избавиться от упоминания, что это работает только на одиночных чипсетах.
Оскорбительные выражения убраны! Mario
Я могу понять любую ситуацию в принципе, но надо же работать над своими недостатками, а не выпячивать них наружу, имено это среднестатистическая норма в основной массе людей.
Ну хорошо, допустим родила (выделила) ты эту тему именно так, озаглавила, причем это, как думаешь именно ты, ну так веди ее, тогда пожалуйста, раз она всплывает не раз и два. Освети перечень вопросов тобою видимых, иерархию, приоритет решений, или возможные направления решения... Неконструктивно ведь получается, нехорошо.
То, что выкинула в сторону и все? Типа вот они тут такие, на них тут и смотрите, какие они несостоятельные. Так что ли?

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 12:45 pm
by Mario
VaStaNi
Просьба не употреблять нецензурных выражений в оскорбительном контексте. Это не приказ - это просьба!

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 12:54 pm
by art_zh
VaStaNi
Не надо так.
Давайте относиться друг к другу спокойно и уважительно, иначе к чему мы тут придем?

Со своей строны CleverMouse совершенно права: если цель - универсальность, то средство одно: ACPI.

И в проницательности ей не откажешь: я действительно слукавил, приведя пример с перезагрузкой в теме про выключение.
Код выключения недокументирован, его пришлось выцарапывать из реального железа, поэтому без гарантий.

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 12:57 pm
by VaStaNi
Конкретно по сабжу, применительно к охрененному количеству машин с INTELовским чипсетом!
Благо разумники из INTEL в принципе уважают слово стандарт,
то применительно к их чипсетам (если уж кому то очень надо без всяких уродств аля RM DOS APM... INT 0x15... ) прекрасно работает следующий код:

Code: Select all

        xor     cx, cx
        dec     cx         ; = 0xFFFF
        mov     dx, 0x404
        in      ax, dx
        cmp     ax, cx     ;примитивно понюхаем есть ли сей порт вообще в наличии?
         jne    @a         ;если AX <> 0xFFFF - значит существует, будем выключать
        mov     dx, 0x4004
        in      ax, dx
        cmp     ax, cx     ;тогда, может этот есть (т.е. 0x4004)?
         je     @q
@a:
        mov     ah, 111100b
        out     dx, ax     ; собственно тут рубильник выключается фактически, не успеете моргнуть! Завершаемся заранее!
@q:
как в PCI, например узнать, что именно INTEL что такое ID=8086 писать не буду, сами знаете...
Это самый "дубовый" вариант, его можно сделать умнее сток на... ну 20 пусть. Но это не килобайты и по статистике моего тестинга (а машин на лет 8 последних я попробовал немало) пока этих двух портов хватало ДЛЯ ВСЕХ INTELовских чипсетов, что попадались.
Желательно сообщить Ваши результаты и при отрицательном выложить данные вашего южника.
Успехов!

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 2:22 pm
by Serge
VaStaNi
Мобильным винтам парковка очень даже нужна. Они конечно сами паркуются, но немного времени для этого им необходимо. Другие устройства тоже неплохо отключить штатно. Хорошо когда есть драйверы, которые умеют переводить все устройства из D0 в D3. А если их нет помогает ACPI. Потому что самый неправильный способ выключить компьютер это выдернуть штепсель.

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 2:32 pm
by Mario
С точки зрения механики - выдирание штепселя ничего не испортит - да, электроника не любит включения и выключения, но головки давно уже сами паркуются. Они во время работы удерживаются сервоприводами, а как только питание пропадает, то за счет механики головка паркуется в свой паз. Вот только имеется существенный минус в виде недописанных (и соответственно пропавших) данных.

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 2:41 pm
by SoUrcerer
Кроме недописанных данных это приводило (и не раз) у меня к слетанию ext4 на жестком. Еще я боюсь, что есть связь между этим казусом ипоявлением bad-блоков на устройстве.

Re: Выключение ПК.

Posted: Tue Oct 04, 2011 2:44 pm
by Mario
Так Ext4 содержит кучу служебных данных в оперативке и синхронизация у нее не так часто происходит, так что ничего удивительного.
А бэд-блоки появляются чаще из-за того что во время работы жесткий диск подвергался либо вибрации, либо его вообще перемещали, если это переносной, ну, и в вертикальном положении он не жилец еще.

Re: Выключение ПК.

Posted: Wed Oct 05, 2011 2:13 am
by art_zh
Serge
при необходимости D-состояния всех контроллеров моста переключаются в тех же PM-регистрах. Это конечно сложнее, чем просто "вырубить рубильник"; надо делать минимальный драйвер PM и унифицировать его для всех целевых мостов. Но факт: альтернативный "не-ACPI" вектор развития все равно имеется.

Хотя лучше конечно заранее слить кэш на диск из его родного драйвера и не заморачиваться с PM. Это - более прямая "вторая" альтернатива.

Re: Выключение ПК.

Posted: Wed Oct 05, 2011 9:46 am
by Serge
art_zh
Разумеется есть альтернатива, но для этого надо иметь родные драйверы. А таких у нас несколько штук в разной стадии недоделанности. И три драйверописателя на всё.

Re: Выключение ПК.

Posted: Thu Oct 06, 2011 11:24 pm
by CleverMouse
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.

В частности, поэтому очень странно, что "не работает" универсальный код - если там нет чисто кодерской ошибки, то он на данной машине просто-напросто сводится ровно к неуниверсальному.

Re: Выключение ПК.

Posted: Mon Oct 17, 2011 12:41 pm
by art_zh
diamond
Если бы твоя ACPI-выключалка работала на Гудзонах, я бы вообще туда не лез. Однако пришлось,- именно потому что
CleverMouse wrote:- это и есть код ACPI, прямо по спецификации: взять регистр PM1a_CNT_BLK - практически всегда регистры ACPI объединяются в один блок, поскольку этот регистр в FADT перечислен третьим, то и в блоке он идёт третьим, то есть по смещению +4
Начиная с SB800 это "практически" не работает. АМД решила изобрести новый велосипед и теперь маппит все ресурсы южного моста на MMIO с дефолтным базовым адресом FED80000h, причем PMIO-регистры в этом блоке маппятся со смещением +300h. IO-доступ к этим ресурсам оставлен, но недодокументирован: оговаривается только мл.байт адреса (04), который должен лежать в PM_Reg по смещению 62h.
Старший байт (08) лежит сразу за ним, но это нигде не указано. Именно поэтому я и не даю никаких гарантий, выключая через порт номер 0х0804. Универсальная АМД-выключалка будет работать через MMIO.

Re: Выключение ПК.

Posted: Mon Oct 17, 2011 1:26 pm
by Serge
art_zh
А что там в таблицах ACPI написано ?