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”將應用於所有控制方法評估。