Tags

Désassembler une table ACPI

L'ACPI implémente de nombreuses tables qui décrivent comment l'ordinateur doit
gérer l'énergie des composants. La plus connue d'entre elles est la table DSDT

La dernière version de la norme ACPI, la version 4.0, est sortie le 16 juin
2009 [1]

La table DSDT


La table DSDT (Differentiated System Description Table) est la table ACPI la
plus connue. Cette table contient des informations et une configuration sur le
système de base. Il n'est pas toujours capable de fournir les tables de
fonctions complètes et doit parfois être corrigé.

En effet, on trouve aujourd'hui des sites [2] référençant des tables ACPI
patchées (en particulier la table DSDT) ainsi qu'un patch noyau [3] permettant
d'ignorer la table DSDT de l'ordinateur pour utilisée celle modifiée. Passer
outre la DSDT est donc assez facile : au lieu de charger la table DSDT du BIOS,
le noyau est compilé avec et utilise sa propre table DSDT.

Nous nous sommes donc intéressé au désassemblage d'une table DSDT sous GNU/Linux.

Désassemblage d'une table DSDT

La méthode utilisée récupère la table DSDT chargée par le noyau, accessible via
/proc/acpi/dsdt

Nous récupérons donc la table DSDT de l'un de nos oridnateurs :

# cp /proc/acpi/dsdt DSDT


La table récupérée est écrite en AML (ACPI Machine Language). C'est une
syntaxetrès proche de l'assembleur Il convient ensuite de désassembler la table
DSDT du fichier ainsi récupéré :

$ iasl -d DSDT


Nous obtenons alors un fichier d'environ 10000 lignes contenant toute la table
DSDT. La syntaxe utilisée est la syntaxe ASL.

La table DSDT peut ensuite être modifiée et recompilée :


$ iasl -tc DSDT.dsl


On commence alors à toucher du doigt les limites des composants fournis par les
grands constructeurs. Que ce soit l'ordinateur de Clément (DELL) ou le mien
(ThinkPad), la recompilation de la table DSDT provoque moultes erreurs et
warnings. Ainsi, il sera possible de demander à l'ordinateur de se contenter
d'une table DSDT partiellement compilée, contenant des erreurs. Ce sera alors
au noyau du système d'exploitation de s'en accomoder.

Ceci explique en partie la grande difficulté des OS libres à mettre
correctement un ordinateur en veille ou en hibernation.

L'ASL ?

L'ASL, pour ACPI Control Method Source Language, est un langage déclaratif qui
est compilé en AML (ACPI Machine Language). La spécification ACPI décrit le
langage ASL, mais seul le langage AML doit obligatoirement pouvoir être
interprété par le Système d'Exploitation. Rien n'interdit de générer de l'AML
de la manière que l'on souhaite.

La syntaxe ASL en elle-même est relativement lisible, mais le résultat d'un
désassemblage est toujours complexe à appréhender. Il reste en effet un
certain nombre de fragments en hexadécimal, et les variables internes n'ont
pas des noms parlants.

Contenu d'une table DSDT

Structure


Toute la table DSDT est comprise dans un unique *DefinitionBlock*. Cette
entité est compilée et chargée en bloc par le système d'exploitation.
Il peut cependant y avoir plusieurs *DefinitionBlocks* dans une table (par
exemple dans le cas d'une docking station).

À l'intérieur du *DefinitionBlock* se trouvent différents types de
déclarations.

* Name(object) pour définir un objet dans l'espace de nom global
* Method pour définir une *Control Method*, c'est à dire une procédure qui
peut être appelée. Il est à noter que le mot clé Serialized permet
d'associer un verrou d'exclusion mutuelle (mutex) à la méthode.
* Device(identifiant) pour définir un élément physique
* Notify(object, value) pour prévenir le Système d'Exploitation d'un
événement lié à l'objet passé en argument.
* Scope pour définir un espace de nommage.


Points intéressants


En parcourant la table DSDT de mon ordinateur portable (un Dell XPS 13"), j'ai
pu m'apercevoir qu'à l'intérieur d'une procédure, une distinction était faite
en fonction du nom du système d'exploitation. Plusieurs versions de Windows
étaient mentionnées. GNU/Linux n'apparait pas (mais dans la table DSDT du
Lenovo de Benjamin, si).

J'ai tenté de recompiler la table DSDT désassemblée, et la compilation, tout
en s'effectuant, a remonté plusieurs erreurs et des dizaines de Warnings.
On peut donc penser que Dell ne met pas beaucoup de soin dans la rédaction de
ses tables ACPI.


[1] http://linuxfr.org/2009/06/24/25646.html
[2] http://acpi.sourceforge.net/dsdt/index.php
[3] http://gaugusch.at/kernel.shtml


Benjamin V. et Clément D.

Comments