ACPICA 追踪工具

版权所有:

© 2015, 英特尔公司

作者:

Lv Zheng <lv.zheng@intel.com>

摘要

本文档描述了方法追踪工具的功能和接口。

功能和使用示例

ACPICA 提供了方法追踪能力。目前,有两个功能是利用此能力实现的。

日志缩减器

当 CONFIG_ACPI_DEBUG 启用时,ACPICA 子系统提供调试输出。通过 ACPI_DEBUG_PRINT() 宏部署的调试消息可以在两个级别上进行缩减:每组件级别(称为调试层,通过 /sys/module/acpi/parameters/debug_layer 配置)和每类型级别(称为调试级别,通过 /sys/module/acpi/parameters/debug_level 配置)。

但是,当特定的层/级别应用于控制方法评估时,调试输出的数量可能仍然过大,无法放入内核日志缓冲区。因此,提出的想法是只在控制方法评估开始时启用特定的调试层/级别(通常更详细)日志,并在控制方法评估停止时禁用详细日志记录。

以下命令示例说明了“日志缩减器”功能的使用方式

  1. 在评估控制方法时,过滤掉与调试层/级别匹配的日志

    # cd /sys/module/acpi/parameters
    # echo "0xXXXXXXXX" > trace_debug_layer
    # echo "0xYYYYYYYY" > trace_debug_level
    # echo "enable" > trace_state
    
  2. 在评估指定的控制方法时,过滤掉与调试层/级别匹配的日志

    # cd /sys/module/acpi/parameters
    # echo "0xXXXXXXXX" > trace_debug_layer
    # echo "0xYYYYYYYY" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "method" > /sys/module/acpi/parameters/trace_state
    
  3. 在首次评估指定的控制方法时,过滤掉与调试层/级别匹配的日志

    # cd /sys/module/acpi/parameters
    # echo "0xXXXXXXXX" > trace_debug_layer
    # echo "0xYYYYYYYY" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "method-once" > /sys/module/acpi/parameters/trace_state
    
其中
0xXXXXXXXX/0xYYYYYYYY

有关可能的调试层/级别掩码值,请参阅ACPI CA 调试输出

PPPP.AAAA.TTTT.HHHH

ACPI 命名空间中可以找到的控制方法的完整路径。它不必是控制方法评估的入口。

AML 追踪器

方法追踪工具在 AML 解释器开始/停止执行控制方法或 AML 操作码的“追踪点”处添加了特殊的日志条目。请注意,日志条目的格式可能会更改

[    0.186427]   exdebug-0398 ex_trace_point        : Method Begin [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution.
[    0.186630]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905c88:If] execution.
[    0.186820]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905cc0:LEqual] execution.
[    0.187010]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905a20:-NamePath-] execution.
[    0.187214]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905a20:-NamePath-] execution.
[    0.187407]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905f60:One] execution.
[    0.187594]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905f60:One] execution.
[    0.187789]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905cc0:LEqual] execution.
[    0.187980]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905cc0:Return] execution.
[    0.188146]   exdebug-0398 ex_trace_point        : Opcode Begin [0xf5905f60:One] execution.
[    0.188334]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905f60:One] execution.
[    0.188524]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905cc0:Return] execution.
[    0.188712]   exdebug-0398 ex_trace_point        : Opcode End [0xf5905c88:If] execution.
[    0.188903]   exdebug-0398 ex_trace_point        : Method End [0xf58394d8:\_SB.PCI0.LPCB.ECOK] execution.

开发者可以利用这些特殊的日志条目来追踪 AML 解释过程,从而有助于问题调试和性能调优。请注意,由于“AML 追踪器”日志是通过 ACPI_DEBUG_PRINT() 宏实现的,因此要启用“AML 追踪器”日志也需要启用 CONFIG_ACPI_DEBUG。

