Signed-off-by: Thomas Renninger <trenn@suse.de> Link: http://lkml.kernel.org/r/1349043837-22659-7-git-send-email-trenn@suse.de Cc: Len Brown <lenb@kernel.org> Cc: Robert Moore <robert.moore@intel.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Eric Piel <eric.piel@tremplin-utc.net> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>tirimbino
parent
325a8d3603
commit
8347bbecf3
@ -0,0 +1,94 @@ |
||||
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 |
Loading…
Reference in new issue