Blame view

kernel/linux-rt-4.4.41/Documentation/acpi/initrd_table_override.txt 3.28 KB
5113f6f70   김현기   kernel add
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
  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