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