ETMv4 sysfs Linux 驅動程式程式設計參考。

作者:

Mike Leach <mike.leach@linaro.org>

日期:

2019年10月11日

現有 ETMv4 驅動程式文件的補充。

Sysfs 檔案和目錄

根目錄: /sys/bus/coresight/devices/etm<N>

以下段落解釋了 sysfs 檔案與其影響的 ETMv4 暫存器之間的關聯。請注意,暫存器名稱不帶“TRC”字首。


檔案:

mode (rw)

跟蹤暫存器:

{CONFIGR + 其他}

注意事項:

位選擇跟蹤功能。參見下面的“mode”部分。此位將導致跟蹤配置和其他暫存器進行相應的程式設計,以啟用請求的功能。

語法 & 示例:

echo bitfield > mode

位欄位最多 32 位,用於設定跟蹤功能。

示例:

$> echo 0x012 > mode


檔案:

reset (wo)

跟蹤暫存器:

所有

注意事項:

重置所有程式設計,不跟蹤任何內容/未程式設計任何邏輯。

語法:

echo 1 > reset


檔案:

enable_source (wo)

跟蹤暫存器:

PRGCTLR, 所有硬體暫存器。

注意事項:
  • > 0 : 使用驅動程式中當前持有的值對硬體進行程式設計並啟用跟蹤。

  • = 0 : 停用跟蹤硬體。

語法:

echo 1 > enable_source


檔案:

cpu (ro)

跟蹤暫存器:

無。

注意事項:

此 ETM 連線的 CPU ID。

示例:

$> cat cpu

$> 0


檔案:

ts_source (ro)

跟蹤暫存器:

無。

注意事項:

當 FEAT_TRF 實現時,用於跟蹤會話的 TRFCR_ELx.TS 值。否則 -1 表示未知時間源。檢查 trcidr0.tssize 以檢視是否有全域性時間戳可用。

示例:

$> cat ts_source

$> 1


檔案:

addr_idx (rw)

跟蹤暫存器:

無。

注意事項:

用於索引地址比較器和範圍功能的虛擬暫存器。為範圍中的第一對設定索引。

語法:

echo idx > addr_idx

其中 idx < nr_addr_cmp x 2


檔案:

addr_range (rw)

跟蹤暫存器:

ACVR[idx, idx+1], VIIECTLR

注意事項:

由 addr_idx 選擇的地址對,用於一個範圍。根據可選引數決定包含/排除,如果省略則使用當前的“mode”設定。在控制暫存器中選擇比較器範圍。如果索引是奇數值,則報錯。

依賴:

mode, addr_idx

語法:

echo addr1 addr2 [exclude] > addr_range

其中 addr1 和 addr2 定義範圍,且 addr1 < addr2。

可選排除值:

  • 0 表示包含

  • 1 表示排除。

示例:

$> echo 0x0000 0x2000 0 > addr_range


檔案:

addr_single (rw)

跟蹤暫存器:

ACVR[idx]

注意事項:

根據 addr_idx 設定單個地址比較器。當地址比較器用作事件生成邏輯的一部分時使用此功能。

依賴:

addr_idx

語法:

echo addr1 > addr_single


檔案:

addr_start (rw)

跟蹤暫存器:

ACVR[idx], VISSCTLR

注意事項:

根據 addr_idx 設定跟蹤起始地址比較器。在控制暫存器中選擇比較器。

依賴:

addr_idx

語法:

echo addr1 > addr_start


檔案:

addr_stop (rw)

跟蹤暫存器:

ACVR[idx], VISSCTLR

注意事項:

根據 addr_idx 設定跟蹤停止地址比較器。在控制暫存器中選擇比較器。

依賴:

addr_idx

語法:

echo addr1 > addr_stop


檔案:

addr_context (rw)

跟蹤暫存器:

ACATR[idx,{6:4}]

注意事項:

將上下文 ID 比較器連結到地址比較器 addr_idx

依賴:

