1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
@section How it works
The DSDT is one of several tables that is exported by the ACPI
BIOS parts of your system from ROM to RAM.
The BIOS tells the Operating System where to find these tables
and loads/uses them.
The DSDT table actually is code that can be executed by the Operating
System and the BIOS to communicate with each other.
This code (the DSDT) is byte-code (similar to compiled Java code) that
is interpreted by the kernel. It can easily be extracted, disassembled,
modified (errors corrected, debug info attached, ...) and compiled to
byte-code again. You can attach the modified DSDT to your initrd/initramfs
(the modular part of the kernel that is loaded very early at boot time).
After the BIOS exported the ACPI tables to RAM and tells the kernel where to
find them, the kernel can replace e.g. the DSDT with your modfied/corrected
one. Having said this, two points should be very important for you:
@itemize bullet
@item
Your BIOS Rom is not flashed. It's just replaced in RAM and
booting another kernel/OS (without a modified DSDT) will
use your manufacturer's DSDT as it was shipped.
@item
The DSDT code is partly generated by your BIOS.
If you add or remove memory you need to repatch (extract
the original DSDT, modify it, ...) your changes.
@end itemize
For some distributions you need a kernel patch to be able to do that.
(not needed for most distributions like
current versions of SUSE Linux, Ubuntu, Mandrake and others)
You find the patch here: @uref{http://gaugusch.at/kernel.shtml}
@section How to check your DSDT for errors and debugging it
You can disassemble the byte-code of your DSDT. You then
have a C-like bunch of functions that were exported by your BIOS.
You can modify and add debug statements to it, recompile it and
let the kernel override the one exported by BIOS with your
modified/fixed one. The pmtools package has to be installed for this.
You do this by:
@enumerate
@item
Extract all your ACPI BIOS tables by e.g.: acpidmp >/tmp/acpidmp
@item
Extract the DSDT from the tables: acpixtract dsdt /tmp/acpidmp >/tmp/dsdt
@item
Disassemble the dsdt: iasl -d /tmp/dsdt
@item
You now have a human readable C like file(dsdt.dsl) you can edit.
@item
You can recompile it by: iasl -sa dsdt.dsl
@item
Often you now get obvious compile errors -> try to fix them.
This is the time where you should have a look at the ACPI specification for help.
See @uref{http://www.acpi.info/} to download the newest version.
@item
You can add e.g. debug statements that are written to syslog if the code
is executed by adding lines like: Store ("Read battery", Debug).
Be aware that your kernel must have CONFIG_ACPI_DEBUG set and you have to set the
kernel ACPI debug values higher (see @ref{ACPI_Debugging}). This is not the case
for e.g. SUSE kernels for verions 9.3 and higher.
@item
After successfully compiling your modified DSDT, c
copy the DSDT.aml file where you want to (recommended:
/etc/DSDT.aml). Edit /etc/sysconfig/kernel and modify the
path to a DSDT variable where you copied your compiled
DSDT (e.g. /etc/DSDT.aml). Run mkinitrd (located in the
mkinitrd package). Everytime you reinstall your kernel and
use mkinitrd to create a initrd, your DSDT will be included
and loaded at boottime.
@end enumerate
@section Finding and Adding an already fixed DSDT
Find a DSDT for your laptop under:
@uref{http://acpi.sourceforge.net/dsdt/tables/}
In the SUSE Linux distribution for example you can override
your DSDT by:
@enumerate
@item
Download the table for your machine. Be sure that it is
unzipped and compiled (normally ending on AML [ACPI Machine
Language], if so go to step 3.).
@item
If it is ending on ASL (ACPI Source Language) , you still
have to compile the table using the iasl program located in
the pmtools package. Compile the file: iasl -sa XXX.asl
You also find the newest version of iasl (Intel ACPI
compiler) under:
@uref{http://developer.intel.com/technology/iapc/acpi/downloads.htm}
@item
Copy the DSDT.aml where you want to (recommended:
/etc/DSDT.aml) Edit /etc/sysconfig/kernel and modify the
path to a DSDT variable where you copied your compiled
DSDT (e.g. /etc/DSDT.aml). Run mkinitrd (located in the
mkinitrd package). Everytime you reinstall your kernel and
use mkinitrd to create a initrd, your DSDT will be included
and loaded at boottime.
@end enumerate
|