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