addr_idx

語法:

echo ctxt_idx > addr_context

其中 ctxt_idx 是連結的上下文 ID / vmid 比較器的索引。


檔案:

addr_ctxtype (rw)

跟蹤暫存器:

ACATR[idx,{3:2}]

注意事項:

輸入值字串。為連結的上下文 ID 比較器設定型別。

依賴:

addr_idx

語法:

echo type > addr_ctxtype

型別為 {all, vmid, ctxid, none} 之一

示例:

$> echo ctxid > addr_ctxtype


檔案:

addr_exlevel_s_ns (rw)

跟蹤暫存器:

ACATR[idx,{14:8}]

注意事項:

為所選地址比較器設定 ELx 安全和非安全匹配位

依賴:

addr_idx

語法:

echo val > addr_exlevel_s_ns

val 是一個 7 位值,用於排除異常級別。輸入值移位到暫存器中的正確位。

示例:

$> echo 0x4F > addr_exlevel_s_ns


檔案:

addr_instdatatype (rw)

跟蹤暫存器:

ACATR[idx,{1:0}]

注意事項:

設定用於匹配的比較器地址型別。驅動程式僅支援設定指令地址型別。

依賴:

addr_idx


檔案:

addr_cmp_view (ro)

跟蹤暫存器:

ACVR[idx, idx+1], ACATR[idx], VIIECTLR

注意事項:

讀取當前選定的地址比較器。如果屬於地址範圍,則顯示兩個地址。

依賴:

addr_idx

語法:

cat addr_cmp_view

示例:

$> cat addr_cmp_view

addr_cmp[0] range 0x0 0xffffffffffffffff include ctrl(0x4b00)


檔案:

