| Overriding ACPI tables via initrd |
| ================================= |
| |
| 1) Introduction (What is this about) |
| 2) What is this for |
| 3) How does it work |
| 4) References (Where to retrieve userspace tools) |
| |
| 1) What is this about |
| --------------------- |
| |
| If the ACPI_INITRD_TABLE_OVERRIDE compile option is true, it is possible to |
| override nearly any ACPI table provided by the BIOS with an instrumented, |
| modified one. |
| |
| For a full list of ACPI tables that can be overridden, take a look at |
| the char *table_sigs[MAX_ACPI_SIGNATURE]; definition in drivers/acpi/osl.c |
| All ACPI tables iasl (Intel's ACPI compiler and disassembler) knows should |
| be overridable, except: |
| - ACPI_SIG_RSDP (has a signature of 6 bytes) |
| - ACPI_SIG_FACS (does not have an ordinary ACPI table header) |
| Both could get implemented as well. |
| |
| |
| 2) What is this for |
| ------------------- |
| |
| Please keep in mind that this is a debug option. |
| ACPI tables should not get overridden for productive use. |
| If BIOS ACPI tables are overridden the kernel will get tainted with the |
| TAINT_OVERRIDDEN_ACPI_TABLE flag. |
| Complain to your platform/BIOS vendor if you find a bug which is so sever |
| that a workaround is not accepted in the Linux kernel. |
| |
| Still, it can and should be enabled in any kernel, because: |
| - There is no functional change with not instrumented initrds |
| - It provides a powerful feature to easily debug and test ACPI BIOS table |
| compatibility with the Linux kernel. |
| |
| |
| 3) How does it work |
| ------------------- |
| |
| # Extract the machine's ACPI tables: |
| cd /tmp |
| acpidump >acpidump |
| acpixtract -a acpidump |
| # Disassemble, modify and recompile them: |
| iasl -d *.dat |
| # For example add this statement into a _PRT (PCI Routing Table) function |
| # of the DSDT: |
| Store("HELLO WORLD", debug) |
| iasl -sa dsdt.dsl |
| # Add the raw ACPI tables to an uncompressed cpio archive. |
| # They must be put into a /kernel/firmware/acpi directory inside the |
| # cpio archive. |
| # The uncompressed cpio archive must be the first. |
| # Other, typically compressed cpio archives, must be |
| # concatenated on top of the uncompressed one. |
| mkdir -p kernel/firmware/acpi |
| cp dsdt.aml kernel/firmware/acpi |
| # A maximum of: #define ACPI_OVERRIDE_TABLES 10 |
| # tables are currently allowed (see osl.c): |
| iasl -sa facp.dsl |
| iasl -sa ssdt1.dsl |
| cp facp.aml kernel/firmware/acpi |
| cp ssdt1.aml kernel/firmware/acpi |
| # Create the uncompressed cpio archive and concatenate the original initrd |
| # on top: |
| find kernel | cpio -H newc --create > /boot/instrumented_initrd |
| cat /boot/initrd >>/boot/instrumented_initrd |
| # reboot with increased acpi debug level, e.g. boot params: |
| acpi.debug_level=0x2 acpi.debug_layer=0xFFFFFFFF |
| # and check your syslog: |
| [ 1.268089] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] |
| [ 1.272091] [ACPI Debug] String [0x0B] "HELLO WORLD" |
| |
| iasl is able to disassemble and recompile quite a lot different, |
| also static ACPI tables. |
| |
| |
| 4) Where to retrieve userspace tools |
| ------------------------------------ |
| |
| iasl and acpixtract are part of Intel's ACPICA project: |
| http://acpica.org/ |
| and should be packaged by distributions (for example in the acpica package |
| on SUSE). |
| |
| acpidump can be found in Len Browns pmtools: |
| ftp://kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools/acpidump |
| This tool is also part of the acpica package on SUSE. |
| Alternatively, used ACPI tables can be retrieved via sysfs in latest kernels: |
| /sys/firmware/acpi/tables |