ACPI: Modificar el DSDT de sistema
Ingredients
* Els fonts del Kernel 2.4.x * El patch ACPI més nou per al kernel * L'ensamblador d'Intel per a ASL [[http://www.intel.com/technology/IAPC/acpi/downloads.htm|iasl]] * Estar ja corrent un kernel amb suport ACPI
Usar un kernel amb ACPI
Per poder extraure el DSDT del sistema necessitem estar usant un kernel amb suport ACPI. Això vol dir que cal fer una primera compilació seleccionant suport per ACPI encara que el DSDT no funcioni del tot.
Obtenció de la matèria prima: DSDT
Primer hem d'obtenir el DSDT que ja porta el sistema, per poder-ho fer necessitem estar usant un kernel amb suport ACPI encara que el DSDT no funcioni és necessari per obtenir-lo Podem fer-ho de dos maneres:
* Llegint-lo de /proc/acpi/dsdt * Volcant-lo amb [[http://people.freebsd.org/~takawata/pacpidump.tar.gz|acpidump]]
Aquest fitxer és un binari (codi màquina del ACPI), per obtenir un codi llegible i poder arreglar el que Microsoft ha destrossat necessitem desensamblar-lo amb ajuda del iasl, així per exemple farem:
# cat /proc/acpi/dsdt > dsdt-original # iasl -d dsdt-original
Això genera un fitxer dsdt.dsl molt semblant a un codi en C. Dona-hi un cop d'ull si vols.
Procediment
Cuinant la nova DSDT
Ara que tenim el codi font DSL, és molt simple, només l'hem de compilar de nou amb el iasl i corregir els errors (no detallaré com, mira aquí i aquí):
$ iasl -tc dsdt.dsl [...] ASL Input: dsdt.dsl - xxxx lines, xxxxx bytes, xxxx keywords Compilation complete. X Errors, X Warnings, 0 Remarks ...
Com pots veure no compila, dóna errors i/o warnings que cal arreglar. Un cop arreglats i la compilació finalitzi sense problemes, tindrem dos fitxers: dsdt.hex i dsdt.aml.
Preparant el plat: Incloure la DSDT nova al kernel
Primer necessitem que el kernel llegeixi la nostra DSDT i carregui aquesta enlloc de la del sistema. Per fer-ho necessitem aplicar aquest patch:
--- linux-2.4/drivers/acpi/osl.c 2003/01/14 16:22:32 1.1 +++ linux-2.4/drivers/acpi/osl.c 2003/01/14 16:25:43 @@ -25,6 +25,7 @@ * */ +#include <acpi/dsdt_table.h> #include <linux/config.h> #include <linux/kernel.h> #include <linux/slab.h> @@ -208,7 +209,8 @@ if (!existing_table || !new_table) return AE_BAD_PARAMETER; - *new_table = NULL; + *new_table = (strncmp(existing_table->signature, DSDT_SIG, 4)) ? NULL \ + : (struct acpi_table_header *) AmlCode; return AE_OK; }
Com pots veure el patch fa un 'include' d'un fitxer anomenat dsdt_table.h, aquest fitxer serà la nostra nova DSDT, copia-la:
# cp dsdt.hex /usr/src/linux-2.4.26/include/acpi/dsdt_table.h
Posar-ho al forn a preparar: Compilar el kernel
Finalment només queda compilar el kernel com ho faries normalment i reiniciar. En els missatge de boot (o si no també apareix en el dmesg), veuràs que t'avisa que sobreescriure el DSDT de sistema.