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.
Выключение ПК.
-
Сделаем мир лучше!
Нет у меня на E350 ни линукса, ни винды. И поставить пока не могу (встроенный он, долго отвинчивать).
Подскажите как эти таблицы из Колибри выцарапать -- где они лежат?
Подскажите как эти таблицы из Колибри выцарапать -- где они лежат?
art_zh, если охота писать код на ассемблере, то берёшь код из kernel.asm между комментариями "scan for RSDP" и "ebx is linear address of FADT" и получаешь линейный адрес в ebx, размер в dword[ebx+4]. Если охота возиться с С, то Serge прокомментирует по acpica лучше меня.
Сделаем мир лучше!
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);
Поставил на Е350 SuSe 11.4, в /proc вообще не оказалось подкаталога acpi .CleverMouse wrote:Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.
Включил в GRUB опцию acpi=on, чтоб без вопросов -- то же самое.
Прилагаю /var/log/boot.msg, может там есть что-то полезное.
Дамп из-под Колибри пока не доделал, хронический цейтнот...
- Attachments
-
-
boot.7z (11.51 KiB)Downloaded 434 times
-
Евангелие от Иоанна: стих 1[/size]
Code: Select all
; В начале было Слово:
B32: mov ax, os_stack ; Selector for os
Ох уж эти линуксы, вечно чего-нибудь меняют. Из лога видно только, что 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)).
Сделаем мир лучше!
можно проще, через acpidump - сдампить те таблицы, которые надо указать.
Спасибо XVilka, через acpidump прошло (а через /dev/mem - нет).
- Attachments
-
-
dumpacpi.7z (30.39 KiB)Downloaded 464 times
-
Евангелие от Иоанна: стих 1[/size]
Code: Select all
; В начале было Слово:
B32: mov ax, os_stack ; Selector for os
Таблицы выглядят нормально. После подстановки констант код выключения по идее разворачивается в
Если запустить прямо такой код, он выключит машину, зависнет в первом цикле или зависнет на jmp $?
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 $
Сделаем мир лучше!
Миль пардон, только сегодня увидел Ваш вопрос, набил ради интереса этот код и прогнал на реальном железе в Колибри-А (там in/out работает в юзермоде с любыми портами).
Машина зависла наглухо, но без отключки. Просто умерла с включенным экраном.
Когда решил оттрассировать по шагам в MTBEBUGе - машина совершенно правильно выключилась (с полной остановкой всего) на предпоследней команде, не доходя до jmp $ .
Выход из цикла произошёл на самом первом прогоне (ax == 0х0001)
Да, но я вообще-то не за этим сюда зашёл.
Я тут в последнее время изучаю (в жестко- извращённой форме) несчастный Acer ao522. В целом - очень неплохая машинка, не сравнить со снулыми атомами. Колибри на ней завелась с пол-оборота, ATIшный драйвер работает изумительно (спасибо, Serge!), клавиатура и тачпад - в полном порядке. Только три минуса -
-1) USB-устройства (даже загрузочные флешки) не распознаются BIOSом ни при каких настройках. Чтобы загрузиться, приходится лезть в потроха, вытаскивать лицензионный NTFS-жд и ставить туда что-нибудь православное;
-2) сеть еще долго будет ждать своего драйвера; ну и наконец
-3) не выключается, зараза! - причем не только ACPI-отключка не пашет, но даже и мой "прямой" рубильник. Выпинывает на PEREGRUZKy
да и еще вот инфа по сабжу :
Машина зависла наглухо, но без отключки. Просто умерла с включенным экраном.
Когда решил оттрассировать по шагам в MTBEBUGе - машина совершенно правильно выключилась (с полной остановкой всего) на предпоследней команде, не доходя до jmp $ .
Выход из цикла произошёл на самом первом прогоне (ax == 0х0001)
Да, но я вообще-то не за этим сюда зашёл.
Я тут в последнее время изучаю (в жестко- извращённой форме) несчастный Acer ao522. В целом - очень неплохая машинка, не сравнить со снулыми атомами. Колибри на ней завелась с пол-оборота, ATIшный драйвер работает изумительно (спасибо, Serge!), клавиатура и тачпад - в полном порядке. Только три минуса -
-1) USB-устройства (даже загрузочные флешки) не распознаются BIOSом ни при каких настройках. Чтобы загрузиться, приходится лезть в потроха, вытаскивать лицензионный NTFS-жд и ставить туда что-нибудь православное;
-2) сеть еще долго будет ждать своего драйвера; ну и наконец
-3) не выключается, зараза! - причем не только ACPI-отключка не пашет, но даже и мой "прямой" рубильник. Выпинывает на PEREGRUZKy
да и еще вот инфа по сабжу :
если это так, то все равно что есть ACPI-подсистема, что ее нет - нужен будет свой драйвер PM под конкретную невыключаемую платформу...говорят, обращение к отдельным портам, а также и ACPI-регистрам, может быть оформлено на IO_TRAP с автоматической генерацией SMI.
На материнской плате Asrock P4VM890 компьютер не выключается, при нажатии на кнопку выключения просто зависает. На других, причём более новых, выключение из под вашей ОС работает нормально.
включите вывод отладочной информации на экран, скорее всего там будет сообщение о падении потока ядра, если это так, то вам просто "повезло" если нет, то сообщите сюда повторно.
Who is online
Users browsing this forum: No registered users and 0 guests