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 未使用。