Page 3 of 3
Re: Выключение ПК.
Posted: Mon Oct 17, 2011 1:38 pm
by CleverMouse
diamond'а нет, так что отвечать, видимо, придётся мне. В первых версиях ACPI регистр PM1a_CNT_BLK обязан был находиться в I/O пространстве, и на это рассчитывает код diamond'а, сейчас соответствующее поле в FADT всё ещё существует, но "is superseded by the X_PM1a_CNT_BLK field" в том же FADT; новое поле X_PM1a_CNT_BLK - уже стандартная для ACPI структура, умеющая описывать ресурсы в разнообразных пространствах, включая IO и MMIO.
Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.
Re: Выключение ПК.
Posted: Mon Oct 17, 2011 1:47 pm
by art_zh
Нет у меня на E350 ни линукса, ни винды. И поставить пока не могу (встроенный он, долго отвинчивать).
Подскажите как эти таблицы из Колибри выцарапать -- где они лежат?
Re: Выключение ПК.
Posted: Mon Oct 17, 2011 2:18 pm
by CleverMouse
art_zh, если охота писать код на ассемблере, то берёшь код из kernel.asm между комментариями "scan for RSDP" и "ebx is linear address of FADT" и получаешь линейный адрес в ebx, размер в dword[ebx+4]. Если охота возиться с С, то Serge прокомментирует по acpica лучше меня.
Re: Выключение ПК.
Posted: Mon Oct 17, 2011 3:37 pm
by Serge
AcpiGbl_FADT локальная копия FADT в ACPICA. Или воспользоваться drivers/devman/acpinfo. Таблица находится аналогично MADT. Переменная ядра
acpi_rsdt_base хранит
физический адрес RSDT. В исходниках L4:Ka есть вывод FADT.
Spoiler:
Code: Select all
typedef struct __attribute__((packed))
{
u32_t sig;
u32_t len;
u8_t rev;
u8_t csum;
char oem_id[ACPI_OEM_ID_SIZE];
char oem_tid[ACPI_OEM_TABLE_ID_SIZE];
u32_t oem_rev;
u32_t creator_id;
u32_t creator_rev;
}acpi_thead_t;
typedef struct __attribute__((packed)){
acpi_thead_t Header; /* Common ACPI table header */
u32_t Facs; /* 32-bit physical address of FACS */
u32_t Dsdt; /* 32-bit physical address of DSDT */
u8_t Model; /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */
u8_t PreferredProfile; /* Conveys preferred power management profile to OSPM. */
u16_t SciInterrupt; /* System vector of SCI interrupt */
u32_t SmiCommand; /* 32-bit Port address of SMI command port */
u8_t AcpiEnable; /* Value to write to smi_cmd to enable ACPI */
u8_t AcpiDisable; /* Value to write to smi_cmd to disable ACPI */
u8_t S4BiosRequest; /* Value to write to SMI CMD to enter S4BIOS state */
u8_t PstateControl; /* Processor performance state control*/
u32_t Pm1aEventBlock; /* 32-bit Port address of Power Mgt 1a Event Reg Blk */
u32_t Pm1bEventBlock; /* 32-bit Port address of Power Mgt 1b Event Reg Blk */
u32_t Pm1aControlBlock; /* 32-bit Port address of Power Mgt 1a Control Reg Blk */
u32_t Pm1bControlBlock; /* 32-bit Port address of Power Mgt 1b Control Reg Blk */
u32_t Pm2ControlBlock; /* 32-bit Port address of Power Mgt 2 Control Reg Blk */
u32_t PmTimerBlock; /* 32-bit Port address of Power Mgt Timer Ctrl Reg Blk */
u32_t Gpe0Block; /* 32-bit Port address of General Purpose Event 0 Reg Blk */
u32_t Gpe1Block; /* 32-bit Port address of General Purpose Event 1 Reg Blk */
u8_t Pm1EventLength; /* Byte Length of ports at Pm1xEventBlock */
u8_t Pm1ControlLength; /* Byte Length of ports at Pm1xControlBlock */
u8_t Pm2ControlLength; /* Byte Length of ports at Pm2ControlBlock */
u8_t PmTimerLength; /* Byte Length of ports at PmTimerBlock */
u8_t Gpe0BlockLength; /* Byte Length of ports at Gpe0Block */
u8_t Gpe1BlockLength; /* Byte Length of ports at Gpe1Block */
u8_t Gpe1Base; /* Offset in GPE number space where GPE1 events start */
u8_t CstControl; /* Support for the _CST object and C States change notification */
u16_t C2Latency; /* Worst case HW latency to enter/exit C2 state */
u16_t C3Latency; /* Worst case HW latency to enter/exit C3 state */
u16_t FlushSize; /* Processor's memory cache line width, in bytes */
u16_t FlushStride; /* Number of flush strides that need to be read */
u8_t DutyOffset; /* Processor duty cycle index in processor's P_CNT reg*/
u8_t DutyWidth; /* Processor duty cycle value bit width in P_CNT register.*/
u8_t DayAlarm; /* Index to day-of-month alarm in RTC CMOS RAM */
u8_t MonthAlarm; /* Index to month-of-year alarm in RTC CMOS RAM */
u8_t Century; /* Index to century in RTC CMOS RAM */
u16_t BootFlags; /* IA-PC Boot Architecture Flags. See Table 5-10 for description */
u8_t Reserved; /* Reserved, must be zero */
u32_t Flags; /* Miscellaneous flag bits (see below for individual flags) */
acpi_address_t ResetRegister; /* 64-bit address of the Reset register */
u8_t ResetValue; /* Value to write to the ResetRegister port to reset the system */
u8_t Reserved4[3]; /* Reserved, must be zero */
u64_t XFacs; /* 64-bit physical address of FACS */
u64_t XDsdt; /* 64-bit physical address of DSDT */
acpi_address_t XPm1aEventBlock; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
acpi_address_t XPm1bEventBlock; /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
acpi_address_t XPm1aControlBlock; /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
acpi_address_t XPm1bControlBlock; /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
acpi_address_t XPm2ControlBlock; /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
acpi_address_t XPmTimerBlock; /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
acpi_address_t XGpe0Block; /* 64-bit Extended General Purpose Event 0 Reg Blk address */
acpi_address_t XGpe1Block; /* 64-bit Extended General Purpose Event 1 Reg Blk address */
} acpi_fadt_t;
static void dump_fadt(acpi_fadt_t *fadt)
{
printf("FACS base: %x DSDT base: %x\n", fadt->Facs, fadt->Dsdt);
u8_t p = fadt->PreferredProfile;
printf("PreferredProfile: %s\n" ,
p == 0 ? "Unspecified" :
p == 1 ? "Desktop" :
p == 2 ? "Mobile" :
p == 3 ? "Workstation" :
p == 4 ? "Enterprise Server" :
p == 5 ? "SOHO Server" :
p == 6 ? "Appliance PC" : "Unknown");
printf("SciInterrupt: %d\n"
"SmiCommand: %x\n"
"AcpiEnable: %x\n"
"AcpiDisable: %x\n"
"S4BiosRequest: %x\n"
"PstateControl: %x\n"
"Pm1aEventBlock: %x\n"
"Pm1bEventBlock: %x\n\n",
fadt->SciInterrupt,
fadt->SmiCommand,
fadt->AcpiDisable,
fadt->S4BiosRequest,
fadt->PstateControl,
fadt->Pm1aEventBlock,
fadt->Pm1bEventBlock);
};
fadt = (acpi_fadt_t*)rsdt_find(rsdt, 0x50434146);
Re: Выключение ПК.
Posted: Sun Oct 23, 2011 9:26 pm
by art_zh
CleverMouse wrote:Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.
Поставил на Е350 SuSe 11.4, в /proc вообще не оказалось подкаталога
acpi .
Включил в GRUB опцию acpi=on, чтоб без вопросов -- то же самое.
Прилагаю /var/log/boot.msg, может там есть что-то полезное.
Дамп из-под Колибри пока не доделал, хронический цейтнот...
Re: Выключение ПК.
Posted: Mon Oct 24, 2011 1:48 pm
by CleverMouse
Ох уж эти линуксы, вечно чего-нибудь меняют. Из лога видно только, что FADT находится по адресу 6fce38b0h и имеет длину 0F4h, а DSDT - 6fcde150h и имеет длину 575fh. Можно сдампить через dd if=/dev/mem of=fadt bs=1 skip=$((0x6fce38b0)) count=$((0xf4)), если, конечно, там и /dev/mem заодно не отменили, а ОС не потопталась по памяти из-под таблиц. Заодно уж и DSDT тогда можно сдампить, dd if=/dev/mem of=dsdt bs=1 skip=$((0x6fcde150)) count=$((0x575f)).
Re: Выключение ПК.
Posted: Mon Oct 24, 2011 10:52 pm
by XVilka
можно проще, через acpidump - сдампить те таблицы, которые надо указать.
Re: Выключение ПК.
Posted: Thu Oct 27, 2011 12:33 pm
by art_zh
Спасибо XVilka, через acpidump прошло (а через /dev/mem - нет).
Re: Выключение ПК.
Posted: Mon Nov 07, 2011 4:01 pm
by CleverMouse
Таблицы выглядят нормально. После подстановки констант код выключения по идее разворачивается в
Code: Select all
; enter SCI mode
mov al, 0A0h
out 0B2h, al
mov edx, 804h
@@:
in ax, dx
test al, 1
jz @b
; power off
mov edx, 804h
in ax, dx
and ax, 203h
or ah, 34h
out dx, ax
jmp $
Если запустить прямо такой код, он выключит машину, зависнет в первом цикле или зависнет на jmp $?
Re: Выключение ПК.
Posted: Fri Feb 03, 2012 1:11 am
by art_zh
Миль пардон, только сегодня увидел Ваш вопрос, набил ради интереса этот код и прогнал на реальном железе в Колибри-А (там in/out работает в юзермоде с любыми портами).
Машина зависла наглухо, но без отключки. Просто умерла с включенным экраном.
Когда решил оттрассировать по шагам в MTBEBUGе - машина совершенно
правильно выключилась (с полной остановкой всего) на предпоследней команде, не доходя до jmp $ .
Выход из цикла произошёл на самом первом прогоне (ax == 0х0001)
Да, но я вообще-то не за этим сюда зашёл.
Я тут в последнее время изучаю (в жестко-
извращённой форме) несчастный
Acer ao522. В целом - очень неплохая машинка, не сравнить со снулыми атомами. Колибри на ней завелась с пол-оборота, ATIшный драйвер работает изумительно (спасибо, Serge!), клавиатура и тачпад - в полном порядке. Только три минуса -
-1) USB-устройства (даже загрузочные флешки) не распознаются BIOSом ни при каких настройках. Чтобы загрузиться, приходится лезть в потроха, вытаскивать лицензионный NTFS-жд и ставить туда что-нибудь православное;
-2) сеть еще долго будет ждать своего драйвера; ну и наконец
-3) не выключается, зараза! - причем не только ACPI-отключка не пашет, но даже и мой "прямой" рубильник. Выпинывает на PEREGRUZKy
да и еще вот инфа по сабжу :
говорят, обращение к отдельным портам, а также и ACPI-регистрам, может быть оформлено на IO_TRAP с автоматической генерацией SMI.
если это так, то все равно что есть ACPI-подсистема, что ее нет - нужен будет свой драйвер PM под конкретную невыключаемую платформу...
Re: Выключение ПК.
Posted: Fri Sep 30, 2022 8:29 pm
by Itaris
На материнской плате Asrock P4VM890 компьютер не выключается, при нажатии на кнопку выключения просто зависает. На других, причём более новых, выключение из под вашей ОС работает нормально.
Re: Выключение ПК.
Posted: Tue Oct 11, 2022 6:42 pm
by Doczom
включите вывод отладочной информации на экран, скорее всего там будет сообщение о падении потока ядра, если это так, то вам просто "повезло" если нет, то сообщите сюда повторно.