Modifier une table DSDT à chaud sur un système GNU/Linux

La méthode de modification de la table DSDT consistant à intégrer la nouvelle table au noyau Linux est pérenne, mais n'est absolument pas adaptée à du trial and error. En effet, recompiler son noyau à chaque modification mineure d'un élément de la table se révèle fastidieux.
Nous allons donc aborder dans cet article le remplacement (ou l'ajout) de méthodes ACPI à chaud. Évidemment une fois que la table est correctement configurée, il faut l'intégrer proprement dans le noyau. La méthode présentée ici n'est valable que pour accélerer les cycles de debug.

Récupération d'une méthode existante

Si on veut modifier une méthode existante (mais on peut très bien en ajouter de nouvelles), il faut commencer par la récupérer :

$ cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat
$ iasl -d dsdt.dat
(On a indiqué le nouvel emplacement dans /sys et plus dans /proc/acpi/, en vigueur depuis le noyau 2.6.37) Il suffit ensuite d'extraire la méthode désirée dans un fichier à part (par exemple nom_methode.asl), et de la modifier. On ne peut surcharger que des objets ACPI de type "METHOD". Les objets de type "DEVICE", etc ne peuvent donc pas être surchargés

Création d'une nouvelle méthode

Dans le cas d'une nouvelle méthode, il suffit de créer un fichier et d'y définir la méthode. On compilera et chargera la méthode exactement de la même façon que pour surcharger une méthode existante. Si on crée une nouvelle méthode, il faut bien préciser le namespace complet de la méthode.

Génération du code AML

Il s'agit maintenant de compiler le code ASL que l'on a écrit en code AML, qui sera interprété par la machine.

$ iasl nom_methode.asl
Un fichier nom_methode.aml sera alors généré.

Chargement de la nouvelle méthode ACPI

On commence par monter le sytème de fichiers debugfs.

# mount -t debugfs none /sys/kernel/debug
On charge ensuite la nouvelle méthode
cat /tmp/nom_methode.aml > /sys/kernel/debug/acpi/custom_method

Annuler les changements

La méthode "annuler" ("undo) n'est pas encore supportée pour les méthode insérées à chaud. Il n'est donc pas encore possible d'enlever une méthode ajoutée. Pour une méthode surchargée, si l'on souhaite annuler ses changements, il faut sauvegarder une copie de la méthode originale du code ASL puis surcharger à nouveau la méthode avec la méhode d'origine.

Il est tout à fait possible d'utiliser plusieurs méthodes modifiant l'ACPI à chaud. Mais chaque écriture sur le fichier (de type debugfs ) doit implémenter une seule surcharge de méthode (en cas d'insertion/surcharge de plusieurs méthodes ACPI, il faut les séparer, et écrire une fois par méthode dans le fichier /sys/kernel/debug/acpi/custom_method)

Il est donc bien plus pratique de créer et de tester du code ASL par cette méthode que par la méthode plus lourde qui consiste à intégrer le code au noyau. Une fois les changements validés, il ne faut pas oublier de les intégrer définitivement au noyau.

Sources:

Comments