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