nr_addr_cmp (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

地址比較器對的數量


檔案:

sshot_idx (rw)

跟蹤暫存器:

注意事項:

選擇單次觸發暫存器集。


檔案:

sshot_ctrl (rw)

跟蹤暫存器:

SSCCR[idx]

注意事項:

訪問單次觸發比較器控制暫存器。

依賴:

sshot_idx

語法:

echo val > sshot_ctrl

將 val 寫入選定的控制暫存器。


檔案:

sshot_status (ro)

跟蹤暫存器:

SSCSR[idx]

注意事項:

讀取單次觸發比較器狀態暫存器

依賴:

sshot_idx

語法:

cat sshot_status

讀取狀態。

示例:

$> cat sshot_status

0x1


檔案:

sshot_pe_ctrl (rw)

跟蹤暫存器:

SSPCICR[idx]

注意事項:

訪問單次觸發 PE 比較器輸入控制暫存器。

依賴:

sshot_idx

語法:

echo val > sshot_pe_ctrl

將 val 寫入選定的控制暫存器。


檔案:

ns_exlevel_vinst (rw)

跟蹤暫存器:

VICTLR{23:20}

注意事項:

程式設計非安全異常級別過濾器。設定/清除 NS 異常過濾器位。設定為“1”將從異常級別排除跟蹤。

語法:

echo bitfield > ns_exlevel_viinst

其中 bitfield 包含用於設定 EL0 到 EL2 的位。

示例:

%> echo 0x4 > ns_exlevel_viinst

排除 EL2 NS 跟蹤。


檔案:

vinst_pe_cmp_start_stop (rw)

跟蹤暫存器:

VIPCSSCTLR

注意事項:

訪問 PE 啟動停止比較器輸入控制暫存器


檔案:

bb_ctrl (rw)

跟蹤暫存器:

BBCTLR

注意事項:

定義分支廣播將操作的範圍。預設值 (0x0) 為所有地址。

依賴:

BB 已啟用。


檔案:

cyc_threshold (rw)

跟蹤暫存器:

CCCTLR

注意事項:

設定將發出迴圈計數的閾值。如果嘗試設定低於 IDR3 中定義的最小值,或者掩碼寬度超出有效位數,則報錯。

依賴:

CC 已啟用。


檔案:

syncfreq (rw)

跟蹤暫存器:

SYNCPR

注意事項:

設定跟蹤同步週期。2 的冪次方值,0(關閉)或 8-20。驅動程式預設為 12(每 4096 位元組)。


檔案:

cntr_idx (rw)

跟蹤暫存器:

注意事項:

選擇要訪問的計數器

語法:

echo idx > cntr_idx

其中 idx < nr_cntr


檔案:

cntr_ctrl (rw)

跟蹤暫存器:

CNTCTLR[idx]

注意事項:

設定計數器控制值。

依賴:

cntr_idx

語法:

echo val > cntr_ctrl

其中 val 符合 ETMv4 規範。


檔案:

cntrldvr (rw)

跟蹤暫存器:

CNTRLDVR[idx]

注意事項:

設定計數器過載值。

依賴:

cntr_idx

語法:

echo val > cntrldvr

其中 val 符合 ETMv4 規範。


檔案:

nr_cntr (ro)

跟蹤暫存器:

來自 IDR5

注意事項:

已實現的計數器數量。


檔案:

ctxid_idx (rw)

跟蹤暫存器:

注意事項:

選擇要訪問的上下文 ID 比較器。

語法:

echo idx > ctxid_idx

其中 idx < numcidc


檔案:

ctxid_pid (rw)

跟蹤暫存器:

CIDCVR[idx]

注意事項:

設定上下文 ID 比較器值。

依賴:

ctxid_idx


檔案:

ctxid_masks (rw)

跟蹤暫存器:

CIDCCTLR0, CIDCCTLR1, CIDCVR<0-7>

注意事項:

一對值,用於設定 1-8 個上下文 ID 比較器的位元組掩碼。自動將掩碼位元組清除為 CID 值暫存器中的 0。

語法:

echo m3m2m1m0 [m7m6m5m4] > ctxid_masks

由掩碼位元組組成的 32 位值,其中 mN 表示上下文 ID 比較器 N 的位元組掩碼值。

對於上下文 ID 比較器少於 4 個的系統,不需要第二個值。


檔案:

numcidc (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

上下文 ID 比較器的數量


檔案:

vmid_idx (rw)

跟蹤暫存器:

注意事項:

選擇要訪問的 VM ID 比較器。

語法:

echo idx > vmid_idx

其中 idx < numvmidc


檔案:

vmid_val (rw)

跟蹤暫存器:

VMIDCVR[idx]

注意事項:

設定 VM ID 比較器值。

依賴:

vmid_idx


檔案:

vmid_masks (rw)

跟蹤暫存器:

VMIDCCTLR0, VMIDCCTLR1, VMIDCVR<0-7>

注意事項:

一對值,用於設定 1-8 個 VM ID 比較器的位元組掩碼。自動將掩碼位元組清除為 VMID 值暫存器中的 0。

語法:

echo m3m2m1m0 [m7m6m5m4] > vmid_masks

其中 mN 表示 VMID 比較器 N 的位元組掩碼值。對於 VMID 比較器少於 4 個的系統,不需要第二個值。


檔案:

numvmidc (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

VMID 比較器的數量


檔案:

res_idx (rw)

跟蹤暫存器:

無。

注意事項:

選擇要訪問的資源選擇器控制。必須是 2 或更高,因為選擇器 0 和 1 是硬連線的。

語法:

echo idx > res_idx

其中 2 <= idx < nr_resource x 2


檔案:

res_ctrl (rw)

跟蹤暫存器:

RSCTLR[idx]

注意事項:

設定資源選擇器控制值。值符合 ETMv4 規範。

依賴:

res_idx

語法:

echo val > res_cntr

其中 val 符合 ETMv4 規範。


檔案:

nr_resource (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

資源選擇器對的數量


檔案:

event (rw)

跟蹤暫存器:

EVENTCTRL0R

注意事項:

設定最多 4 個已實現的事件欄位。

語法:

echo ev3ev2ev1ev0 > event

其中 evN 是一個 8 位事件欄位。最多 4 個事件欄位組成 32 位輸入值。有效欄位的數量取決於實現,在 IDR0 中定義。


檔案:

event_instren (rw)

跟蹤暫存器:

EVENTCTRL1R

注意事項:

選擇將事件包插入跟蹤流的事件。

依賴:

EVENTCTRL0R

語法:

echo bitfield > event_instren

其中 bitfield 最多為 4 位,具體取決於事件欄位的數量。


檔案:

event_ts (rw)

跟蹤暫存器:

TSCTLR

注意事項:

設定將生成時間戳請求的事件。

依賴:

TS 啟用

語法:

echo evfield > event_ts

其中 evfield 是一個 8 位事件選擇器。


檔案:

seq_idx (rw)

跟蹤暫存器:

注意事項:

序列器事件暫存器選擇 - 0 到 2


檔案:

seq_state (rw)

跟蹤暫存器:

SEQSTR

注意事項:

序列器當前狀態 - 0 到 3。


檔案:

seq_event (rw)

跟蹤暫存器:

SEQEVR[idx]

注意事項:

狀態轉換事件暫存器

依賴:

seq_idx

語法:

echo evBevF > seq_event

其中 evBevF 是由兩個事件選擇器組成的 16 位值,

  • evB : 返回

  • evF : 前進。


檔案:

seq_reset_event (rw)

跟蹤暫存器:

SEQRSTEVR

注意事項:

序列器復位事件

語法:

echo evfield > seq_reset_event

其中 evfield 是一個 8 位事件選擇器。


檔案:

nrseqstate (ro)

跟蹤暫存器:

來自 IDR5

注意事項:

序列器狀態的數量(0 或 4)


檔案:

nr_pe_cmp (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

PE 比較器輸入的數量


檔案:

nr_ext_inp (ro)

跟蹤暫存器:

來自 IDR5

注意事項:

外部輸入的數量


檔案:

nr_ss_cmp (ro)

跟蹤暫存器:

來自 IDR4

注意事項:

單次觸發控制暫存器的數量


注意: 在程式設計任何地址比較器時,驅動程式會用所使用的型別標記比較器——即 RANGE、SINGLE、START、STOP。一旦設定了此標記,則只能使用用於程式設計它的相同 sysfs 檔案/型別來更改值。

因此

% echo 0 > addr_idx           ; select address comparator 0
% echo 0x1000 0x5000 0 > addr_range ; set address range on comparators 0, 1.
% echo 0x2000 > addr_start    ; error as comparator 0 is a range comparator
% echo 2 > addr_idx           ; select address comparator 2
% echo 0x2000 > addr_start    ; this is OK as comparator 2 is unused.
% echo 0x3000 > addr_stop     ; error as comparator 2 set as start address.
% echo 2 > addr_idx           ; select address comparator 3
% echo 0x3000 > addr_stop     ; this is OK

要移除所有比較器(以及所有其他硬體)上的程式設計,請使用 reset 引數。

% echo 1 > reset

“mode”sysfs 引數。

這是一個位欄位選擇引數,用於設定 ETM 的整體跟蹤模式。下表描述了這些位,使用了驅動程式原始檔中的定義,並附帶了這些位所代表的功能的描述。許多功能是可選的,因此取決於硬體中的實現。

位分配如下所示:


位 (0)

ETM_MODE_EXCLUDE

描述

這是設定地址範圍時包含/排除功能的預設值。設定為 1 表示排除範圍。當設定 mode 引數時,此值將應用於當前索引的地址範圍。

位 (4)

ETM_MODE_BB

描述

如果硬體支援 [IDR0],則設定為啟用分支廣播。此功能的主要用途是當代碼在執行時動態修補時,可能無法僅使用條件分支來重建完整的程式流。

Perf 目前不支援向解碼器提供修改後的二進位制檔案,因此此功能僅用於除錯目的或與第三方工具一起使用。

選擇此選項將導致生成的跟蹤量顯著增加——可能存在溢位風險,或覆蓋的指令更少。請注意,此選項還會覆蓋 ETM_MODE_RETURNSTACK 的任何設定,因此當分支廣播範圍與返回堆疊範圍重疊時,該範圍將無法使用返回堆疊。

位 (5)

ETMv4_MODE_CYCACC

描述

如果支援 [IDR0],則設定為啟用週期精確跟蹤。

位 (6)

ETMv4_MODE_CTXID

描述

如果硬體支援 [IDR2],則設定為啟用上下文 ID 跟蹤。

位 (7)

ETM_MODE_VMID

描述

如果支援 [IDR2],則設定為啟用虛擬機器 ID 跟蹤。

位 (11)

ETMv4_MODE_TIMESTAMP

描述

如果支援 [IDR0],則設定為啟用時間戳生成。

位 (12)

ETM_MODE_RETURNSTACK

描述

如果支援 [IDR0],則設定為啟用跟蹤返回堆疊使用。

位 (13-14)

ETM_MODE_QELEM(val)

描述

如果 ETM [IDR0] 實現了 Q 元素支援,則“val”決定了啟用的 Q 元素支援級別。

位 (19)

ETM_MODE_ATB_TRIGGER

描述

如果支援 [IDR5],則設定為啟用事件控制暫存器 [EVENTCTLR1] 中的 ATBTRIGGER 位。

位 (20)

ETM_MODE_LPOVERRIDE

描述

如果支援 [IDR5],則設定為啟用事件控制暫存器 [EVENTCTLR1] 中的 LPOVERRIDE 位。

位 (21)

ETM_MODE_ISTALL_EN

描述

設定為啟用停頓控制暫存器 [STALLCTLR] 中的 ISTALL 位。

位 (23)

ETM_MODE_INSTPRIO

描述

如果支援 [IDR0],則設定為啟用停頓控制暫存器 [STALLCTLR] 中的 INSTPRIORITY 位。

位 (24)

ETM_MODE_NOOVERFLOW

描述

如果支援 [IDR3],則設定為啟用停頓控制暫存器 [STALLCTLR] 中的 NOOVERFLOW 位。

位 (25)

ETM_MODE_TRACE_RESET

描述

如果支援 [IDR3],則設定為啟用 viewinst 控制暫存器 [VICTLR] 中的 TRCRESET 位。

位 (26)

ETM_MODE_TRACE_ERR

描述

設定為啟用 viewinst 控制暫存器 [VICTLR] 中的 TRCCTRL 位。

位 (27)

ETM_MODE_VIEWINST_STARTSTOP

描述

設定 viewinst 控制暫存器 [VICTLR] 中 ViewInst 啟動/停止邏輯的初始狀態值。

位 (30)

ETM_MODE_EXCL_KERN

描述

設定預設跟蹤配置以排除核心模式跟蹤(參見注 a)

位 (31)

ETM_MODE_EXCL_USER

描述

設定預設跟蹤配置以排除使用者空間跟蹤(參見注 a)


注 a) 啟動時,ETM 被程式設計為使用地址範圍比較器 0 跟蹤完整的地址空間。 “mode”位的 30 / 31 修改此設定,以在地址範圍比較器中設定使用者空間 (EL0) 或核心空間 (EL1) 中 NS 狀態的 EL 排除位。(預設設定排除所有安全 EL 和 NS EL2)

一旦使用了 reset 引數和/或實現了自定義程式設計,使用這些位將以相同的方式設定地址比較器 0 的 EL 位。

注 b) 位 2-3、8-10、15-16、18、22 控制僅適用於資料跟蹤的功能。由於 ETMv4 中架構上禁止 A-profile 資料跟蹤,此處已省略。可能的用途是當核心支援作為異構系統一部分的 R 或 M profile 基礎設施的控制時。

位 17、28-29 未使用。