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 :shock: .
Включил в 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)

Да, но я вообще-то не за этим сюда зашёл.

Я тут в последнее время изучаю (в жестко- :twisted:извращённой форме) несчастный 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
включите вывод отладочной информации на экран, скорее всего там будет сообщение о падении потока ядра, если это так, то вам просто "повезло" если нет, то сообщите сюда повторно.