-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ACPI: Document ACPI table overriding via initrd
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>
- Loading branch information
Thomas Renninger
authored and
H. Peter Anvin
committed
Oct 1, 2012
1 parent
325a8d3
commit 8347bbe
Showing
1 changed file
with
94 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |