ACPI CA 调试输出

ACPI CA 可以生成调试输出。本文档描述如何使用此功能。

编译时配置

ACPI CA 调试输出通过 CONFIG_ACPI_DEBUG 全局启用。如果未设置此配置选项,则调试消息甚至不会构建到内核中。

引导时和运行时配置

当 CONFIG_ACPI_DEBUG=y 时,您可以选择您感兴趣的消息的组件和级别。在引导时,使用 acpi.debug_layer 和 acpi.debug_level 内核命令行选项。引导后,您可以使用 /sys/module/acpi/parameters/ 中的 debug_layer 和 debug_level 文件来控制调试消息。

debug_layer(组件)

“debug_layer”是一个掩码,用于选择感兴趣的组件,例如,ACPI 解释器的特定部分。要构建 debug_layer 位掩码,请在 ACPI 源文件中查找“#define _COMPONENT”。

您可以使用 acpi.debug_layer 命令行参数在引导时设置 debug_layer 掩码,并且可以通过将值写入 /sys/module/acpi/parameters/debug_layer 在引导后更改它。

可能的组件在 include/acpi/acoutput.h 中定义。

读取 /sys/module/acpi/parameters/debug_layer 会显示支持的掩码值

ACPI_UTILITIES                  0x00000001
ACPI_HARDWARE                   0x00000002
ACPI_EVENTS                     0x00000004
ACPI_TABLES                     0x00000008
ACPI_NAMESPACE                  0x00000010
ACPI_PARSER                     0x00000020
ACPI_DISPATCHER                 0x00000040
ACPI_EXECUTER                   0x00000080
ACPI_RESOURCES                  0x00000100
ACPI_CA_DEBUGGER                0x00000200
ACPI_OS_SERVICES                0x00000400
ACPI_CA_DISASSEMBLER            0x00000800
ACPI_COMPILER                   0x00001000
ACPI_TOOLS                      0x00002000

debug_level

“debug_level”是一个掩码,用于选择不同类型的消息,例如,与初始化、方法执行、信息性消息等相关的消息。要构建 debug_level,请查看 ACPI_DEBUG_PRINT() 语句中指定的级别。

ACPI 解释器使用几个不同的级别,但 Linux ACPI 核心和 ACPI 驱动程序通常只使用 ACPI_LV_INFO。

您可以使用 acpi.debug_level 命令行参数在引导时设置 debug_level 掩码,并且可以通过将值写入 /sys/module/acpi/parameters/debug_level 在引导后更改它。

可能的级别在 include/acpi/acoutput.h 中定义。读取 /sys/module/acpi/parameters/debug_level 会显示支持的掩码值,目前这些值是

ACPI_LV_INIT                    0x00000001
ACPI_LV_DEBUG_OBJECT            0x00000002
ACPI_LV_INFO                    0x00000004
ACPI_LV_INIT_NAMES              0x00000020
ACPI_LV_PARSE                   0x00000040
ACPI_LV_LOAD                    0x00000080
ACPI_LV_DISPATCH                0x00000100
ACPI_LV_EXEC                    0x00000200
ACPI_LV_NAMES                   0x00000400
ACPI_LV_OPREGION                0x00000800
ACPI_LV_BFIELD                  0x00001000
ACPI_LV_TABLES                  0x00002000
ACPI_LV_VALUES                  0x00004000
ACPI_LV_OBJECTS                 0x00008000
ACPI_LV_RESOURCES               0x00010000
ACPI_LV_USER_REQUESTS           0x00020000
ACPI_LV_PACKAGE                 0x00040000
ACPI_LV_ALLOCATIONS             0x00100000
ACPI_LV_FUNCTIONS               0x00200000
ACPI_LV_OPTIMIZATIONS           0x00400000
ACPI_LV_MUTEX                   0x01000000
ACPI_LV_THREADS                 0x02000000
ACPI_LV_IO                      0x04000000
ACPI_LV_INTERRUPTS              0x08000000
ACPI_LV_AML_DISASSEMBLE         0x10000000
ACPI_LV_VERBOSE_INFO            0x20000000
ACPI_LV_FULL_TABLES             0x40000000
ACPI_LV_EVENTS                  0x80000000

示例

例如,drivers/acpi/acpica/evxfevnt.c 包含以下内容

#define _COMPONENT          ACPI_EVENTS
...
ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI mode disabled\n"));

要启用此消息,请在 acpi.debug_layer 中设置 ACPI_EVENTS 位,并在 acpi.debug_level 中设置 ACPI_LV_INIT 位。(ACPI_DEBUG_PRINT 语句使用 ACPI_DB_INIT,这是一个基于 ACPI_LV_INIT 定义的宏。)

在引导期间启用所有 AML “Debug” 输出(在解释 AML 时存储到 Debug 对象)

acpi.debug_layer=0xffffffff acpi.debug_level=0x2

启用所有与 ACPI 硬件相关的消息

acpi.debug_layer=0x2 acpi.debug_level=0xffffffff

在引导后启用所有 ACPI_DB_INFO 消息

# echo 0x4 > /sys/module/acpi/parameters/debug_level

显示所有有效的组件值

# cat /sys/module/acpi/parameters/debug_layer