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
bitfield 最多 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 的字节掩码值。
在具有少于 4 个上下文 ID 比较器的系统上不需要第二个值
- 文件:
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 的字节掩码值。在具有少于 4 个 VMID 比较器的系统上不需要第二个值。
- 文件:
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
- 描述
这是设置地址范围时 include / 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] 实现了,则 '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],则设置以启用查看指令控制寄存器 [VICTLR] 中的 TRCRESET 位。
- 位 (26)
ETM_MODE_TRACE_ERR
- 描述
设置以启用查看指令控制寄存器 [VICTLR] 中的 TRCCTRL 位。
- 位 (27)
ETM_MODE_VIEWINST_STARTSTOP
- 描述
设置查看指令控制寄存器 [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)
一旦使用了复位参数,和/或实现了自定义编程 - 使用这些位将以相同的方式设置地址比较器 0 的 EL 位。
注释 b) 位 2-3、8-10、15-16、18、22 控制仅适用于数据跟踪的功能。由于 A-profile 数据跟踪在 ETMv4 中是架构禁止的,因此此处省略了这些位。可能的用途可能是内核支持作为异构系统一部分的 R 或 M 配置文件基础设施的控制。
位 17、28-29 未使用。