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

Devices programming
  • Нет у меня на 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);
    
  • 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, может там есть что-то полезное.

    Дамп из-под Колибри пока не доделал, хронический цейтнот...
    Attachments
    boot.7z (11.51 KiB)
    Downloaded 420 times
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • Ох уж эти линуксы, вечно чего-нибудь меняют. Из лога видно только, что 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 456 times
    Евангелие от Иоанна: стих 1

    Code: Select all

    ; В начале было Слово:
    B32:        mov     ax, os_stack       ; Selector for os
    [/size]
  • Таблицы выглядят нормально. После подстановки констант код выключения по идее разворачивается в

    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 $?
    Сделаем мир лучше!
  • Миль пардон, только сегодня увидел Ваш вопрос, набил ради интереса этот код и прогнал на реальном железе в Колибри-А (там 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 под конкретную невыключаемую платформу...
  • На материнской плате Asrock P4VM890 компьютер не выключается, при нажатии на кнопку выключения просто зависает. На других, причём более новых, выключение из под вашей ОС работает нормально.
  • включите вывод отладочной информации на экран, скорее всего там будет сообщение о падении потока ядра, если это так, то вам просто "повезло" если нет, то сообщите сюда повторно.
  • Who is online

    Users browsing this forum: No registered users and 0 guests