以下命令示例说明了“AML 追踪器”功能的使用方式

  1. 在评估控制方法时,过滤掉方法开始/停止的“AML 追踪器”日志

    # cd /sys/module/acpi/parameters
    # echo "0x80" > trace_debug_layer
    # echo "0x10" > trace_debug_level
    # echo "enable" > trace_state
    
  2. 在评估指定的控制方法时,过滤掉方法开始/停止的“AML 追踪器”日志

    # cd /sys/module/acpi/parameters
    # echo "0x80" > trace_debug_layer
    # echo "0x10" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "method" > trace_state
    
  3. 在首次评估指定的控制方法时,过滤掉方法开始/停止的“AML 追踪器”日志

    # cd /sys/module/acpi/parameters
    # echo "0x80" > trace_debug_layer
    # echo "0x10" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "method-once" > trace_state
    
  4. 在评估指定的控制方法时,过滤掉方法/操作码开始/停止的“AML 追踪器”日志

    # cd /sys/module/acpi/parameters
    # echo "0x80" > trace_debug_layer
    # echo "0x10" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "opcode" > trace_state
    
  5. 在首次评估指定的控制方法时,过滤掉方法/操作码开始/停止的“AML 追踪器”日志

    # cd /sys/module/acpi/parameters
    # echo "0x80" > trace_debug_layer
    # echo "0x10" > trace_debug_level
    # echo "\PPPP.AAAA.TTTT.HHHH" > trace_method_name
    # echo "opcode-opcode" > trace_state
    

请注意,所有上述与方法追踪工具相关的模块参数都可以用作启动参数,例如

acpi.trace_debug_layer=0x80 acpi.trace_debug_level=0x10 \
acpi.trace_method_name=\_SB.LID0._LID acpi.trace_state=opcode-once

接口描述

所有方法追踪功能都可以通过 ACPI 模块参数进行配置,这些参数可在 /sys/module/acpi/parameters/ 访问

trace_method_name

用户想要追踪的 AML 方法的完整路径。

请注意,完整路径不应在其名称段中包含尾随的“_”,但可以包含“\”以形成绝对路径。

trace_debug_layer

启用追踪功能时使用的临时 debug_layer。

默认使用 ACPI_EXECUTER (0x80),它是用于匹配所有“AML 追踪器”日志的 debug_layer。

trace_debug_level

启用追踪功能时使用的临时 debug_level。

默认使用 ACPI_LV_TRACE_POINT (0x10),它是用于匹配所有“AML 追踪器”日志的 debug_level。

trace_state

追踪功能的状态。

用户可以通过执行以下命令来启用/禁用此调试追踪功能

# echo string > /sys/module/acpi/parameters/trace_state

其中“string”应为以下之一

“disable”

禁用方法追踪功能。

“enable”

启用方法追踪功能。

在任何方法执行期间,匹配“trace_debug_layer/trace_debug_level”的 ACPICA 调试消息将被记录。

“method”

启用方法追踪功能。

在执行“trace_method_name”方法期间,匹配“trace_debug_layer/trace_debug_level”的 ACPICA 调试消息将被记录。

“method-once”

启用方法追踪功能。

在执行“trace_method_name”方法期间,匹配“trace_debug_layer/trace_debug_level”的 ACPICA 调试消息将只记录一次。

“opcode”

启用方法追踪功能。

在执行“trace_method_name”方法/操作码期间,匹配“trace_debug_layer/trace_debug_level”的 ACPICA 调试消息将被记录。

“opcode-once”

启用方法追踪功能。

在执行“trace_method_name”方法/操作码期间,匹配“trace_debug_layer/trace_debug_level”的 ACPICA 调试消息将只记录一次。

请注意,“enable”与其他功能启用选项之间的区别在于

  1. 当指定“enable”时,由于“trace_debug_layer/trace_debug_level”将应用于所有控制方法评估,因此在将“trace_state”配置为“enable”后,“trace_method_name”将被重置为 NULL。

  2. 当指定“method/opcode”时,如果在将“trace_state”配置为这些选项时“trace_method_name”为 NULL,则“trace_debug_layer/trace_debug_level”将应用于所有控制方法评估。