Chapter D4

嵌入式跟踪扩展(The Embedded Trace Extension)

原文:ARM DDI 0487, The Embedded Trace Extension
完整中文翻译版 — 原文逐句翻译,保留全部ARM标签ID

本章描述嵌入式跟踪扩展(Embedded Trace Extension,简称ETE)。包含以下章节:

  • D4.1 关于嵌入式跟踪扩展
  • D4.2 编程人员模型
  • D4.3 跟踪元素
  • D4.4 指令和异常分类
  • D4.5 关于ETE跟踪单元
  • D4.6 资源操作

D4.1 关于嵌入式跟踪扩展(About the Embedded Trace Extension)

IJTPNL

FEAT_ETE 描述了一个跟踪单元(trace unit)的操作。跟踪单元提供在 PE 上运行的软件控制流的详细信息,这些信息可用于辅助调试或优化。跟踪单元提供过滤功能,允许将信息定位到特定的代码区域或操作时段。

ILVKQS

FEAT_ETE 与 ETMv4 架构有重叠部分,同时也为新的架构特性提供支持。有关 ETMv4 架构的更多信息,参见 Arm 嵌入式跟踪宏单元架构规范 ETMv4(ARM IHI 0064)。FEAT_ETE 不支持 ETMv4 的所有特性。有关 FEAT_ETE 与 ETMv4 架构之间差异的更多信息,参见 ETM 与 ETE 之间的差异。

D4.1.1 跟踪的属性(Attributes of tracing)

IRGLSR

PE 跟踪的属性如下:

  • 跟踪实时生成。
    跟踪提供了一种在 PE 运行时观察 PE 操作的手段。出于诊断目的,这一点非常有用,因为某些类型的错误行为只能通过在运行时观察系统来解决。此外,由于 PE 跟踪可以包含周期计数,跟踪也可用于 PE 性能分析。

  • 跟踪对 PE 的功能性能影响极小。
    通常情况下,跟踪对 PE 的功能性能没有影响。然而,这一属性取决于被调试 PE 的目标市场使用场景,以及该 PE 的跟踪需求和为满足这些需求所采用的跟踪方案。在某些市场中,对 PE 性能的某些影响是可以接受的,但在其他市场中,最显著的是在实时系统中,对 PE 性能的影响可能是不可接受的。

  • 跟踪可用于自托管分析(self-hosted analysis)。
    来自 PE 或进程的跟踪可供目标上运行的软件进行分析。参见自托管跟踪(Self-hosted Trace)。

  • 跟踪深度嵌入在 SoC 中。
    跟踪提供了一种调试在深度嵌入于 SoC 内部的 PE 上执行软件的方法。

  • 跟踪可用于外部分析。
    来自 PE 或进程的跟踪可以导出到片外,供外部工具进行分析。

D4.1.2 自托管跟踪(Self-hosted Trace)

IFNMRL

自托管跟踪用于多种目的,包括:

  • 非侵入式单步执行(Non-invasive single stepping):
    跟踪提供与通过单步执行代码所获得的类似的执行历史记录。

  • 故障日志记录(Failure logging):
    类似于故障发生时进行的栈回溯转储(stack trace dump)。

  • 性能分析(Performance analysis):
    跟踪可与其他跟踪源或性能分析单元一起使用,以分析程序性能。

IVVSCJ

在片内捕获跟踪涉及以下方式之一:

  • 使用系统内存:
    来自跟踪单元的跟踪输出通过由 FEAT_TRBE 定义的跟踪缓冲单元(Trace Buffer Unit)被导向主系统内存中的缓冲区。

  • 使用现有的共享系统内存,其中预留了部分主系统内存用于跟踪捕获:
    来自跟踪单元的跟踪输出通过主系统总线被导向预留内存,通常使用 CoreSight 技术,例如 CoreSight ETR。

  • 使用专用的片内缓冲区:
    来自跟踪单元的跟踪输出被导向专用内存,通常使用 CoreSight 技术,例如 CoreSight ETB。通常在跟踪单元和专用内存之间还会实现一条专用总线,如 AMBA ATB。使用专用内存意味着可以在对系统行为产生零影响或最小影响的情况下执行 PE 跟踪。
    AMBA ATB 由 AMBA ATB 协议规范(ARM IHI 0032)定义。

D4.1.3 外部调试(External debug)

ITQGBH

外部调试通常用于需要长期记录行为的跟踪应用中。此外,当必须将 PE 跟踪对系统性能的影响降至最低时,更有可能使用外部调试。

例如,外部调试可能用于:

  • 调试实时系统。
  • 分析行为不频繁变化的程序。
  • 调试软件,此时需要故障发生前的执行历史。

将跟踪导出到片外通常涉及以下方法之一:

D4.1.3.1 实时连续导出(Real-time continuous export)

IVJBMM

这可以通过以下任一方式完成:

  • 一个能够维持跟踪带宽的专用跟踪端口。
  • SoC 上的一个现有接口,例如 USB 或其他高速端口。

使用专用跟踪端口意味着可以在对系统行为产生零影响或最小影响的情况下将跟踪导出到片外。当系统约束(如成本或封装尺寸)意味着无法实现专用跟踪端口时,通常会使用现有接口。然而,使用现有接口可能会影响系统行为,因为跟踪和正常的接口流量共用同一端口。

D4.1.3.2 短期片内捕获后低速导出(Short-term on-chip capture with subsequent low speed export)

IPXSSB

当需要一种低成本的跟踪导出方法,或者当系统约束阻止实时连续导出时,使用此选项。来自跟踪单元的跟踪输出被临时存储在片内,然后使用以下任一方式导出:

  • SoC 上的一个现有调试端口,例如 JTAG-DP 或 SW-DP。
  • SoC 上的另一个现有接口,例如 USB。

通常,临时存储是一个循环缓冲区(circular buffer)。如果缓冲区已满,较新的跟踪数据会覆盖较旧的跟踪数据,这意味着缓冲区始终包含最近的跟踪数据。在采用 Arm CoreSight 技术的 SoC 中,提供了一个专用的嵌入式跟踪缓冲区(ETB)用于在片内捕获跟踪。

D4.1.4 跟踪输出(Trace output)

RSVDBD

跟踪单元将跟踪字节流输出到以下一个或多个目标:

  • TRBE。
  • 一个或多个由具体实现定义的(IMPLEMENTATION DEFINED)接口。连接到 CoreSight 子系统的 AMBA ATB 接口就是此类由实现定义的接口的一个示例。

RLGVCX

如果跟踪缓冲单元(Trace Buffer Unit)已启用,则跟踪字节流仅输出到跟踪缓冲单元。

RFJFNS

如果跟踪缓冲单元已禁用,则跟踪字节流输出到一个或多个其他接口。

RHBBDV

当实现了 FEAT_ETEv1p3 并且存在一个由实现定义的跟踪输出接口时,ETE 跟踪输出使能(ETE Trace Output Enable)总是被实现。

RRPHPJ

当实现了 FEAT_ETE 并且存在一个由实现定义的跟踪输出接口时,ETE 跟踪输出使能是可选的。

RFTSZG

当未实现 ETE 跟踪输出使能且跟踪缓冲单元已禁用时,跟踪会输出到一个由实现定义的跟踪输出接口,除非该输出被一个由实现定义的机制禁用。

RPJYKY

当实现了 ETE 跟踪输出使能,且 TRCEVENTCTL1R.OE 为 0 或跟踪缓冲单元已启用时,跟踪绝不会输出到任何由实现定义的跟踪输出接口。

RMMCKW

当实现了 ETE 跟踪输出使能,且 TRCEVENTCTL1R.OE 为 1 且跟踪缓冲单元已禁用时,跟踪会输出到一个由实现定义的跟踪输出接口。

注意: TRCEVENTCTL1R.OE 的添加不向后兼容,要求跟踪分析器显式地启用向任何由实现定义的跟踪输出接口的跟踪输出。

ITVDMT

如果跟踪输出由专用于某个 PE 的单个捕获点捕获,并且不与任何其他跟踪流混合,则编程到 TRCTRACEIDR.TRACEID 中的值不需要与系统中所有跟踪单元中编程的所有值保持唯一。例如,可以将值 0x01 编程到所有拥有自己专用跟踪捕获点的跟踪单元中。

  • 专用跟踪捕获点的一个示例是跟踪缓冲扩展(Trace Buffer Extension)。当 FEAT_TRBE 已实现并启用时,所有使用跟踪缓冲扩展的 PE 的 TRCTRACEIDR.TRACEID 值可以相同。更多信息,参见跟踪缓冲扩展(The Trace Buffer Extension)。
  • 专用跟踪捕获点的另一个示例是通过 AMBA ATB 接口连接并专用于某个 PE 的 CoreSight ETR。如果 AMBA ATB 接口连接到 ETR 而不与任何其他跟踪流混合,则在使用 ETR 时 TRCTRACEIDR.TRACEID 不需要是唯一的,前提是确保跟踪不会到达任何其他跟踪捕获点。

RRWPFG

如果实现了 AMBA ATB 接口,跟踪单元必须支持以下所有功能:

  • ATB 触发器,由 TRCIDR5.ATBTRIG 指示。
  • 7 位跟踪 ID,由 TRCIDR5.TRACEIDSIZE 指示。

IQJKVW

Arm 建议,如果跟踪单元实现了 AMBA ATB 接口或用于跟踪输出的由实现定义的接口,那么该接口的路径不应受到 PE 热复位(Warm reset)的影响。这确保跟踪能够在 PE 热复位期间进行,这对于底层调试场景非常有用。

RNLSSL

当所有跟踪输出都被禁用时,跟踪单元将任何已生成的跟踪数据视为已经输出。

D4.1.5 跟踪会话(Trace sessions)

RGLTKQ

在任何时候,跟踪单元要么被启用,要么被禁用。有关跟踪单元可能状态的更多信息,参见跟踪单元编程状态(Trace unit programming states)。

RXBPSQ

跟踪会话(trace session)是指从跟踪单元变为启用状态到下次变为禁用状态之间的时间段。

RMTLFH

当跟踪单元启用时,ViewInst() 函数要么处于激活(active)状态,要么处于非激活(inactive)状态。当 ViewInst() 处于激活状态时,跟踪单元为已执行的指令生成跟踪信息,除非跟踪生成处于失效(inoperative)状态。

RMFNWB

ViewInst() 是处于激活还是非激活状态,与跟踪生成是处于有效(operative)还是失效状态无关。

RZVNKV

当以下两种情况均不成立时,跟踪生成处于有效状态:

  • 跟踪单元被禁用。
  • 跟踪单元正在从跟踪单元缓冲区溢出(trace unit buffer overflow)中恢复。

RRDPSW

当跟踪生成从失效状态转换为有效状态时,跟踪生成变为有效。发生在以下任一情况发生之时:

  • 当跟踪单元从禁用状态转换为启用状态时。
  • 当跟踪单元从跟踪单元缓冲区溢出中恢复时。

RBDRKW

当跟踪生成从有效状态转换为失效状态时,跟踪生成变为失效。发生在以下任一情况发生之时:

  • 当跟踪单元从启用状态转换为禁用状态时。
  • 当跟踪单元遇到跟踪单元缓冲区溢出时。

RLDDLP

当跟踪单元无法生成架构要求的至少一个跟踪包时,就会发生跟踪单元缓冲区溢出。

IHDJWW

跟踪单元缓冲区溢出通常是由于跟踪单元中的任何缓冲无法接收更多跟踪包所导致。无法接收跟踪包通常是因为无法维持向任何跟踪捕获基础设施输出跟踪包。

注意: 跟踪单元缓冲区溢出与跟踪缓冲单元(Trace Buffer Unit)填满或在内存中回绕跟踪缓冲区无关。然而,跟踪单元缓冲区溢出可能是由于跟踪缓冲单元因容量不足而拒绝跟踪数据,随后达到了跟踪单元内部缓冲区的限制所导致的。

D4.1.6 跟踪单元编程状态(Trace unit programming states)

RWMGGP

跟踪单元始终处于图 D4-1 和表 D4-1 所示的状态之一。

Figure D4-1

图 D4-1 跟踪单元编程状态

表 D4-1 跟踪单元编程状态

状态(State) TRCSTATR.IDLE TRCSTATR.PMSTABLE 跟踪单元已启用(Trace unit enabled)
Idle(空闲) 0b1 0b1
Enabling(启用中) 0b1 UNKNOWN
Running(运行中) 0b0 UNKNOWN
Unstable(不稳定) 0b0 0b0
Stable(稳定) 0b0 0b1

译者注: TRCSTATR 是跟踪单元的状态寄存器,IDLE 位指示跟踪单元是否空闲,PMSTABLE 位指示编程模型状态是否稳定。UNKNOWN 表示该值在架构上未定义,可能因具体实现而异。

RDXFFN

当跟踪单元被启用时,跟踪单元从 Idle(空闲)状态转换到 Enabling(启用中)状态。

RZFPHC

跟踪单元在有限时间内从 Enabling(启用中)状态转换到 Running(运行中)状态。

RTZSRP

当跟踪单元被禁用时,跟踪单元从 Running(运行中)状态转换到 Unstable(不稳定)状态。

RCZHWF

跟踪单元在有限时间内从 Unstable(不稳定)状态转换到 Stable(稳定)状态。

RBPTKT

当跟踪单元处于 Stable(稳定)和 Idle(空闲)状态时,以下字段的状态不会改变,除非通过直接写入或外部写入:

  • TRCVICTLR.SSSTATUS
  • TRCSEQSTR.STATE
  • TRCCNTVR<n>.VALUE
  • TRCSSCSR<n>.STATUS
  • TRCRSR.EVENT
  • TRCRSR.EXTIN
  • TRCRSR.TA

ITDLZL

当处于 Stable(稳定)或 Idle(空闲)状态时,可以安全地读取跟踪单元编程者模型(programmers’ model)的状态。

RTRZCP

当跟踪单元变为完全空闲并且以下两个条件均成立时,跟踪单元从 Stable(稳定)状态转换到 Idle(空闲)状态:

  • 跟踪单元已排空所有跟踪数据。
  • 除编程接口外,跟踪单元上的所有外部接口都处于静默(quiescent)状态。

RRWYQD

当跟踪单元不处于 Idle(空闲)状态时,对跟踪单元寄存器的直接写入和外部写入是受限不可预测的(CONSTRAINED UNPREDICTABLE),以下寄存器除外:

  • TRCPRGCTLR
  • TRCCLAIMSET
  • TRCCLAIMCLR

该受限不可预测行为是以下情况之一:

  • 写入被忽略。
  • 寄存器取一个未知(UNKNOWN)值。

跟踪字节流也可能被损坏,对字节流的分析可能变得不可行。

RMDZDN

当跟踪单元不处于 Idle(空闲)或 Running(运行中)状态时,更改 TRCPRGCTLR.EN 的值是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

该受限不可预测行为是以下情况之一:

  • 写入被忽略。
  • 寄存器取一个未知(UNKNOWN)值。

译者注: “CONSTRAINED UNPREDICTABLE”(受限不可预测)是 ARM 架构中的一种行为分类,意味着架构规范对可能发生的行为施加了一定约束,但并未精确定义其结果。软件应避免依赖此类行为。

IPRQRD

更多信息,参见:

  • 启用时的行为(Behavior on enabling)。
  • 禁用时的行为(Behavior on disabling)。
  • 相应寄存器页面的访问权限。

IFJPCN

图 D4-2 显示了在使用外部调试接口编程跟踪单元寄存器时必须遵循的流程。

Figure D4-2

图 D4-2 外部调试接口编程流程

IZGJRF

图 D4-3 显示了在使用系统指令接口编程跟踪单元寄存器时所使用的流程。

Figure D4-3

图 D4-3 系统指令编程流程


翻译说明

  1. 技术术语一致性

    • trace unit = 跟踪单元
    • PE (Processing Element) = 处理单元
    • trace = 跟踪
    • ETE (Embedded Trace Extension) = 嵌入式跟踪扩展
    • trace buffer = 跟踪缓冲区
    • trace session = 跟踪会话
    • trace packet = 跟踪包
    • ViewInst() = ViewInst()(函数名保留不译)
    • IMPLEMENTATION DEFINED = 由实现定义的
    • CONSTRAINED UNPREDICTABLE = 受限不可预测的
    • UNKNOWN = 未知
  2. 所有 ARM 文档标签 ID(如 IJTPNL、ILVKQS、IRGLSR 等)均已保留在原位。

  3. 表格已使用 Markdown 重新创建,包含所有行和列数据。

  4. 图片占位符已放置,由于原图内容(状态机图和流程图)以 ASCII 艺术形式呈现,已尽可能在翻译中反映其流程逻辑,图片已裁剪为单独的示意图文件。

  5. 译者注已添加在适当位置(如 UNKNOWN 和 CONSTRAINED UNPREDICTABLE 概念的解释处)。

D4.2 编程人员模型(Programmers’ Model)

D4.2

编程人员模型


D4.2.1 访问ETE寄存器

IVYNRB

ETE架构提供了一系列寄存器,用于对ETE跟踪单元进行编程以及回读已编程的设置。这些寄存器可以通过以下一种或多种访问机制进行访问:

  • 外部调试接口(External debug interface),供外部调试器使用。
  • 系统指令(System instructions),供被跟踪PE上运行的自托管软件(self-hosted software)使用。

RNBPML

当来自多种访问机制的寄存器访问同时发生时,跟踪单元的行为如同所有访问按任意顺序原子性地发生。


D4.2.1.1 外部调试接口(External debug interface)

IKPYGY

外部调试接口定义了一个地址映射的外设,占用4KB的地址空间。

注:
PE不必处于调试状态(Debug state)即可对ETE寄存器进行编程。

ITBMWG

除非本节中另有说明,外部调试接口支持的访问大小信息参见”Supported access sizes”(支持的访问大小)。

RVQWLY

跟踪单元支持以下访问大小:

  • 字对齐的32位访问:用于访问32位寄存器,或访问映射到双字对齐的相邻32位位置对的64位寄存器的任一半。
  • 双字对齐的64位访问:用于访问映射到双字对齐的相邻32位位置对的64位寄存器。两个半字的访问顺序未指定。

注:
这意味着,如果一个系统使用32位总线(如CoreSight系统中的AMBA APB)实现调试寄存器,且系统互联总线宽度更大,则必须在系统总线与调试总线之间实现一个桥接器,该桥接器能够拆分64位访问。

RVNNPF

所有寄存器仅在字粒度上具有单拷原子性(single-copy atomic)。

RKYDTQ

跟踪单元不支持以下访问:

  • 字节(Byte)访问
  • 半字(Halfword)访问
  • 非对齐字(Unaligned word)访问——这些访问在字粒度上不具有单拷原子性。
  • 非对齐双字(Unaligned doubleword)访问——这些访问在双字粒度上不具有单拷原子性。
  • 对并非构成64位寄存器的双字对齐相邻32位位置对进行的双字访问。
  • 四字(Quadword)或更高粒度的访问。
  • 独占(Exclusives)访问。

RCFRFW

对于来自外部调试接口的访问,访问的大小由接口决定。在符合Arm调试接口规范的存储器访问端口(MEM-AP)中,这由MEM-AP的CSW寄存器指定。CoreSight APB-AP仅支持字访问。

RYFRMG

跟踪单元不支持的访问行为属于受约束的不可预测(CONSTRAINED UNPREDICTABLE),表现为以下之一:

  1. 访问产生外部中止(External abort),写入操作将所访问的一个或多个寄存器设置为未知(UNKNOWN)值。
  2. 读取返回未知(UNKNOWN)数据,写入被忽略。
  3. 读取返回未知(UNKNOWN)数据,写入将所访问的一个或多个寄存器设置为未知(UNKNOWN)值。这是Arm推荐的行为。

译者注:CONSTRAINED UNPREDICTABLE(受约束的不可预测)

这是ARM架构中的一种规范术语。当某操作被标记为CONSTRAINED UNPREDICTABLE时,意味着架构规范不强制要求该操作产生一个特定结果,但将该行为约束在一组有限的合法选项内(如上文列出的三种)。软件不能依赖这些操作产生确定性的结果。这不同于UNPREDICTABLE(完全不可预测),后者没有行为约束。在调试接口中遇到不支持访问类型时,系统设计者可以在上述三个选项中选择实现方式。


RYSHRS

对于来自外部调试接口的访问,当AllowExternalTraceAccess()返回FALSE时返回错误响应的情况下,EDPRSR.STAD仅在以下情况被设置为1:当这是错误的最优先原因时。以下原因具有比AllowExternalTraceAccess()更高的优先级:

  • 跟踪单元核心电源域已掉电(powered down)。
  • OS Lock已锁定,且该寄存器由于OS Lock锁定而被定义为返回错误响应。

RKQMKX

来自外部调试接口的、对未实现或保留(Reserved)的跟踪单元寄存器的访问,行为如下:

  • 当跟踪单元核心电源域关闭时,访问返回错误。
  • 否则:
    • 对于偏移量范围为0xF000xFFC的访问,行为表现为RES0H(即读取返回0,写入忽略)。
    • 对于偏移量范围为0x0000xEFC的访问:
      • 当OS Lock锁定时,响应为受约束的不可预测,可以选择返回错误响应或表现为RES0H。
      • 当OS Lock已解锁且AllowExternalTraceAccess()返回FALSE时,响应为受约束的不可预测,可以选择返回错误响应或表现为RES0H。
      • 否则,访问表现为RES0H。

RWXKDP

对只写寄存器(write-only registers)的读取操作是保留的(Reserved)。

RSVSNR

对只读寄存器(read-only registers)的写入操作是保留的(Reserved)。

IWTJFD

对于返回错误的访问,有关如何处理该错误的更多详细信息,请参见”Behavior of a not permitted memory-mapped access”(不允许的存储器映射访问的行为)。


D4.2.1.2 系统指令(System instructions)

RVGVTS

CRn >= 0b1000的指令未分配用于访问跟踪单元寄存器。

RSGPQB

当PE处于EL0异常级别时,所有访问都是未定义的(UNDEFINED)

IWCXDT

为了与Arm架构保持一致,对未实现寄存器的系统指令访问将产生未定义指令异常(Undefined Instruction exception)。这些访问包括:

  • 对只读寄存器的写入。
  • 对只写寄存器的读取。
  • 因跟踪单元配置而不存在的寄存器的访问。

D4.2.2 寄存器更新的同步(Synchronization of register updates)

D4.2.2.1 系统寄存器(System registers)

IKWCGH

根据”Synchronization requirements for AArch64 System registers”(AArch64系统寄存器同步要求)中的定义,对跟踪单元寄存器的直接写入仅在随后的**上下文同步事件(Context synchronization event)**之后才能保证对执行可见。上下文同步事件包括以下之一:

  • 发生异常(Taking an exception)
  • 从异常返回(Returning from an exception)
  • 执行指令同步屏障(Instruction Synchronization Barrier,ISB)操作
  • 退出调试状态(Debug state)
  • 在调试状态下执行DCPS指令
  • 在调试状态下执行DRPS指令

译者注:上下文同步事件(Context synchronization event)

上下文同步事件是ARM架构中确保之前所有指令(尤其是系统寄存器写入)的效果对后续指令可见的关键机制。例如,执行ISB指令后,流水线会被刷新,所有之前写入系统寄存器的效果都会生效。这对于跟踪单元的编程至关重要:如果在写入TRCPRGCTLR后没有执行ISB或发生异常等同步事件,新的跟踪配置可能不会立即生效。

IPNZZH

当跟踪单元不处于稳定(Stable)或空闲(Idle)状态时,对跟踪单元寄存器的直接读取不能保证包含直接读取操作之前执行所产生跟踪操作的结果。

IQPVJQ

根据”AArch64系统寄存器同步要求”中的定义:如果使用与先前系统指令写入相同的寄存器编号对该寄存器进行直接写入,则最终结果是第二次写入的值,两次写入指令之间不需要任何上下文同步。

IWLGQK

根据”AArch64系统寄存器同步要求”中的定义:如果使用与先前直接写入相同的寄存器编号对该寄存器进行直接读取,则保证能够观察到之前写入的值,写入和读取指令之间不需要任何上下文同步。

SHSXGZ

在改变TRCPRGCTLR.EN的值或改变OS Lock时,上下文同步事件非常重要。在写入TRCPRGCTLR以改变TRCPRGCTLR.EN的值之后,在对任何其他寄存器进行编程之前,需要先读取一次TRCSTATR。在写入TRCPRGCTLR和读取TRCSTATR之间需要一个上下文同步事件。如果需要多次读取TRCSTATR,则每次读取TRCSTATR之间都需要一个上下文同步事件,以确保跟踪单元状态的任何变化都能被观察到。

RWPWWS

当对表D4-2中的寄存器发生间接写入或外部写入时,以下两者都可以观察到这些写入:

  • 在有限时间内无需显式同步的直接读取。
  • 无需显式同步的后续间接读取。

表 D4-2 具有可观察性保证的寄存器

寄存器 说明
TRCCLAIMSET 声明标签设置寄存器(Claim Tag Set Register)
TRCCLAIMCLR 声明标签清除寄存器(Claim Tag Clear Register)
TRCCNTVR<n> 计数器值寄存器 <n>(Counter Value Register <n>)
TRCSEQSTR 序列器状态寄存器(Sequencer State Register)
TRCSSCSR<n> 单次比较器控制状态寄存器 <n>(Single-shot Comparator Control Status Register)

RJQTMC

当跟踪单元因直接写入而变为启用或禁用状态时,对于程序中顺序位于该直接写入之前的任何指令,跟踪单元的新状态不会影响跟踪操作。

RKNQWS

当跟踪单元因直接写入而变为启用或禁用状态时,对于程序中顺序位于上下文同步事件之后、且该同步事件位于该直接写入之后的任何指令,跟踪单元的新状态将对任何跟踪操作生效。

注:
控制跟踪单元启用或禁用的寄存器包括:

  • TRCPRGCTLR
  • OSLAR_EL1

SYKGMP

Arm建议在对跟踪单元寄存器进行编程后执行一个上下文同步事件,以确保在恢复正常代码执行之前,所有更新都已同步到跟踪单元。

RWZQWC

当上下文同步事件发生在跟踪单元处于空闲(Idle)或稳定(Stable)状态时(且仅在这些状态下),对跟踪单元寄存器的间接写入保证对直接读取可见。

RGQKGX

当以下任一事件发生时(且仅在这些事件发生时),对跟踪单元寄存器的间接写入保证对间接读取或外部读取可见:

  • 跟踪单元转换到稳定(Stable)状态。
  • 跟踪单元转换到空闲(Idle)状态。

RXLXQL

跟踪单元功能按架构顺序(architectural order)对寄存器执行间接写入和间接读取。

译者注:间接写入/间接读取(Indirect writes/reads)

间接写入和读取是指由跟踪单元内部硬件逻辑自动执行的寄存器访问,而非由外部调试器或软件通过调试接口或系统指令直接发起的访问。例如,跟踪单元在采集跟踪数据时自动更新计数器寄存器(TRCCNTVR)就是间接写入。理解直接访问与间接访问的区别对于正确使用同步机制至关重要。

IRCKQJ

有关编程跟踪单元的更多详细信息,请参见”Trace unit programming states”(跟踪单元编程状态)。


D4.2.2.2 外部调试器寄存器(External debugger registers)

IKNWDX

根据”External debug registers synchronization of changes”(外部调试寄存器变更同步)中的定义,本节将来自外部调试接口的访问称为外部读取(external reads)外部写入(external writes)

IHMNWB

根据”外部调试寄存器变更同步”中的定义:对于外部代理执行的外部读取或外部写入,要使同一代理对同一使用相同地址的寄存器的后续外部读取或外部写入可观察到,不需要显式同步。因此,对于仅在外部调试接口中可访问的寄存器,从来不需要显式同步

IYXWFD

根据”外部调试寄存器变更同步”中的定义:当使用与先前外部写入相同的寄存器编号对该寄存器执行外部写入时,最终结果是第二次写入的值,两次写入访问之间不需要任何上下文同步。

RPGTLX

跟踪单元不需要显式同步即可使外部写入对间接读取可见。

RDYRZC

跟踪单元不需要显式同步即可使外部写入对后续外部读取可见。

IRDFSX

根据”外部调试寄存器变更同步”中的定义:外部写入需要对直接读取可见时,需要显式同步。

RMMYRJ

当跟踪单元处于稳定(Stable)或空闲(Idle)状态时,跟踪单元不需要显式同步即可使间接写入对外部读取可见。

译者注:外部调试寄存器的同步总结

外部调试接口的同步规则可以概括为:

  • 外部写 → 外部读/外部写 → 外部读:不需要同步
  • 外部写 → 间接读:不需要同步
  • 间接写(当跟踪单元处于Stable/Idle时) → 外部读:不需要同步
  • 外部写 → 直接读需要显式同步

这里的”直接读/写”是指通过系统指令(如MSR/MRS)由软件发起的访问,而”外部读/写”是指通过外部调试接口(如JTAG/SWD)由调试器发起的访问。


D4.2.2.3 同步与认证接口(Synchronization and the authentication interface)

RWYWMJ

对认证接口的更改是认证接口控制器对TRCAUTHSTATUS间接写入。认证接口上的更改是否保证仅在上下文同步事件之后或在有限时间内对外部读取该寄存器可见,是**实现定义(IMPLEMENTATION DEFINED)**的。

译者注:IMPLEMENTATION DEFINED(实现定义)

“实现定义”是ARM架构中的另一类规范术语,表示具体行为由芯片实现者(如ARM的授权合作伙伴)自行决定,但实现者必须文档化其选择的行为。这与”CONSTRAINED UNPREDICTABLE”不同——后者是架构允许的合法行为集合,而前者是设计者需要明确选择一个确定的行为并记录在案。

IXVVKN

更多信息,请参见”Synchronization and the authentication interface”(同步与认证接口)。


译者注:本节核心概念总结

  1. ETE寄存器访问方式:通过外部调试接口(4KB地址空间)或系统指令(MRS/MSR)访问。
  2. 同步的核心重要性:对跟踪单元寄存器的修改不会立即生效,需要通过上下文同步事件(异常、ISB等)来确保修改可见。
  3. 直接vs间接访问:直接访问由软件明确发起;间接访问由硬件自动执行。两者的可见性保证不同。
  4. 外部vs内部访问:外部调试接口的访问通常同步需求更少,而内部(系统指令)访问需要严格遵循同步规则。
  5. Stable/Idle状态:跟踪单元处于这两个状态时,数据一致性和可观察性有更强的保证。

D4.3 跟踪元素(Trace Elements)


IFNFWZ

跟踪元素构成一个抽象语法树(AST),用于描述程序执行的控制流。不同的跟踪元素序列可用于表示相同的操作。通过这种方式,FEAT_ETE可以被不同的微架构使用。这与先前跟踪协议中使用的方法类似。更多信息请参见 Arm® 嵌入式跟踪宏单元架构规范,ETMv4 (ARM IHI 0064)。

IXXBMZ

跟踪单元压缩PE执行的信息,并输出由多个编码数据包组成的跟踪字节流。所使用的压缩技术包括:

  • 不为指令跟踪元素流中的每条已执行指令生成跟踪元素
    相反,跟踪单元在执行某些类型的指令时,会在跟踪元素流中生成P0元素。这些特定类型的指令称为P0指令。P0元素在程序流中充当路标,指示执行正沿着给定路径进行。

    因此,P0元素流隐含了更多数量指令的执行,跟踪分析器可以通过使用P0元素流和程序映像,重建在P0元素之间执行的指令流。

  • 单个数据包中包含多个跟踪元素
    跟踪元素的常见序列被编码到单个数据包中。

  • 从跟踪元素流中移除程序地址
    跟踪分析器可以从程序映像和先前历史中推断出地址。这包括直接分支指令的目标地址,其中目标地址编码在指令本身中。

  • 移除可预测的跟踪元素
    如果跟踪元素的内容可以通过软件流中先前的控制流选择来预测,则某些跟踪元素可以从AST表示中移除。例如,如果已经跟踪了到子例程的分支,则可能不需要从子例程返回的目标地址元素。


D4.3.1 层模型(Layer model)

IXMFJT

FEAT_ETE基于层模型。每一层处理跟踪PE的一个独特方面。

Layer 3(层3)
元素(Elements)
推测(Speculation)
数据包层(Packet Layer)
传输层(Transport Layer)

Figure D4-4

IGLPQZ

传输层(Transport Layer)
传输层提供以下任一功能:

  • 通往片外的路径。
  • 通往用于存储跟踪的内存缓冲区的路径。

层1(Layer 1)
层1通过以下方式提供压缩:

  • 将跟踪元素分组形成数据包。
  • 移除可隐含的跟踪元素。
  • 对先前值进行压缩。
  • 前导零压缩。
  • 跟踪元素重排序。

层2(Layer 2)
层2提供:

  • 推测解析(Speculation resolution)。

层3(Layer 3)
在层3:

  • PE行为被转换为跟踪元素。
  • 通过移除可使用程序映像预测的跟踪元素来实现压缩:
    • 直接分支目标地址。
    • 返回栈优化。
  • 解压缩需要了解应用程序的知识。修改指令操作码的过程需要附加信息以允许调试。

D4.3.2 跟踪协议同步(Trace protocol synchronization)

ICLTCM

跟踪单元的跟踪字节流通常存储在循环缓冲区中,如果缓冲区已满,较新的跟踪数据会覆盖较旧的跟踪数据。为了确保当跟踪数据存储在循环缓冲区中时能够分析跟踪流,跟踪单元必须定期在跟踪字节流中生成跟踪协议同步点。

IBPNSY

以下跟踪元素或数据包用于在不同层提供同步信息。

表 D4-3 各层的控制

控制
层3 上下文元素(Context element)和目标地址元素(Target Address element)
层2 跟踪信息元素(Trace Info element)
层1 跟踪信息数据包(Trace Info packet)
传输层 对齐同步数据包(Alignment Synchronization packet)

ISFXXD

每当跟踪分析器接收到一个跟踪信息数据包(Trace Info packet)时,跟踪分析器会接收到关于跟踪当前状态的信息。然而,跟踪分析器在知道指令执行的上下文以及拥有一个用于开始分析的指令地址之前,无法开始分析程序执行。

RPGHPW

当生成跟踪信息元素(Trace Info element)时,跟踪单元会在跟踪信息元素之后不久生成一个上下文元素(Context element)和一个目标地址元素(Target Address element)。

注意
在某些常见用例中,与跟踪协议同步相关的字节数与其他跟踪字节数之比会显著增加,导致跟踪可用性降低。因此,Arm 建议仅在需要时才进行跟踪协议同步。


D4.3.2.1 非周期性跟踪协议同步(Non-periodic trace protocol synchronization)

RQZRMQ

当跟踪单元变为可操作时,会发生非周期性跟踪协议同步。

RTTLJC

当发生非周期性跟踪协议同步时,跟踪单元会在生成任何其他跟踪数据包之前,先在跟踪字节流中生成一个对齐同步数据包(Alignment Synchronization packet)。

RHMDGL

当发生非周期性跟踪协议同步时,跟踪单元会在生成任何其他跟踪元素之前(事件元素和仪器化元素除外),先在跟踪元素流中生成一个跟踪信息元素(Trace Info element)。

IMQNBT

Arm 建议,如果在 ViewInst() 处于非活动状态时收到跟踪协议同步请求,则在发生以下任一情况之前,不应在跟踪字节流中输出对齐同步数据包:

  • ViewInst() 变为活动状态。
  • 输出事件数据包(Event packet)。
  • 输出仪器化数据包(Instrumentation packet)。

IMHGVF

仪器化数据包(Instrumentation packet)的生成独立于 ViewInst() 函数。因此,当 ViewInst() 指示指令跟踪处于非活动状态时,仍可生成仪器化数据包。


D4.3.2.2 周期性跟踪协议同步(Periodic trace protocol synchronization)

IYPRYM

跟踪单元可以被编程为定期生成跟踪协议同步请求,以便在跟踪元素流和跟踪字节流存储在循环跟踪缓冲区中时能够对其进行分析。TRCSYNCPR.PERIOD 控制周期性跟踪协议同步请求。

INTFYC

周期性跟踪协议同步也可以由跟踪捕获基础设施请求,例如在 Arm AMBA ATB 接口上接收到跟踪协议同步请求时。有关 Arm AMBA ATB 接口的更多信息,请参见 AMBA® ATB 协议规范 (ARM IHI 0032)。

RQHHSY

当周期性跟踪协议同步被请求时(无论是通过 TRCSYNCPR.PERIOD 还是其他源),跟踪单元执行周期性跟踪协议同步。

RVMPYW

当发生周期性跟踪协议同步时,跟踪单元生成一个对齐同步数据包。然后跟踪单元生成一个跟踪信息元素,以指示可以开始程序执行跟踪分析的点。如果仅输出事件元素和仪器化元素,则不需要跟踪信息元素。

IQYQRY

Arm 建议,仅当自上一个对齐同步数据包以来有其它跟踪数据包被输出时,才在跟踪字节流中输出对齐同步数据包。这降低了循环缓冲区填满并覆盖跟踪数据的风险。

INQYXW

如果发生两个或更多周期性跟踪协议同步请求,并且这两个请求之间没有生成跟踪数据,则 Arm 建议在生成任何进一步跟踪数据之前,先进行一次非周期性跟踪协议同步。这确保当跟踪长时间处于非活动状态后重新激活时,跟踪流完全同步。


D4.3.2.3 指令跟踪的同步(Synchronization of instruction trace)

RKKQGK

当发生非周期性跟踪协议同步时,跟踪单元在生成任何P0元素之前,先生成一个上下文元素和一个目标地址元素,以为跟踪分析器提供上下文信息和地址信息。

RSVGNN

当发生周期性跟踪协议同步,且在生成相应的跟踪信息元素时 ViewInst() 处于活动状态,则跟踪单元生成一个上下文元素和一个目标地址元素,这些元素为最近未取消的P0元素的目标提供上下文信息和地址信息。

注意
如果跟踪单元在跟踪信息元素之后立即生成上下文元素和目标地址元素,则最近的未取消P0元素可能发生在跟踪信息元素之前。

1
2
3
4
5
6
7
           P0          P0
│ │
───────────┘───────────┘──────────────────> 程序流(Program flow)

Trace Info Target Address P0
│ (目标) │
└────────────────────┘

Figure D4-5

RDLPYX

当发生周期性跟踪协议同步,且在生成相应的跟踪信息元素时 ViewInst() 处于非活动状态,则当 ViewInst() 变为活动状态并生成一个跟踪开启元素(Trace On element)时,跟踪单元在生成任何Atom元素、Q元素或异常元素之前,先生成一个上下文元素和一个目标地址元素。这为跟踪分析器提供了上下文信息和地址信息。

1
2
3
Trace Info     Trace On        Target Address     P0
│ (目标) │
──────────────────────────────────┘───────────────> 程序流

Figure D4-6

IYZPCB

如果取消元素(Cancel element)取消了跟踪信息元素之前的任何P0元素,则跟踪分析器丢弃以下所有内容:

  • 被取消的P0元素。
  • 跟踪信息元素。
  • 跟踪信息元素之后、直到并包括取消元素的所有元素。这包括任何上下文元素或目标地址元素。

注意
在这种情况下,来自被取消的跟踪信息元素的信息仍然可以使用。

1
2
3
4
5
6
7
8
 P0          P0      Trace Info     Target Address     P0
│ │ │ │ (目标) │
─┘───────────┘───────────┘──────────┴────────────────┴───> 程序流

cancel (2)

Target Address │
(目标) │

Figure D4-7

RKGPTB

当生成了一个取消元素,并且该取消元素取消了跟踪信息元素之前的任何P0元素时,跟踪单元会生成一个新的上下文元素和一个新的目标地址元素,这些元素指示最近未被取消的P0元素的目标。

ICHTFM

目标地址元素和上下文元素可能指示跟踪信息元素之前的P0元素的目标,也可能被延迟到下一个P0元素之后,因此指示该P0元素的目标。

注意
如果跟踪单元在下一个新P0元素之前生成了新的上下文元素和目标地址元素,则这可能会阻止指示跟踪信息元素之前某些指令的执行。

如果取消元素取消了跟踪信息元素之后的所有P0元素,但未取消跟踪信息元素之前的任何P0元素,则跟踪单元可能需要立即生成一个上下文元素和一个目标地址元素。这是因为跟踪信息元素之后可能在跟踪元素流中存在上下文元素和目标地址元素,而这些上下文元素和目标地址元素现在已被丢弃。

INSWTK


D4.3.3 跟踪元素流中的推测(Speculation in the trace element stream)

INVBWS

FEAT_ETE 支持跟踪的修正。这可能是由于PE对指令的推测执行进行跟踪所致。

IRTJNK

FEAT_ETE 跟踪单元以与所有其他指令相同的方式跟踪推测执行的指令,因此推测执行的指令和架构执行的指令都出现在指令跟踪元素流中。这意味着跟踪元素流中显示的部分程序执行信息可能是错误的,因为某些推测执行的指令可能是错误推测的。

注意
跟踪中揭示的推测程度是**实现定义(IMPLEMENTATION DEFINED)**的。

IXLLKT

跟踪单元通过生成跟踪元素来解决这个推测问题,以确认指令跟踪元素流中每条指令的状态。也就是说,跟踪单元生成跟踪元素来显示每条指令是已提交执行,还是因错误推测而被取消。这意味着跟踪分析器在接收到指示指令是已提交执行还是因错误推测而被取消的跟踪元素之前,无法知道被跟踪指令的状态。

RZJJKY

当跟踪推测执行的指令时,跟踪单元随后会生成指示这些指令是已提交执行还是已被取消的跟踪元素。

IKYXKZ

跟踪分析器采取适当的操作,可能涉及取消某些跟踪元素,以确定实际的程序执行。

IGGFML

用于确定被跟踪指令状态的跟踪元素称为推测解析元素(speculation resolution elements)。有关推测元素的更多信息,请参见”推测解析元素(Speculation Resolution Elements)”。

RKYGRF

当为推测执行生成跟踪数据时,对于错误推测的执行,跟踪单元不会跟踪任何无法被以与错误推测执行相同或更低特权级别执行的软件访问的信息。

RQHQLY

当上下文同步事件被推测为发生或执行时,跟踪单元不会为该上下文同步事件之后的任何推测执行生成跟踪数据,直到该上下文同步事件被解析。

RLWJCQ

当被推测的上下文同步事件被解析为未发生或未执行时,跟踪单元不会为上下文同步事件之后发生的错误推测执行生成跟踪数据。

RYGSGJ

当退出跟踪禁止(Trace Prohibited)区域被推测为发生时,跟踪单元不会为退出跟踪禁止区域之后的任何推测执行生成跟踪数据,直到退出跟踪禁止区域被解析。

RSRLCG

当被推测的退出跟踪禁止区域被解析为未发生时,跟踪单元不会为退出跟踪禁止区域之后发生的错误推测执行生成跟踪数据。


D4.3.4 跟踪元素流(Trace element stream)

跟踪元素流是一系列描述以下内容的元素的序列:

ILTBWR

  • 跟踪单元所跟踪的PE执行的软件控制路径。
  • 基于事件的跟踪(Event-based trace)。
  • 时间信息(Temporal information)。

ILBSZF

跟踪信息元素(Trace Info element)在跟踪元素流中提供了一个可以开始分析跟踪元素流的点。跟踪信息元素包括关于以下内容的设置信息:

  • 静态跟踪编程,即在跟踪会话期间不会改变的信息,包括是否启用周期计数,以及如果启用,周期计数阈值。
  • 动态信息,即在跟踪会话期间可能改变的信息,例如推测深度(speculation depth),它指示在跟踪信息元素之前跟踪了多少个未解析的P0元素。

D4.3.5 P0元素(P0 element)

ILLDBJ

P0元素隐含了指令的执行。

IXPZXL

P0元素是推测性生成的,必须被提交或取消。有关推测元素的更多信息,请参见”推测解析元素(Speculation Resolution Elements)”。

RXVHWG

P0元素必须按顺序执行顺序生成。


D4.3.5.1 Atom元素(Atom element)

IXPFJG

Atom元素隐含了一条或多条指令已执行,直到并包括下一条P0指令。只有某些指令会生成Atom元素。有关这些指令的信息,请参见”指令和异常分类(Instruction and exception classification)”。

RPRNZH

Atom元素是以下类型之一:

  • E Atom(E原子)
  • N Atom(N原子)

ICYMYM

Atom元素类型的含义取决于其所编码的指令。例如,分支指令如果分支被发生(taken),则表示为E Atom元素;如果分支未发生(not taken),则表示为N Atom元素。


D4.3.5.2 异常元素(Exception element)

IYVMSC

异常元素指示无法通过分析程序映像计算得出的程序流变化,或由非P0指令引起的程序流变化。这种程序流变化被称为异常事件(Exceptional occurrence)

RMKPFJ

异常事件包括以下内容:

  • PE架构异常(PE Architectural exceptions)。
  • ETE定义的异常(ETE defined exceptions)。
  • 实现定义的异常(IMPLEMENTATION DEFINED exceptions)。

IJLZPY

异常元素指示:

  • 已发生一个异常事件。
  • 异常事件的类型。
  • 发生异常事件时的虚拟地址,也称为首选异常返回地址(preferred exception return address)

RDXJBQ

异常元素的首选异常返回地址的指令集是以下之一:

  • AArch64 A64。
  • AArch32 A32。
  • AArch32 T32。

RYPPRH

异常元素是一个P0元素。


D4.3.5.2.1 PE架构异常(PE Architectural exceptions)

RPZRFL

以下异常类型用于指示PE架构异常:

  • IRQ。
  • FIQ。
  • Trap(陷阱)。
  • Call(调用)。
  • Inst fault(指令故障)。
  • Data fault(数据故障)。
  • Inst debug(指令调试)。
  • Data debug(数据调试)。
  • Alignment(对齐异常)。
  • System Error(系统错误)。
  • Debug halt(调试暂停)。

有关PE架构异常与这些异常类型之间映射的信息,请参见”指令和异常分类(Instruction and exception classification)”。

RSFYMW

表 D4-4 定义了PE架构异常的各异常类型的首选异常返回地址。

表 D4-4 PE架构异常的首选异常返回地址

异常类型 首选异常返回地址
IRQ 最后一条已执行指令之后的下一条指令
FIQ 最后一条已执行指令之后的下一条指令
Trap 对于被陷阱的指令或UNDEFINED指令,首选异常返回地址是该指令的地址。对于被陷阱的异常,首选异常返回地址是导致该异常的指令的地址。
Call 调用指令之后的下一条指令
Inst fault 导致该异常的指令
Data fault 导致该异常的指令
Inst debug 导致该异常的指令
Data debug 导致该异常的指令
Alignment 导致对齐异常的指令
System Error 最后一条已执行指令之后的下一条指令
Debug halt 最后一条已执行指令之后的下一条指令,即加载到DLR寄存器中的值。

IGZKGC

系统错误(System Error)的性质意味着执行可能不会完全进行到首选异常返回地址,或者可能在首选异常返回地址之后执行一些操作。此行为是**实现定义(IMPLEMENTATION DEFINED)**的,并可能因异常原因而异。

RGFJZF

当发生不精确的系统错误异常时,首选异常返回地址是发生异常时存储在相关ELR中的地址。

SGKMTH

当发生系统错误异常时,跟踪分析器必须注意,首选异常返回地址可能不指示程序执行被中断的确切点。跟踪分析器不应依赖首选异常返回地址来推断确切执行了哪些指令。此行为仅发生在不精确的系统错误异常中。

RLBLWT

当发生不精确的调试暂停异常时,首选异常返回地址是发生异常时存储在DLR或DLR_EL0中的地址。

SRDJXM

当发生不精确的调试暂停异常时,跟踪分析器必须注意,首选异常返回地址可能不指示程序执行被中断的确切点。跟踪分析器不应依赖首选异常返回地址来推断确切执行了哪些指令。不精确的调试暂停异常只能在调试器的直接控制下发生,通常通过控制EDRCR.CBRRQ实现。


D4.3.5.2.2 ETE定义的异常(ETE defined exceptions)

RMZJTJ

除了Arm架构异常之外,ETE还指定了以下使用异常元素进行跟踪的异常事件:

  • PE复位(PE Reset),指示发生了PE热复位(Warm reset)。

RNRJGC

表 D4-5 定义了ETE定义异常的各异常类型的首选异常返回地址。

表 D4-5 ETE定义异常的首选异常返回地址

异常类型 首选异常返回地址
PE Reset UNKNOWN(未知)

RJRNYF

当发生PE复位时,首选异常返回地址和上下文是UNKNOWN。因此,对于指示PE复位的异常元素,首选异常返回地址和上下文是UNKNOWN。在之前的P0元素和异常元素之间不指示任何指令执行。

IQJYYZ

当发生指示PE复位的异常元素时:

  • 前一个P0元素的目标地址和目标上下文可能是UNKNOWN。
  • 如果在跟踪开启元素(Trace On element)和异常元素之间没有P0元素,则上一个跟踪开启元素之后的初始地址和上下文可能是UNKNOWN。

D4.3.5.2.3 实现定义的异常(IMPLEMENTATION DEFINED exceptions)

RZVYQW

ETE定义了一些是**实现定义(IMPLEMENTATION DEFINED)**的异常类型,包括但不限于:

  • ECC错误纠正(ECC error correction)。
  • 程序执行的通用重放(Generic replay of program execution)。

IXHFLL

实现定义的异常的使用是可选的,并且是实现定义的。实现定义的异常不需要被跟踪,但旨在用于简化某些微架构情况的跟踪。

IDFLDJ

通常,首选异常返回地址是异常发生之前最后一条已执行指令之后的下一条指令的地址。


D4.3.5.3 源地址元素(Source Address element)

IDJTGL

源地址元素指示执行已进行到并包括一个提供的P0指令地址,并指示该P0指令被发生(taken)。除最终P0指令外的所有P0指令都未被发生,这意味着这些P0指令不需要显式跟踪N Atom元素。源地址元素为最终P0指令指示以下两者:

  • 指令集。
  • 指令的虚拟地址。

RHVVRK

源地址元素的指令集是以下之一:

  • AArch64 A64。
  • AArch32 A32。
  • AArch32 T32。

RWTRBB

源地址元素是一个P0元素。


D4.3.5.4 Q元素(Q element)

RJRFYT

Q元素属于指令跟踪元素流中的P0元素组,并且必须被显式解析或取消。

IXPNWS

Q元素可以选择性地包含一个数字M。该数字是自最近P0元素(可能是Q元素)以来已执行的指令计数。如果Q元素不包含指令计数,则自最近P0元素以来已执行的指令数是UNKNOWN。

RXWBMW

跟踪单元按照程序顺序生成Q元素,跟踪协议的编码和解码过程维护此顺序。

RJBYXC

Q元素不隐含异常事件。

RKPNGG

当Q元素隐含一个被发生的异常返回指令时,该指令是Q元素所隐含的最后一条指令。

RYRLJR

当Q元素隐含一条已执行的ISB指令时,如果执行在ISB之后从新的上下文继续,则该指令是Q元素隐含的最后一条指令。

RLZLDH

当在生成Q元素之后从新的上下文继续执行时,跟踪单元在Q元素之后生成一个上下文元素。

IBTNZC

上下文元素可能在Q元素之后也需要的目标地址元素之前或之后生成。

如果在非上下文同步事件的点发生上下文更改,则Q元素隐含的最后一条指令必须是以旧上下文执行的最后一条指令。然后跟踪单元可以在Q元素之后生成一个上下文元素以指示新的上下文。


D4.3.6 虚拟地址空间元素(Virtual Address Space Element)

D4.3.6.1 跟踪开启元素(Trace On element)

RNHDCF

跟踪开启元素指示跟踪元素流中的不连续性。跟踪单元在跟踪元素流生成中断后插入一个跟踪开启元素:

  • 当跟踪生成变为可操作时,且在任何P0元素之前。
  • 如果某些指令被过滤出跟踪。
  • 在以下情况之后首次被跟踪的指令:
    • 跟踪禁止(Trace Prohibited)区域。
    • PE离开调试状态。
  • 当由于跟踪单元缓冲区溢出导致指令跟踪丢失时。

RKMFKP

当生成跟踪开启元素时,跟踪单元在下一条P0元素之前生成一个目标地址元素。

RTJLYH

当生成跟踪开启元素时,跟踪单元在下一个Atom元素、异常元素或Q元素之前生成一个上下文元素,以指示跟踪开始的位置,除非自上一个上下文元素输出以来上下文没有变化。

RJKFBS

当生成第一个跟踪开启元素时,跟踪单元在第一个P0元素之前输出相应的上下文元素。


D4.3.6.2 目标地址元素(Target Address element)

RQWBLT

目标地址元素为下一条要执行的指令指示以下两者:

  • 指令集。
  • 指令的虚拟地址。

RJYKHH

目标地址元素的指令集是以下之一:

  • AArch64 A64。
  • AArch32 A32。
  • AArch32 T32。

RHMWHY

跟踪单元相对于其他P0元素按照程序顺序生成目标地址元素。

IXCKNM

目标地址元素的值可以被另一个目标地址元素纠正,前提是两个目标地址元素都在下一个P0元素或跟踪开启元素之前生成。


D4.3.6.3 上下文元素(Context element)

IKQKFF

上下文元素指示下一条要执行指令的执行上下文。

RVHQYV

上下文元素提供以下上下文信息:

  • 安全状态(Security state)。
  • 异常级别(Exception level)。
  • PE的执行状态(Execution state)。

RWSVRL

上下文元素可以选择性地提供以下上下文信息:

  • 上下文标识符(Context identifier)。
  • 虚拟上下文标识符(Virtual context identifier)。

RWJDWF

跟踪单元相对于P0元素按照程序顺序生成上下文元素。


D4.3.7 时间元素(Temporal elements)

IHHXND

时间元素提供关于跟踪元素流中时间流逝的信息。ETE支持以下时间元素:

  • 周期计数元素(Cycle Count element)
    指示跟踪元素流中PE时钟周期的流逝。

  • 时间戳元素(Timestamp element)
    指示跟踪元素流中时间的流逝。

  • 时间戳标记元素(Timestamp Marker element)
    指示最近的P0元素、事件元素或仪器化元素已被加上时间戳,并且随后的时间戳元素包含时间戳值。


D4.3.7.1 周期计数元素(Cycle Count element)

INVGJP

每个周期计数元素与一个提交元素(Commit element)相关联,当生成提交元素时,也可能生成周期计数元素。

RBZQWX

每个周期计数元素与最近的提交元素相关联。

RVZXNN

周期计数元素指示两个都关联有周期计数元素的最近提交元素之间的PE时钟周期数。

IFHGKM

并非每个提交元素都需要关联一个周期计数元素。

RVNYMN

周期计数元素相对于提交元素按顺序生成。


D4.3.7.2 时间戳元素(Timestamp element)

ILKDJM

时间戳元素将一个全局时间戳值插入到跟踪元素流中。

IBLBJX

时间戳元素中报告的时间戳源由以下寄存器控制:

  • TRFCR_EL1.TS。
  • TRFCR_EL2.TS。

RBRJJF

时间戳值为零表示时间戳值UNKNOWN(未知)。

IVTLTF

UNKNOWN时间戳值可能在系统不支持时间戳或时间戳暂时不可用时发生。

IYQJDR

时间戳元素负载的源由TRFCR寄存器和虚拟计时器控制。预期这些寄存器将由上下文切换软件更改。因此,如果时间戳源发生变化,或者任何上下文切换更改了控制时间戳值的系统寄存器,时间戳元素的负载可能会出现不连续性,甚至倒退。

RMCSGX

如果实现了FEAT_ETEv1p1,则在时间戳元素之前存在时间戳标记元素(Timestamp Marker element)的情况下,时间戳元素包含时间戳标记元素之前以下最近元素的时间戳值:

  • P0元素。
  • 事件元素。
  • 仪器化元素。

RDGTJZ

如果未实现FEAT_ETEv1p1,或者在时间戳元素之前不存在时间戳标记元素,则时间戳元素包含时间戳元素之前以下最近元素的时间戳值:

  • P0元素。
  • 事件元素。
  • 仪器化元素。

IPXZVX

如果TRCIDR0.TSMARK为1且没有先前的时间戳标记元素,则时间戳元素是针对跟踪开始之前的P0元素、事件元素或仪器化元素的。这种情况可能发生在跟踪分析从并非第一个跟踪信息元素的跟踪信息元素开始时,且时间戳标记元素是在跟踪信息元素之前生成的。

ICSZYW

要求每个时间戳元素都有一个时间戳标记元素是为了避免需要在跟踪信息点指示是否存在时间戳标记元素。这使得跟踪分析器可以基于静态信息,假设在跟踪信息之前存在(或不存在)时间戳标记元素。


D4.3.7.3 时间戳标记元素(Timestamp Marker element)

RRFYPT

时间戳标记元素指示最近的P0元素、事件元素或仪器化元素已被加上时间戳,并且将有一个包含时间戳值的时间戳元素紧随其后。

RSZRHP

时间戳标记元素相对于P0元素、事件元素和仪器化元素按顺序生成。

RDCRVK

时间戳标记元素不会被取消元素(Cancel element)取消。

IDLCLX

取消元素可能导致某个P0元素被取消,如果存在与该P0元素关联的时间戳标记元素,则该时间戳标记元素不再与任何P0元素关联。与该时间戳标记元素关联的时间戳元素不受影响,仍然可用于对跟踪流中的大致位置进行时间戳标记。

RVWJVC

如果在两个时间戳标记元素之间没有时间戳元素,则忽略较早的时间戳标记元素。

RJNWJY

如果在时间戳标记元素之后、时间戳元素之前出现了溢出元素(Overflow element)或丢弃元素(Discard element),则忽略该时间戳标记元素。

RLWZXK

如果跟踪单元生成时间戳标记元素,则每个时间戳元素在时间戳元素之前必须有一个对应的时间戳标记元素生成。

IJGKZJ

时间戳标记元素的生成由 TRCIDR0.TSMARK 指示。


D4.3.8 推测解析元素(Speculation Resolution Elements)

IYYMXT

ETE架构允许推测性生成跟踪数据,然后由解压缩过程提交或移除。每个P0元素被跟踪,并被认为是推测性的,直到被提交元素(Commit element)提交或被取消元素(Cancel element)取消。这种生成推测性跟踪数据的方法允许对推测执行进行跟踪。

ISRRZZ

推测解析元素为跟踪分析器提供关于哪些跟踪元素被正确或不正确生成的信息,并确保跟踪分析器能够重建程序执行。ETE支持以下推测解析元素:

  • 错误预测元素(Mispredict element)
    纠正最近的Atom元素。
  • 取消元素(Cancel element)
    指示一个或多个P0元素被取消。
  • 提交元素(Commit element)
    指示一个或多个P0元素已解析为执行。
  • 丢弃元素(Discard element)
    移除所有推测性的P0元素。

IXLHWT

TRCIDR8.MAXSPEC 指定了可以在稍后阶段使用取消元素丢弃的未提交P0元素的最大数量。


D4.3.8.1 提交元素(Commit element)

IKQQML

提交元素指示一定数量的未解析P0元素已被解析为执行。被解析的P0元素是最旧的P0元素。

RPNBGQ

提交元素解析所有类型的P0元素。

IKHYLN

如果被解析的P0元素总数小于 TRCIDR8.MAXSPEC,则提交元素可以被合并。提交元素通过将它们各自的提交计数值相加来合并。

图 D4-8 显示了提交元素的操作示例:

1
2
3
4
5
6
7
8
9
10
P0              P0
F E
D C
B
A

提交 2(Commit 2)

图例: F, E, D, C, B, A = P0元素(从旧到新)
Commit 2 表示提交了2个最旧的P0元素

Figure D4-8


D4.3.8.2 取消元素(Cancel element)

IMRGLC

取消元素指示从执行中取消的最年轻的未解析且未取消的P0元素的数量。跟踪单元可能因多种原因取消元素,包括但不限于:

  • P0指令被错误推测。
  • 发生异常。

RWLTNX

取消元素取消所有类型的P0元素。

INDQKN

如果中间没有生成任何P0元素,则取消元素可以被合并。取消元素通过将它们各自的取消编号相加来合并。

图 D4-9 显示了取消元素的操作示例:

1
2
3
4
5
6
7
8
9
10
P0              P0
F E
D C
B
A

取消 2(Cancel 2)

图例: F, E, D, C, B, A = P0元素(从旧到新)
Cancel 2 表示取消了2个最年轻的P0元素

Figure D4-9


D4.3.8.3 丢弃元素(Discard element)

ITCWCN

当跟踪生成变为非可操作时仍存在未提交的P0元素,或者当未提交P0元素的解析结果无法由跟踪单元输出时,会生成丢弃元素。

ISTXQZ

如果跟踪生成保持非可操作状态,则由P0元素(例如条件P0指令)跟踪的指令结果无法被解析,因此丢弃元素指示必须丢弃所有未提交的P0元素。


D4.3.8.4 错误预测元素(Mispredict element)

IGBKKQ

错误预测元素指示最近未取消的Atom元素具有错误的E或N状态。

IRGVGL

例如,如果分支指令被预测为发生(taken),则使用E Atom元素跟踪。如果该预测变得不正确,则跟踪一个错误预测元素以向跟踪分析器指示该E Atom元素更改为N Atom元素。


D4.3.9 仪器化元素(Instrumentation element)

IZLFFN

仪器化元素指示执行了TRCIT指令。

RBXTXK

如果仪器化跟踪被禁止,则TRCIT指令不生成跟踪数据,并且TRCIT表现为NOP。

RJJZXW

如果跟踪被禁止,则TRCIT指令不生成ETE跟踪数据,并且TRCIT表现为NOP。TraceAllowed() 定义了何时禁止跟踪。

RBWHCS

如果仪器化跟踪未被禁止且跟踪已启用且未被禁止,则执行TRCIT指令请求在ETE跟踪流中生成一个仪器化元素。TraceInstrumentationAllowed() 定义了何时不禁止仪器化跟踪。

RNHJLQ

当请求仪器化元素时,当且仅当TRCIT指令在架构上被执行时,才生成仪器化元素。

RVPFGH

如果无法在需要时生成仪器化元素,则发生跟踪单元缓冲区溢出。

RCJRNL

仪器化元素不会被取消元素丢弃。


D4.3.10 其他元素(Other elements)

D4.3.10.1 事件元素(Event element)

IRBKYZ

事件元素指示一个编程的ETEEvent何时发生,其负载包含一个用于标识ETEEvent编号的数字。参见 TRCEVENTCTL0R 和 TRCEVENTCTL1R 了解任意ETEEvent的编程信息。

RSMLVB

事件元素相对于其他事件元素保持顺序。


D4.3.10.2 溢出元素(Overflow element)

IRFQKZ

溢出元素指示跟踪单元缓冲区已溢出,并且可能已丢失至少一个跟踪元素。


译者注

注1:层模型(Layer 3/2/1/Transport)的分层原因

ARM ETE的层模型采用四层架构,每一层负责跟踪系统中一个独立的关注点:

  • 传输层(Transport Layer) 是最底层,负责将编码后的跟踪数据实际送出去——无论是通过芯片引脚输出到外部跟踪捕获设备,还是写入芯片内部的跟踪缓冲区。它不关心数据内容,只关心传输的物理/协议层面。

  • 层1(数据包层,Packet Layer) 负责将多个跟踪元素打包成数据包,并应用各类无损压缩技术(如增量压缩、前导零压缩、移除可隐含元素等)。这一层的核心目标是减少数据量

  • 层2(推测层,Speculation Layer) 专门处理推测执行带来的不确定性。当CPU推测执行指令时,跟踪单元也会推测性地生成跟踪元素。这一层负责在推测解决后,通过Commit/Cancel等元素来”修正”跟踪流。将推测逻辑独立为一层,使得层1的压缩算法不需要关心推测语义。

  • 层3(元素层,Element Layer) 是最上层,将PE(处理单元)的硬件执行行为抽象为一系列跟踪元素(Atom、Exception、Q元素等)。这一层关注的是”要跟踪什么”,而不关心后续如何压缩或传输。

这种分层设计的核心优势是关注点分离:每一层可以独立优化和实现,不同微架构可以在不改变上层语义的前提下选择不同的压缩/传输策略。

注2:P0元素与P0指令的关系

P0指令和P0元素是不同层面的概念:

  • P0指令 是指令分类中的一个子集。在ARM指令集中,某些指令被归类为P0指令——主要包括分支指令(B、BL、BX等)、条件指令等。这些指令的特点是它们会影响程序控制流,因此需要被跟踪以重建程序执行路径。

  • P0元素 是跟踪元素流中的元素类型。当跟踪单元遇到一条P0指令被执行时,它会在跟踪流中生成一个P0元素(可能是Atom元素、异常元素、Q元素等)。

关系可概括为:P0指令在PE上执行 → 跟踪单元检测到 → 在跟踪流中生成P0元素(某种具体类型的元素)

并非所有执行的指令都会在跟踪流中产生跟踪元素——非P0指令的执行是通过P0元素来”隐含”的。跟踪分析器利用程序映像(Program Image)来推断P0元素之间执行了哪些非P0指令。

注3:推测执行跟踪机制

现代高性能处理器为了提升IPC(每周期指令数),会推测执行(Speculative Execution)指令——即在确认分支条件之前就预测分支方向并提前执行。如果预测正确,性能提升;如果预测错误(mis-speculated),则需要冲刷流水线并恢复正确状态。

ARM ETE的推测跟踪机制设计考虑是:

  1. 推测性生成:跟踪单元对推测执行的指令也生成跟踪元素(Atom元素等),与正常执行没有区别。这意味着跟踪元素流中可能包含”实际上从未发生”的指令。

  2. 延迟解析:每个P0元素在被生成时被认为是”推测性的”(speculative),其最终状态待定。只有当后续出现以下解析元素时,跟踪分析器才能确定这些P0元素的状态:

    • Commit元素:确认这些P0元素对应的指令确实被架构提交(即真正执行了)。
    • Cancel元素:指示因错误推测或异常而取消的P0元素。
    • Mispredict元素:修正Atom元素的E/N状态(如预测为”发生”但实际”未发生”)。
    • Discard元素:当跟踪无法继续时,丢弃所有未决P0元素。
  3. 设计考虑:这种设计意味着跟踪分析器必须有足够的缓冲区来暂存推测性元素,直到收到Commit/Cancel等解析元素。TRCIDR8.MAXSPEC 限制了最大未提交P0元素数量,避免分析器需要无限缓冲。

注4:Atom元素中E/N的含义和编码

Atom元素是P0元素的一种,用于表示P0指令的执行结果。E和N的语义取决于所跟踪的指令类型:

  • 对于条件分支指令(如B.cond)

    • E Atom = 分支发生(taken)。即条件满足,跳转到目标地址执行。
    • N Atom = 分支未发生(not taken)。即条件不满足,顺序执行下一条指令。
  • 对于无条件分支/直接分支

    • 通常隐含E Atom(总是发生),不显式生成Atom元素。
  • E/N的原始含义:在早期的ARM跟踪规范中,E代表”Executed”(已执行/已发生),N代表”Not executed”(未执行/未发生)。在分支指令的上下文中,”已执行”意味着分支被实际执行并跳转(taken)。

在编码层面,Atom元素是跟踪流中最基本的元素之一。E Atom通常编码为1 bit(值为1),N Atom也编码为1 bit(值为0)。多个Atom元素可以被打包到同一个数据包中(如EENN、ENE等序列),以提高编码效率。

注5:Q元素的作用

Q元素是P0元素组中的一个特殊成员,其核心作用和特点包括:

  1. 隐含指令执行:与Atom元素类似,Q元素也隐含了一定数量的指令被执行。Q元素之后跟的上下文信息(Context/Target Address)可以用于重建后续控制流。

  2. 携带可选计数:Q元素可以附带一个计数值M,指示自最近P0元素以来执行的指令数量。如果不带计数,则指令数记为UNKNOWN。

  3. 适用场景:Q元素通常用于以下情况:

    • 当需要在不生成Atom元素的情况下指示指令执行。
    • 当程序流经过一个非P0指令的异常返回。
    • 当执行ISB指令并需要指示上下文切换点。
  4. 与Atom的差异:Q元素不隐含异常事件(Exceptional occurrences),而异常元素本身就是一种异常指示。Q元素必须在后续被明确解析(Commit/Cancel),而Atom元素的状态可以通过Mispredict元素修正。

  5. 触发Context元素生成:如果Q元素隐含的指令执行导致上下文变更(如异常返回后切换安全状态),跟踪单元会在Q元素之后生成Context元素以指示新的执行上下文。

注6:Commit/Cancel/Mispredict/Discard元素的关系

这四个元素都是推测解析元素(Speculation Resolution Elements),用于解决推测执行带来的不确定性,但它们的作用和适用场景不同:

元素 作用 针对目标 语义
Commit 确认P0元素已提交执行 最旧的N个未解析P0元素 “这些指令确实被执行了”
Cancel 取消P0元素 最年轻的N个未解析P0元素 “这些指令被错误推测了”
Mispredict 修正Atom元素的E/N状态 最近未取消的Atom元素 “预测方向错了”
Discard 丢弃所有未提交P0元素 全部未提交P0元素 “无法知道结果,全部丢弃”

关系说明

  • Commit 和 Cancel 是互斥的:一个P0元素要么最终被Commit(确认执行),要么被Cancel(取消)。两者分别从队列的两端操作——Commit处理最旧的(oldest)元素,Cancel处理最年轻的(youngest)元素。

  • Mispredict 是Commit/Cancel的补充:Mispredict只修正最近一个Atom元素的E/N状态,而不增减P0元素的数量。例如:分支预测为”发生”(E Atom),实际”未发生”,则用Mispredict元素将E改为N。之后仍需要Commit来确认该Atom元素已被解析。

  • Discard 是异常终止机制:当跟踪生成被迫停止(如缓冲区溢出、跟踪被禁止),且还有未解析的P0元素时,使用Discard一次性丢弃所有未决元素。Discard不需要逐一计数,是一种清扫操作。

  • 典型处理流程

    1. 推测执行时,跟踪单元生成若干P0元素(Atom等)。
    2. 推测解析后:
      • 正确的路径:生成Commit N,确认N个最旧P0元素正确。
      • 错误路径:生成Cancel N + 新P0元素(新路径),取消N个最年轻错误P0元素并开始新路径跟踪。
      • 预测方向错误:生成Mispredict修正Atom方向,再Commit确认。
    3. 如果中途跟踪停止:生成Discard抛弃所有未决元素。

这种机制允许跟踪分析器在接收到完整的解析信息后,正确地重建出实际(架构上)执行的指令序列,排除掉所有推测错误引入的虚假路径。

D4.4 指令和异常分类(Instruction and Exception Classification)

D4.4

指令和异常分类

INMJBZ

本节定义了所有的P0指令。

RPBVZM

P0指令包含以下所有类别:

  • 直接P0指令(Direct P0 instructions)
  • 间接P0指令(Indirect P0 instructions)

RGFNRJ

直接P0指令包含以下所有类别:

  • 所有直接分支指令(All direct branch instructions)。
  • ISB指令。
  • TSTART指令。
  • WFE、WFET、WFI和WFIT指令,当TRCIDR2.WFXMODE指示时。

间接P0指令包含以下所有类别:

RDJMQM

  • 所有直接P0指令。
  • 所有间接P0指令。

RKJTCL

  • 所有间接分支指令(All indirect branch instructions)。

注意: 本节中所有提及ISB之处均适用于ISB指令的所有变体,包括CP15ISB指令。


D4.4.1 AArch64指令

D4.4.1.1 直接P0指令

RTWTMK

下表描述了A64直接P0指令。

表 D4-6 A64直接P0指令

指令 描述
B 无条件分支(Unconditional Branch)
B.cond 条件分支(Conditional Branch)
BC.cond 一致性条件分支(Branch Consistent conditionally)
BL 带链接的分支(Branch with link)
CB<cc> (immediate) 比较寄存器与立即数并分支(Compare register with immediate and branch)
CB<cc> (register) 比较寄存器并分支(Compare registers and branch)
CBB<cc> 比较字节并分支(Compare bytes and branch)
CBH<cc> 比较半字并分支(Compare halfwords and branch)
CBZ 或 CBNZ 比较零并分支(Compare with zero and branch)
ISB 指令同步屏障(Instruction Synchronization Barrier)
TBZ 或 TBNZ 测试并分支(Test and branch)
WFE, WFET 等待事件(Wait For Event)
WFI, WFIT 等待中断(Wait For Interrupt)

D4.4.1.2 间接P0指令

RLTZGC

下表描述了A64间接P0指令。

表 D4-7 A64间接P0指令

指令 描述
BLR 带链接的分支到寄存器(Branch with link to register)
BLRAA 认证并带链接分支(Authenticate and branch with link)
BLRAAZ 认证并带链接分支(Authenticate and branch with link)
BLRAB 认证并带链接分支(Authenticate and branch with link)
BLRABZ 认证并带链接分支(Authenticate and branch with link)
BR 分支到寄存器(Branch to register)
BRAA 认证并分支(Authenticate and branch)
BRAAZ 认证并分支(Authenticate and branch)
BRAB 认证并分支(Authenticate and branch)
BRABZ 认证并分支(Authenticate and branch)
ERET 从异常返回(Return From Exception)
ERETAA 认证并异常返回(Authenticate and Exception return)
ERETAB 认证并异常返回(Authenticate and Exception return)
RET 从子程序返回(Return From subroutine)
RETAA 认证并函数返回(Authenticate and function return)
RETAASPPC 认证并函数返回(Authenticate and function return)
RETAASPPCR 认证并函数返回(Authenticate and function return)
RETAB 认证并函数返回(Authenticate and function return)
RETABSPPC 认证并函数返回(Authenticate and function return)
RETABSPPCR 认证并函数返回(Authenticate and function return)

D4.4.1.3 异常返回指令

RBVKWS

下表描述了A64异常返回指令。

表 D4-8 A64异常返回指令

指令 描述
ERET 从异常返回(Return From Exception)
ERETAA 认证并异常返回(Authenticate and Exception return)
ERETAB 认证并异常返回(Authenticate and Exception return)

D4.4.1.4 带链接的分支指令

RDVKBK

下表描述了A64带链接的分支指令。

表 D4-9 A64带链接的分支指令

指令 描述
BL 带链接分支(Branch with link)
BLR 带链接分支到寄存器(Branch with link to register)
BLRAA 认证并带链接分支(Authenticate and branch with link)
BLRAAZ 认证并带链接分支(Authenticate and branch with link)
BLRAB 认证并带链接分支(Authenticate and branch with link)
BLRABZ 认证并带链接分支(Authenticate and branch with link)

D4.4.1.5 Atom元素的含义

RHGDNB

下表描述了AArch64 A64中Atom元素的含义。

表 D4-10 AArch64 A64中Atom元素的含义

指令 E N
B 分支已执行(The branch was taken) 保留(RESERVED)
B.cond 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BC.cond 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BL 分支已执行(The branch was taken) 保留(RESERVED)
BLR 分支已执行(The branch was taken) 保留(RESERVED)
BLRAA 分支已执行(The branch was taken) 保留(RESERVED)
BLRAAZ 分支已执行(The branch was taken) 保留(RESERVED)
BLRAB 分支已执行(The branch was taken) 保留(RESERVED)
BLRABZ 分支已执行(The branch was taken) 保留(RESERVED)
BR 分支已执行(The branch was taken) 保留(RESERVED)
BRAA 分支已执行(The branch was taken) 保留(RESERVED)
BRAAZ 分支已执行(The branch was taken) 保留(RESERVED)
BRAB 分支已执行(The branch was taken) 保留(RESERVED)
BRABZ 分支已执行(The branch was taken) 保留(RESERVED)
CB<cc> (immediate) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CB<cc> (register) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CBB<cc> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CBH<cc> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CBZ 或 CBNZ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
ERET 分支已执行且PE已从异常返回(The branch was taken and the PE returned from the Exception) 保留(RESERVED)
ERETAA 分支已执行且PE已从异常返回(The branch was taken and the PE returned from Exception) 保留(RESERVED)
ERETAB 分支已执行且PE已从异常返回(The branch was taken and the PE returned from Exception) 保留(RESERVED)
ISB ISB执行了上下文同步事件,视为已执行(The ISB performed a Context synchronization event and is considered as taken) 保留(RESERVED)
RET 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETAA 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETAASPPC 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETAASPPCR 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETAB 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETABSPPC 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
RETABSPPCR 分支已执行且PE已从子程序返回(The branch was taken and the PE returned from the subroutine) 保留(RESERVED)
TBZ 或 TBNZ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
WFE, WFET 指令已执行,视为已执行(The instruction was executed and is considered as taken) 保留(RESERVED)
WFI, WFIT 指令已执行,视为已执行(The instruction was executed and is considered as taken) 保留(RESERVED)

D4.4.2 AArch32 A32指令

D4.4.2.1 直接P0指令

RGWKSD

下表描述了A32直接P0指令。

表 D4-11 A32直接P0指令

指令 描述
B{<c>} 分支(Branch)
BL 带链接分支(Branch with link)
BLX <immed> 带链接分支并交换指令集(Branch with link and exchange)
ISB 指令同步屏障(Instruction Synchronization Barrier)
WFE 等待事件(Wait For Event)
WFI 等待中断(Wait For Interrupt)

D4.4.2.2 间接P0指令

RDTZVJ

下表描述了A32间接P0指令。

表 D4-12 A32间接P0指令

指令 描述
BLX <reg> 带链接分支并交换指令集(Branch with Link and Exchange)
BX 分支并交换指令集(Branch and Exchange)
BXJ 分支并交换指令集(Branch and Exchange)
修改PC的数据处理指令(Data processing instructions that modify the PC) -
ERET 异常返回(Exception Return)
包含PC的LDM(LDM including the PC) 加载多个寄存器至PC(Load Multiple to the PC)
LDR PC 加载一个字至PC(Load a word to the PC)
RFE 从异常返回(Return From Exception)

D4.4.2.3 带链接的分支指令

RPLXGS

下表描述了A32带链接的分支指令。

表 D4-13 A32带链接的分支指令

指令 描述
BL 带链接分支(Branch with link)
BLX <immed> 带链接分支并交换指令集(Branch with link and exchange)
BLX <reg> 带链接分支并交换指令集(Branch with Link and Exchange)

D4.4.2.4 Atom元素的含义

RYVVSN

下表描述了AArch32 A32中Atom元素的含义。

表 D4-14 AArch32 A32中Atom元素的含义

指令 E N
B{<c>} 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BL 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BLX <immed> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BLX <reg> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BX 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BXJ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
修改PC的数据处理指令(Data processing instructions that modify the PC) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
ERET 分支已执行且PE已从异常返回(The branch was taken and the PE returned from an Exception) 分支未执行且PE未从异常返回(The branch was not taken and the PE did not return from an Exception)
ISB ISB执行了上下文同步事件,视为已执行(The ISB performed a Context synchronization event and is considered as taken) ISB未执行上下文同步事件,视为未执行(The ISB did not perform a Context synchronization event and is considered as not taken)
包含PC的LDM(LDM including the PC) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
LDR PC 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
RFE 分支已执行且PE已从异常返回(The branch was taken and the PE returned from the Exception) 保留(RESERVED)
WFE 指令通过或未通过条件码检查,但视为已执行(The instruction either passed its condition code check or failed its condition code check, but it is considered as taken) 指令未通过条件码检查,视为未执行(The instruction failed its condition code check and is considered as not taken)
WFI 指令通过或未通过条件码检查,但视为已执行(The instruction either passed its condition code check or failed its condition code check, but it is considered as taken) 指令未通过条件码检查,视为未执行(The instruction failed its condition code check and is considered as not taken)

D4.4.3 AArch32 T32指令

D4.4.3.1 直接P0指令

RNRJKR

下表描述了T32直接P0指令。

表 D4-15 T32直接P0指令

指令 描述
B{<c>} 分支(Branch)
BL 带链接的分支(Branch with Link)
BLX <immed> 带链接分支并交换指令集(Branch with Link and Exchange)
CBNZ 比较非零并分支(Compare and Branch on Nonzero)
CBZ 比较零并分支(Compare and Branch on Zero)
ISB 指令同步屏障,包括CP15编码(Instruction Synchronization Barrier, including CP15 encodings)
WFE 等待事件(Wait For Event)
WFI 等待中断(Wait For Interrupt)

D4.4.3.2 间接P0指令

RWXDRS

下表描述了T32间接P0指令。

表 D4-16 T32间接P0指令

指令 描述
BLX <reg> 带链接分支并交换指令集(Branch with Link and Exchange)
BX 分支并交换指令集(Branch and Exchange)
BXJ 分支并交换指令集(Branch and Exchange)
修改PC的数据处理指令(Data processing instructions that modify the PC) -
包含PC的LDM(LDM including the PC) 加载多个寄存器至PC(Load Multiple including to the PC)
LDR to the PC 加载至PC(Load to the PC)
POP {..,PC} 从栈中加载PC(Load the PC from the stack)
RFE 从异常返回(Return From Exception)
TBB 表分支(Table Branch)
TBH 表分支(Table Branch)

D4.4.3.3 带链接的分支指令

RBHLTJ

下表描述了T32带链接的分支指令。

表 D4-17 T32带链接的分支指令

指令 描述
BL 带链接的分支(Branch with Link)
BLX <immed> 带链接分支并交换指令集(Branch with Link and Exchange)
BLX <reg> 带链接分支并交换指令集(Branch with Link and Exchange)

D4.4.3.4 Atom元素的含义

RPLGZG

下表描述了AArch32 T32中Atom元素的含义。

表 D4-18 AArch32 T32中Atom元素的含义

指令 E N
B{<c>} 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BL 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BLX <immed> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BLX <reg> 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BX 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
BXJ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CBNZ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
CBZ 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
修改PC的数据处理指令(Data processing instructions that modify the PC) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
ISB ISB执行了上下文同步事件,视为已执行(The ISB performed a Context synchronization event and is considered as taken) ISB未执行上下文同步事件,视为未执行(The ISB did not perform a Context synchronization event and is considered as not taken)
包含PC的LDM(LDM including the PC) 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
LDR to the PC 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
POP {..,PC} 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
RFE 分支已执行且PE已从异常返回(The branch was taken and the PE returned from the Exception) 分支未执行且PE未从异常返回(The branch was not taken and the PE did not return from the Exception)
TBB 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
TBH 分支已执行(The branch was taken) 分支未执行(The branch was not taken)
WFE 指令通过或未通过条件码检查,但视为已执行(The instruction either passed its condition code check or failed its condition code check, but it is considered as taken) 指令未通过条件码检查,视为未执行(The instruction failed its condition code check and is considered as not taken)
WFI 指令通过或未通过条件码检查,但视为已执行(The instruction either passed its condition code check or failed its condition code check, but it is considered as taken) 指令未通过条件码检查,视为未执行(The instruction failed its condition code check and is considered as not taken)

D4.4.4 异常元素的异常映射编码(Exceptions to Exception element encoding)

RGZQKS

下表显示了异常陷入AArch64状态时的异常映射关系。

表 D4-19 异常陷入AArch64状态时的异常映射

原因(Reason) 类型(Type)
分支目标异常(Branch Target exception) 指令故障(Inst fault)
断点(Breakpoint) 指令调试(Inst debug)
由SME功能引起的异常(Exceptions due to SME functionality) 陷阱(Trap)
EXLOCK异常(EXLOCK exception) 指令故障(Inst fault)
FIQ FIQ
由数据访问引起的GPC异常(GPC exception due to data access) 数据故障(Data fault)
由指令访问引起的GPC异常(GPC exception due to instruction access) 指令故障(Inst fault)
受保护控制栈数据检查异常(Guarded Control Stack Data Check exception) 数据故障(Data fault)
HVC 调用(Call)
暂停调试事件(Halting debug event) 调试暂停(Debug halt)
IRQ IRQ
非法执行状态(Illegal execution state) 陷阱(Trap)
指令中止(Instruction Abort) 指令故障(Inst fault)
由控制位陷入的指令或事件(Instruction or event trapped by a control bit) 陷阱(Trap)
MemCpy或MemSet 陷阱(Trap)
未对齐的PC(Misaligned PC) 对齐异常(Alignment)
PAC失败(PAC Fail) 数据故障(Data fault)
PMU异常(PMU exception) 指令调试(Inst debug)
SError异常(SError exception) 系统错误(System Error)
由HCR_EL2.TSC引起的SMC(SMC due to HCR_EL2.TSC) 陷阱(Trap)
非由HCR_EL2.TSC引起的SMC(SMC other than due to HCR_EL2.TSC) 调用(Call)
由HFGITR_EL2.SVC_EL0或HFGITR_EL2.SVC_EL1引起的SVC 陷阱(Trap)
非由HFGITR_EL2.SVC_EL0或HFGITR_EL2.SVC_EL1引起的SVC 调用(Call)
软件断点指令(Software Breakpoint Instruction) 指令调试(Inst debug)
软件单步(Software Step) 指令调试(Inst debug)
栈指针未对齐(Stack Pointer Misalignment) 对齐异常(Alignment)
同步数据中止(Synchronous Data Abort) 数据故障(Data fault)
由GCSSTR和GCSSTTR引起的陷阱(Traps due to GCSSTR and GCSSTTR) 陷阱(Trap)
UNDEFINED指令(UNDEFINED instruction) 陷阱(Trap)
监视点(Watchpoint) 数据调试(Data debug)

RGPYBB

下表显示了异常陷入AArch32状态时的异常映射关系。

表 D4-20 异常陷入AArch32状态时的异常映射

原因(Reason) 类型(Type)
断点(Breakpoint) 指令故障(Inst fault)
FIQ FIQ
HVC 调用(Call)
暂停调试事件(Halting debug event) 调试暂停(Debug halt)
IRQ IRQ
非法执行状态(Illegal execution state) 陷阱(Trap)
由控制位陷入的指令或事件(Instruction or event trapped by a control bit) 陷阱(Trap)
预取中止(Prefetch Abort) 指令故障(Inst fault)
SError异常(SError exception) 系统错误(System Error)
SMC 调用(Call)
SVC 调用(Call)
软件断点指令(Software Breakpoint Instruction) 指令故障(Inst fault)
同步数据中止(Synchronous Data Abort) 数据故障(Data fault)
UNDEFINED指令(UNDEFINED instruction) 陷阱(Trap)
向量捕获异常(Vector Catch exception) 指令故障(Inst fault)
监视点(Watchpoint) 数据故障(Data fault)

译者注

1. P0/P1/P2指令分类的含义和用途

在ARM嵌入式跟踪扩展(ETE, Embedded Trace Extension)中,指令被分为P0、P1、P2三个类别。这种分类用于跟踪流量压缩——跟踪硬件利用这些分类来决定需要在跟踪流中输出哪些信息,以及可以推断哪些信息:

  • P0指令:在程序流中,P0指令是可能改变程序控制流的指令(即分支指令和屏障指令)。跟踪硬件必须在跟踪流中为P0指令输出一个Atom元素(原子元素,即E/N标记),以指示该指令是否执行(分支是否跳转)。P0指令是跟踪解码的最小必要信息单位。
  • P1指令:P1指令不改变控制流,是那些在指令地址单调递增的指令流中被预测的指令。跟踪硬件不需要为P1指令输出信息,解码器可以推断它们的存在。
  • P2指令:P2指令是跟踪硬件完全不跟踪的指令。它们不会被编码到跟踪流中,解码器假定它们不存在或不会影响程序流。

这种分层分类允许跟踪硬件以最小带宽输出最关键的控制流信息,从而实现高效的实时跟踪。

2. 为什么某些指令被分类为P0

指令被分类为P0的核心原因是:该指令会改变程序计数器(PC)的执行流,解码器无法在不依赖跟踪数据的情况下预测其目标地址。具体来说:

  • 直接分支指令(如B、BL、B.cond):虽然目标地址在指令编码中是固定的,但其是否执行(条件分支)或总是执行(无条件分支)是跟踪解码的关键信息,因此需要P0分类。
  • 间接分支指令(如BR、BLR、RET、ERET、BX):目标地址在运行时从寄存器或栈中获取,解码器完全无法预测,因此必须由跟踪流提供执行信息。
  • ISB指令:指令同步屏障会影响上下文同步事件,这些事件对解码器的状态跟踪至关重要,因此被归为P0。
  • WFE/WFI等指令:这些指令会导致PE进入低功耗等待状态,影响程序流的连续追踪,因此在特定条件下(由TRCIDR2.WFXMODE控制)被分类为P0。
  • 修改PC的数据处理指令(AArch32):在AArch32中,某些数据处理指令(如MOV、ADD等)可以将结果写入PC,从而隐式实现分支。由于解码器无法预知这些指令的运行时数据值,因此归为间接P0指令。
  • TBB/TBH(AArch32 T32):表分支指令的目标地址在运行时从一个内存表中读取,解码器无法预测,因此归为间接P0指令。

3. AArch64与AArch32的P0指令差异

差异点 AArch64(A64) AArch32(A32/T32)
TSTART指令 AArch64直接P0中包含TSTART指令(用于SME扩展的事务启动) 不适用,TSTART仅存在于AArch64
条件分支 独立的BC.cond(分支一致性条件)指令 无BC.cond,统一使用B{c}(条件后缀)
认证指针指令 AArch64间接P0中包含大量PAuth指令(BRAA/BRAB/BLRAA/BLRAB/RETAA/RETAB等系列) AArch32不具有指针认证(Pointer Authentication)扩展
修改PC的数据处理指令 AArch64中不允许数据处理指令直接写入PC,因此不存在此类间接分支 AArch32中数据处理指令可以直接写入PC,因此归为间接P0指令
POP/栈操作 AArch64中RET用于函数返回,无独立的POP {..,PC}形式 T32中POP {..,PC}是一种间接P0指令
TBB/TBH表分支 AArch64中无TBB/TBH指令 T32中TBB和TBH是间接P0指令
CBNZ/CBZ AArch64中CBNZ/CBZ已包含在CB<cc>分类中,属于直接P0 T32中CBNZ/CBZ独立列在直接P0指令表中
BLX指令 AArch64不使用BLX,因为指令集由目标指针的LSB位决定 AArch32使用BLX在ARM和Thumb指令集之间切换
WFE/WFI条件语义 AArch64中WFE/WFI/FET/WFIT认为总是已执行(E),N保留 AArch32 A32/T32中WFE/WFI根据条件码检查结果决定E或N
RFE AArch64不使用RFE AArch32 A32/T32中RFE是从异常返回的间接P0指令
LDR PC/LDM包含PC AArch64中无独立的LDR PC(写入PC需要间接分支指令) AArch32中LDR PC和包含PC的LDM是间接P0指令
异常映射的不同 AArch64有更丰富的异常类型(如PAC Fail、GPC异常、SME相关异常、MemCpy/MemSet、GCS等),反映了AArch64的架构演进 AArch32的异常映射更为传统,包含向量捕获异常(Vector Catch)等特有类型

总的来说,AArch64的P0指令集反映了该架构的现代化设计——引入了指针认证(PAuth)和SME等新特性,同时消除了AArch32中一些隐式修改PC的遗留行为。而AArch32的P0指令集则更加多样化,包含了更多由于架构历史原因产生的间接分支形式。

D4.5 关于ETE跟踪单元(About the ETE Trace Unit)

D4.5

关于ETE跟踪单元

IGBYNF

图D4-10展示了跟踪生成的各个阶段:

Figure D4-10

图D4-10 跟踪生成的各个阶段


D4.5.1 复位跟踪单元(Resetting the trace unit)

RPCXJC

跟踪单元包含一个跟踪单元复位机制,该复位会重置以下所有内容:

  • 跟踪单元跟踪寄存器(trace unit trace registers)。
  • 跟踪单元管理寄存器(trace unit management registers)。

RPTZDH

当跟踪单元核心电源域(Core power domain)上电时,会施加一次跟踪单元复位。

IZXRHG

系统是否有机制可以按需发起跟踪单元复位,这是**实现定义(IMPLEMENTATION DEFINED)**的。

SWVMHS

在具有FEAT_TRF特性的PE中,PE冷复位(Cold reset)会导致EDSCR.TFO复位为0,这意味着在冷复位之后,跟踪被禁止,直到软件明确允许为止。如果需要在冷复位后进行跟踪,调试器必须确保所有相关控制项(包括EDSCR.TFO)都被编程为允许跟踪。对此类寄存器进行编程可能涉及使PE进入调试状态(Debug state),以确保在PE开始执行指令之前可以对这些寄存器进行编程。

RWKLGX

当施加跟踪单元复位时,跟踪单元将所有跟踪单元寄存器的值复位为各个寄存器描述中所述的值。

ICQWFH

其他一些Arm跟踪架构支持跟踪单元的多种复位类型。


D4.5.2 系统行为(System behaviors)

RGFMRH

跟踪单元在有限时间内,无需外部激励即可输出所有跟踪字节流(trace byte stream)。

D4.5.2.1 启用时的行为(Behavior on enabling)

RVBMLV

当以下两个条件同时成立时,跟踪单元处于启用状态:

  • TRCPRGCTLR.EN被设置为1。
  • OS锁(OS Lock)已解锁。

ILFBBP

某些Arm跟踪架构具有专用的跟踪单元OS锁,而ETE依赖于PE的OS锁。

RKBFFQ

当跟踪单元启用时,跟踪单元可以跟踪所有PE执行过程,但以下任何一种情况除外:

  • 发生跟踪单元缓冲区溢出(trace unit buffer overflow)。
  • 认证接口(authentication interface)禁止跟踪某些代码片段。
  • FEAT_TRF或FEAT_TRBE禁止跟踪某些代码片段。

IKCDMH

任何代码序列或PE操作都不例外于此要求。但是,当跟踪单元从启用状态转换到禁用状态,或从禁用状态转换到启用状态时,允许丢失一些跟踪信息。

IGDNWY

当跟踪单元启用时,对大多数跟踪单元跟踪寄存器的写入可能会被忽略。对这些寄存器的写入是否成功是**未知(UNKNOWN)的。当写入成功时,跟踪单元的行为是不可预测(UNPREDICTABLE)**的。

SBXQJH

当跟踪单元启用时,或当TRCSTATR.IDLE指示跟踪单元不空闲时,跟踪分析器(trace analyzer)不得写入大多数跟踪单元跟踪寄存器。

ARM DDI 0487 M.b

版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密

D4-7381

ITPTRW

当跟踪单元启用或空闲时,程序员模型中可见的所有资源可能具有不稳定的值。因此,跟踪分析工具必须意识到,在读取以下值时,它们可能正在动态变化:

  • 计数器值(Counter values),由TRCCNTVR<n>指示。
  • 序列器状态(Sequencer state),由TRCSEQSTR指示。
  • ViewInst启动/停止函数(start/stop function),由TRCVICTLR指示。
  • 单次比较器控制状态(Single-shot Comparator Control status),由TRCSSCSR<n>指示。

RVNGFG

当跟踪单元启用时,跟踪单元不会重置跟踪单元中任何资源的状态,包括计数器、序列器和ViewInst启动/停止函数。

SLMPNV

当跟踪单元禁用时,以及在启用之前,跟踪分析器确保跟踪单元资源被编程为有效的初始状态。

D4.5.2.2 禁用时的行为(Behavior on disabling)

IGZPBM

当跟踪单元禁用时:

  • 跟踪单元无法生成跟踪信息。
  • 跟踪单元资源被禁用。

更多信息,请参见”处于暂停状态时资源的行为”(Behavior of the resources while in the Pausing state)。

RTMLTF

当以下任一条件成立时,跟踪单元处于禁用状态:

  • TRCPRGCTLR.EN被设置为0。
  • OS锁已锁定。

IWSFFP

某些Arm跟踪架构具有专用的跟踪单元OS锁。ETE依赖于PE的OS锁。

RZDTLK

当跟踪单元变为禁用时,跟踪单元停止生成跟踪信息,并通过输出其中任何数据来清空跟踪缓冲区。

RTNYDD

当跟踪缓冲区为空时,在跟踪单元变为禁用后变为空闲后,TRCSTATR.IDLE指示跟踪单元处于空闲状态。

RTMVLW

当跟踪单元变为禁用时,程序员模型中可见的所有资源保留其值,并在这些值上保持稳定。

RQVYMJ

当跟踪单元变为禁用时,当资源稳定时,TRCSTATR.PMSTABLE指示程序员模型(programmers’ model)已稳定。

RGLBHL

当跟踪单元在生成了事件元素(Event elements)后变为禁用时,跟踪单元会在TRCSTATR.IDLE指示跟踪单元空闲之前输出这些Event元素。

RYFLJT

当跟踪单元禁用时,以下陈述成立:

  • 不生成任何跟踪信息。
  • 所有跟踪单元资源和ETEEvents都被禁用。

D4.5.2.3 刷新时的行为(Behavior on flushing)

IXRMWS

允许跟踪单元缓冲跟踪字节流,以便高效利用系统基础设施。

IWHZBD

由于允许跟踪单元延迟将跟踪字节流输出到系统基础设施,因此存在一些系统事件要求所有跟踪字节流对系统中的其他观察者可见。

ICXLCR

使跟踪字节流对其他观察者可见称为跟踪单元刷新(trace unit flush)

RJLRQH

当发生以下任何情况时,会请求一次跟踪单元刷新:

  • 跟踪单元从启用状态转换到禁用状态。
  • 跟踪捕获基础设施(trace capture infrastructure)请求跟踪单元刷新。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7382

  • 在跟踪禁止区域(Trace Prohibited region)中执行TSB CSYNC指令,同时跟踪缓冲区扩展(Trace Buffer Extension)已实现并启用。

IKGJRL

跟踪单元刷新也可能因**实现定义(IMPLEMENTATION DEFINED)**的原因而被请求。例如:

  • 在跟踪单元进入以下状态之前:
    • 低功耗状态(low-power state)。
    • 掉电状态(powerdown state)。
  • PE进入调试状态(Debug state)。

IZWHKM

跟踪单元刷新的一个示例是在Arm AMBA ATB接口上请求的刷新。有关Arm AMBA ATB接口的更多信息,请参见AMBA® ATB协议规范(ARM IHI 0032)。

RHGYLG

当请求跟踪单元刷新时,跟踪单元在响应刷新请求之前执行以下任务:

  1. 将任何剩余的元素编码为跟踪数据包。
  2. 完成正在生成过程中的任何数据包。
  3. 输出在收到刷新请求之前发生的所有PE执行过程的跟踪数据包。

ILMVMT

跟踪单元可能需要将剩余元素编码为跟踪数据包的一个示例是,当存在尚未编码的Commit元素时。

RTWBVY

当跟踪单元正在从跟踪单元缓冲区溢出中恢复时发生跟踪单元刷新,跟踪单元在响应刷新请求之前输出相应的溢出元素(Overflow element)。

IGHKFH

当发生跟踪单元刷新时,跟踪单元要么继续生成跟踪信息,要么停止生成跟踪信息,具体取决于导致跟踪刷新的条件。例如,如果刷新是因为跟踪单元进入禁用状态而发生的,则跟踪在跟踪刷新后变为非活动状态。

RTTDBB

当某个条件同时导致跟踪单元刷新和跟踪单元停止生成跟踪信息时,跟踪单元会在响应刷新请求之前、以及在指示跟踪单元空闲之前,停止生成跟踪信息。

INHBMZ

在进入调试状态时,Arm建议:如果跟踪处于活动状态,则在刷新的跟踪数据中包含指示进入调试状态的异常元素(Exception element)。

RPFHWW

当请求跟踪单元刷新时,跟踪单元在有限时间内输出数据。

RDKFRL

当请求跟踪单元刷新且刷新请求的原因需要确认时,跟踪单元在有限时间内生成确认。

ISCBMG

AMBA ATB上的刷新请求机制是需要确认的刷新请求原因的一个示例。


D4.5.2.4 低功耗状态(Low-power state)

IGHHNW

跟踪单元中的低功耗状态是一种在跟踪生成受限期间提高能效的机制。跟踪单元可能处于低功耗状态的场景包括以下任何一种:

  • PE处于低功耗状态。
  • PE处于调试状态。

RLHDSS

只有在以下任一条件成立时,才允许跟踪单元进入低功耗状态:

  • PE由于等待事件机制(Wait for Event mechanism)而处于低功耗状态。
  • PE由于等待中断机制(Wait for Interrupt mechanism)而处于低功耗状态。
  • PE处于调试状态。
  • 跟踪单元已禁用。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7383


D4.5.2.5 PE处于低功耗状态时跟踪单元的行为(Trace unit behavior when the PE is in a low-power state)

IMSTWP

被跟踪的PE可能支持一种无执行发生的低功耗状态。例如,当PE执行WFI、WFIT、WFE或WFET指令时,可能会调用此低功耗状态。

IDPFXN

当PE处于低功耗状态时,跟踪单元也进入低功耗状态可能是有利的。

RFBMYZ

跟踪单元是否支持低功耗状态是**实现定义(IMPLEMENTATION DEFINED)**的。

RWMPTL

当跟踪单元处于禁用状态时,跟踪单元不会阻止PE进入低功耗状态。

RYLDDV

当跟踪单元处于低功耗覆盖模式(Low-power Override Mode)时,跟踪单元不会影响PE的操作。


D4.5.2.6 低功耗状态下跟踪单元的行为(Trace unit behavior in the low-power state)

RFMXFM

当跟踪单元启用时,在跟踪单元进入低功耗状态后,跟踪单元在整个低功耗状态期间继续表现为启用状态。

RKQVNN

当跟踪单元进入或离开低功耗状态时,跟踪单元不会丢失正在通过跟踪单元传输中的资源事件(resource events),但通过资源的暂停状态(Pausing state)时允许丢失的事件除外。关于在暂停状态下允许丢失的资源事件的更多信息,请参见”处于暂停状态时资源的行为”(Behavior of the resources while in the Pausing state)。

IRVKHK

对跟踪单元进入低功耗状态时正在通过跟踪单元传输中的资源事件的观察,可能直到跟踪单元离开低功耗状态之后才会发生。

RRGFJY

当跟踪单元不处于低功耗状态时,并且在进入低功耗状态之前,资源进入暂停状态(Paused state)。有关资源暂停的更多信息,请参见”处于暂停状态时资源的行为”(Behavior of the resources while in the Paused state)。

IMXHHN

如果将WFI和WFE指令归类为P0指令(参见TRCIDR2.WFXMODE),并且跟踪单元因WFI或WFE指令而进入低功耗状态,Arm强烈建议在跟踪单元进入低功耗状态之前生成以下元素:

  • 表示WFI、WFIT、WFE或WFET指令的Atom元素。
  • 任何待处理的Commit元素。

RLBDSM

当跟踪单元处于低功耗状态时,跟踪单元不生成跟踪信息,包括ETEEvent跟踪信息。

RMFBDT

当跟踪单元处于低功耗状态时,资源保持在跟踪单元进入低功耗状态之前所处的状态。

IQXBYK

这些资源包括:

  • 计数器(Counters)。
  • 序列器(Sequencer)。
  • ViewInst启动/停止函数(start/stop function)。
  • 单次比较器控制(Single-shot Comparator Controls)。

RFHYHC

当跟踪单元处于低功耗状态时,跟踪单元将所有外部输出(External Outputs)驱动为低电平。

RDNKDV

当跟踪单元处于低功耗状态时,PE和外部调试器访问跟踪单元跟踪寄存器和跟踪单元管理寄存器的能力不受影响。

RXTBQX

当跟踪单元处于低功耗状态时,当发生跟踪协议同步请求时,跟踪单元会正确处理该请求。有关跟踪单元如何处理跟踪协议同步请求的更多信息,请参见”跟踪协议同步”(Trace protocol synchronization)。

RTWQJT

当跟踪单元处于保持状态(retention state)时,外部调试器对跟踪单元的访问行为就如同跟踪单元核心电源域没有供电一样。

IRCXZX

当跟踪单元处于低功耗状态时,跟踪单元可能无法识别外部事件,例如任何外部输入(External Inputs)的断言。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7384

IBPQTL

当跟踪单元处于低功耗状态时,周期计数器是否继续计数是**实现定义(IMPLEMENTATION DEFINED)**的。

IVTRBC

当跟踪单元处于低功耗状态时,时间戳请求(timestamp requests)可能会被忽略。

IZTDMB

跟踪单元有可能在PE处于低功耗状态期间间歇性地离开并重新进入低功耗状态。如果发生这种情况,跟踪单元资源在此期间可能会间歇性地变为活动状态。此外,跟踪生成也可能间歇性地变为活动状态,这意味着跟踪单元可能会输出一些数据包。此行为是**实现定义(IMPLEMENTATION DEFINED)**的。

IZVDSF

跟踪单元在离开低功耗状态时,没有额外要求生成跟踪信息元素(Trace Info element)或跟踪开启元素(Trace On element)。但是,如果跟踪单元因为PE处于调试状态而进入低功耗状态,则适用于在离开调试状态后重新启动跟踪的正常要求,包括生成Trace On元素。有关PE调试状态的更多信息,请参见”PE处于调试状态时跟踪单元的行为”(Trace unit behavior while the PE is in Debug state)。

ILQFRD

跟踪单元可以通过启用低功耗覆盖模式(Low-power Override Mode)来进行编程,使其不进入低功耗状态。低功耗覆盖模式通过TRCEVENTCTL1R.LPOVERRIDE进行选择。

RVHSFL

当启用低功耗覆盖模式时,资源继续运行,跟踪单元可以生成跟踪信息。

IFRMMP

低功耗覆盖模式不会影响PE的操作,但它不要求阻止PE进入低功耗状态。这意味着,即使跟踪单元可以生成跟踪信息,它也可能只生成事件元素(Event elements)。


D4.5.3 PE处于调试状态时跟踪单元的行为(Trace unit behavior while the PE is in Debug state)

RXJXQS

当ViewInst处于活动状态时,如果PE进入调试状态,跟踪单元会生成一个Exception元素,指示PE已进入调试状态。

RYMJFJ

当PE进入调试状态时,ViewInst变为非活动状态,并且在PE处于调试状态的整个期间保持非活动状态。

RDPKSC

当PE处于调试状态时,跟踪单元不跟踪:

  • 已执行的指令。
  • 已执行指令的影响。
  • 异常事件(Exceptional occurrences)。

RHBNFJ

当PE退出调试状态并且ViewInst变为活动状态时,跟踪单元生成一个Trace On元素。

RTGFHM

当PE处于调试状态时,ViewInst启动/停止函数保持其状态。

IWFYLQ

如果在PE退出调试状态与PE执行第一条指令之间发生了异常事件,则使用TRCRSR.TA的值来确定是否跟踪该异常事件。通常,如果进入调试状态被跟踪了,那么TRCRSR.TA将被设置为1,因此在退出调试状态时的这个异常事件会被跟踪。

INPQLT

如果PE在处于调试状态时发生PE复位(PE Reset),这被视为离开调试状态。这意味着,如果跟踪未被禁止,并且以下任一条件成立,则会跟踪Trace On元素和指示PE复位的Exception元素:

  • TRCRSR.TA为1。
  • PE复位的强制跟踪(Forced tracing of PE Resets)处于活动状态。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7385


D4.5.4 跟踪单元缓冲区溢出时的行为(Trace unit behavior on a trace unit buffer overflow)

RPQGXB

当发生跟踪单元缓冲区溢出时,跟踪生成将失效,直到跟踪单元能够从溢出中恢复。

RRQHFH

当发生跟踪单元缓冲区溢出时,跟踪单元不会输出不完整的跟踪数据包,即跟踪单元只能输出完整的数据包。

ITDCNT

溢出元素(Overflow element)向跟踪分析器指示发生了跟踪单元缓冲区溢出。关于生成Overflow元素的更多详细信息,请参见”Overflow元素”(Overflow element)。

RDQBDH

当跟踪单元从跟踪单元缓冲区溢出中恢复时,会发生以下情况:

IVQYYH

当生成了Overflow数据包时,跟踪单元可能在输出对齐同步数据包(Alignment Synchronization packet)之前输出以下任何数据包:

  • 事件数据包(Event packet)。
  • 溢出数据包(Overflow packet)。
  • 丢弃数据包(Discard packet)。
  • 忽略数据包(Ignore packet)。

IYYNRQ

  • 跟踪协议同步被请求。
  • 跟踪协议同步发生在跟踪单元输出任何数据包之前。

Arm建议在对齐同步数据包(Alignment Synchronization packet)是溢出数据包之后输出的第一个数据包。


D4.5.5 仪器化扩展(Instrumentation extension)

ITLZTW

FEAT_ITE提供了一种机制,允许软件将仪器化信息(instrumentation information)注入到ETE跟踪流中,从而允许使用软件定义的信息来增强ETE跟踪,这有助于调试和解释ETE跟踪。

IGRJLV

仪器化信息的示例包括以下内容:

  • 正在执行的程序的上下文信息。
  • 函数的参数。
  • 变量和其他数据结构的数据地址和值。

ICMDFW

以下所有寄存器控制FEAT_ITE的行为:

  • TRCITECR_EL1,为EL1提供FEAT_ITE的控制。
  • TRCITECR_EL2,为EL2提供FEAT_ITE的控制。
  • TRCITEEDCR、TRCCONFIGR和EDSCR.TFO,为外部调试器提供FEAT_ITE的控制。
  • MDCR_EL3.EnITE,为访问TRCITECR_EL1和TRCITECR_EL2提供EL3陷阱控制。
  • HDFGRTR2_EL2.nTRCITECR_EL1和HDFGWTR2_EL2.nTRCITECR_EL1,为访问TRCITECR_EL1提供EL2陷阱控制。

RFLGVJ

TRCITECR_EL1和TRCITECR_EL2中提供的控制功能类似于FEAT_TRF提供的TRFCR_ELx。

RRTKDL

如果启用了自托管跟踪(self-hosted trace),则TRCITECR_EL1和TRCITECR_EL2中的控制控制何时禁止仪器化跟踪(Instrumentation trace)。
请参见TraceInstrumentationAllowed()。

RDKCFL

如果自托管跟踪被禁用且TRCCONFIGR.ITO为1,则TRCITEEDCR中的字段控制何时禁止仪器化跟踪。
请参见TraceInstrumentationAllowed()。

ISRTGR

如果自托管跟踪被禁用且TRCCONFIGR.ITO为0,则TRCITEEDCR、TRCITECR_EL1和TRCITECR_EL2中的字段控制何时禁止仪器化跟踪。
请参见TraceInstrumentationAllowed()。

TRCCONFIGR.ITO和TRCITEEDCR允许外部调试器执行以下任一操作:

  • 完全控制允许和禁止仪器化跟踪的时机。
  • 与在PE上运行的软件共享仪器化跟踪允许/禁止的控制。

D4.5.6 跟踪单元电源状态(Trace unit power states)

IGNFXM

Arm架构定义了以下电源状态:

正常(Normal)
跟踪单元核心电源域完全上电,跟踪单元寄存器可访问。

待机(Standby)
跟踪单元核心电源域开启,但采取了降低能耗的措施。待机状态是透明的,意味着对软件和外部调试器而言,它与正常操作无法区分。

保持(Retention)
OS采取一些措施(包括**实现定义(IMPLEMENTATION DEFINED)**的代码序列和寄存器)来降低能耗。跟踪单元寄存器无法访问。离开保持状态时不会发生跟踪单元复位。

掉电(Powerdown)
OS采取一些措施通过关闭跟踪单元核心电源域来降低能耗。跟踪寄存器无法访问。离开掉电状态时会发生跟踪单元复位。

IMNDVQ

跟踪单元可能支持低功耗状态,该状态等同于待机状态。

IBMSVN

跟踪单元可能支持保持状态或掉电状态,这两种状态都被视为跟踪单元核心电源域断电的状态。

IZVBZF

如果跟踪单元实现在与PE电源域分离的电源域中,则以下所有陈述成立:

  • 跟踪单元核心电源域可能能够在PE电源域不掉电的情况下断电。
  • 当PE电源域掉电时,跟踪单元核心电源域始终同时掉电。

ICNZJH

读取TRCPDSR返回有关跟踪单元当前状态的信息。

表D4-21描述了返回值含义。

表D4-21 TRCPDSR值的含义

STICKYPD POWER 含义
0b0 0b1 跟踪单元核心电源域已上电,跟踪单元寄存器可访问。
0b1 0b1 跟踪单元核心电源域已上电,跟踪单元寄存器可访问。发生了跟踪单元复位或电源中断,因此跟踪单元寄存器状态可能无效。

RCMKXK

当跟踪单元核心电源域从断电状态转换到上电状态时,如果跟踪单元寄存器状态在掉电期间得以保留,则TRCPDSR.STICKYPD恢复到掉电前的值。

RFQMXQ

当跟踪单元核心电源域从断电状态转换到上电状态时,如果跟踪单元寄存器状态在掉电期间未保留,则TRCPDSR.STICKYPD被设置为0b1。

:ETE仅支持单个电源域,因此TRCPDSR.POWER始终为0b1。

IFRMBB

系统可能支持一个调试电源域(Debug power domain),其中包含跟踪单元与外部调试器之间的接口。当外部调试器需要连接到系统时,调试电源域通常需要上电。此类调试电源域在”复位和电源域”(Resets and power domains)中有描述。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7387

RGYLKD

如果跟踪单元核心电源域可以独立于调试电源域断电,Arm建议系统实现一个带有上电请求机制(powerup request mechanism)的外部调试组件,该机制可以请求跟踪单元核心电源域上电。

RZNSNS

Arm强烈建议上电请求机制是一个包含跟踪单元父条目(parent entry)的CoreSight Class 0x9 ROM表。组件的父条目是以下之一:

  • ROM表中定位该组件的条目。
  • 第一个ROM表中定位第二个ROM表的条目,而第二个ROM表包含该组件的父条目。

第二个ROM表是第一个ROM表的后代。

ITLYXG

父条目的这个定义是递归的,因此上电请求机制可能位于ROM表层次结构的高层。ROM表及其后代可能描述其他调试组件,包括其他PE的调试组件。ROM表可能在其它ROM表中拥有父条目,而这些父条目也可能在那些ROM表中具有上电请求机制。

RZPCZC

如果实现了上电请求机制,则在包含跟踪单元上电请求机制的Class 0x9 ROM表中:

  • 父条目中的POWERIDVALID位必须为0b1。
  • 父条目中的POWERID字段具有**实现定义(IMPLEMENTATION DEFINED)**的值。

IDXHPS

跟踪单元核心电源域是PE核心电源域还是其他电源域,这是**实现定义(IMPLEMENTATION DEFINED)**的。有关CoreSight Class 0x9 ROM表的更多信息,请参见Arm® CoreSight™架构规范(ARM IHI 0029)。


D4.5.7 PE操作的可视性(Visibility of the PE operation)

IBMPFH

本节描述了跟踪单元跟踪PE操作执行的能力。

RQCFMC

当跟踪单元执行PE系统寄存器的间接读取时,跟踪单元遵循与上下文同步事件(Context synchronization events)相关的规则。

RQHTYC

当跟踪单元执行PE系统寄存器的间接读取时,跟踪单元遵循与TSB CSYNC指令相关的规则,如”跟踪缓冲区扩展”(The Trace Buffer Extension)中所定义。

RQCFSS

当指令在任何跟踪禁止区域(Trace Prohibited region)之外执行时,跟踪单元观察到该执行。

RCDNKX

当可观察的指令被执行时,跟踪单元在PE上下文同步事件发生之前观察到所有执行,如”跟踪缓冲区扩展”中所定义。

RQMBKJ

当在任何跟踪禁止区域之外发生异常事件时,跟踪单元观察到该异常事件。

IXBJFP

执行TSB CSYNC指令会生成跟踪同步事件(Trace synchronization event),如”跟踪缓冲区扩展”中所定义。

RFCBLJ

当在跟踪禁止区域内执行TSB CSYNC指令时,该TSB CSYNC指令不会成为微架构完成(microarchitecturally-finished),直到资源处于暂停状态(Paused state)或跟踪单元处于空闲或稳定状态(Idle or Stable state)。

IJYJDZ

在跟踪禁止区域内执行的TSB CSYNC指令生成跟踪同步事件之后,当跟踪操作为生成该跟踪同步事件的TSB CSYNC指令之前的每个指令(位于生成该跟踪同步事件的上下文同步事件之前)完成微架构完成时,该跟踪同步事件即为微架构完成。

有关TSB CSYNC指令的更多详细信息,请参见RMRVPT。

RXLVQM

当在跟踪禁止区域中执行的TSB CSYNC指令变为微架构完成时,跟踪单元不再生成跟踪信息,直到PE离开跟踪禁止区域。

ICZLXW

当在跟踪禁止区域中执行TSB CSYNC时,关于生成跟踪刷新和在跟踪禁止区域中不再生成跟踪信息的规则意味着只输出完整的跟踪数据包,并且输出的最后一个字节是数据包的结尾。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7388

IGSXJJ

这些规则确保不会生成新的跟踪信息,并允许更改各种系统寄存器(例如那些控制跟踪缓冲区扩展的寄存器),而无需担心在这些寄存器被更改时生成任何跟踪信息。

RXRWPV

当跟踪单元在跟踪禁止区域内被启用时,跟踪单元不会生成任何跟踪信息,直到PE离开跟踪禁止区域。

:这确保在PE离开跟踪禁止区域之前不会生成任何跟踪信息,因此允许更改各种系统寄存器(例如那些控制跟踪缓冲区扩展的寄存器),而无需担心在这些寄存器被更改时生成任何跟踪信息。

IKXDDS

如”跟踪缓冲区扩展”中所定义的跟踪操作可以拆分为由以下任一执行的操作:

  • PE。
  • ETE跟踪单元。
  • 跟踪缓冲区(trace buffer)。

跟踪单元的操作由ETE跟踪操作定义。

RRFJQN

如果跟踪缓冲区单元(Trace Buffer Unit)已实现并启用,则当发生跟踪同步事件时,并且在跟踪单元生成的所有跟踪字节流被刷新到跟踪缓冲区之后,跟踪同步事件完成。

ICNJYL

表D4-22描述了本章中存在的排序图(ordering diagrams)中使用的标签。

表D4-22 排序图标签

符号 名称 描述
po program-order(程序顺序) head在程序顺序上位于tail之后。
rf Reads-from(读取自) tail从head读取。
co Coherence-after(一致性之后) head在一致性顺序上位于tail之后。
fr from-read(从读取) 同co,但head处的操作是读取。
ob Observed-by(被观察) tail被head观察到。仅适用于不同的观察者。
tb traced-by(被跟踪) head是tail处指令的跟踪操作。
gb generated by(由…生成) head是由tail处指令生成的操作。
seo speculative execution-order(推测执行顺序) PE推测head处的指令是在tail之后执行的,但该指令后来被取消了。seo箭头可能与一个can箭头配对来显示这一点。
can canceled(已取消) 当head处的指令被解析时,tail处的指令被取消。

D4.5.7.1 ETE跟踪操作(ETE trace operation)

RYCJXC

每条指令具有以下所有状态信息:

  • PC。
  • PSTATE.T。
  • PSTATE.EL。
  • 安全状态(Security state)。
  • CONTEXTIDR_EL1.PROCID。
  • CONTEXTIDR_EL2.PROCID。
  • TRFCR_EL1。
  • TRFCR_EL2。
  • MDCR_EL3.STE。
  • TxNestingLevel。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7389

IGCLMS

生成的跟踪信息包含在目标地址元素(Target Address elements)、源地址元素(Source Address elements)、异常元素(Exception elements)和Q元素中的地址信息。地址信息包含:

  • 指令的虚拟地址。
  • 指令集,称为sub_isa。

IJTLPL

生成的跟踪信息包含在上下文元素(Context elements)中的上下文信息。上下文信息包含:

  • 当前安全状态(Security state)。
  • 当前异常级别(Exception level)。
  • 当前执行状态(Execution state)。
  • 当前上下文标识符(Context identifier),存储在CONTEXTIDR_EL1.PROCID中。
  • 当前虚拟上下文标识符(Virtual context identifier),存储在CONTEXTIDR_EL2.PROCID中。

RWBCRN

当一条指令被执行并且该指令的所有跟踪元素都已生成时,该指令的跟踪操作完成。

IWXNXB

为一条指令生成的跟踪元素可能包括:

  • 全局时间戳元素(Global timestamp elements)。
  • 周期计数元素(Cycle count elements)。
  • 推测解析元素(Speculation resolution elements)。

IFKTKY

例如,PE执行的跟踪是指:

  • 已解析指令A在程序顺序上先于已解析指令B执行。
  • tA是由于跟踪指令A而生成的所有跟踪元素。
  • tB是由于跟踪指令B而生成的所有跟踪元素。
  • tA的跟踪元素必须在tB之前被观察到。

如图D4-11所示。

Figure D4-11

图D4-11 跟踪操作


D4.5.7.2 对PE行为的影响(Impact on PE behavior)

ILLKFT

ETE架构对跟踪生成对PE功能性能的影响没有要求。Arm期望跟踪单元实现根据被跟踪PE的市场需求和这些PE的跟踪要求来设计。对于某些市场和跟踪需求,跟踪方案可能始终对PE产生一些性能影响,ETE架构不禁止这一点。


D4.5.7.3 PE热复位时的行为(Behavior on a PE Warm reset)

RYYHBF

PE热复位(Warm reset)不会导致跟踪单元复位。

:这确保在PE热复位期间可以继续跟踪。

IQBSCX

PE热复位可能与跟踪单元复位同时发生,但它们是异步且无关的事件。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7390


D4.5.7.4 指令块(Instruction block)

ITYXHR

指令在不同PE设计之间的执行方式可能有显著差异。为了适应这些差异,ETE架构在过滤模型内允许一定的灵活性。过滤模型不是应用于单个指令,而是应用于指令块。

RBQTBL

一个指令块包含一条或多条指令。

RGDZBX

一个指令块可以包含零条或一条P0指令。

RCVJQH

当生成的指令块包含P0指令时,该P0指令位于指令块中的最后一条指令。

RHPJTP

异常事件不会发生在指令块中的指令之间。

RLDJXZ

指令块中指令的地址是连续的。

IJCQHC

块中指令的数量可以在不同块之间变化,并且每次执行相同指令序列时也可以变化。

IHRBJG

例如,指令块的跟踪是指:

  • 已解析指令A在程序顺序上先于已解析指令B执行。
  • tA是由于跟踪指令A而生成的所有跟踪元素。
  • tB是由于跟踪指令B而生成的所有跟踪元素。

如图D4-12所示。

Figure D4-12

图D4-12 指令块跟踪操作


D4.5.7.5 暴露推测(Exposing speculation)

IDCDNQ

对于某些PE微架构,仅跟踪执行顺序可能无法实现。ETE架构提供了跟踪推测执行指令的能力。

RTRVLX

当观察到推测性指令时,跟踪单元通过解析操作(resolve operation)或取消操作(cancel operation)指示每条指令是已解析还是已取消。

RPPJSK

解析操作指示一条或多条指令已经或将要在架构上执行。

RWZBLY

取消操作指示一条或多条指令虽然被跟踪单元观察到,但并未在架构上执行。

IKQYZB

不要求向跟踪单元暴露任何推测信息。

IDKDHD

例如,推测执行的跟踪是指:

  • S在推测执行顺序上位于已解析指令A之后。
  • A在程序顺序上先于已解析指令B执行。
  • S不在推测执行顺序上位于B之后。
  • Q在推测执行顺序上位于已解析指令B之后。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7391

如图D4-13所示。

Figure D4-13

图D4-13 推测跟踪操作的观察


D4.5.7.6 跟踪禁止区域(Trace Prohibited Regions)

ITHCBC

跟踪禁止区域是指令地址区域或PE执行的时间段,这些区域或时间段不被允许跟踪。不被禁止的指令和异常事件不一定会被跟踪,因为跟踪单元具有许多跟踪过滤函数,用于将生成的跟踪量限制在感兴趣的部分或时间段。

IRJYNL

可执行程序可能包含禁止跟踪的代码区域。这些区域可能与另一个安全状态相关联,或与PE进入特权模式以执行其中包含的指令相关联。

当PE在某些状态或模式下操作时,跟踪可能被禁止。例如:

  • 当PE处于安全(Secure)、领域(Realm)或根(Root)状态时,非入侵式调试(Non-invasive debug)可能被禁止。
  • FEAT_TRF可能禁止跟踪。
  • FEAT_TRBE可能禁止跟踪。

如果,在跟踪程序执行期间,认证接口改变了当前允许的非入侵式调试级别,跟踪也可能变为禁止。例如,如果跟踪在被允许并且在PE在安全状态下操作时处于活动状态,然后允许的非入侵式调试级别从安全状态被允许变为不允许,则跟踪变为禁止。

IZPXRJ

跟踪缓冲区扩展(The Trace Buffer Extension)描述了FEAT_TRBE何时禁止跟踪。

RHYZLQ

如果实现了可选的认证接口,当根据该可选认证接口,非安全状态(Non-secure state)之外的安全状态中非入侵式调试被禁用,并且自托管跟踪被禁用时,对于在该安全状态中的执行,PE在跟踪禁止区域中执行。

INVSDD

可选认证接口的一个示例是CoreSight认证接口。更多信息,请参见Arm® CoreSight™架构规范(ARM IHI 0029)。

RFFVYM

当PE从跟踪禁止区域执行代码时,跟踪单元不跟踪指令或异常事件,包括PE复位。

RKTMLZ

当PE从跟踪禁止区域执行代码时,指令地址比较器(instruction Address Comparators)不会匹配跟踪禁止区域中的任何指令。

RSZRZR

当启用周期计数且PE从跟踪禁止区域执行代码时,周期计数器继续计数。

IMCCBH

当PE离开跟踪禁止区域并重新开始跟踪时,周期计数器将在跟踪禁止区域中花费的周期计入周期计数。

ISDSGK

进入跟踪禁止区域时资源的行为在”处于暂停状态时资源的行为”(Behavior of the resources while in the Paused state)中定义。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7392

RVHRGM

当PE从跟踪禁止区域执行代码时,跟踪单元不输出任何可能提供有关跟踪禁止区域内执行信息的跟踪信息。

IJSKLD

跟踪可能提供的关于跟踪禁止区域内执行信息的示例包括执行的上下文、指令地址以及跟踪禁止区域中第一条指令的地址。

IMKQWS

进入跟踪禁止区域的最常见原因是异常事件或上下文同步事件。

RTHBVD

当必须被跟踪的异常事件导致PE进入跟踪禁止区域时,跟踪单元生成一个指示异常类型的Exception元素。

RCKZMR

当PE进入跟踪禁止区域并且跟踪字节流中存在未解析的推测性P0元素时,当推测元素的解析已知时,跟踪单元生成适当的Commit元素或Cancel元素。

RRXMJF

当PE离开跟踪禁止区域并且ViewInst处于活动状态(即应用的任何过滤指示ViewInst处于活动状态)时,跟踪单元生成一个Trace On元素。

IQGFJF

跟踪单元在PE退出跟踪禁止区域且ViewInst处于活动状态时生成Trace On元素的目的是向跟踪分析器指示跟踪元素流中出现了不连续性。

IJBFTB

如果PE离开跟踪禁止区域的方式不是通过上下文同步事件,则允许跟踪禁止区域延伸到下一个上下文同步事件。通常,PE通过上下文同步事件离开跟踪禁止区域,但PE也可能在认证接口更改时,或在从较高安全状态移动到较低安全状态而没有异常返回时,离开跟踪禁止区域。

IDMXPF

如果在PE退出跟踪禁止区域与PE执行第一条指令之间发生异常事件,则使用TRCRSR.TA的值来确定是否跟踪该异常事件。


D4.5.7.7 多线程处理器(Multi-threaded processor)

RKBZTZ

具有多个线程或PE的处理器为每个线程或PE配备一个跟踪单元。

IKHSWQ

处理器可能支持在线程启用和禁用,无论是在PE复位时还是动态地。被禁用的线程的跟踪单元可能表现出以下行为之一:

  • 跟踪单元核心电源域断电。
  • 跟踪单元核心电源域保持在跟踪单元复位状态。

IRFSNL

Arm建议永久禁用线程的跟踪单元不可见:要么不包括,要么在描述系统的任何ROM表中标记为不存在。


D4.5.7.8 在多个PE之间共享(Sharing between multiple PEs)

ITSWXS

以前的跟踪架构允许跟踪单元在多个PE之间共享。

RTLJSQ

跟踪单元仅跟踪单个PE,即不能在多个PE之间共享。


D4.5.8 推测解析(Speculation resolution)

IRKYCD

跟踪单元实现最大的推测深度(maximum speculation depth),即任何时刻允许推测的P0元素的最大数量。TRCIDR8.MAXSPEC指示**实现定义(IMPLEMENTATION DEFINED)**的最大推测深度。

RGLQPL

跟踪单元输出推测性P0元素的数量绝不会超过最大推测深度。

IKCFGW

如果跟踪单元不暴露于任何推测执行,Arm建议跟踪单元实现的最大推测深度为零,在这种情况下:

  • 不生成Cancel元素。
  • 在每个P0元素之后生成Commit元素,使得每个P0元素在生成时立即被解析。指令跟踪协议隐式地为每个P0元素生成这些Commit元素,这意味着不需要显式的Commit数据包。
  • 不生成Mispredict元素。

IQLKDL

ETE架构定义了Commit元素和Cancel元素,以允许跟踪分析器解析P0元素的推测。跟踪单元需要计算被提交或取消的P0元素的数量。有许多方法可以计算这些数字,但在一般情况下的跟踪单元可以使用以下数学过程。

PE可以向跟踪单元推测性地指示指令块。每个指令块被赋予一个标签,其中标签属于0…m,m是PE支持的回滚点(rewind points)的数量。

每个块的指令数量可以是集合N中的任意值,并且每个块最多有一条P0指令。标签的使用顺序可以是随机的,但在具有该标签的前一个块被解析、取消或合并之前,标签不能被重用。

此过程生成一个从核心标签的潜在随机序列到更可用空间的变换。变换T随时间演化,因为标签被重用,并提供了到新空间的映射:

Tt = [c0, …, cm]

ci是核心标签i的映射。
ci属于0…q,其中q大于m。


D4.5.8.1 初始化(Initialization)

IHRDQL

为了执行必要的计算,跟踪单元跟踪最后一个已解析块的变换。γt是最后一个已提交指示符。算法在t=0时初始化为:

∀i ∈ 0, …, m : T0[i] = γ0
x0 = γ0


D4.5.8.2 新块操作(New block operation)

ISMGSG

变换空间中的数字序列xt由以下方程定义:

xt+1 = {
|(xt + 1) mod q| 如果跟踪的P0指令
xt 否则
}

Tt+1[tagt] = {
|(xt + 1) mod q| 如果跟踪的P0指令
Tt[tagt] 否则
}


D4.5.8.3 解析操作(Resolved operation)

IBJFLR

PE可以在一个原子操作中解析一个或多个块。这是通过指示要解析的最年轻块的标签来执行的,并且通过推断,所有更老的块也被解析。

Commit元素所需的数量通过以下方式计算:
n+ = |(Tt[l] - γt) mod q|

变换的状态通过以下方式更新:
γt+1 = Tt[l]

其中l是最年轻块的标签。


D4.5.8.4 取消操作(Cancel operation)

IHJYQH

PE可以在一个原子操作中取消一个或多个块。这是通过指示要取消的最老块来执行的。

Cancel元素所需的数量通过以下方式计算:
n- = |(xt - Tt[r]) mod q|

变换的状态通过以下方式更新:

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7394

xt+1 = Tt[r]

其中r是最老块的标签。


D4.5.9 过滤跟踪生成(Filtering trace generation)

ICCWZG

跟踪单元可能生成的跟踪量可能是巨大的。并非所有PE的操作都总是相关的。通过使用跟踪单元过滤函数可以减少生成的跟踪量。


D4.5.9.1 ViewInst函数(ViewInst function)

RGQFSB

指令跟踪的过滤函数表示为对每条指令计算的表达式。

ViewInsti =

⎪0 当禁止(Prohibited)
⎨0 当处于调试状态(Debug state)
⎪S ∧ I ∧ E ∧ N 否则

其中:

  • Si = ViewInst启动/停止函数(start/stop function)
  • Ii = ViewInst包含/排除函数(include/exclude function)
  • Ei = 异常级别过滤(Exception level filtering)
  • Ni = 基于资源事件的过滤(Resource event based filtering)

RBZXFH

当ViewInst为高时,跟踪单元跟踪所有指令。

IMJMCV

ViewInst为低的指令可能被跟踪。这可能是由于跟踪下一个P0元素或跟踪单元中的优化而导致的。

RXPNZL

当指令块中的一条指令的ViewInst为高时,跟踪单元跟踪整个指令块。

RKHDNX

当ViewInst变为高时,跟踪单元跟踪下一个P0指令或异常事件。

INSMSV

某些指令类型会导致跟踪单元生成P0元素,从而使它们被显式跟踪。然而,其他指令类型不会被显式跟踪。这些其他指令类型的执行可以从P0元素推断出来。这意味着可能出现以下场景:

  1. 当ViewInst为高时,执行了一些指令。这意味着ViewInst指示这些指令必须被跟踪。但是,所执行的指令中没有一条导致跟踪单元生成P0元素,因此没有指令被跟踪。
  2. ViewInst随后变为低。
  3. PE随后执行了一条指令,该指令在ViewInst为高时会导致跟踪单元生成P0元素。

在此场景中,尽管在第3步中执行指令时ViewInst为低,指示该指令不被跟踪,但允许跟踪该指令,因为这是跟踪前面指令的唯一方式。

IFGSBW

如果在程序执行移动到目标地址时ViewInst已转换为低状态,则不要求跟踪P0指令或异常事件的目标地址。

ILCXHX

除非目标指令块被跟踪,否则任何指示P0指令或异常事件目标地址的Target Address元素都不能被依赖。


D4.5.9.1.1 基于资源事件的过滤(Resource event based filtering)

RBQNWP

ViewInst函数中基于资源事件的过滤部分表示为以下方程:

Ni = Fn(TRCVICTLR.EVENT.SEL, TRCVICTLR.EVENT.TYPE)

其中Fn(TRCVICTLR.EVENT.SEL, TRCVICTLR.EVENT.TYPE)选择用于基于资源事件过滤的资源选择器组合。

IKMXNS

基于资源事件的过滤的时序是**实现特定(IMPLEMENTATION SPECIFIC)**的。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7395

IDWWVR

基于资源事件的过滤可用于根据系统条件或跟踪单元资源使ViewInst变为活动状态。例如:

  • 基于周期计数的采样。
  • 在第n次函数调用时激活跟踪。
  • 性能监测单元(Performance Monitoring Unit)事件。

RNBYKR

当在一个周期内由跟踪单元处理指令块时,跟踪单元在该周期内对ViewInst函数资源事件输入进行采样。

RSRMMD

当在一个周期内没有指令块被跟踪单元处理时,跟踪单元在该周期内不对ViewInst函数资源事件输入进行采样。


D4.5.9.1.2 异常级别过滤(Exception level filtering)

IHNPYV

此函数提供了一种简单的方法来过滤掉有关不同异常级别的信息,而无需使用额外的资源。

RLWYJR

ViewInst函数中基于异常级别的过滤部分表示为以下方程:

Ei =

⎪¬TRCVICTLR.EXLEVEL_S_EL0 Secure EL0
⎪¬TRCVICTLR.EXLEVEL_S_EL1 Secure EL1
⎪¬TRCVICTLR.EXLEVEL_S_EL2 Secure EL2
⎪¬TRCVICTLR.EXLEVEL_S_EL3 EL3
⎪¬TRCVICTLR.EXLEVEL_NS_EL0 Non-secure EL0
⎪¬TRCVICTLR.EXLEVEL_NS_EL1 Non-secure EL1
⎪¬TRCVICTLR.EXLEVEL_NS_EL2 Non-secure EL2
⎪¬(TRCVICTLR.EXLEVEL_RL_EL0 ⊕ TRCVICTLR.EXLEVEL_NS_EL0) Realm EL0
⎪¬(TRCVICTLR.EXLEVEL_RL_EL1 ⊕ TRCVICTLR.EXLEVEL_NS_EL1) Realm EL1
⎩¬(TRCVICTLR.EXLEVEL_RL_EL2 ⊕ TRCVICTLR.EXLEVEL_NS_EL2) Realm EL2


D4.5.9.2 ViewInst启动/停止函数过滤(ViewInst start/stop function filtering)

IPJQSC

当需要跟踪一段特定的代码及其调用的所有函数时,ViewInst启动/停止函数非常有用。

ViewInst启动/停止函数使用单地址比较器(Single Address Comparators)和PE比较器输入(PE Comparator Inputs)来定义启动点(start points)和停止点(stop points)。

启动点是以下任何一种:

  • 与使用TRCVISSCTLR.START为ViewInst启动/停止函数选择的单地址比较器匹配的指令地址。
  • 与使用TRCVIPCSSCTLR.START为ViewInst启动/停止函数选择的PE比较器匹配的指令地址。

停止点是以下任何一种:

  • 与使用TRCVISSCTLR.STOP为ViewInst启动/停止函数选择的单地址比较器匹配的指令地址。
  • 与使用TRCVIPCSSCTLR.STOP为ViewInst启动/停止函数选择的PE比较器匹配的指令地址。

可以选择多个启动点。可以选择多个停止点。

RMVDJT

当遇到启动点时,ViewInst启动/停止函数对启动点处的指令变为活动状态。

RCDFBP

当遇到停止点时,ViewInst启动/停止函数在停止点处的指令之后立即变为非活动状态。

RLMQPR

当ViewInst启动/停止函数使ViewInst变为活动状态时,跟踪单元跟踪启动地址处的指令。

RBWXLS

当ViewInst启动/停止函数使ViewInst变为非活动状态时,跟踪单元跟踪到停止地址处的指令为止(包括该指令)。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7396

RXHFYQ

当ViewInst启动/停止函数的启动地址与停止地址相同时,ViewInst启动/停止函数的行为是**不可预测(UNPREDICTABLE)**的。

RKCYTR

ViewInst函数中的ViewInst启动/停止函数部分表示为以下方程:

TRCVICTLR.SSSTATUSi+1 = Si ∧ ¬Stopi
Si = TRCVICTLR.SSSTATUSi ∨ Starti

如果TRCIDR4.NUMPC == 0b0000,则:
Starti = Σn (SAC[n] ∧ TRCVISSCTLR.START[n])
Stopi = Σn (SAC[n] ∧ TRCVISSCTLR.STOP[n])

如果TRCIDR4.NUMPC != 0b0000,则:
Starti = Σn (SAC[n] ∧ TRCVISSCTLR.START[n]) ∨ Σm (PECMP[m] ∧ TRCVIPCSSCTLR.START[m])
Stopi = Σn (SAC[n] ∧ TRCVISSCTLR.STOP[n]) ∨ Σm (PECMP[m] ∧ TRCVIPCSSCTLR.STOP[m])

RMVFYN

以下因素对ViewInst启动/停止函数没有影响:

  • 异常事件(Exceptional occurrences)。
  • 在调试状态中执行。
  • 在跟踪禁止区域中执行。
  • 跟踪单元缓冲区溢出。

RGRSVY

当禁用跟踪单元时,ViewInst启动/停止函数变为静态并保持其状态,直到跟踪单元再次启用。

SXMMLP

对于TRCVICTLR.SSSTATUS、TRCVISSCTLR和TRCVIPCSSCTLR中的每一个,如果该寄存器已实现,则必须在跟踪会话前编程跟踪单元时使用初始状态进行编程。

RHYLDM

如果实现向跟踪单元暴露了推测信息,则ViewInst启动/停止函数表现为好像没有发生推测一样。也就是说,当启动点或停止点处的指令被推测执行并随后被取消时,ViewInst启动/停止函数表现为好像启动点或停止点处的指令未被执行一样。

RBZSXR

当跟踪单元被禁用并且启动点或停止点处仍有推测性指令时,ViewInst启动/停止函数的行为是**实现定义(IMPLEMENTATION DEFINED)**的,并且是以下之一:

  • ViewInst启动/停止函数表现为好像启动点或停止点处的指令被错误推测一样。即,跟踪单元表现为那些启动点和停止点没有发生一样。
  • ViewInst启动/停止函数表现为好像启动点或停止点处的指令被正确推测一样。即,跟踪单元更新ViewInst启动/停止函数的状态,就好像那些启动点和停止点发生了一样。

RHMKSZ

当发生错误推测并且PE返回到跟踪单元启用之前的执行点时,ViewInst启动/停止函数恢复到跟踪单元启用时的状态。

RPBFMY

当ViewInst启动/停止函数的状态由除直接写入TRCVICTLR以外的任何方式更改时,PE将该写入视为对TRCVICTLR.SSSTATUS的间接写入。


D4.5.9.2.1 指令块(Instruction blocks)

RPTTKL

当执行的指令块包含ViewInst启动点处的指令但不包含ViewInst停止点处的指令时,ViewInst启动/停止函数在整个指令块期间保持活动状态。

RWJLMR

当ViewInst启动/停止函数处于活动状态时,如果执行的指令块包含至少一个ViewInst停止地址且不包含ViewInst启动地址,则ViewInst启动/停止函数对整个指令块保持活动状态,并在下一个指令块变为非活动状态,除非下一个指令块包含ViewInst启动地址。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7397

RSMGJZ

当执行的指令块包含至少一条位于ViewInst启动点处的指令和至少一条位于ViewInst停止点处的指令时,ViewInst启动/停止函数遵循块中启动点和停止点的顺序,并具有以下后果:

  • ViewInst启动/停止函数在整个指令块期间处于活动状态。
  • 当块中位于ViewInst启动点或停止点处的最后一条指令位于ViewInst启动点处时,ViewInst启动/停止函数对下一个指令块处于活动状态。
  • 当块中位于ViewInst启动点或停止点处的最后一条指令位于ViewInst停止点处时,ViewInst启动/停止函数对下一个指令块处于非活动状态,除非下一个块包含位于新ViewInst启动点处的指令。

RSFXZB

跟踪分析器确保,对于所有选择为ViewInst启动点或停止点的SAC,任何地址低于另一个SAC的SAC在编号上也低于另一个SAC。也就是说,SAC按照地址顺序包含地址。

IRYPMM

当为ViewInst选择的SAC未按地址顺序包含地址时,ViewInst启动/停止函数的行为是**不可预测(UNPREDICTABLE)**的。

RZLDKC

跟踪分析器确保,对于所有选择为ViewInst启动点或停止点的PE比较器输入,任何地址低于另一个PE比较器的PE比较器在编号上也低于另一个PE比较器。也就是说,PE比较器按照地址顺序包含地址。

ICKTWT

当为ViewInst选择的PE比较器输入未按地址顺序包含地址时,ViewInst启动/停止函数的行为是**不可预测(UNPREDICTABLE)**的。

RVFFWS

如果多个指令地址比较器被编程为相同的指令地址,则将其中一个或多个比较器编程为启动比较器,并将其中一个或多个编程为停止比较器,会导致ViewInst启动/停止函数出现以下**受限不可预测(CONSTRAINED UNPREDICTABLE)**行为:

  • ViewInst启动/停止函数对于该地址处的指令要么处于活动状态,要么处于非活动状态。
  • ViewInst启动/停止函数在该指令之后要么处于活动状态,要么处于非活动状态。

D4.5.9.3 ViewInst包含/排除函数过滤(ViewInst include/exclude function filtering)

INDYFG

在以下情况下,ViewInst包含/排除函数非常有用:

  • 需要将特定范围的指令包含在跟踪中。
  • 需要将特定范围的指令从跟踪中排除。
  • 需要结合包含和排除指令范围。

ILDDGL

ViewInst包含/排除函数由两个函数组成:

函数 含义
ViewInst包含函数(ViewInst include function) 包含一个或多个指令地址范围
ViewInst排除函数(ViewInst exclude function) 排除一个或多个指令地址范围

ViewInst包含/排除函数可使用零到八个指令地址范围比较器(Address Range Comparators)。其中一些比较器可以选择用于ViewInst包含函数,一些用于ViewInst排除函数。

SVNWYT

例如,如果需要从0x00到0x2C地址范围内的所有指令,但不需要其他指令,则可以选择一个地址范围比较器用于ViewInst包含函数,并使用这两个地址对其编程。此地址范围内的所有指令(包括开始和结束地址处的指令)都会被跟踪。

INKLJR

ViewInst包含/排除函数与ViewInst启动/停止函数在以下方面不同:

  • 当使用ViewInst启动/停止函数时,跟踪单元在指定的启动指令地址处开始跟踪,并在指定的停止指令地址处停止跟踪。但是,如果执行分支或跳转到启动点和停止点之间的地址,而没有首先访问启动地址处的指令,则分支或跳转到的指令不会被跟踪。只有在访问了启动地址处的指令,从而触发跟踪单元开始跟踪时,启动/停止范围内的指令才会被跟踪。触发后,随着执行顺序地向停止地址继续,所调用的所有函数都会被跟踪。

ARM DDI 0487 M.b
版权所有 © 2021-2025 Arm Limited或其附属公司。所有权利保留。
非机密
D4-7398

  • 当使用ViewInst包含/排除函数时,例如通过使用包含地址范围编程地址范围比较器,如果执行分支或跳转到该范围内任何指令地址,该指令总是被跟踪。无论是否已访问启动地址处的指令,情况都是如此。

此外,与ViewInst启动/停止函数不同,随着程序执行在地址范围内继续向结束地址推进,所调用的任何函数都不会被跟踪。

RSKZHH

ViewInst函数中的ViewInst包含/排除函数部分表示为以下方程:

Ii = Includei ∧ ¬Excludei

Includei = Σn (ARC[n] ∧ TRCVIIECTLR.INCLUDE[n]) ∨ ∏n ¬TRCVIIECTLR.INCLUDE[n]

Excludei = Σn (ARC[n] ∧ TRCVIIECTLR.EXCLUDE[n])


D4.5.9.3.1 指令块(Instruction blocks)

RRNPWD

当指令块中的一条指令被ViewInst包含/排除函数包含在跟踪中时,ViewInst包含/排除函数会包含整个指令块。

RPLCQJ

当指令块包含至少一条被ViewInst包含/排除函数排除的指令,并且仅当指令块中的所有指令都被排除时,ViewInst包含/排除函数才会排除该指令块。

ILBNVM

如果一个指令块没有被至少一个由TRCVIIECTLR.EXCLUDE选择的单个ARC完全覆盖,则该块是否被排除是**受限不可预测(CONSTRAINED UNPREDICTABLE)**的。即使由TRCVIIECTLR.EXCLUDE选择的其他ARC覆盖了块的其余部分,该规则仍然适用。


D4.5.9.4 解释ViewInst函数结果的指南(Guidelines for interpreting the ViewInst function result)

ITCGMV

ViewInst函数的结果是以下之一:

结果 含义
高(High) 指示正在执行的指令必须被跟踪
低(Low) 预期正在执行的指令不被跟踪

如果预期正在执行的指令不被跟踪,则在某些情况下允许跟踪其中一些指令。本节提供了在什么情况下允许跟踪ViewInst指示不被跟踪的指令的指南。


D4.5.9.4.1 当ViewInst从低转换为高时(When ViewInst transitions from low to high)

IGMYYC

如果在ViewInst为低时发生执行,则在某些情况下允许跟踪单元跟踪指令。有关ViewInst为低的更多信息,请参见”当ViewInst为低时允许跟踪指令的情况”(Occasions when tracing instructions when ViewInst is low is permitted)。

IRVCQT

当ViewInst为低时允许跟踪指令,但如果没有指令或异常事件被跟踪,则跟踪中会出现不连续性。当跟踪中出现不连续性时,当ViewInst变为高时,必须生成一个Trace On元素。

IYXGLK

在ViewInst为高时执行的任何指令都必须被跟踪。


D4.5.9.4.2 当ViewInst为低时允许跟踪指令的情况(Occasions when tracing instructions when ViewInst is low is permitted)

IVFYXG

ETE允许在以下场景中在ViewInst为低时跟踪指令:

  • 当ViewInst指示不应被跟踪的指令与ViewInst指示必须被跟踪的指令位于同一个指令块中时。这是因为跟踪必须被跟踪的指令的唯一方式是跟踪整个指令块。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7399

  • 当ViewInst指示不应被跟踪的指令位于包含ViewInst指示必须被跟踪的指令的指令块之前或之后的指令块中。

实现总是跟踪包含必须被跟踪的指令的指令块。然而,额外的指令块也可能被跟踪。当许多指令在紧密接近的位置执行时,这更可能发生。

ICDLHB

除了提到的场景外,如果ViewInst函数指示一条指令不应被跟踪,则通常预期它不会被跟踪。

IFJMHL

在图D4-14中,指令块1在执行顺序上位于指令块2之前。第二个块的ViewInst计算返回真,如标记为(a)的转换所示。由于此指令块的ViewInst为真,因此该块中的所有指令必须被跟踪,如标记为(b)的转换所示。指令块1可能被跟踪,因为它与块2在同一个PE周期中,如标记为(c)的转换所示。

Figure D4-14

图D4-14 紧密接近位置的示例


D4.5.9.5 跟踪异常事件的规则(Rules for tracing Exceptional occurrences)

RCGVJD

当发生异常事件时,异常事件不会影响ViewInst函数使用的比较器,并且ViewInst函数使用的比较器都不会匹配。

IVFDMQ

ViewInst函数使用的比较器包括以下:

  • 单地址比较器(Single Address Comparators)。
  • 地址范围比较器(Address Range Comparators)。
  • 上下文标识符比较器(Context Identifier Comparators)。
  • 虚拟上下文标识符比较器(Virtual Context Identifier Comparators)。

IVFNZR

当跟踪Exception元素时,它可能指示执行到指定地址的指令。这些指令可能对比较器产生影响,但异常事件本身不会。

这意味着当发生异常事件时,ViewInst函数不指示该异常事件是否必须被跟踪。然而,跟踪异常事件对于确定执行为何偏离了正常程序流程是有用的。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7400

IBVGXZ

当指令执行或异常事件发生在跟踪禁止区域之外时,跟踪单元记住该指令或异常事件是否被跟踪。跟踪单元对TRCRSR.TA执行间接写入以存储此状态。当发生异常事件时,跟踪单元使用TRCRSR.TA来确定是否跟踪该异常事件。

RBFSWZ

当指令执行或异常事件发生在跟踪禁止区域之外并且该指令或异常事件被跟踪时,TRCRSR.TA被设置为1。

RMLTTK

当指令执行或异常事件发生在跟踪禁止区域之外并且该指令或异常事件未被跟踪时,TRCRSR.TA被设置为0。

RCJTJM

当指令或异常事件被取消时,TRCRSR.TA被设置为紧接在被取消的指令或异常事件之前的TRCRSR.TA的值。

RDPMBQ

当发生异常事件时,如果满足以下所有条件,则跟踪该异常事件:

  • PE不处于调试状态。
  • TRCRSR.TA为1。

RBJQDP

当以下任何条件成立时,TRCRSR.TA不受任何执行的影响:

  • PE处于调试状态。
  • PE处于跟踪禁止区域。

RQZPJD

当发生跟踪单元缓冲区溢出时,TRCRSR.TA的行为是**实现定义(IMPLEMENTATION DEFINED)**的,并且是以下之一:

  • TRCRSR.TA被设置为0。
  • TRCRSR.TA被设置为跟踪单元缓冲区溢出发生前最近的指令或异常事件的TRCRSR.TA的值。

D4.5.9.6 强制跟踪异常事件(Forced tracing of Exceptional occurrences)

IMFQND

跟踪单元可以被编程为始终跟踪某些异常事件,无论异常事件之前的指令或异常事件是否必须被跟踪。通过设置以下一个或两个选项来启用此功能:

  • TRCVICTLR.TRCERR设置为1。这强制跟踪单元跟踪系统错误异常(System Error exceptions),无论ViewInst的值如何。
  • TRCVICTLR.TRCRESET设置为1。这强制跟踪单元跟踪PE复位,无论ViewInst的值如何。

RSJXYS

当PE在跟踪禁止区域中执行时,系统错误异常的强制跟踪是非活动状态的。

RVLNMN

当PE不在跟踪禁止区域中执行并且系统错误异常的强制跟踪已启用时,系统错误异常的强制跟踪是活动状态的。

RLTLBB

当系统错误异常的强制跟踪处于活动状态时,当发生系统错误异常时,跟踪单元生成一个指示系统错误异常的Exception元素,无论ViewInst的值如何。

RNCXJN

当PE在跟踪禁止区域中执行时,PE复位的强制跟踪是非活动状态的,无论PE复位是否导致PE离开跟踪禁止区域。

RNQJNL

当PE不在跟踪禁止区域中执行,并且PE复位的强制跟踪已启用时,PE复位的强制跟踪是活动状态的。

RGPKSH

当PE复位的强制跟踪处于活动状态时,当发生PE复位时,跟踪单元生成一个指示PE复位的Exception元素,无论ViewInst的值如何。

RBBBBT

当跟踪处于非活动状态时,在由于强制跟踪PE复位或系统错误异常而生成Exception元素之前,跟踪单元生成一个Trace On元素,然后生成一个Target Address元素。

ILXLKS

当由于强制跟踪而生成Exception元素时,在Exception元素之前生成的Trace On元素指示跟踪变为活动状态,Target Address元素指示跟踪变为活动状态的位置。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7401

RNZNDM

当发生系统错误异常且TRCRSR.TA为0,并且由于启用了系统错误异常的强制跟踪而跟踪该异常时,TRCRSR.TA是被设置为1还是保持为0是**实现定义(IMPLEMENTATION DEFINED)**的。

RYFKGM

当发生PE复位且TRCRSR.TA为0,并且由于启用了PE复位的强制跟踪而跟踪该PE复位时,TRCRSR.TA是被设置为1还是保持为0是**实现定义(IMPLEMENTATION DEFINED)**的。

IGWHRM

在系统错误异常大约与退出跟踪禁止区域同时发生、在跟踪禁止区域内所有执行之后、在跟踪禁止区域外任何指令执行之前的场景中,该系统错误异常被视为发生在跟踪禁止区域内部还是外部是**不可预测(UNPREDICTABLE)的。系统错误异常的强制跟踪对此异常是否活动也是不可预测(UNPREDICTABLE)**的。
这些场景不包括系统错误异常导致退出跟踪禁止区域的场景,因为系统错误异常发生在跟踪禁止区域内部。

IJGVSY

在系统错误异常大约与进入跟踪禁止区域同时发生、在跟踪禁止区域之前所有执行之后、在跟踪禁止区域内任何指令执行之前的场景中,该系统错误异常被视为发生在跟踪禁止区域内部还是外部是**不可预测(UNPREDICTABLE)的。系统错误异常的强制跟踪对此异常是否活动也是不可预测(UNPREDICTABLE)**的。
这些场景不包括系统错误异常导致进入跟踪禁止区域的场景,因为系统错误异常发生在跟踪禁止区域外部。

RTSVKN

当系统错误异常在PE退出跟踪禁止区域后立即发生并且该系统错误异常被跟踪时,指示该系统错误异常的Exception元素中的首选异常返回地址(preferred exception return address)不包含有关跟踪禁止区域的信息。

IPXJWM

在PE复位大约与退出跟踪禁止区域同时发生、在跟踪禁止区域内所有执行之后、在跟踪禁止区域外任何指令执行之前的场景中,该PE复位被视为发生在跟踪禁止区域内部还是外部是**不可预测(UNPREDICTABLE)的。PE复位的强制跟踪对此PE复位是否活动是不可预测(UNPREDICTABLE)**的。
这些场景不包括PE复位导致退出跟踪禁止区域的场景,因为PE复位发生在跟踪禁止区域内部。

IJKQHF

在PE复位大约与进入跟踪禁止区域同时发生、在跟踪禁止区域之前所有执行之后、在跟踪禁止区域内任何指令执行之前的场景中,该PE复位被视为发生在跟踪禁止区域内部还是外部是**不可预测(UNPREDICTABLE)的。PE复位的强制跟踪对此PE复位是否活动是不可预测(UNPREDICTABLE)**的。
这些场景不包括PE复位导致进入跟踪禁止区域的场景,因为PE复位发生在跟踪禁止区域外部。

RNRNFS

当PE复位在PE退出跟踪禁止区域后立即发生并且该PE复位被跟踪时,指示该PE复位的Exception元素中的首选异常返回地址不包含有关跟踪禁止区域的信息。


D4.5.10 元素生成(Element Generation)

D4.5.10.1 Trace Info元素生成(Trace Info element generation)

RTFQRM

当处理跟踪协议同步请求时,跟踪单元生成一个Trace Info元素,以指示可以从何处开始程序执行跟踪分析。Trace Info元素不需要指示可以从何处开始Event元素和Instrumentation元素的分析。

:不要求在每次ViewInst变为活动状态时都生成新的Trace Info元素。这是因为,尽管过滤引起了跟踪不连续性,但跟踪的编程保持不变。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7402


D4.5.10.2 Atom元素(Atom element)

RXCJGD

当一条P0指令被执行时,跟踪单元生成以下之一:

  • 一个E Atom元素。
  • 一个Source Address元素。

RSRYKV

当一条P0指令未被执行时,跟踪单元生成以下之一:

  • 一个N Atom元素。
  • 不生成任何内容。

RTZZRH

当一条P0指令未被执行并且跟踪单元未生成N Atom元素时,对于所有后续未执行的P0指令,直到下一个被执行的P0指令或异常事件,跟踪单元都不生成N Atom元素。

RNZTGQ

当一条P0指令未被执行并且跟踪单元未生成N Atom元素时,如果在下一个被执行的P0指令之前发生异常事件,跟踪单元生成一个Exception元素。

RFWCQR

当一条P0指令未被执行并且跟踪单元未生成N Atom元素时,如果在下一个被执行的P0指令之前没有发生异常事件,跟踪单元为下一个被执行的P0指令生成一个Source Address元素。

RNTMMM

当一条P0指令未被执行并且跟踪单元未生成N Atom元素,并且该P0指令随后被错误预测时,跟踪单元生成一个Source Address元素并且不生成Mispredict元素。

RZRYPK

跟踪单元按照P0元素发生的程序顺序生成Atom元素,跟踪协议编码和解码过程维护此顺序。

ITGQNB

对于条件分支指令,E Atom元素指示该指令通过了条件码检查,而N Atom元素指示该指令未通过条件码检查,尽管跟踪单元可能使用Mispredict元素来修改Atom元素。

IBXBNQ

跟踪单元可能使用E Atom元素或N Atom元素来跟踪无条件P0指令。

RRNYNV

当使用N Atom元素跟踪无条件P0指令时,跟踪单元生成Mispredict元素或Cancel元素来纠正N Atom元素。

RLMDZV

当ISB指令未通过条件码检查,并且ISB指令未执行上下文同步事件时,跟踪单元将ISB指令视为未执行的指令。

RNZPLB

当ISB指令未通过条件码检查,但ISB指令执行了上下文同步事件时,跟踪单元将ISB指令视为已执行的指令。

RCPFBS

当ISB指令通过条件码检查时,跟踪单元将ISB指令视为已执行的指令。

:对于ISB指令,跟踪分析器不得从Atom元素推断PSTATE条件标志的值。

RQBGXJ

跟踪单元是否将WFI、WFIT、WFE和WFET指令分类为P0指令是**实现定义(IMPLEMENTATION DEFINED)**的。当WFI、WFIT、WFE和WFET被分类为P0指令时,执行这些指令会生成一个Atom元素。请参见”低功耗状态”和TRCIDR2.WFXMODE。

RHJHHV

当WFI、WFIT、WFE和WFET指令被分类为P0指令,并且执行条件WFE或WFI指令时,如果该指令通过了条件码检查,则生成一个E Atom元素。

RBMXDT

当WFI、WFIT、WFE和WFET指令被分类为P0指令,并且执行条件WFE或WFI指令时,如果该指令未通过条件码检查,则生成E Atom元素或N Atom元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7403

:对于被分类为P0指令的WFI、WFIT、WFE或WFET指令,跟踪分析器不得从E Atom元素推断PSTATE条件标志的值。

IPZRCT

未通过或预测未通过条件码检查的P0指令要么生成未定义指令异常(Undefined Instruction exception),要么作为NOP执行(如果该指令也是UNDEFINED的)。

RYCRVD

当P0指令未通过或预测未通过条件码检查,并且P0指令作为NOP执行时,跟踪单元为该P0指令生成一个N Atom元素。

RTSQGH

当P0指令未通过或预测未通过条件码检查,并且P0指令生成未定义指令异常时,跟踪单元不为该指令生成Atom元素,而是生成一个Exception元素。生成的Exception元素的首选异常返回地址是UNDEFINED指令,指示该指令未执行。

RNQPPX

跟踪单元推测性地生成所有Atom元素,并通过生成Commit元素或Cancel元素来显式解析或取消每个Atom元素。

INGJYB

跟踪分析器可以从Atom元素推断执行,但只有在Atom元素已被Commit元素解析之后。

SMFDNZ

对于已执行的直接P0指令,跟踪分析器必须从程序镜像中的操作码推断目标地址和指令集。

STJSRY

如果已执行的直接P0指令来自分支广播区域(branch broadcasting region),则跟踪分析器不需要推断目标地址和指令集,因为这已使用Target Address元素显式跟踪。


D4.5.10.3 异常元素(Exception element)

RQHRVX

当发生异常事件时,如果需要跟踪该异常事件,跟踪单元生成一个Exception元素。

RLYYMG

跟踪单元在相对于其他P0元素的程序顺序中生成Exception元素。

IPCMYT

为了与生成Target Address元素的规则保持一致,在以下场景中,跟踪单元必须在Exception元素之前生成一个Target Address元素,除非该Target Address元素因返回栈匹配(return stack match)而被移除:

  • 异常事件是从已执行的间接P0指令的目标获取的。
  • 异常事件是从分支广播区域中已执行的直接P0指令的目标获取的。
  • 异常事件是从另一个Exception元素的目标获取的。

RXGXKK

当发生异常事件时,如果Exception元素之前的P0元素的目标处的上下文信息发生了变化,则跟踪单元在Exception元素之前生成一个Context元素。Context元素提供有关从中获取异常事件的地址和上下文的上下文信息。

ICMRCN

无效地址(invalid address)是bits[63:P]不全为零或不全为1的地址,其中P定义如下:

  • 当实现了FEAT_LVA3时,为56。
  • 当实现了FEAT_LVA时,为52。
  • 否则,为48。

RRJCBT

当PE尝试在无效地址处执行指令并且跟踪单元生成Exception元素时,Exception元素中的首选异常返回地址指示以下之一:

  • 完整的64位无效地址。
  • 任何其他无效地址,其地址bits[P-1:0]与完整无效地址相同。

IGYJKB

当发生到无效地址的分支并且为从该无效地址获取的异常生成了Exception元素时,Arm建议Exception元素中的首选异常返回地址与此分支的Target Address元素指示的无效地址相同。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7404


D4.5.10.4 源地址元素(Source address element)

RDCHPQ

当必须被跟踪的P0指令未被执行并且跟踪单元未生成N Atom元素时,当后续的P0指令被执行时,跟踪单元生成一个Source Address元素。

IKDTRV

跟踪单元可以生成Source Address元素来暗示至少一条指令(包括已执行的P0指令)已被执行。

RWVBQW

当跟踪单元生成Source Address元素来暗示已执行的P0指令时,与该Source Address元素关联的地址是该已执行的P0指令的虚拟地址。


D4.5.10.5 Q元素(Q element)

RFZTZP

跟踪单元可以生成Q元素来暗示至少一条指令(可能包括P0指令)已被执行。

RWHLPS

当生成Q元素时,跟踪单元生成一个Target Address元素,指示在Q元素隐含的所有指令执行完毕后执行应继续的位置。

RMNWCK

当生成Q元素并且Q元素隐含的最后一条指令是P0指令时,跟踪单元生成一个Target Address元素,指示该P0指令的目标地址。

RBJLRS

当生成Q元素并且Q元素隐含的最后一条指令不是P0指令时,跟踪单元生成一个Target Address元素,指示紧跟在Q元素隐含的最后一条指令之后的指令地址。

RFPHFM

当PE通过P0指令或顺序执行离开允许使用Q元素的区域时,如果Q元素暗示了该区域中最后一条指令的执行,则Q元素不会暗示该区域中最后一条指令之后的任何更多指令。

RDTWYZ

当PE通过P0指令或异常事件进入允许使用Q元素的区域时,跟踪单元使用Q元素以外的元素来跟踪该P0指令或异常事件。

:尽管跟踪单元不使用Q元素跟踪导致PE进入允许使用Q元素的区域的P0指令或异常事件,但该区域中任何后续指令可能使用Q元素进行跟踪。

IYRZWY

当PE通过顺序执行进入允许使用Q元素的区域时,自允许区域外的最后一个P0元素以来执行的任何指令都可能使用Q元素进行跟踪。这些指令始终可以从Q元素中唯一地推断出来。

RSJSGX

当PE通过顺序执行进入允许使用Q元素的区域,并且自允许区域外的最后一个P0元素以来执行的P0指令由Q元素跟踪时,该Q元素不指示允许区域外的任何P0指令的执行。


D4.5.10.6 事件元素(Event element)

RWJPTB

跟踪单元独立于ViewInst生成Event元素。

RKKLYB

当TRCEVENTCTL1R.INSTEN<n>为1且TRCEVENTCTL0R.EVENT<n>选择的资源事件处于活动状态时,在跟踪生成有效期间,跟踪单元在每个PE时钟周期上生成一个Event元素<n>。

RSPYTT

当在两个P0元素之间或与一个P0元素同时(该P0元素跟随另一个P0元素)生成Event元素时,跟踪单元在第一个P0元素之后但在第一个P0元素之后**实现定义(IMPLEMENTATION DEFINED)**数量的P0元素处插入Event元素。

IXLJKP

Arm建议**实现定义(IMPLEMENTATION DEFINED)**的P0元素数量小于或等于PE可以同时处理的P0元素数量。

RSHYMY

当由于跟踪单元缓冲区溢出导致跟踪生成失效时,当编程的ETEEvent <n>发生时,跟踪单元在生成对应于跟踪单元缓冲区溢出的Overflow元素之前,至少生成一个Event元素<n>。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7405


D4.5.10.7 Cancel元素生成(Cancel element generation)

RHYCXR

当一个或多个P0元素被取消时,跟踪单元生成一个Cancel元素。

RGKDYR

跟踪单元相对于P0元素按执行顺序生成Cancel元素。

RKDTVX

当Cancel元素导致执行返回到程序流中不与P0指令相邻的点时,跟踪单元在生成任何P0元素之前生成一个指示哪些指令被执行到程序流中该点的Exception元素。


D4.5.10.8 Commit元素生成(Commit element generation)

RQNLYJ

当一个或多个被跟踪的P0元素被解析为执行时,跟踪单元生成一个Commit元素。

IMDSCN

Atom元素可以在被解析后使用Mispredict元素进行纠正。

RMNXTW

跟踪单元生成的推测性P0元素数量绝不会超过跟踪单元的最大推测深度。

RXXFBC

当由于跟踪单元被禁用而导致跟踪生成失效时,跟踪单元输出任何尚未输出的Commit元素。

IBNLZT

如果启用了周期计数,某些Commit元素具有关联的Cycle Count元素,这些元素提供处理器时钟周期的计数。Cycle Count元素中给出的周期计数值可用于获得累计计数。

RZHWDD

具有关联Cycle Count元素的Commit元素不能与后面的Commit元素合并。

IPSFTD

更多信息,请参见”Cycle Count元素”(Cycle Count element)。


D4.5.10.9 上下文元素(Context element)

RBDFDQ

跟踪单元在以下情况下生成Context元素:

  • 在跟踪处于活动状态时,当任何上下文信息发生变化时,在任何指示从新上下文执行的P0元素之前。
  • 由于非周期性(non-periodic)跟踪协议同步请求而生成Trace Info元素之后,在任何P0元素之前。
  • 由于周期性(periodic)跟踪协议同步请求而生成Trace Info元素之后。
  • 当错误推测导致输出了不正确的Context元素时,在任何指示从正确上下文执行的P0元素之前。

RJNXJT

当启用了虚拟上下文标识符跟踪并且TRFCR_EL2.CX禁止跟踪虚拟上下文标识符时,当跟踪单元生成Context元素时,Context元素中的虚拟上下文标识符的值为0x0。

ITBJPL

Context元素也可能在其他点输出,这可能包括在所有上下文同步事件之后,或在上下文信息发生变化的任何其他点。

RMKKZN

如果实现的最高异常级别使用AArch64,则上下文标识符值是CONTEXTIDR_EL1的值。

IWXVHT

某些上下文信息可能在上下文同步事件之外的其他点发生变化。这些变化发生在使用系统指令更改某一部分上下文信息时,包括:

  • 写入当前的CONTEXTIDR_EL1。
  • 写入CONTEXTIDR_EL2。
  • 从不使用异常返回的方式从较高安全状态更改到较低安全状态。
  • 除异常或异常返回之外的异常级别变化。

RHXNXF

当系统指令写入系统寄存器并且上下文信息发生变化时,跟踪单元在P0元素(在系统指令之前)之后,但在上下文同步事件(在系统指令之后)之后的P0元素之前,生成包含新上下文值的Context元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7406

:如果在系统指令之后的第一个P0元素之前输出了Context元素,这可能意味着系统指令之前的一些指令是使用新上下文执行的。这是可接受的,因为更改上下文的代码通常在旧上下文值还是新上下文值无关紧要的状态下执行。

IWTSTB

如果PE在执行写入系统寄存器的操作(该操作更改了上下文)之后、但在自写入以来尚未生成P0元素时发生异常,则不要求在Exception元素之前输出指示新上下文的Context元素。这是因为没有指令或异常事件被指示为从新上下文执行。如果该异常事件是上下文同步事件,则必须在Exception元素之后生成指示新上下文的Context元素。如果异常事件更改了上下文,则Context元素必须指示新上下文。例如,如果安全状态发生变化,就可能发生这种情况。

RHTYGF

当发生PE复位时,在相关PE寄存器更新之前,跟踪单元将上下文标识符和虚拟上下文标识符跟踪为零。

IKTPVJ

如果在任何指令在新上下文中执行之前跟踪变为非活动状态,则不要求跟踪单元生成Context元素。

IQWSVJ

在某些场景中,跟踪单元可能输出额外的Context元素,但这些元素必须仅在它们不影响跟踪元素流分析的情况下输出。这样的场景可能包括:当上下文信息的变化被错误推测,并且后续的Context元素纠正了先前不正确Context元素的值时。Arm建议尽量减少额外不必要的Context元素的生成,以确保跟踪带宽最小化。


D4.5.10.10 目标地址元素(Target Address element)

RHLRZJ

当跟踪分析器无法从跟踪中推断出地址或指令集时,跟踪单元生成一个Target Address元素。

IFRTGM

跟踪分析器可能无法从先前跟踪中推断出地址或指令集的情况包括:

  • 在已执行的间接P0指令的目标处。
  • 在分支广播区域中已执行的直接P0指令的目标处,更多信息请参见TRCBBCTLR。
  • 在异常事件的目标处。
  • 当发生错误推测且无法推断地址时。
  • 在生成Q元素之后。

RZRYSN

当跟踪分析器无法从跟踪中推断出地址或指令集时,跟踪单元在下一个P0元素之前生成结果Target Address元素,除非以下任何条件成立:

  • 由于返回栈匹配(return stack match),可以省略Target Address元素。
  • 在P0指令或异常事件的目标处跟踪处于非活动状态。

RRGPTK

当发生非周期性跟踪协议同步时,跟踪单元在对应于非周期性跟踪协议同步的Trace Info元素和Trace On元素之后、下一个P0元素生成之前,生成一个Target Address元素。

RMDTYL

当发生周期性跟踪协议同步时,在生成了相应的Trace Info元素之后,跟踪单元生成一个Target Address元素,其中包含在Target Address元素之前最近的P0元素的目标地址。

IYMLXQ

当发生非周期性跟踪协议同步时,Target Address元素不需要指示最近P0元素的目标,因为跟踪可能不会在P0元素的目标处变为活动状态。

IGBMWG

当发生周期性跟踪协议同步时,Target Address元素需要指示最近P0元素的目标,因为跟踪是从该P0元素继续的。此外,Target Address元素可能指示Trace Info元素之前的P0元素的目标。

RQCSJJ

当生成Trace On元素时,跟踪单元在下一个P0元素之前生成一个Target Address元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7407

IDTQDH

通常,在Exception元素之后需要Target Address元素来指示异常事件的目标,因为跟踪分析器通常无法推断异常事件的目标。

IYHQGL

在某些场景中,可能生成Exception元素,其中异常事件的目标地址是异常事件之前最后一条指令的下一条顺序指令。此行为取决于许多因素,并且可能仅对**实现定义(IMPLEMENTATION DEFINED)**的异常事件发生。如果异常事件被执行到下一个顺序指令,跟踪单元不需要输出指示异常事件目标地址的Target Address元素,因为这可以从先前的执行中推断出来。

IGVZJZ

跟踪分析器在确定正在使用的指令集之前需要Target Address元素和Context元素,因为Target Address元素提供指令集,Context元素提供PE所处的执行状态信息。

RRHDMW

当发生AArch32状态和AArch64状态之间的指令集切换时,跟踪单元生成一个指示新状态的Context元素。

IKZXQW

无效地址是bits[63:P]不全为零或不全为1的地址,其中P定义如下:

  • 当实现了FEAT_LVA3时,为56。
  • 当实现了FEAT_LVA时,为52。
  • 否则,为48。

RVWVWR

当PE尝试在无效地址处执行指令并且跟踪单元生成Target Address元素时,Target Address元素指示以下之一:

  • 完整的64位无效地址。
  • 任何其他无效地址,其地址bits[P-1:0]与完整无效地址相同。

IYJYFM

当发生到无效地址的分支并且为从该无效地址获取的异常生成了Exception元素时,Arm建议Exception元素中的首选异常返回地址与此分支的Target Address元素指示的无效地址相同。

RSBCPK

当使用标记地址(tagged addresses)时,跟踪元素流中的虚拟地址不包括标签,而是PC值,即根据PE在地址处的状态,bits[63:56]是以下之一:

  • bit[55]的符号扩展。
  • 零。

IYGGGK

转换控制寄存器TCR_ELx包含TBI字段,用于控制是否忽略地址的顶字节。如果当前TBI字段从0更改为1,并且在下一个上下文同步事件之前,PE由于无效的顶地址字节而触发异常,则到无效地址的分支目标地址或Exception元素的首选异常返回地址可能不包含完整的无效地址,而可能包含顶字节被屏蔽的地址。此外,分支目标地址可能是无效地址,因此可能与首选异常返回地址不同。跟踪分析工具必须意识到,如果分支目标地址与后续的首选异常返回地址显著不同,则可能是TBI字段发生了更改,导致了地址的这种大幅变化。

RHHKGB

当指针认证检查失败并且从生成的无效地址触发异常时,首选异常返回地址是以下之一:

  • 完整的64位无效地址。
  • 任何其他无效地址,其地址bits[P-1:0]与完整无效地址相同。

ICRSTX

当指针认证检查失败并且从生成的无效地址触发异常时,Arm建议首选异常返回地址应为完整的64位无效地址。

RFSWRC

地址的低位按以下方式被忽略:

  • 在A64或A32指令中使用的地址的Bits[1:0]始终被跟踪为零。
  • 在T32指令中使用的地址的Bit[0]始终被跟踪为零。

IMDZJL

在某些场景中,跟踪单元可能输出额外的Target Address元素,但这些元素必须仅在它们不影响跟踪元素流分析的情况下输出。这些场景包括但不限于:

  • 当指令地址被错误推测,并且后续的Target Address元素纠正了先前不正确Target Address元素的值时。
  • 当指令地址可以由跟踪分析器推断(例如直接P0指令的目标),但仍然以相同地址输出Target Address元素时。

Arm建议尽量减少额外不必要的Target Address元素的生成,以确保跟踪带宽最小化。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7408


D4.5.10.11 Mispredict元素(Mispredict element)

RYJCNT

当最后一个未取消的Atom元素的状态已被PE更改时,跟踪单元生成一个Mispredict元素。

RSCKBZ

跟踪单元仅生成Mispredict元素来更改Atom元素的状态。

IXYDNP

跟踪单元可能为同一个Atom元素生成多个Mispredict元素。跟踪分析器必须使用每个Mispredict元素来确定Atom元素的最终状态。例如,如果一个E Atom元素有两个Mispredict元素,第一个Mispredict元素指示该Atom元素是一个N Atom元素,第二个Mispredict元素指示它是一个E Atom元素。

IHVWCN

如果PE仅错误预测了P0元素的目标地址,则它不会生成Mispredict元素。
跟踪单元使用Target Address元素来纠正错误预测的目标地址。在分析Mispredict元素时,错误预测的Atom元素和Mispredict元素之间的任何Target Address元素都必须被丢弃。


D4.5.10.12 溢出元素(Overflow element)

RHRYKY

当发生跟踪单元缓冲区溢出时,在跟踪单元缓冲区溢出之前生成的所有跟踪元素被输出之后,跟踪单元输出一个Overflow元素。

RRPSPH

当发生跟踪单元缓冲区溢出,并且跟踪单元在从跟踪单元缓冲区溢出恢复后被禁用时,跟踪单元在跟踪单元变为空闲之前输出相应的Overflow元素。


D4.5.10.13 时间戳元素(Timestamp element)

RYYWTR

当TRCCONFIGR.TS为1且发生以下任一情况时,会发生时间戳请求(timestamp request):

  • 时间戳资源事件发生,由TRCTSCTLR控制。
  • 跟踪单元生成一个Trace Info元素。
  • 跟踪单元从跟踪单元缓冲区溢出中恢复。
  • 当不在跟踪禁止区域中时,由以下任一情况引起的上下文同步事件:
    • PE触发异常。
    • PE从异常返回。
    • 执行ISB指令。
  • 请求跟踪单元刷新。

RCKNFV

当TRCCONFIGR.TS为1并且不在跟踪禁止区域中时,当发生以下任一情况但不引起上下文同步事件时,可能发生时间戳请求:

  • PE触发异常。
  • PE从异常返回。
  • 执行ISB指令。

RNGXNQ

ViewInst函数的状态不影响时间戳请求是否发生。

RHZSYP

当时间戳请求发生并且ViewInst处于非活动状态时,允许延迟时间戳请求,直到发生以下第一个情况:

  • 生成了P0元素。
  • 生成了Event元素。
  • 生成了Instrumentation元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7409

IWFXVV

不要求在每次ViewInst变为活动状态时都在跟踪元素流中生成Timestamp元素。

RRMSVV

当时间戳请求发生且未被忽略时,跟踪单元生成一个Timestamp元素。

RDWCYP

当时间戳请求发生但跟踪单元没有能力立即生成Timestamp元素时,则Timestamp元素的生成被延迟到有能力时。

ITQDHQ

跟踪单元可能由于多种原因没有能力生成Timestamp元素,包括避免跟踪单元缓冲区溢出。延迟的Timestamp元素意味着时间戳值可能不是导致时间戳请求的事件的精确时间。时间戳只是插入在跟踪元素流中大致接近请求时间的时间指示器。

RXMJGY

当在跟踪禁止区域中发生时间戳请求时,Timestamp元素的生成被延迟到PE离开跟踪禁止区域之后。

RCWHHW

当跟踪生成变得有效后发生第一个时间戳请求时,跟踪单元将相应Timestamp元素的生成延迟到跟踪单元生成了P0元素、Event元素或Instrumentation元素之后。

ISDPZZ

这样做的目的是使时间戳值可以对应这些元素中最新的一个。

RSZNMB

如果先前的时间戳请求由于生成延迟尚未生成Timestamp元素,则允许忽略时间戳请求。

RDWFTT

如果满足以下所有条件,跟踪单元可能忽略两个连续时间戳请求中的第二个请求:

  • 第二个请求不是由跟踪协议同步请求引起的。
  • 在两个请求之间没有生成P0元素、Event元素或Instrumentation元素。
  • 两个Timestamp元素中的时间戳值将相同。

RZMQLT

当TRCCONFIGR.CCI为1时,每个Timestamp元素包含一个周期计数,指示Timestamp关联的元素与之前最近的Cycle Count元素之间的周期数。

RMWJHD

与Timestamp元素关联的周期计数与Cycle Count元素在以下方面不同:

  • 周期计数不影响累计周期计数。
  • 周期计数值可以为零。

IHTGCM

当与Timestamp元素关联的周期计数为零时,表示在之前的Cycle Count元素与Timestamp元素关联的元素之间没有经过任何周期。

ITYVDN

与Timestamp元素关联的周期计数不是Cycle Count元素,因此对周期计数器没有影响。

RJNSWW

当跟踪单元首次启用时,在周期计数启用的情况下,如果在任何Cycle Count元素之前生成了Timestamp元素,则该Timestamp元素报告周期计数为未知(UNKNOWN)

RNPYKS

当生成Timestamp元素且周期计数器已超过最大支持值时,该Timestamp元素报告周期计数为未知(UNKNOWN)


D4.5.10.14 Trace On元素(Trace On element)

RLMLSN

当指令块在指令块未被跟踪或发生跟踪单元缓冲区溢出之后立即被跟踪时,跟踪单元生成一个Trace On元素。

IGPQZW

当跟踪指示PE复位的Exception元素时,首选异常返回地址是未知(UNKNOWN)。自最近未解析的P0元素以来的任何指令都不被跟踪。如果对这些指令ViewInst是活动状态的,这不被认为是跟踪元素流中的间隙,不需要Trace On元素。

在某些场景中,当发生错误推测或指令被取消时,在处理了Cancel元素之后,跟踪元素流中可能存在Trace On元素,即使在架构执行的指令跟踪中没有发生跟踪不连续性。这通常在使用ViewInst函数过滤跟踪时发生,这会导致插入Trace On元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7410

IMHFJB

跟踪分析器必须意识到这些额外的Trace On元素可能被跟踪。


D4.5.10.15 Cycle Count元素(Cycle Count element)

RTYNZR

周期计数器具有**实现定义(IMPLEMENTATION DEFINED)**的大小,介于12到20位之间,如TRCIDR2.CCSIZE所指示。因此,周期计数器支持从1到2^20-1的值。

RGWQGS

当TRCCONFIGR.CCI为1且周期计数等于或大于TRCCCCTLR.THRESHOLD的值时,当生成Commit元素时,会发生Cycle Count元素请求。

RKJXDK

当TRCCCCTLR.THRESHOLD被编程为小于TRCIDR3.CCITMIN的值时,Cycle Count元素的生成是**受限不可预测(CONSTRAINED UNPREDICTABLE)**的。

RGDTBW

当发生Cycle Count元素请求时,会发生以下情况之一:

  • 跟踪单元立即生成一个Cycle Count元素,并在任何未来的Commit元素之前生成。
  • 跟踪单元将Cycle Count元素的生成延迟到生成一个或多个进一步Commit元素之后。

ITCFRL

Arm建议,当发生Cycle Count元素请求时,应立即生成Cycle Count元素,并且Cycle Count元素的生成仅在罕见且非重复的情况下延迟。

RBMVKB

当生成Cycle Count元素时,该Cycle Count元素包含生成最近Commit元素时周期计数器的值,并且周期计数器重置为自最近Commit元素生成以来的周期数。

RPFZXK

值为0表示周期计数值为未知(UNKNOWN)

RYVWJW

当周期计数器超过最大支持值时,周期计数值为未知(UNKNOWN)

RYFMWB

当跟踪单元启用时,生成的第一个Cycle Count元素会出现**未知(UNKNOWN)**的周期计数值。

RHQKWH

当发生跟踪单元缓冲区溢出时,生成的第一个Cycle Count元素会出现**未知(UNKNOWN)**的周期计数值。

IPDBDY

PE时钟重新启动后的第一个Cycle Count元素应具有**未知(UNKNOWN)**的周期计数。


D4.5.10.16 丢弃元素(Discard element)

RWDWGV

当在生成了P0元素之后跟踪生成失效,但跟踪单元无法输出这些P0元素的解析时,跟踪单元生成一个Discard元素。

RFHQDX

当由于跟踪单元被禁用而导致跟踪生成失效,并且生成了Discard元素时,跟踪单元在所有其他元素之后输出Discard元素。

RNSMJF

当在生成了P0元素之后发生PE复位,但跟踪单元无法输出这些P0元素的解析时,跟踪单元生成一个Discard元素。

ISKJSP

如果没有推测性的P0元素,跟踪单元可能不生成Discard元素。

ITGXKV

即使没有推测性的P0元素,跟踪单元也可能生成Discard元素。

RCTYFK

当生成Discard元素时,所有未提交的P0元素都被丢弃,即当前推测深度被设置为零。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7411


D4.5.10.17 仪器化元素(Instrumentation element)

RSTQSN

第一条TRCIT指令的Instrumentation元素在程序顺序中任何在该第一条TRCIT指令之后的TRCIT指令的Instrumentation元素之前生成。

RWYYPN

Instrumentation元素包含以下信息:

  • TRCIT指令的Xt寄存器参数中包含的双字(doubleword)。
  • 执行TRCIT指令时的异常级别。

IXWZNW

如果仪器化跟踪被禁止但跟踪未被禁止,则Arm建议TRCIT指令的行为不受跟踪单元状态的影响。

IKGBZX

TRCIT指令被添加到支持并发修改和执行(concurrent modification and execution)的指令列表中,以允许对TRCIT指令进行实时修补(live patching)。TRCIT指令只允许修改为NOP指令或TRCIT指令的另一种编码。只有NOP指令或TRCIT指令才允许修改为TRCIT指令。

RSRSGF

架构保证,对于NOP和TRCIT指令,在修改指令后,行为与以下任一执行一致:

  • 最初获取的指令。
  • 获取修改后的指令。

RLGWQF

每个Instrumentation元素生成一个Instrumentation数据包。

IBXHZM

当发生非周期性跟踪协议同步时,跟踪单元在任何Instrumentation数据包之前生成一个对齐同步数据包(Alignment Synchronization packet)。请参见RTTLJC。

IYWJZW

Instrumentation数据包与其他ETE数据包之间没有排序要求,除了对齐同步数据包的要求以及对Timestamp数据包和Timestamp Marker数据包排序的要求。


D4.5.11 跟踪单元特性(Trace unit features)

IBFHRC

架构定义了多个可选和强制特性,用于修改跟踪元素流以提供附加信息来辅助调试。这些特性包括:

  • Q元素区域(Q element regions)。
  • 分支广播(Branch broadcasting)。
  • 上下文标识符跟踪(Context identifier tracing)。
  • 周期计数(Cycle counting)。
  • 事件跟踪(Event trace)。
  • 无溢出(No overflow)。
  • PE暂停和溢出避免(PE Stalling and overflow avoidance)。
  • 时间戳(Timestamping)。
  • 虚拟上下文标识符跟踪(Virtual context identifier tracing)。

对于可选特性,这些可选特性的包含情况在TRCIDR0-TRCIDR13中指示。


D4.5.11.1 Q区域(Q regions)

IXFPKH

Q元素的支持是可选的(OPTIONAL),由TRCIDR0.QSUPP指示。

IFSXRY

如果要使用Q元素,必须显式启用Q元素的使用。

ICGQZJ

当启用Q元素时,跟踪元素流可能不包含足够的信息来确定完整的程序流程,因为某些流程变化可能没有被显式指示。

IQLVSG

Arm建议仅在生成完整的ETE指令跟踪元素流可能导致被跟踪PE的性能显著下降的情况下使用Q元素。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7412

ITNPWC

使用Q元素会降低可以从跟踪元素流中提取的信息质量。Arm建议也实现Q元素过滤(Q element filtering),如TRCIDR0.QFILT所指示。

ICBKXZ

如果实现了TRCQCTLR,则跟踪单元支持使用ARC控制何时在跟踪元素流中允许Q元素的能力。Q元素过滤在排除模式(Exclude mode)或包含模式(Include mode)下运行,由TRCQCTLR.MODE选择。

RDSFJZ

如果启用了Q元素并且Q元素过滤处于包含模式,则由TRCQCTLR.RANGE选择的ARC定义了允许Q元素的位置。

RWXRDY

如果启用了Q元素并且Q元素过滤处于排除模式,则由TRCQCTLR.RANGE选择的ARC定义了不允许Q元素的位置。

RRBPJF

当指令块包含至少一条允许Q元素的指令时,整个指令块都允许生成Q元素。

RNQSLS

以下方程为每个指令块计算,并定义何时允许Q元素:

Q_PERMITTEDi =
⎧ Σn ARCi[n] ∧ TRCQCTLR.RANGE[n] 包含模式(Include mode)
⎨ ¬Σn ARCi[n] ∧ TRCQCTLR.RANGE[n] 排除模式(Exclude mode)

RSGFHP

当TRCCONFIGR.QE指示禁用Q元素时,跟踪单元不生成任何Q元素。

RCGHSK

当TRCCONFIGR.QE指示禁用Q元素时,跟踪单元能够生成跟踪指令序列所需的所有元素。


D4.5.11.2 分支广播(Branch broadcasting)

IWLPLZ

分支广播特性强制跟踪单元显式跟踪已执行的直接P0指令的目标地址。
目标地址使用指令跟踪流中的Target Address元素进行跟踪。

IDCYQT

通过执行以下两个操作启用分支广播:

  1. 将TRCCONFIGR.BB设置为1。
  2. 编程TRCBBCTLR以指定分支广播的行为方式。TRCBBCTLR选择地址范围比较器(Address Range Comparators)来定义何时分支广播处于活动状态,并选择分支广播的操作模式:
    • 分支广播对所选范围内的所有指令处于活动状态。这称为包含模式(Include mode)。
    • 分支广播对所选择范围外的所有指令处于活动状态。这称为排除模式(Exclude mode)。

RMHYFV

当分支广播处于活动状态的直接P0指令被执行时,跟踪单元生成一个Target Address元素来显式跟踪该指令的目标,无论该P0指令是否被错误预测。

RVQTVR

当启用了分支广播且启用了返回栈时,跟踪单元优先考虑分支广播而非返回栈,即返回栈不匹配任何分支广播处于活动状态的指令的目标。

RXSVSX

如果未实现TRCBBCTLR,则在启用分支广播时,分支广播对所有指令处于活动状态。


D4.5.11.3 上下文标识符跟踪(Context identifier tracing)

IRJJZW

跟踪单元可以被编程为包含有关正在PE上执行的程序的当前执行上下文的信息,包括:

  • 当前进程标识符,存储在CONTEXTIDR_EL1中。这称为上下文标识符(Context identifier)。
  • 当前VMID,存储在CONTEXTIDR_EL2中。这称为虚拟上下文标识符(Virtual context identifier)。

RGVMFG

跟踪单元支持上下文标识符的跟踪,TRCIDR2.CIDSIZE指示32位的上下文标识符大小。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7413


D4.5.11.4 周期计数(Cycle counting)

IMKQVC

使用周期计数特性会在跟踪元素流中引入Cycle Count元素,以指示PE时钟周期的流逝。

IBMCMB

计算PE执行特定函数所使用的时钟周期数可以用作测量程序性能或对PE进行性能分析的一种方式。

RJMLLY

当启用周期计数时,跟踪单元输出包含处理器时钟周期计数值的Cycle Count数据包。

ITVCCV

Cycle Count元素与Commit元素相关联,因此当生成Commit元素时,也可能生成Cycle Count元素。是否在生成Commit元素时生成Cycle Count元素取决于编程TRCCCCTLR.THRESHOLD时指定的周期计数阈值。当生成Commit元素并且周期计数值大于或等于阈值时,会生成Cycle Count元素并输出Cycle Count数据包。该数据包中包含的周期计数值与触发它的Commit元素相关联。

RBHYWB

当启用周期计数,并且生成Commit元素时,如果周期计数值大于或等于编程在TRCCCCTLR.THRESHOLD中的阈值,跟踪单元生成一个Cycle Count元素。

ILFLCZ

此外,由于周期计数与Commit元素相关联,Cycle Count数据包可能隐含Commit元素的生成,因此除了周期计数值外,一些Cycle Count数据包还包含跟踪单元生成的Commit元素数量的值。

IMWQNZ

在新的Cycle Count数据包中给出的周期计数值指示:新Commit元素(与该数据包关联的)与最近的、具有关联Cycle Count元素的Commit元素之间的处理器时钟周期数。
这意味着如果需要有累计周期计数总数,可以将连续Cycle Count数据包中的周期计数值相加来获得。


D4.5.11.5 事件跟踪(Event trace)

IGGMQT

ETE架构支持在跟踪流中跟踪附加信息。这些被称为ETEEvents,也称为事件跟踪(Event trace)。跟踪单元支持最多4个ETEEvent。ETEEvent的生成受资源选择器(resources selectors)选择的控制。ETEEvent的发生可以通过以下方式传达:

  • 通过外部输出(External Outputs)传达给系统。
  • 通过事件数据包(Event Packet)传达给跟踪分析器。

D4.5.11.6 无溢出(No overflow)

IDJCLX

跟踪单元可能包含一个防止溢出的可选特性,由TRCIDR3.NOOVERFLOW指示。

RYSPHL

TRCSTALLCTLR.NOOVERFLOW控制无溢出特性。

SBSPDF

启用无溢出特性可能对PE性能产生重大影响。

RLCGZJ

当启用无溢出特性,并且ETEEvent的数量或频率低于**实现定义(IMPLEMENTATION DEFINED)**的阈值时,跟踪单元不会溢出。

RVHMZX

该阈值大于或等于每个编号的ETEEvent的每一个,每个跟踪会话。

RMYMKW

当TRCIDR3.SYSSTALL为0时,TRCSTALLCTLR.NOOVERFLOW的有效值(Effective value)为0,这意味着无溢出特性被禁用。

RJYYLV

当TRCSTALLCTLR.ISTALL为0且TRCSTALLCTLR.NOOVERFLOW为1时,是禁用所有暂停还是启用无溢出特性是**受限不可预测(CONSTRAINED UNPREDICTABLE)**的。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7414


D4.5.11.7 暂停PE的执行(Stalling the execution of the PE)

IMPBVQ

跟踪单元可以被编程以降低跟踪单元缓冲区溢出的可能性。如果跟踪单元配置为支持PE暂停,TRCIDR3.STALLCTL指示实现了PE暂停,TRCIDR3.SYSSTALL指示允许PE暂停,则可以减慢PE的执行速度。

IHPFQP

允许跟踪单元的编程影响PE的操作。入侵量以及何时发生暂停是**实现定义(IMPLEMENTATION DEFINED)**的。通过启用此特性可以实现PE执行的额外暂停。

IVZSVK

跟踪单元对PE的暂停独立于PE的操作。

RNVBGS

与跟踪单元显式交互的PE操作独立于跟踪单元暂停PE的能力的编程而完成。

RSCLVV

当以下任何条件成立时,跟踪单元不会暂停PE:

  • 跟踪单元处于禁用状态。
  • PE在跟踪禁止区域中执行(请参见”跟踪禁止区域”)。
  • PE处于调试状态。
  • PE不允许暂停,即TRCIDR3.SYSSTALL == 0b0。
  • 自托管跟踪已禁用且ExternalInvasiveDebugEnabled() == FALSE。
  • 当TRCSTALLCTLR.ISTALL == 0b0且TRCSTALLCTLR.NOOVERFLOW == 0b0时。
  • 跟踪输出已禁用。

RRWTYJ

当以下所有条件都成立时,允许跟踪单元暂停PE:

  • 暂停PE未被RSCLVV禁止。
  • TRCSTALLCTLR.ISTALL == 0b1。
  • 以下任一条件成立:
    • TRCSTALLCTLR.NOOVERFLOW == 0b1。
    • 跟踪单元内部存储中的可用空间低于TRCSTALLCTLR.LEVEL指示的水平。

否则,跟踪单元不会由于暂停特性或无溢出特性而暂停PE。

RNVKXX

跟踪单元不会无限期地暂停PE的操作。

IXPRQJ

在多线程处理器中,如果跟踪单元暂停了一个PE,Arm建议应最小化对其他PE处理的暂停或干扰。特别是,如果多线程处理器中一个或多个PE的跟踪已启用,但多线程处理器中其他PE的跟踪已禁用,Arm建议,如果被跟踪的PE被其各自的跟踪单元暂停,则该暂停对未被跟踪的PE影响最小。

IKBXXH

TRCSTALLCTLR.LEVEL中指示的级别是允许的入侵级别。

IZRQBK

表D4-25总结了暂停和无溢出的场景,假设TRCIDR3.STALLCTL为1且TRCIDR3.SYSSTALL为1。

表D4-25 TRCSTALLCTLR暂停和无溢出特性总结

ISTALL NOOVERFLOW LEVEL 描述
0 0 x 暂停已禁用。
0 1 x 是启用无溢出特性还是禁用暂停是**受限不可预测(CONSTRAINED UNPREDICTABLE)**的。
1 0 暂停以最低级别启用。
1 0 非零 暂停已启用,并基于TRCSTALLCTLR.LEVEL中的值。
1 1 无溢出特性启用,防止溢出。
1 1 非零 无溢出特性启用,防止溢出,并且TRCSTALLCTLR.LEVEL可能比防止溢出所需更早地引起暂停。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7415


D4.5.11.8 时间戳(Timestamping)

IYVBBW

跟踪单元支持时间戳,将公共全局时间值插入到跟踪流中。这些时间戳可用于关联多个跟踪流,包括来自其他PE或其他跟踪源的跟踪流。这些时间戳可用于确定时间的流逝,用于性能分析。

IVFWQS

当启用时间戳时,跟踪单元将Timestamp元素插入到跟踪流中。每个Timestamp元素指示最近发生的P0元素、Event元素或Instrumentation元素的时间,并且可用于精确确定该元素发生的时间。

IYFPDZ

Timestamp元素中包含的时间值由TRFCR_EL1和TRFCR_EL2选择,是以下之一:

  • 物理时间(Physical time),由PE中的通用定时器看到。
  • 虚拟时间(Virtual time),由PE中的通用定时器看到。
  • **实现定义(IMPLEMENTATION DEFINED)**的时间值,通常由CoreSight系统提供。

ICLZKR

Timestamp元素的插入由TRCCONFIGR.TS和TRCTSCTLR控制。


D4.5.11.9 虚拟上下文标识符跟踪(Virtual context identifier tracing)

IVMGBJ

实现是否支持虚拟上下文标识符跟踪是**实现定义(IMPLEMENTATION DEFINED)**的。如果支持,则跟踪单元可以被编程为输出PE正在执行的虚拟机的标识符。

IFDDXM

此选项通过将TRCCONFIGR.VMID设置为0b1来启用。

RPTVYD

如果PE实现了EL2,则跟踪单元支持32位的虚拟上下文标识符,TRCIDR2.VMIDSIZE指示32位的虚拟上下文标识符大小。虚拟上下文标识符的来源是CONTEXTIDR_EL2.PROCID。

RBRDYF

如果PE未实现EL2,则跟踪单元不支持虚拟上下文标识符,TRCIDR2.VMIDSIZE指示不支持虚拟上下文标识符跟踪。

:来自Arm的先前跟踪架构支持选择虚拟上下文标识符的来源的能力。本规范不支持虚拟上下文标识符选择,仅允许CONTEXTIDR_EL2.PROCID作为虚拟上下文标识符的来源。有关更多详细信息,请参见TRCIDR2.VMIDOPT。


D4.5.12 压缩(Compression)

IWVBMT

通过以下方法实现跟踪字节流的额外压缩:

  • 移除可以由跟踪分析器推断的元素:
    • 基于其他元素的跟踪推断Commit元素的存在。
    • 移除可以通过分析先前跟踪的PE执行由跟踪分析器计算的Target Address元素。
  • 将多个元素组合成单个数据包:
    • 将Atom元素组合成单个数据包。
    • 将Cancel元素和Mispredict元素组合成单个数据包。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7416


D4.5.12.1 隐式提交(Implied commits)

IBTGGX

ETE跟踪协议提供了机制,以最小化需要在跟踪字节流中显式输出的Commit元素数量。当在跟踪字节流中输出P0元素时,如果输出的推测性P0元素数量超过了TRCIDR8.MAXSPEC,则隐含一个Commit元素,该元素解析最旧的推测性P0元素。

RYKLRM

跟踪单元不为已被跟踪协议隐含的Commit元素生成Commit数据包。


D4.5.12.2 Atom打包(Atom packing)

IQMVNP

ETE跟踪协议提供了允许将连续Atom元素组打包成单个跟踪数据包的数据包。图D4-15显示了生成不同格式Atom数据包的决策树。

Figure D4-15

图D4-15 Atom打包

IXXSGS

取消数据包(Cancel Packets)可以指示多个Atom元素和Cancel元素。

IKWWHP

错误预测数据包(Mispredict Packets)可以指示多个Atom元素和Mispredict元素。


D4.5.12.3 地址压缩(Address compression)

ILFFCR

跟踪单元可以从跟踪流中移除程序地址。跟踪分析器可以从程序镜像和先前历史推断出地址。
这包括直接P0指令的目标,其中目标地址编码在指令本身中。

RSJPYH

跟踪单元最多保留最后三个在跟踪协议中显式输出的地址信息,如包含在:

  • Target Address数据包。
  • Source Address数据包。
  • Exception数据包。
  • PE Reset数据包。
  • Q数据包。

ISXNYK

跟踪单元保留的显式输出地址称为地址历史缓冲区(address history buffer)

ILPYRK

为优化跟踪协议效率,Arm建议地址历史缓冲区为三个条目深度。

RLMHFW

当生成以下任何数据包时,跟踪单元将地址值和sub_isa推送到地址历史缓冲区:

  • Target Address数据包。
  • Source Address数据包。
  • 隐含Target Address元素的Q数据包。

RCMCRT

当生成Exception数据包时,跟踪单元将首选异常返回地址值和sub_isa推送到地址历史缓冲区。

RFPDFJ

当使用**未知(UNKNOWN)**地址生成PE复位数据包时,跟踪单元将地址值0x0和sub_isa IS0推送到地址历史缓冲区。

RBPRDC

当生成Target Address数据包时,跟踪单元使用地址历史缓冲区来标识何时可以使用Target Address Exact Match数据包。当无法使用Target Address Exact Match数据包时,地址历史缓冲区中的最近条目用于Target Address数据包选择。

RGWKFD

当生成Source Address数据包时,跟踪单元使用地址历史缓冲区来标识何时可以使用Source Address Exact Match数据包。当无法使用Source Address Exact Match数据包时,地址历史缓冲区中的最近条目用于Source Address数据包选择。

RYLXFK

当生成Exception数据包时,跟踪单元使用地址历史缓冲区来标识何时可以使用Exception Exact Match Address数据包。当无法使用Exception Exact Match Address数据包时,地址历史缓冲区中的最近条目用于Exception Address数据包选择。

RYCMCG

当生成隐含Target Address元素的Q数据包时,跟踪单元使用地址历史缓冲区来标识何时可以使用Q with Exact Match Address数据包。当无法使用Q with Exact Match Address数据包时,地址历史缓冲区中的最近条目用于Q Address数据包选择。

RBTWGD

当生成Trace Info数据包时,跟踪单元将地址历史缓冲区的所有条目设置为地址值0x0和sub_isa IS0。


D4.5.12.4 返回栈地址匹配(Return stack address matching)

INHWVZ

跟踪单元可能包含可选的返回栈(return stack)功能。当分支与链接指令(Branch with Link instructions)或间接P0指令被执行时,返回栈运行,并提供一种机制,允许跟踪单元从跟踪元素流中移除某些Target Address元素。跟踪分析器维护返回栈的独立副本,用于确定何时移除了Target Address元素,然后推断间接P0指令的目标。

RHNDJJ

返回栈的深度是**实现定义(IMPLEMENTATION DEFINED)**的,范围为0到15个条目。

IBLYHW

为优化跟踪协议效率,Arm建议跟踪单元实现至少3个条目的返回栈。

RHFCTC

当TRCCONFIGR.RS为1时,当分支与链接指令被预测为执行并被跟踪时,跟踪单元将以下地址信息推送到返回栈:

  • 指令地址+指令大小,即分支与链接指令的返回地址。
  • 来自指令集编码的sub_isa。

RZKTHK

当发生返回栈推入(push)时,所有现有条目在返回栈上向下移动一个位置,新条目被推入返回栈的顶部条目。

RZSVDQ

当返回栈已满时,如果发生返回栈推入,则丢弃返回栈上最旧的条目。

RFFXPW

当分支与链接指令被预测为执行并使用E Atom元素跟踪时,当发生返回栈推入时,即使预测不正确并随后被纠正为N Atom元素,跟踪单元也会推入返回栈。

RNYHFH

当分支与链接指令被预测为未执行并使用N Atom元素跟踪时,跟踪单元不会推入返回栈,即使预测不正确并随后被纠正为E Atom元素。

RGVLKJ

当分支与链接指令由Q元素隐含时,跟踪单元不会推入返回栈。

RWRXCW

当在分支广播区域中执行分支与链接指令时,跟踪单元不会推入返回栈。

RFVRPZ

当分支与链接指令被推测执行并生成E Atom元素时,如果该Atom元素随后被Cancel元素取消,则跟踪单元返回栈上任何相应的条目必须从跟踪单元返回栈中弹出。

:丢弃跟踪单元返回栈的全部内容可以满足此义务。

RQHSBN

当间接P0指令被执行并被跟踪时,如果生成的Target Address元素中的地址信息匹配返回栈顶部的地址和sub_isa,则跟踪单元执行返回栈弹出(pop)。

RHTKJS

当发生返回栈弹出时,会发生以下两种情况:

  • 跟踪单元丢弃与返回栈顶部地址和sub_isa匹配的Target Address元素。
  • 跟踪单元移除返回栈的顶部条目,并将每个较旧的条目向上移动一个位置。

RWBCJG

当间接P0指令由Q元素隐含时,跟踪单元不执行返回栈弹出。

IBCWSQ

当间接P0指令被执行时,PE可能错误预测目标地址。

RYMRGB

当已执行的间接P0指令的目标地址被错误预测,并且错误的目标地址使用Target Address元素跟踪时,跟踪单元通过生成一个具有正确目标地址的新Target Address元素来纠正错误地址,并且这两个目标地址都不会导致返回栈弹出。

RGBHNP

当已执行的间接P0指令的目标地址被错误预测,并且错误的目标地址匹配返回栈的顶部条目时,跟踪单元随后生成一个具有正确目标地址的Target Address元素,并且这两个目标地址都不会导致返回栈弹出。

RZCCBS

当与间接P0指令对应的Atom元素的最终状态为E(包括当一个或多个Mispredict元素更改Atom元素的状态时),跟踪单元执行返回栈弹出。

:仅当分支与链接指令的初始Atom元素状态为E时,才会发生返回栈推入。相反,仅当间接P0指令的最终Atom元素状态为E时,才会发生返回栈弹出。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7419

RSLDXR

当执行同时是分支与链接指令和间接P0指令的指令时,跟踪单元按顺序在返回栈上执行以下操作:

  1. 确定是否可能进行返回栈推入,并在需要时推入。
  2. 确定是否可能进行返回栈弹出,并在需要时弹出。

:某些Arm跟踪架构使用不同的操作顺序。

RSBZJB

当发生以下任何情况时,跟踪单元丢弃返回栈的内容:

  • 跟踪单元生成Trace Info元素。
  • 跟踪单元生成Trace On元素。
  • PE进入分支广播区域。

IXRQHQ

跟踪单元可能在任何时候丢弃返回栈的内容。

IDCNGF

当返回栈内容被丢弃时,不要求跟踪分析器意识到此丢弃操作已发生。这是因为即使跟踪单元返回栈的内容被丢弃,如果跟踪分析器返回栈的内容被保留但从未使用,也不会有不良后果。

RGZSSX

在Trace Info元素之后,需要Target Address元素和Context元素,但可能不会立即生成。如果在下一个P0元素之前没有生成Target Address元素和Context元素,则在Target Address元素和Context元素都生成之前,任何分支与链接指令都不能推入返回栈。

:此限制防止跟踪单元为跟踪分析器尚无法分析的指令执行返回栈推入,因为它尚未完全同步。


D4.5.12.5 时间戳值压缩(Timestamp value compression)

IGYYNG

跟踪分析器维护最后广播的Timestamp元素值的副本。Timestamp元素值可以相对于最后一个值进行压缩,只有已更改的位需要被编码。

RGPGQQ

当生成Trace Info数据包时,跟踪单元将其维护的最后一个Timestamp元素的值设置为零,并且当跟踪单元生成后续Timestamp数据包时,该值相对于这个新的零值进行压缩。这意味着Trace Info数据包之后的第一个Timestamp数据包包含Timestamp值的所有非零位。

ARM DDI 0487 M.b
版权所有 © 2013-2026 Arm Limited或其附属公司。保留所有权利。
非机密
D4-7420


译者注

以下是对文中关键概念的补充解释:

1. 跟踪禁止区域(Trace Prohibited regions)的作用
跟踪禁止区域是指令地址区域或PE执行的时间段,在这些区域中不允许生成跟踪信息。其主要作用是保护敏感代码(如安全状态下的代码)不被跟踪。当PE进入安全状态(Secure、Realm或Root状态),或FEAT_TRF/FEAT_TRBE禁止跟踪时,PE在跟踪禁止区域中执行。跟踪单元不会输出任何可能泄露关于该区域执行信息的跟踪数据(包括指令地址、上下文等)。这确保了机密代码的执行不会被泄露。

2. ViewInst函数的逻辑(S ∧ I ∧ E ∧ N)
ViewInst是决定指令是否应被跟踪的核心过滤函数,其定义为:ViewInst = S ∧ I ∧ E ∧ N,其中各分量的含义为:

  • S(Start/Stop function):基于指令地址的启动/停止过滤,可以定义跟踪的开始和结束地址。
  • I(Include/Exclude function):基于指令地址范围的包含/排除过滤。
  • E(Exception level filtering):基于异常级别的过滤,可以选择跟踪特定异常级别(如仅EL0/EL1)。
  • N(Resource event based filtering):基于资源事件的过滤,如周期计数采样或性能事件触发的跟踪。
    只有当所有四个分量同时为”真”时,ViewInst才为高,指令才”必须”被跟踪。

3. 周期计数和时间戳的关系

  • Cycle Count元素:跟踪单元通过比较Commit元素之间的周期数来测量性能。周期计数器大小在12-20位之间,当达到阈值时生成Cycle Count元素。
  • Timestamp元素:提供全局时间信息(物理时间、虚拟时间或系统定义的时间),用于关联多个跟踪流和确定事件发生的绝对/相对时间。
  • 当TRCCONFIGR.CCI为1时,每个Timestamp元素可以包含一个与最近Cycle Count元素之间的周期计数值,但这个值不影响累计周期计数,且可以为0。

4. Q元素的适用场景
Q元素是一种跟踪压缩机制,允许跟踪单元用一个元素暗示多条指令的执行。适用场景包括:

  • 需要跟踪大量连续指令但带宽有限的情况。
  • 当生成完整ETE指令跟踪元素流可能导致PE性能显著下降时。
  • 在性能敏感的代码区域中,使用Q元素可以减少跟踪数据量。
    Q元素会丢失部分程序流信息,因此Arm建议仅在必要时使用,并配合Q区域过滤(Include/Exclude模式)精确定位启用Q元素的地址范围。

5. 分支广播和返回栈优化

  • 分支广播(Branch broadcasting):强制跟踪单元显式跟踪所有已执行的直接P0指令的目标地址(使用Target Address元素)。否则,直接分支的目标地址需要由跟踪分析器从程序镜像中推断。分支广播可以按地址范围配置(包含/排除模式)。
  • 返回栈(Return stack):用于优化对”分支与链接”(BL)指令和间接分支的跟踪。当BL指令执行时,返回地址被推入返回栈;当间接分支(函数返回)的目标地址匹配栈顶时,可以省略Target Address元素,节省跟踪带宽。返回栈深度为0-15个条目。

6. 地址压缩算法和历史缓冲区

  • 地址历史缓冲区:跟踪单元保留最近3个显式输出的地址(来自Target Address、Source Address、Exception、PE Reset、Q数据包)。这允许后续地址引用使用”精确匹配”(Exact Match)形式的短数据包,而不是完整的64位地址。
  • 压缩原理:当需要输出一个地址时,跟踪单元检查该地址是否与历史缓冲区中的某个条目匹配。如果匹配,可以使用Exact Match数据包(仅索引),大幅减少数据量。跟踪分析器维护相同的地址历史以正确解码。

7. 跟踪协议同步(periodic vs non-periodic)

  • 非周期性同步(Non-periodic):由特定事件触发(如Trace Info元素请求、缓冲区溢出恢复)。同步后生成的Target Address元素不需要指示最近P0元素的目标,因为跟踪可能不在P0元素的目标处变为活动状态。
  • 周期性同步(Periodic):按固定间隔发生。同步后生成的Target Address元素必须指示最近P0元素的目标,因为跟踪从该P0元素继续。目标地址可能来自Trace Info元素之前的P0元素。
    两者都会生成Trace Info元素并提供重同步点,使跟踪分析器可以从该点开始分析。

8. 跟踪单元电源状态管理
ETE定义了四个电源域状态:

  • 正常(Normal):完全上电,所有寄存器可访问。
  • 待机(Standby):核心域上电但采取了节能措施,对软件/调试器透明。
  • 保持(Retention):OS采取措施降低能耗,寄存器不可访问,离开时不产生复位。
  • 掉电(Powerdown):核心域断电,寄存器不可访问,离开时产生复位。
    跟踪单元核心电源域可能与PE电源域分离,允许独立电源管理。ETE仅支持单个电源域(TRCPDSR.POWER始终为1)。系统还可实现调试电源域,供外部调试器独立访问。

D4.6 资源操作(Resource Operation)

D4.6

资源操作

IPKCDG

FEAT_ETE拥有多个可用于提供高级过滤功能的资源。

RPWBZK

资源运行在以下状态之一:

  • 运行(Running) — 所有资源均处于活动状态。
  • 暂停中(Pausing) — 资源正在过渡到暂停状态。
  • 已暂停(Paused) — 除外部输入选择器(External Input Selectors)外,所有资源均为静态且非活动状态。
1
运行 ──→ 暂停中 ──→ 已暂停

Figure D4-16

IHWYYK

如”系统行为”中所述,跟踪单元可通过以下任一方式禁用:

  • 设置 TRCPRGCTLR.EN 为 0。
  • 锁定 OS 锁,通过设置 OSLAR_EL1.OSLK 为 1。

RJLLVN

当资源处于运行状态时,发生以下任一情况时,资源进入暂停中状态:

  • 跟踪单元变为禁用。
  • 跟踪单元进入低功耗状态。
  • PE 开始在跟踪禁止区域(Trace Prohibited region)中执行。

RYWDVJ

当资源处于暂停中状态时,资源在有限时间内进入已暂停状态。

RLYFDT

当跟踪单元处于已暂停状态时,以下所有条件成立时,资源进入运行状态:

  • 跟踪单元已启用。
  • 跟踪单元未处于低功耗状态。
  • PE 未在跟踪禁止区域中执行。

RTMPZZ

跟踪单元缓冲区溢出对资源的行为没有影响。

D4.6.1 处于运行状态时的资源行为

SJVYQP

资源运行所需的时间可能因不同的跟踪单元实现而异。


D4.6.2 处于暂停中状态时的资源行为

RRDCGC

当资源进入暂停中状态时,资源执行以下过程:

  1. 除状态机(Sequencer)和任何计数器(Counters)外,所有资源都被驱动为低电平,作为资源选择器(Resource Selector)逻辑的输入。计数器和状态机正常运行。
  2. 在资源被驱动为低电平之前,这些输入的状态会传播通过资源选择器逻辑。
  3. 计数器和状态机的状态再额外传播一次通过资源选择器逻辑。也就是说,计数器和状态机的状态通过资源选择器逻辑传播的时间,等于资源状态通过资源选择器逻辑传播所需的时间。
  4. 资源进入已暂停状态。

ILGWRK

资源在暂停中状态时执行的过程所产生的结果是,对于由非计数器或非状态机资源激活的资源事件,不会丢失任何活动,因为所有这些资源事件都已更新。

ICQNGN

当计数器和状态机状态作为资源被反馈回来从而形成循环时,以下情况成立:

  • 如果使用计数器归零(Counter at zero)资源来激活状态机或计数器,那么在该过程结束时,该计数器归零资源可能仍在通过资源选择器逻辑传播。在这种情况下,由该计数器归零资源激活的状态机状态资源或其他计数器归零资源可能会丢失。
  • 如果使用状态机状态资源来激活计数器,那么在该过程结束时,该状态机状态资源可能仍在通过资源选择器逻辑传播。在这种情况下,由该状态机状态资源激活的计数器归零资源可能会丢失。

IBRZXY

当跟踪单元变为禁用时,资源在暂停中状态下的行为确保程序员模型提供跟踪单元资源状态的一致视图。即,关于计数器和状态机,以下情况成立:

  • 如果状态机的状态被反馈为资源,那么作为资源事件的状态机视图和状态机资源状态的视图都显示相同的状态机状态。
  • 如果计数器的状态被反馈为资源,那么作为资源事件的计数器视图和计数器资源状态的视图都显示相同的计数器状态。计数器状态可能是以下之一:
    • 计数器归零。
    • 计数器未归零。

D4.6.3 处于已暂停状态时的资源行为

IYXKSQ

当 PE 进入低功耗状态或跟踪禁止区域时,资源的行为与 Arm 定义的其他跟踪架构不同。

RFHYQW

当资源处于已暂停状态且跟踪单元未禁用时,资源不会丢失正在转换中的资源事件,但通过资源暂停中状态时允许丢失的事件除外。有关在暂停中状态下允许丢失的资源事件的详细信息,请参见”处于暂停中状态时的资源行为”。

IHZRSS

当资源处于已暂停状态时,资源可能直到离开已暂停状态后才观察到正在转换中的资源事件。

RYWQNQ

当资源处于已暂停状态时,资源保持其当前所处的状态。

RBQSMN

当资源处于已暂停状态时,跟踪单元将所有外部输出(External Outputs)驱动为低电平。

RMVZYP

当跟踪单元变为禁用且资源进入已暂停状态时(且在此之前不会),跟踪单元可能设置 TRCSTATR.PMSTABLE 为 1。

RRWNTS

当 TRCSTATR.PMSTABLE 设置为 1 时,所有资源和资源事件保持静止状态。

IZSHWT

外部输入选择器在已暂停状态下的行为详见”已暂停状态下的操作”。


D4.6.4 在跟踪同步事件上的资源行为

RRFSRY

当以下资源已完成对先前上下文同步事件之前所有指令的计算时,跟踪同步事件完成:

  • 地址比较器(Address Comparators)
  • 上下文标识符比较器(Context Identifier Comparators)
  • 虚拟上下文标识符比较器(Virtual Context Identifier Comparators)
  • 单次比较器控制(Single-shot Comparator Controls)

D4.6.5 资源组织

INJLRF

资源有 2 种类型:

  • 精确资源(Precise resources)
  • 非精确资源(Imprecise resources)

每个资源都有一个当前状态,作为资源状态(Resource state)输出。资源状态由资源选择器(Resource Selectors)选择,然后被各种跟踪单元功能用作资源事件(Resource event),参见图 D4-17。

IJCKLL

1
资源 ──→ 资源状态 ──→ 资源选择器 ──→ 资源事件 ──→ 跟踪单元功能

Figure D4-17

D4.6.5.1 精确资源

IQSPKY

精确资源用于评估 ViewInst 包含/排除函数和 ViewInst 启动/停止函数。

RWNGDH

跟踪单元对每个指令块评估精确资源。详见”指令块”。

RNFDCZ

跟踪单元保持精确资源的执行顺序。

1
2
3
4
5
6
地址比较器 ──┐
上下文标识符 ├──→ ViewInst 包含/排除函数 ──┐
比较器 │ │
虚拟上下文 │ ├──→ ViewInst
标识符比较器 ┘ │
PE 比较器输入 ──────────────────→ ViewInst 启动/停止函数 ┘

Figure D4-18

D4.6.5.2 非精确资源

INNHSY

如果某个资源不是精确资源,则它是非精确资源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
地址比较器 ──┐
上下文标识符 ├──┐
比较器 │ │
虚拟上下文 │ │
标识符比较器 │ │
状态机 │ │
单次比较器 │ │
控制 │ │
资源选择器 │ │
├──→ 资源事件总线 ──→ ViewInst
计数器 │ ──→ 计数器
时间戳控制 │ ──→ 状态机
状态机 │ ──→ *ETEEvents*
PE 比较器输入│ ──→ PE 比较器输入
外部输入 │
选择器 │
PMU 事件 │

Figure D4-19

D4.6.5.3 选择单个资源或一对资源

IBRQFW

通过使用资源选择器来选择资源。

RQDJVV

每个资源选择器使用 30 个 TRCRSCTLR<n> 寄存器之一。跟踪单元成对实现资源选择器,因此最多可实现 15 个可编程对。

RNRSGN

资源选择器 0 始终提供 FALSE(假)结果。

RSXSQT

当资源处于运行状态时,资源选择器 1 提供 TRUE(真)结果。

ITQVKS

TRCIDR4.NUMRSPAIR 指示实现了多少对资源选择器。

IMSHWC

资源选择器可以成对使用或单独使用。当使用一对资源选择器时,可以将布尔函数应用于所选资源组合的输出。参见图 D4-21。

RWZVDQ

当 TRCRSCTLR<n>.SELECT[m] 为 1 时,资源选择器选择由 TRCRSCTLR<n>.GROUP 选择的组中的资源编号 m,如表 D4-26 所述。

表 D4-26 资源分组

GROUP 资源编号(Resource Number) 资源(Resource)
0b0000 0-3 外部输入选择器 0-3
4-15 保留
0b0001 0-7 PE 比较器输入 0-7
8-15 保留
0b0010 0 计数器 0 归零
1 计数器 1 归零
2 计数器 2 归零
3 计数器 3 归零
4 状态机状态 0
5 状态机状态 1
6 状态机状态 2
7 状态机状态 3
8-15 保留
0b0011 0-7 单次比较器控制 0-7
8-15 保留
0b0100 0-15 单地址比较器(SAC)0-15
0b0101 0-7 地址范围比较器(ARC)0-7
8-15 保留
0b0110 0-7 上下文标识符比较器 0-7
8-15 保留
0b0111 0-7 虚拟上下文标识符比较器 0-7
8-15 保留
0b1xxx 0-15 保留

RHVNQG

当 TRCRSCTLR<n>.INV 设置为 0 且组中选择了一个或多个资源时,当所选资源中任一输出为高电平时,资源选择器触发(fires)。

RWFGMY

当 TRCRSCTLR<n>.INV 设置为 1 时,当所选资源中没有任何输出为高电平时,资源选择器触发。

ISZZMP

图 D4-20 总结了资源选择的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                ┌─────────────────┐
│ 资源选择器 │
│ │
INV ────────────┤ │
│ GROUP │
N 个资源 ──────→│ SELECT │
│ 4 │
│ 16 │
│ │
│ 应用掩码从 N 个 │
│ 资源中选择一个 │
│ 或多个资源 │
│ │
│ N │
│ OR ─→ XOR ────→ 资源输出
└─────────────────┘

Figure D4-20

D4.6.5.4 资源选择器对

IDLRMJ

资源选择器按对排列,每对资源选择器的结果可以使用布尔函数组合,并用于驱动跟踪单元中的其他资源和事件。

RKTNJM

对于作为资源选择器对中较低寄存器的每个 TRCRSCTLR<n> 寄存器,该 TRCRSCTLR<n> 寄存器具有 TRCRSCTLR<n>.PAIRINV 字段。

IQKTSJ

例如:

  • TRCRSCTLR2 和 TRCRSCTLR3 构成一个资源选择器对。在这种情况下:
    • TRCRSCTLR2 是较低寄存器。
    • TRCRSCTLR2.PAIRINV 可选地反转应用于所选资源组合输出的布尔函数的结果。
    • TRCRSCTLR3 是较高寄存器。
    • TRCRSCTLR3.PAIRINV 是 RES0。

ILPJXK

这意味着,当使用资源选择器对时,可能的情景如下:

  • 一个 TRCRSCTLR<n> 可能只选择组内的一个资源。
  • 另一个 TRCRSCTLR<n> 可能从组中选择多个资源,因此结果是所选资源的逻辑 OR。
  • 可以将布尔函数(例如逻辑 AND)应用于所选资源组合的输出。
  • 该布尔函数的结果可以通过使用 PAIRINV 进行反转。

在图 D4-21 中,布尔函数通过使用每个资源选择器的 INV 字段来选择,并使用每个资源选择器对的 PAIRINV 字段,参见表 D4-27。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
┌─────────────────────────────────────────────────────────┐
│ 较低资源选择器 │
│ │
│ INV PAIRINV │
│ N 个资源 ──── GROUP ┌────────────────┐│
│ ──── SELECT │ 应用掩码从 N ││
│ 4 │ 个资源中选择一 ││
│ 16 │ 个或多个资源 ││
│ └───────┬────────┘│
│ │ │
│ N │
│ │ │
│ OR │
│ │ │
│ XOR ──── Resource A
│ │
│ 较高资源选择器 │
│ │
│ INV │
│ N 个资源 ──── GROUP ┌────────────────┐│
│ ──── SELECT │ 应用掩码从 N ││
│ 4 │ 个资源中选择一 ││
│ 16 │ 个或多个资源 ││
│ └───────┬────────┘│
│ │ │
│ N │
│ │ │
│ OR │
│ │ │
│ XOR ──── Resource B
│ │
│ AND │
│ │ │
│ XOR │
│ │ │
│ Combined Resource │
└─────────────────────────────────────────────────────────┘

Figure D4-21

表 D4-27 选择布尔函数

函数 PAIRINV 资源 A INV 资源 B INV
A AND B 0b0 0b0 0b0
NOT(A AND B) 0b1 0b0 0b0
保留 0b0 0b0 0b1
NOT(A) OR B 0b1 0b0 0b1
NOT(A) AND B 0b0 0b1 0b0
保留 0b1 0b1 0b0
NOT(A) AND NOT(B) 0b0 0b1 0b1
A OR B 0b1 0b1 0b1

D4.6.6 地址比较器

ILGGVG

ETE 跟踪单元提供 0 到 16 个单地址比较器(Single Address Comparator, SAC),每个 SAC 将指令地址与用户编程的值进行比较。

RYCRNP

跟踪单元成对实现 SAC,因此跟踪单元实现包含偶数个 SAC。

IMNTCY

TRCIDR4.NUMACPAIRS 指示实现了多少对 SAC。

RYMVDZ

当 PE 在调试状态(Debug state)下执行指令时,地址比较器不匹配。

RYPWLR

当 PE 在跟踪禁止区域中执行指令时,地址比较器不匹配。

IWDJPG

地址比较器可能在推测执行(Speculative execution)上匹配。

D4.6.6.1 单地址比较器

ISSHHT

SAC 可以以下方式使用:

  • 作为 ViewInst 函数中 ViewInst 启动/停止函数的输入。更多信息,请参见”ViewInst 启动/停止函数过滤”。
  • 作为独立资源。
  • 可以编程比较器,使得每当 PE 处于特定的安全状态时,比较器仅在特定的异常级别匹配。

RDKCFF

SAC 仅匹配 TRCACATR<n> 指示的异常级别和安全状态上的地址。

SAC_ELi[n] =

  • Secure EL0: ¬TRCACATR<n>.EXLEVEL_S_EL0
  • Secure EL1: ¬TRCACATR<n>.EXLEVEL_S_EL1
  • Secure EL2: ¬TRCACATR<n>.EXLEVEL_S_EL2
  • EL3: ¬TRCACATR<n>.EXLEVEL_S_EL3
  • Non-secure EL0: ¬TRCACATR<n>.EXLEVEL_NS_EL0
  • Non-secure EL1: ¬TRCACATR<n>.EXLEVEL_NS_EL1
  • Non-secure EL2: ¬TRCACATR<n>.EXLEVEL_NS_EL2
  • Realm EL0: ¬(TRCACATR<n>.EXLEVEL_RL_EL0 ⊕ TRCACATR<n>.EXLEVEL_NS_EL0)
  • Realm EL1: ¬(TRCACATR<n>.EXLEVEL_RL_EL1 ⊕ TRCACATR<n>.EXLEVEL_NS_EL1)
  • Realm EL2: ¬(TRCACATR<n>.EXLEVEL_RL_EL2 ⊕ TRCACATR<n>.EXLEVEL_NS_EL2)

RQFNSK

SAC 仅匹配 TRCACATR<n>.CONTEXT 和 TRCACATR<n>.CONTEXTTYPE 指示的上下文。

m = TRCACATR<n>.CONTEXT
type = TRCACATR<n>.CONTEXTTYPE

SAC_CONTEXTi[n] =

  • type is 0: 1
  • type is 1: CIDCOMP[m]
  • type is 2: VMIDCOMP[m]
  • type is 3: CIDCOMP[m] ∧ VMIDCOMP[m]

RPYMZV

当执行一条指令,且该指令最低字节的地址与 SAC 编程的地址完全匹配时,该 SAC 匹配。

SAC_ADDRi[n] = (ThisInstrAddr()i ≡ TRCACVR<n>.ADDRESS)

ISPFXX

例如,对于地址 0x1000 处的 4 字节指令:

  • 指令的最低字节位于 0x1000。
  • 指令的第二个字节位于 0x1001。
  • 指令的第三个字节位于 0x1002。
  • 指令的最高字节位于 0x1003。

如果 SAC 编程为 0x1000,则它始终匹配地址 0x1000 处的该指令。

IJZXFJ

当编程地址匹配指令的非最低字节时,SAC 是否匹配由实现定义(IMPLEMENTATION DEFINED)。

IVSFSS

Arm 架构支持使用 SCTLR、HSCTLR 和 SCTLR_EL1 系统寄存器中的 ITD 位来禁用超过一条后续指令上的 IT 指令。如果任意 ITD 位设置为 1 且影响 IT 操作,且 SAC 编程为匹配紧跟在 IT 指令之后的指令的地址,当紧跟在 IT 指令之后的指令被执行时,该比较器是否匹配是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

STFYFT

如果任意 ITD 位设置为 1,Arm 建议将 SAC 编程为匹配 IT 指令的地址,而不是紧跟在 IT 指令之后的指令。

SMLDYK

为避免 SAC 的意外行为,Arm 建议始终使用指令最低字节的地址来编程 SAC。

IMCKFH

当执行紧跟在 MOVPRFX 指令之后的指令时,如果 SAC 编程为匹配该指令的地址,则该比较器是否匹配是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

SFPTHL

Arm 建议将 SAC 编程为匹配 MOVPRFX 指令的地址,而不是紧跟在 MOVPRFX 指令之后的指令。

ITBNTJ

SAC 的操作如下:

1
2
3
SACi[n] = 0                (当禁止时)
0 (当处于调试状态时)
SAC_ADDR[i] ∧ SAC_EL[i] ∧ SAC_CONTEXT[i] (其他情况)

D4.6.6.2 地址范围比较器

IHDFQM

SAC 对排列成形成一个地址范围比较器(Address Range Comparator, ARC)。ARC 编程有一个地址范围,因此当访问该范围内的任何地址时,ARC 匹配。跟踪单元包含零到八个 ARC。ARC 可以以下方式使用:

  • 被选择用于 ViewInst 函数中的 ViewInst 包含/排除函数。参见”ViewInst 包含/排除函数过滤”。
  • 作为独立资源。

ARC 通过如下编程 SAC 来编程:

  • 第一个 SAC 编程为指令范围的起始地址。
  • 第二个 SAC 编程为指令范围的结束地址。

SWFSPV

第二个 SAC 编程的地址必须大于或等于第一个 SAC 编程的地址,即结束地址必须大于或等于起始地址。

RMXCGD

当 ARC 的起始地址大于结束地址时,ARC 的行为是受限不可预测的(CONSTRAINED UNPREDICTABLE),即任何时候 ARC 可能执行以下任一操作:

  • 匹配。
  • 不匹配。

RXYJLC

当 ARC 中 SAC 的 TRCACATR<n> 寄存器编程为不同值时,ARC 的行为是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

RLLQPL

当 ARC 编程有指令地址范围时,PE 执行以下范围内的地址处的指令时,ARC 匹配:

start_address = TRCACVR<n>.ADDRESS
end_address = TRCACVR<n+1>.ADDRESS
ARC_ADDRi[n/2] = (ThisInstrAddr()i ≥ start_address) ∧ (ThisInstrAddr()i ≤ end_address)

RYYXSQ

当执行一条指令,且该指令最低字节的地址位于 ARC 编程的地址范围内时,该 ARC 匹配。

IRPFWZ

当执行一条指令,且 ARC 编程的地址范围包含该指令的一个或多个字节的地址,但不包含该指令最低字节的地址时,ARC 是否匹配是实现特定的(IMPLEMENTATION SPECIFIC)。

IRZFPT

例如,对于地址 0x1000 处的 4 字节指令:

  • 指令的最低字节位于 0x1000。
  • 指令的第二个字节位于 0x1001。
  • 指令的第三个字节位于 0x1002。
  • 指令的最高字节位于 0x1003。

如果编程的地址范围包含 0x1000,则 ARC 始终匹配。但是,如果编程的地址范围起始于 0x1001、0x1002 或 0x1003,则 ARC 是否匹配是实现特定的(IMPLEMENTATION SPECIFIC)。

SHSFTQ

为避免 ARC 的意外行为,Arm 建议始终使用起始于指令最低字节地址的地址范围来编程 ARC。

IVRRHS

Arm 架构支持使用 SCTLR、HSCTLR 和 SCTLR_EL1 系统寄存器中的 ITD 位来禁用超过一条后续指令上的 IT 指令。如果任意 ITD 位设置为 1 且影响 IT 操作,且 ARC 编程为包含紧跟在 IT 指令之后的指令的地址但不包含 IT 指令本身,当紧跟在 IT 指令之后的指令被执行时,该比较器是否匹配是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

SDMHQH

如果任意 ITD 位设置为 1,Arm 建议将 ARC 编程为同时包含 IT 指令和紧跟在 IT 指令之后的指令。

IPBKPJ

当执行紧跟在 MOVPRFX 指令之后的指令时,如果 ARC 编程为包含 MOVPRFX 指令之后的指令的地址但不包含 MOVPRFX 指令本身,则该比较器是否匹配是受限不可预测的(CONSTRAINED UNPREDICTABLE)。

SHVTHL

Arm 建议将 ARC 编程为同时包含 MOVPRFX 指令和紧跟在 MOVPRFX 指令之后的指令。

IHTXLT

可能同时发生多个匹配。同时发生匹配的定义是实现特定的(IMPLEMENTATION SPECIFIC),并且可能因运行时条件而变化。然而,同时发生多个匹配的一个示例是当在同一条理器时钟周期内观察到多条指令时,从而对编程范围内的每个地址进行多次比较。在这种情况下,可能发生以下任一情况:

  • 范围内的地址被匹配多次。
  • 范围内的多个地址被同时匹配。

RHMYMX

当为一个 ARC 同时发生多个 ARC 匹配时,以下两者都成立:

  • ARC 至少发出一次匹配信号。
  • ARC 发出的匹配信号不超过执行的指令数,这些指令的地址匹配编程范围内的地址。

ICTBDN

每个 ARC 可以与以下一项或组合使用:

  • 上下文标识符比较器。
  • 虚拟上下文标识符比较器。

RTMCJX

ARC 仅匹配 TRCACATR<2n> 指示的异常级别和安全状态。

ARC_ELi[n] =

  • Secure EL0: ¬TRCACATR<2n>.EXLEVEL_S_EL0
  • Secure EL1: ¬TRCACATR<2n>.EXLEVEL_S_EL1
  • Secure EL2: ¬TRCACATR<2n>.EXLEVEL_S_EL2
  • EL3: ¬TRCACATR<2n>.EXLEVEL_S_EL3
  • Non-secure EL0: ¬TRCACATR<2n>.EXLEVEL_NS_EL0
  • Non-secure EL1: ¬TRCACATR<2n>.EXLEVEL_NS_EL1
  • Non-secure EL2: ¬TRCACATR<2n>.EXLEVEL_NS_EL2
  • Realm EL0: ¬(TRCACATR<2n>.EXLEVEL_RL_EL0 ⊕ TRCACATR<2n>.EXLEVEL_NS_EL0)
  • Realm EL1: ¬(TRCACATR<2n>.EXLEVEL_RL_EL1 ⊕ TRCACATR<2n>.EXLEVEL_NS_EL1)
  • Realm EL2: ¬(TRCACATR<2n>.EXLEVEL_RL_EL2 ⊕ TRCACATR<2n>.EXLEVEL_NS_EL2)

RVSBJF

ARC 仅匹配 TRCACATR<2n>.CONTEXT 和 TRCACATR<2n>.CONTEXTTYPE 指示的上下文。

m = TRCACATR<2n>.CONTEXT
type = TRCACATR<2n>.CONTEXTTYPE

ARC_CONTEXTi[n] =

  • type is 0: 1
  • type is 1: CIDCOMP[m]
  • type is 2: VMIDCOMP[m]
  • type is 3: CIDCOMP[m] ∧ VMIDCOMP[m]

RRTXJN

ARC 的操作如下:

1
2
3
ARCi[n] = 0                 (当禁止时)
0 (当处于调试状态时)
ARC_ADDR[i] ∧ ARC_EL[i] ∧ ARC_CONTEXT[i] (其他情况)

D4.6.7 上下文标识符比较器

IKDSNY

ETE 跟踪单元提供零到八个上下文标识符比较器。每个上下文标识符比较器可以以下任一方式使用:

  • 与 SAC 关联。
  • 与 ARC 关联。
  • 作为独立资源。

RDCCBY

当上下文标识符比较器与 SAC 或 ARC 关联时,仅当 PE 使用该上下文标识符比较器编程的上下文标识符执行,且访问的地址是 SAC 或 ARC 编程匹配的地址时,SAC 或 ARC 才发出匹配信号。

RBKQKQ

当上下文标识符比较器作为独立资源使用时,当使用该上下文标识符比较器编程的上下文标识符执行指令块时,该上下文标识符比较器匹配。

IPBXRH

当使用上下文标识符比较器作为独立资源来激活资源事件时,资源事件被激活的时间相对于上下文标识符比较器变为活动的时间可能是不精确的(imprecise)。

IRBLYL

可能同时发生多个上下文标识符比较器匹配。同时发生匹配的定义是实现特定的(IMPLEMENTATION SPECIFIC),并且可能因运行时条件而变化。然而,同时发生多个匹配的一个示例是当在同一条理器时钟周期内观察到多条指令时,从而进行多次比较。

RMPJBW

当同一个上下文标识符比较器同时发生多个上下文标识符比较器匹配时,以下所有情况成立:

  • 上下文标识符比较器至少发出一次匹配信号。
  • 上下文标识符比较器发出的匹配信号不超过使用该上下文标识符比较器编程的上下文标识符执行的指令数。

IHDCJK

上下文标识符比较器可能在推测执行上匹配,即如果 PE 推测性地更改了上下文标识符,上下文标识符比较器可能匹配。

RMCYYC

当 PE 在调试状态下执行指令时,上下文标识符比较器不匹配。

RSRZGJ

当 PE 在跟踪禁止区域中执行指令时,上下文标识符比较器不匹配。

IGKDRL

上下文标识符可能在非上下文同步事件的点发生变化,例如在使用系统指令写入当前上下文标识符寄存器时。在这些场景中,上下文标识符比较器可能针对系统指令前的 P0 元素之后的任何指令,直到系统指令后的上下文同步事件,比较旧的或新的上下文标识符值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
m = TRCCIDCCTLR0.COMP0 (n≡0)
TRCCIDCCTLR0.COMP1 (n≡1)
TRCCIDCCTLR0.COMP2 (n≡2)
TRCCIDCCTLR0.COMP3 (n≡3)
TRCCIDCCTLR1.COMP4 (n≡4)
TRCCIDCCTLR1.COMP5 (n≡5)
TRCCIDCCTLR1.COMP6 (n≡6)
TRCCIDCCTLR1.COMP7 (n≡7)

v = TRCCIDCVR<n>.VALUE
cid = CONTEXTIDR_EL1.PROCID

CIDCOMP[n] = 0 (当禁止时)
0 (当处于调试状态时)
∏(j=0 to 7) ((v[8j+7:8j] ≡ cid[8j+7:8j]) ∨ m[j]) (其他情况)

D4.6.8 虚拟上下文标识符比较器

IBXVPG

ETE 跟踪单元提供零到八个虚拟上下文标识符比较器。每个虚拟上下文标识符比较器可以以下任一方式使用:

  • 与 SAC 关联。
  • 与 ARC 关联。
  • 作为独立资源。

RRTRBM

当虚拟上下文标识符比较器与 SAC 或 ARC 关联时,仅当 PE 使用该虚拟上下文标识符比较器编程的虚拟上下文标识符执行,且访问的地址是 SAC 或 ARC 编程匹配的地址时,SAC 或 ARC 才发出匹配信号。

RVWYMY

当虚拟上下文标识符比较器作为独立资源使用时,当使用匹配虚拟上下文标识符比较器值的虚拟上下文标识符执行指令块时,该虚拟上下文标识符比较器匹配。

RFLXQL

当 TRFCR_EL2.CX 指示虚拟上下文标识符比较器不能匹配时,虚拟上下文标识符比较器不匹配。

RLPKBR

当 PE 在调试状态下执行指令时,虚拟上下文标识符比较器不匹配。

RWZWLT

当 PE 在跟踪禁止区域中执行指令时,虚拟上下文标识符比较器不匹配。

ISCPJP

当使用虚拟上下文标识符比较器作为独立资源来激活资源事件时,资源事件被激活的时间相对于虚拟上下文标识符比较器变为活动的时间可能是不精确的。

RLJRPW

虚拟上下文标识符比较器通过编程 SAC 的 TRCACATR<n>.CONTEXT 与 SAC 关联。

IGJCRG

可能同时发生多个虚拟上下文标识符比较器匹配。同时发生匹配的定义是实现特定的(IMPLEMENTATION SPECIFIC),并且可能因运行时条件而变化。然而,同时发生多个匹配的一个示例是当在同一条理器时钟周期内观察到多条指令时,从而进行多次比较。

RJNNDL

当同一个虚拟上下文标识符比较器同时发生多个虚拟上下文标识符比较器匹配时,以下两者都成立:

  • 虚拟上下文标识符比较器至少发出一次匹配信号。
  • 虚拟上下文标识符比较器发出的匹配信号不超过使用该虚拟上下文标识符比较器编程的虚拟上下文标识符执行的指令数。

INPPCF

虚拟上下文标识符比较器可能在推测执行上发出匹配信号,即当 PE 推测性地更改了虚拟上下文标识符时,虚拟上下文标识符比较器可能发出匹配信号。

IPPWXT

虚拟上下文标识符可能在非上下文同步事件的点发生变化,例如在使用系统指令写入 CONTEXTIDR_EL2 时。在这些场景中,虚拟上下文标识符比较器可能针对系统指令前的 P0 元素之后的任何指令,直到系统指令后的上下文同步事件,比较旧的或新的虚拟上下文标识符值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
m = TRCVMIDCCTLR0.COMP0 (n≡0)
TRCVMIDCCTLR0.COMP1 (n≡1)
TRCVMIDCCTLR0.COMP2 (n≡2)
TRCVMIDCCTLR0.COMP3 (n≡3)
TRCVMIDCCTLR1.COMP4 (n≡4)
TRCVMIDCCTLR1.COMP5 (n≡5)
TRCVMIDCCTLR1.COMP6 (n≡6)
TRCVMIDCCTLR1.COMP7 (n≡7)

VMID = CONTEXTIDR_EL2.PROCID
v = TRCVMIDCVR<n>.VALUE

VMIDCOMP[n] = 0 (当禁止时)
0 (当处于调试状态时)
∏(j=0 to 7) ((v[8j+7:8j] ≡ VMID[8j+7:8j]) ∨ m[j]) (其他情况)

D4.6.9 计数器

INCCBM

ETE 架构使用的计数器都是递减计数器。

ETE 架构使跟踪单元能够将计数器输出连接到资源事件,从而可以将计数器归零状态用作资源来激活资源事件。例如,计数器归零状态可用于断言外部输出或使 ViewInst 激活。

ETE 跟踪单元提供最多四个 16 位计数器。TRCIDR5.NUMCNTR 指示实现了多少个计数器。对于每个计数器,可以指定以下内容:

  • 初始计数值。可使用 TRCCNTVR<n> 编程。
  • 重载值。可使用 TRCCNTRLDVR<n> 编程。
  • 导致计数器用重载值重载的资源事件。此资源事件称为 RLDEVENT。此外,如果需要,可以编程计数器使其在达到零时自动重载。
  • 使能计数器递减的资源事件。此资源事件称为 CNTEVENT。每当 CNTEVENT 活动时,计数器递减。

RRBMQM

处理器时钟为跟踪单元中的计数器提供时钟。

RPZQGV

当 PE 停顿(stalled)时,计数器继续计数。

RFHFMP

当资源处于已暂停状态时,计数器不计数。

RLFVYH

当计数器值通过直接写入 TRCCNTVR<n> 以外的任何方式改变时,跟踪单元认为该改变是对 TRCCNTVR<n>.VALUE 的间接写入。

IMLDXC

每个计数器以以下两种可能模式之一运行:

  • 常规模式(Normal mode)
  • 自重载模式(Self-reload mode)

RSBQPN

当计数器处于常规模式时,计数器达到零后,保持在零直到重载资源事件 RLDEVENT 发生。

RHYLGG

当计数器处于常规模式时,计数器归零资源在计数器处于零的整个期间内活动。

RYLYPH

当计数器处于自重载模式时,计数器达到零后,当下一次递减资源事件活动时,跟踪单元用重载值重载计数器。

RVGJNL

当计数器处于自重载模式时,当计数器值为零、递减资源事件活动且重载资源事件不活动时,计数器归零资源在一个周期内活动。

IKTRXV

以下示例展示了单个计数器的各种运行场景。每个计数器编程的重载值为 0x3。

图 D4-22 计数器示例 1,常规模式

1
2
3
4
5
6
CLK
资源事件
计数器值 0x3 → 0x2 → 0x1 → 0x0 → 0x3 → 0x2 → 0x1 → 0x0
计数器 CNTEVENT: [active pulses]
计数器 RLDEVENT: [active pulse]
计数器归零: [active while at zero]

Figure D4-22

图 D4-23 计数器示例 2,常规模式

1
2
3
4
5
6
CLK
资源事件
计数器值 0x3 → 0x2 → 0x1 → 0x0 → 0x3 → 0x2
计数器 CNTEVENT: [active pulses]
计数器 RLDEVENT: [active pulse]
计数器归零: [active while at zero]

Figure D4-23

图 D4-24 计数器示例 3,自重载模式

1
2
3
4
5
6
CLK
资源事件
计数器值 0x3 → 0x2 → 0x1 → 0x0 → 0x3 → 0x2 → 0x1 → 0x3 → 0x2 → 0x1 → 0x0
计数器 CNTEVENT: [active pulses]
计数器 RLDEVENT: [inactive]
计数器归零: [active for one cycle at zero]

Figure D4-24

图 D4-25 计数器示例 4,自重载模式

1
2
3
4
5
6
CLK
资源事件
计数器值 0x3 → 0x2 → 0x1 → 0x0 → 0x3 → 0x2 → 0x1 → 0x0
计数器 CNTEVENT: [active pulses]
计数器 RLDEVENT: [active pulse]
计数器归零: [active for one cycle at zero]

Figure D4-25

图 D4-26 计数器示例 5,自重载模式

1
2
3
4
5
6
CLK
资源事件
计数器值 0x3 → 0x2 → 0x1 → 0x0 → 0x3 → 0x2 → 0x1
计数器 CNTEVENT: [active pulses]
计数器 RLDEVENT: [active before zero]
计数器归零: [active for one cycle at zero]

Figure D4-26

RKXLKC

当递减资源事件不活动时,计数器不递减。

RDDCDK

跟踪单元优先处理重载资源事件,优先于计数递减资源事件。

D4.6.9.1 常规模式下的计数器操作

IBRLYH

下表描述了常规模式下的计数器操作。

常规模式下计数器操作表

RLDEVENT dec_action 计数值 动作 资源活动 说明
非活动 x 0 稳定 计数器为零且保持为零时资源活动
非活动 0 >0 稳定 无活动
非活动 1 >0 递减 非零时递减
活动 x 0 重载 重载,但因计数器为零故资源活动
活动 x >0 重载 重载

D4.6.9.2 自重载模式下的计数器操作

ISHWBT

下表描述了自重载模式下的计数器操作:

自重载模式下计数器操作表

RLDEVENT dec_action 计数值 动作 资源活动 说明
非活动 0 x 稳定 无活动,即使计数器为零资源也不活动
非活动 1 0 重载 因 dec_action 活动且计数器为零而重载,资源仅在此周期活动
非活动 1 >0 递减 非零时递减
活动 x x 重载 无论递减动作和计数器值如何都重载,资源从不活动

D4.6.9.3 将两个独立计数器组成更大的计数器

ITYLSH

某些计数器可以链接在一起形成更大的计数器,这样每当一个计数器重载时,另一个计数器就递减。

IMMDRW

以下示例展示了两个链接在一起的计数器的运行场景。计数器 0 编程的重载值为 0x2。

图 D4-27 链接计数器示例 1

1
2
3
4
5
6
7
8
9
10
11
CLK:         0   1   2   3   4   5   6   7   8   9  10  11  12  13
计数器0值: 0x2 0x1 0x0 0x2 0x1 0x0 0x2 0x1 0x2 0x1 0x0 0x2 0x1 0x0
计数器1值: 0x3 0x2 0x1
事件:
计数器0 CNTEVENT: [active on clock edges]
计数器0 RLDEVENT: [active at certain points]
计数器1 CNTEVENT: [active when counter0 reloads]
计数器1 RLDEVENT: [active at certain points]
资源:
计数器0归零: [active at zero]
计数器1归零: [active at zero]

Figure D4-27

RWPWQD

只有特定计数器可以编程为链接在一起,如下所示:

  • 计数器 1 可以编程为在计数器 0 重载时递减。
  • 计数器 3 可以编程为在计数器 2 重载时递减。

RQHZFW

较高计数器 n 的递减资源事件在以下任一情况发生时活动:

  • 较低计数器因以下任一原因重载:
    • TRCCNTCTLR<n-1>.RLDEVENT 选择的重载资源事件。
    • TRCCNTCTLR<n-1>.RLDSELF 控制的自重载机制。
  • TRCCNTCTLR<n>.CNTEVENT 选择的递减资源事件活动。

RBDPDN

当两个计数器链接在一起形成更大的计数器时,更大的计数器表现为一个 32 位计数器,两个计数器之间的值不会出现撕裂(tearing)现象。

IFTDHL

例如,如果计数器 0 处于自重载模式,值为 0x0000,重载值为 0xFFFF;计数器 1 处于常规模式,值为 0x1234;则当计数器 0 上发生递减资源事件时,计数器 0 重载为 0xFFFF。计数器 0 的重载导致计数器 1 递减,结果为 0x1233。因此连续周期上计数器的序列为 0x1234_0000 和 0x1233_FFFF。

IBCMGM

对于计数器 1 和 3,TRCCNTCTLR<n>.CNTCHAIN 是一个读/写字段,决定计数器是否被链接。对于计数器 0 和 2,TRCCNTCTLR<n>.CNTCHAIN 是 RES0。

注意:CounterAtZero 资源可能不与计数器归零同时断言。例如,如果跟踪单元实现流水线了一些逻辑,就可能发生这种情况。

IKJSDV

D4.6.9.4 伪代码

D4.6.9.4.1 EvalAllCounters()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 计数器归零资源
var CounterAtZero : array[[4]] of boolean;

// EvalAllCounters() 每个时钟周期被调用一次
func EvalAllCounters()
begin
var reload : array[[4]] of boolean;
for i = 0 to UInt(TRCIDR5().NUMCNTR) - 1 do
if (i == 1) || (i == 3) then
reload[[i]] = EvalCounter(i, reload[[i-1]]);
else
reload[[i]] = EvalCounter(i, FALSE);
end;
end;
return;
end;

// EvalCounter() 为每个计数器调用
func EvalCounter(index : integer, lower_reloads : boolean) => boolean
begin
var dec_action : boolean;
var resource_active : boolean;
var reload : boolean;
var decrement : boolean;

// dec_action 信号指示计数器是否递减。基于 TRCCNTCTLR(n).CNTEVENT,
// 对于支持链接的计数器,还基于 TRCCNTCTLR(n).CNTCHAIN 以及较低计数器是否正在重载。
dec_action = (IsEventActive(TRCCNTCTLR(index).CNTEVENT) ||
((TRCCNTCTLR(index).CNTCHAIN == '1') && lower_reloads));

// 计数器归零资源在计数器当前为零且处于常规模式,
// 或处于自重载模式且 dec_action 活动且重载事件不活动时活动。
resource_active = ((TRCCNTVR(index).VALUE == Zeros{16}) &&
((TRCCNTCTLR(index).RLDSELF=='0') ||
(dec_action && !IsEventActive(TRCCNTCTLR(index).RLDEVENT))));

// 如果重载事件活动或自重载机制导致重载,则计数器重载。
reload = (IsEventActive(TRCCNTCTLR(index).RLDEVENT) ||
((TRCCNTCTLR(index).RLDSELF == '1') &&
dec_action && TRCCNTVR(index).VALUE == Zeros{16}));

// 计数器仅在其非零、不重载且 dec_action 活动时递减。
decrement = !reload && (TRCCNTVR(index).VALUE != Zeros{16}) && dec_action;

// 确定计数器的下一个值
if reload then
TRCCNTVR(index).VALUE = TRCCNTRLDVR(index).VALUE;
elsif decrement then
TRCCNTVR(index).VALUE = (UInt(TRCCNTVR(index).VALUE) - 1)[15:0];
else
TRCCNTVR(index).VALUE = TRCCNTVR(index).VALUE;
end;

CounterAtZero[[index]] = resource_active;
return reload;
end;

D4.6.10 状态机

IBGGRG

ETE 跟踪单元可以包含一个具有四个状态的状态机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                 状态 0
/ \
F0 B0
/ \
状态 1 ───────── 状态 1
/ \ / \
F1 B1 F1 B1
/ \ / \
状态 2 ───────── 状态 2 ───────── 状态 2
/ \ / \ / \
F2 B2 F2 B2 F2 B2
/ \ / \ / \
状态 3 ───────── 状态 3 ───────── 状态 3 ───────── 状态 3
RST ─→ 状态 0(从任何状态)

Figure D4-28

IPTVBH

TRCIDR5.NUMSEQSTATE 指示是否实现了状态机。

RQYNJH

如果实现了状态机,它有 4 个状态,编号为 0 到 3。

RTQWHX

当跟踪单元离开禁用状态时,状态机从 TRCSEQSTR.STATE 中编程的状态开始。

ISYCBV

状态机可以连接到资源事件,以便在特定资源事件发生时状态机从一个状态转换到另一个状态。TRCSEQEVR<n> 寄存器可用于指定哪些资源事件导致状态机转换。

每个寄存器可用于指定以下内容:

  • 导致状态机前进到下一个状态的资源事件。
  • 导致状态机向后回退到前一个状态的资源事件。

可以选择不同的资源事件使状态机在不同状态之间转换。例如,特定资源事件可能在一个处理器时钟周期内导致从状态 0 到状态 1 的 F0 转换,而不同的资源事件可能在下一个处理器时钟周期内导致从状态 1 到状态 2 的 F1 转换。第三个独立的资源事件可能在第三个时钟周期内导致从状态 2 向后到状态 1 的 B1 转换。

RNPVRQ

跟踪单元在状态机中优先处理前向转换,优先于后向转换。即,当两个资源事件发生时,导致前向转换与后向转换在同一个处理器时钟周期内冲突时,跟踪单元优先处理前向转换并忽略后向转换。

IQNFJZ

状态机可以在单个处理器时钟周期内前进多个状态。例如,如果状态机处于状态 0,且导致 F0 和 F1 转换的资源事件都在一个时钟周期内变为活动,则状态机从状态 0 前进到状态 2。

IDMZGJ

状态机可以从任何其他状态重置到状态 0。TRCSEQRSTEVR 可用于指定重置状态机的资源事件。

RHQBBF

当导致 RST 转换的资源事件发生时,状态机在该时钟周期结束于状态 0,并且直到下一个时钟周期才前进到其他状态。

RKVSXC

跟踪单元优先处理 RST 转换,优先于所有其他转换。即,当导致 RST 转换的资源事件与导致其他转换的资源事件在同一个时钟周期内活动时,跟踪单元优先处理 RST 转换并忽略所有其他转换。

RJDPYL

下表定义了所有可能的状态转换。

状态转换表

从/到 0 1 2 3
0 RST | !F0 F0 & !F1 F0 & F1 & !F2 F0 & F1 & F2
1 RST | (B0 & !F1 & !F0) (!B0 | F0) & !F1 F1 & !F2 F1 & F2
2 RST | (B0 & B1 & !F2 & !F1 & !F0) B1 & (!B0 | F0) & !F1 & !F2 (!B1 | F1) & !F2 F2
3 RST | (B0 & B1 & B2 & !F2 & !F1 & !F0) B2 & B1 & (!B0 | F0) & !F2 & !F1 B2 & (!B1 | F1) & !F2 !B2 | F2

IYQZGV

如果导致转换的多个资源事件在一个处理器时钟周期内变为活动,则无法保证这些资源事件变为活动的顺序被观察到。例如,您可以编程:

  • F0 在地址 0x1000 处的指令地址比较器上活动。
  • F1 在地址 0x1004 处的指令地址比较器上活动。

如果地址 0x1000 和地址 0x1004 处的指令在同一个处理器时钟周期内执行,则无论两条指令的程序顺序如何,都会发生从状态 0 到状态 2 的转换。

RVDTDP

当状态机状态通过直接写入 TRCSEQSTR 以外的任何方式改变时,跟踪单元认为该改变是对 TRCSEQSTR.STATE 的间接写入。

IWYFZH

ETE 架构将每个状态机状态作为一个资源提供,以便状态可用于触发跟踪单元中的其他资源事件。

1
资源事件 → 导致转换 → 导致状态机状态改变 → 导致资源事件

Figure D4-29

RHQHFT

当状态机在单个处理器时钟周期内前进多个状态时,对于它经过的每个状态,状态机触发的资源状态在该周期内活动。

IDCFMF

例如,如果状态机处于状态 0,且在一个处理器时钟周期内移动到状态 3,则状态 1 和状态 2 连接到的资源事件必须在该时钟周期内活动。同样的规则适用于后向转换,因此如果状态机处于状态 3,且在一个处理器时钟周期内 B2 和 B1 使其移动到状态 1,则状态 2 连接到的资源事件必须在该时钟周期内活动。

此规则的例外是当 RST 转换导致状态机返回到状态 0 时。例如,如果状态机处于状态 3,且在一个处理器时钟周期内移动到状态 0,则状态 2 和状态 1 连接到的资源事件不得变为活动。

图 D4-30 状态转换示例

1
2
3
4
5
6
7
8
9
10
11
CLK:     0   1   2   3   4   5   6   7   8   9  10  11  12  13
状态: 0x0 0x3 0x1 0x0 0x2 0x1 0x0
转换事件:
RST: [active]
B: [B0, B1, B2]
F: [F0, F1, F2] [F0] [F0,F1] [F1]
资源:
状态0: [active]
状态1: [active] [active] [active] [active]
状态2: [active]
状态3: [active]

Figure D4-30

D4.6.10.1 伪代码

D4.6.10.1.1 EvalSequencer()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 状态机状态资源
var SequencerState : array[[4]] of boolean;

// EvalSequencer()
// ===============
func EvalSequencer()
begin
var rst : boolean;
var txn0 : array [[4]] of boolean;
var txn1 : array [[4]] of boolean;
var txn2 : array [[4]] of boolean;
var txn3 : array [[4]] of boolean;
(rst, txn0, txn1, txn2, txn3) = SequencerTransitions();

// 状态机状态资源
SequencerState[[0]] = FALSE;
SequencerState[[1]] = FALSE;
SequencerState[[2]] = FALSE;
SequencerState[[3]] = FALSE;
SequencerResource(rst, txn0, txn1, txn2, txn3);
SequencerNextState(rst, txn0, txn1, txn2, txn3);
end;
D4.6.10.1.2 SequencerTransitions()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// SequencerTransitions()
// ======================
func SequencerTransitions() => ( boolean,
array [[4]] of boolean,
array [[4]] of boolean,
array [[4]] of boolean,
array [[4]] of boolean)
begin
let F0 : boolean = IsEventActive(TRCSEQEVR0().F_SEL, TRCSEQEVR0().F_TYPE);
let B0 : boolean = IsEventActive(TRCSEQEVR0().B_SEL, TRCSEQEVR0().B_TYPE);
let F1 : boolean = IsEventActive(TRCSEQEVR1().F_SEL, TRCSEQEVR1().F_TYPE);
let B1 : boolean = IsEventActive(TRCSEQEVR1().B_SEL, TRCSEQEVR1().B_TYPE);
let F2 : boolean = IsEventActive(TRCSEQEVR2().F_SEL, TRCSEQEVR2().F_TYPE);
let B2 : boolean = IsEventActive(TRCSEQEVR2().B_SEL, TRCSEQEVR2().B_TYPE);
let rst : boolean = IsEventActive(TRCSEQRSTEVR().RST_SEL, TRCSEQRSTEVR().RST_TYPE);

var txn0 : array [[4]] of boolean;
var txn1 : array [[4]] of boolean;
var txn2 : array [[4]] of boolean;
var txn3 : array [[4]] of boolean;

// 从状态 0 出发的转换
txn0[[1]] = F0 && !F1;
txn0[[2]] = F0 && F1 && !F2;
txn0[[3]] = F0 && F1 && F2;

// 从状态 1 出发的转换
txn1[[0]] = B0 && !F0 && !F1;
txn1[[1]] = (!B0 || F0) && !F1;
txn1[[2]] = F1 && !F2;
txn1[[3]] = F1 && F2;

// 从状态 2 出发的转换
txn2[[0]] = B0 && !F0 && B1 && !F1 && !F2;
txn2[[1]] = (!B0 || F0) && B1 && !F1 && !F2;
txn2[[2]] = (!B1 || F1) && !F2;
txn2[[3]] = F2;

// 从状态 3 出发的转换
txn3[[0]] = B0 && !F0 && B1 && !F1 && B2 && !F2;
txn3[[1]] = (!B0 || F0) && B1 && !F1 && B2 && !F2;
txn3[[2]] = (!B1 || F1) && B2 && !F2;
txn3[[3]] = (!B2 || F2);

return (rst, txn0, txn1, txn2, txn3);
end;
D4.6.10.1.3 SequencerResource()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// SequencerResource()
// ===================
func SequencerResource(rst : boolean,
txn0 : array [[4]] of boolean,
txn1 : array [[4]] of boolean,
txn2 : array [[4]] of boolean,
txn3 : array [[4]] of boolean)
begin
case TRCSEQSTR().STATE of
when '00' => SequencerState[[0]] = TRUE;
when '01' => SequencerState[[1]] = TRUE;
when '10' => SequencerState[[2]] = TRUE;
when '11' => SequencerState[[3]] = TRUE;
end;

// 如果状态机在一次迭代中经过多个状态,则相应设置 SequencerState
if !rst then
case TRCSEQSTR().STATE of
when '00' =>
if txn0[[2]] then
SequencerState[[1]] = TRUE;
end;
if txn0[[3]] then
SequencerState[[1]] = TRUE;
SequencerState[[2]] = TRUE;
end;
when '01' =>
if txn1[[3]] then
SequencerState[[1]] = TRUE;
SequencerState[[2]] = TRUE;
end;
when '10' =>
if txn2[[0]] then
SequencerState[[1]] = TRUE;
end;
when '11' =>
if txn3[[0]] then
SequencerState[[1]] = TRUE;
SequencerState[[2]] = TRUE;
end;
if txn3[[1]] then
SequencerState[[2]] = TRUE;
end;
end;
end;
end;
D4.6.10.1.4 SequencerNextState()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// SequencerNextState()
// ====================
func SequencerNextState(rst : boolean,
txn0 : array [[4]] of boolean,
txn1 : array [[4]] of boolean,
txn2 : array [[4]] of boolean,
txn3 : array [[4]] of boolean)
begin
if rst then
TRCSEQSTR().STATE = '00';
else
case TRCSEQSTR().STATE of
when '00' =>
if txn0[[1]] then TRCSEQSTR().STATE = '01'; end;
if txn0[[2]] then TRCSEQSTR().STATE = '10'; end;
if txn0[[3]] then TRCSEQSTR().STATE = '11'; end;
when '01' =>
if txn1[[0]] then TRCSEQSTR().STATE = '00'; end;
if txn1[[1]] then TRCSEQSTR().STATE = '01'; end;
if txn1[[2]] then TRCSEQSTR().STATE = '10'; end;
if txn1[[3]] then TRCSEQSTR().STATE = '11'; end;
when '10' =>
if txn2[[0]] then TRCSEQSTR().STATE = '00'; end;
if txn2[[1]] then TRCSEQSTR().STATE = '01'; end;
if txn2[[2]] then TRCSEQSTR().STATE = '10'; end;
if txn2[[3]] then TRCSEQSTR().STATE = '11'; end;
when '11' =>
if txn3[[0]] then TRCSEQSTR().STATE = '00'; end;
if txn3[[1]] then TRCSEQSTR().STATE = '01'; end;
if txn3[[2]] then TRCSEQSTR().STATE = '10'; end;
if txn3[[3]] then TRCSEQSTR().STATE = '11'; end;
end;
end;
end;

D4.6.11 单次比较器控制

IQSKXC

如果跟踪单元暴露于推测执行,且地址比较器用于激活跟踪单元中的资源事件,则这些资源事件可能在推测执行发生时被激活:

  • 单地址比较器(SAC)可能在推测执行上发出匹配信号。
  • 地址范围比较器(ARC)可能在推测执行上发出匹配信号。

例如,这意味着如果使用地址比较器来激活计数器或断言外部输出,则该计数器可能递减,或该外部输出可能因推测执行而被断言。地址比较器的单次比较器控制使得跟踪单元中的资源事件可以仅基于非推测执行(即仅基于架构执行)来激活。

跟踪单元可以提供最多八个单次比较器控制。每个单次比较器控制可以与一个或多个地址比较器一起使用。

ITLFLF

单次比较器控制可以用作跟踪单元资源,以激活跟踪单元资源事件。例如,可以选择单次比较器控制来:

  • 启用或重载跟踪单元计数器。
  • 发起跟踪单元状态机中的转换。
  • 断言外部输出。

因此,如果编程为断言外部输出,单次比较器控制可用于向跟踪分析器指示特定指令已被确认执行。这意味着跟踪分析器可以基于该指令的架构执行来启动或停止跟踪捕获。

IRBMXW

如果跟踪单元包含一个或多个地址比较器,Arm 建议至少实现一个单次比较器控制。

IVNBPG

单次比较器控制以以下方式工作:

  1. 使用单次比较器控制的 TRCSSCCR<n> 选择一个或多个地址比较器。选定的地址比较器可以是所有单地址比较器、所有地址范围比较器,或两者的组合。
  2. 当选定的地址比较器之一匹配时,当该指令被确认已在架构上执行后,单次比较器控制触发(fires)。
    当选定的地址比较器匹配,但该指令被确认未在架构上执行时,单次比较器控制不触发。

RXVVYX

当匹配地址比较器的指令被确认已在架构上执行,且该地址比较器被 TRCSSCCR<n> 选中,且 TRCSSCSR<n>.STATUS 为 0 或 TRCSSCCR<n>.RST 为 1 时,单次比较器控制 <n> 触发。

RXFJGB

当执行 TSB CSYNC 指令时,如果单次比较器控制被编程为因 TSB CSYNC 指令而触发,仅在相关的跟踪同步事件完成后,单次比较器才触发。

RSWNFV

当单次比较器控制触发时,跟踪单元认为这是一次将 TRCSSCSR<n>.STATUS 设置为 1 的间接写入。

RGBDCK

当资源处于已暂停状态时,如果满足单次比较器控制触发的条件:

  • 如果 TRCSSCCR<n>.RST 为 1 或 TRCSSCSR<n>.STATUS 为 0,则 TRCSSCSR<n>.PENDING 被间接写入 1。
  • 如果 TRCSSCCR<n>.RST 为 0 且 TRCSSCSR<n>.STATUS 为 1,则 TRCSSCSR<n>.PENDING 被间接写入 1 或保持不变。

RNKKSN

当跟踪单元变为禁用且被单次比较器控制选中的地址比较器已匹配仍处于推测状态的指令时,单次比较器控制不触发。

RDQZSD

当跟踪变为禁止且被单次比较器控制选中的地址比较器已匹配仍处于推测状态的指令时,单次比较器控制等待直到该指令的推测被解析,并在该指令被架构执行时触发。

RVTWXJ

当单次比较器控制用于指令地址比较时,当满足单次比较器控制触发的条件时,单次比较器控制触发,无论以下任一情况是否成立:

  • 指令未通过条件码检查。
  • 指令是失败的独占存储操作。

IXZKFW

当单次比较器控制用于激活资源事件时,资源事件可能在跟踪单元跟踪该指令后的一段时间才被激活。这是因为虽然跟踪单元跟踪了被执行的指令,但 PE 可能直到稍后才会确认该指令是被架构执行还是因错误推测而取消,因此单次比较器控制可能直到稍后才会触发。

D4.6.11.1 单次比较器控制模式

IXZJSV

每个单次比较器控制运行在以下模式之一:

  • 单次模式(Single-shot mode):单次比较器控制仅触发一次。即,触发后,它将永远不会再次触发。
  • 多次模式(Multi-shot mode):单次比较器控制在每次触发后重置。即,当选定的地址比较器下次发出地址匹配信号且指令被架构执行时,它可以再次触发。

TRCSSCCR<n>.RST 选择模式。

RKJBCH

当单次比较器控制处于多次模式时,单次比较器控制触发时最多持续一个处理器时钟周期。

RSNDBZ

当单次比较器控制处于多次模式时,当为该单次比较器控制选择的多个比较器在短时间内连续匹配时,仅保证第一次匹配导致单次比较器控制触发。

IHSGTY

短时间内连续多次比较器匹配的示例如下:

  • 多个选定的地址比较器同时发出地址匹配信号。
  • 一个地址比较器在第一次匹配仍在等待解析时多次匹配。

D4.6.11.2 已暂停状态下的操作

ISPQLS

推测指令的解析可能发生在 PE 已进入跟踪禁止区域且资源已进入已暂停状态之后。如果在资源处于已暂停状态期间满足单次比较器控制触发的条件,则单次比较器控制资源事件被延迟以确保该资源事件被看到。

RTQHNK

当资源处于已暂停状态时,单次比较器控制不触发。

RPVRGR

当资源在 TRCSSCSR<n>.PENDING 为 1 的情况下进入运行状态时,会发生以下情况:

  • 如果 TRCSSCCR<n>.RST 为 1 或 TRCSSCSR<n>.STATUS 为 0,则单次比较器控制触发。
  • TRCSSCSR<n>.PENDING 被间接写入 0。

IDMGDY

某些实现可能没有 TRCSSCSR<n>.PENDING 可以通过跟踪单元间接写入设置为 1 的场景,特别是如果跟踪单元未暴露于任何推测执行。但是所有实现都支持软件将 TRCSSCSR<n>.PENDING 设置为 1,并且当跟踪单元进入运行状态时单次比较器触发。此行为确保状态可以从一个跟踪单元迁移到不同的跟踪单元。


D4.6.12 外部输出

IBZHDF

ETE 架构支持零到四个外部输出。跟踪单元具有的输出数量由实现定义(IMPLEMENTATION DEFINED),Arm 建议至少实现一个输出。

IQPQFJ

外部输出用于向跟踪分析器指示 ETEEvents。

ETEEvent 由资源事件控制。例如,指令地址比较器可用于驱动资源事件之一。

如果外部输出被编程为基于程序执行(例如地址比较器)来断言,外部输出可能与跟踪单元输出的由该程序执行产生的跟踪不同步。

IPNVWQ

通常,生成的跟踪可能在跟踪单元中缓冲,这意味着外部输出将在跟踪输出之前被断言。

SMFTNW

要编程外部输出,使用 TRCEVENTCTL0R 选择资源。

SRBKWB

TRCIDR0.NUMEVENT 字段显示特定实现支持多少个 ETEEvent。

IRFLGF

外部输出连接到 PE 的交叉触发接口(Cross Trigger Interface, CTI)。参见”嵌入式交叉触发接口”。

RRFGJD

在跟踪单元复位独立于 PE 热复位且 CTI 复位独立于 PE 热复位的 PE 中,外部输出到 CTI 的传输不受 PE 热复位的影响。

D4.6.12.1 已暂停状态下的操作

INXCSB

当资源处于已暂停状态时,ETEEvent 可能发生,但任何相关的跟踪包可能不会生成。TRCRSR.EVENT 提供了一种记录此发生的机制,以便可以保存和恢复跟踪单元状态。

RBCMYM

当资源处于已暂停状态时,ETEEvent 选择器保留一个或多个 ETEEvent 已生成但未跟踪的信息。

RSNKFL

当 ETEEvent 已生成且相关的外部输出已被断言时,会生成任何相关的事件包(Event packets)。

RFVCMB

当 ETEEvent 已生成但相关的外部输出未被断言时,不会生成任何相关的事件包。

RGYWLS

当资源处于已暂停状态时 ETEEvent 发生且事件包未输出时,跟踪单元将关联的 TRCRSR.EVENT[n] 设置为 1。

RDCLHJ

当资源处于已暂停状态时 ETEEvent 发生,这被视为对 TRCRSR 的间接写入。

RSWBRL

当跟踪单元在 TRCRSR.EVENT[n] 为 1 的情况下进入运行状态时,关联的 ETEEvent 资源在单个 PE 时钟周期内活动,跟踪单元将 TRCRSR.EVENT[n] 清除为 0,并将该操作视为对 TRCRSR 的间接写入。

IKZYKM

当跟踪单元在 TRCRSR.EVENT[n] 为 1 的情况下进入运行状态时,TRCEVENTCTL0R.EVENT<n> 选择的资源事件可能在同一个 PE 时钟周期内也活动。如果发生这种情况,关联的 ETEEvent 资源在单个 PE 时钟周期内活动,并且可能不会为这 2 个 ETEEvent 的原因生成 2 个独立的 ETEEvent。


D4.6.13 外部输入

ITPPSC

跟踪单元使用 PMU 事件作为外部输入。

RMTGKB

如果选择的 PMU 事件编号未实现,则外部输入资源事件不活动。

RYCNCR

除非 PMU 事件另有指定,否则跟踪单元可选择以下事件:

  • 如果实现了 FEAT_PMUv3,则为 PMU 实现的所有通用架构和微架构事件。
  • 如果未实现 FEAT_PMUv3,则为性能监视器扩展要求的所有 PMU 事件。参见”必需事件”。

注意:这包括其他已实现扩展所要求的所有事件。

  • PMU_HOVFS 和 PMU_OVFS。
  • 如果实现了 FEAT_TRBE,则为 TRB_TRIG。

IXJBHV

其他特定于 ASIC 的事件可以通过使用实现定义区域中的编号来选择。

IVWHTZ

不要求所有实现定义的事件都对跟踪单元、PMU 计数器和 PMUEVENT 总线可见。

RPHDQT

对于 ETE,PMU 事件向跟踪单元的导出不受 PMCR.X 或 PMCR_EL0.X 的影响。

RRFWZB

当启用了自托管跟踪且跟踪被禁止时,仅将由规则 RVBCBZ 和 RKRSMY 定义的 PMU 事件导出到跟踪单元。

RWSXTC

当禁用了自托管跟踪且在 PE 的当前安全状态下计数被禁止时,仅将由规则 RVBCBZ 和 RKRSMY 定义的 PMU 事件导出到跟踪单元。

RVBCBZ

以下 PMU 事件始终导出到跟踪单元:

  • CTI_TRIGOUT4
  • CTI_TRIGOUT5
  • CTI_TRIGOUT6
  • CTI_TRIGOUT7
  • PMU_OVFS
  • TRB_TRIG
  • TRB_WRAP

RKRSMY

以下 PMU 事件始终导出到跟踪单元,除非自托管跟踪已启用且 TRFCR_EL2.E2TRE 为 0:

  • PMU_HOVFS

RQPDHK

当同一周期内多次出现同一个 PMU 事件时,跟踪单元仅观察到该 PMU 事件的一次出现。

IMHHNV

PMU 事件的操作与跟踪单元内跟踪的生成不是紧密耦合的,并且不能保证因 PMU 事件而启用 ViewInst 会导致引起该 PMU 事件的指令被跟踪。

RXGMPN

当选择 PMU 事件 SW_INCR 作为外部输入且从 EL2 或 EL3 写入 PMSWINC_EL0 时,如果写入的位 [n] 值为 1 且相关的 PMU 计数器 <n> 已实现,则外部输入被断言。

RBXPZK

当选择 PMU 事件 SW_INCR 作为外部输入且从 EL1 或 EL0 写入 PMSWINC_EL0 时,如果写入的位 [n] 值为 1 且相关的 PMU 计数器 <n> 已实现,且以下任一情况成立,则外部输入被断言:

  • EL2 已实现并在当前安全状态下启用,且 <n> 小于 MDCR_EL2.HPMN。
  • EL2 已实现但在当前安全状态下禁用。
  • EL2 未实现。

RTTPPY

在跟踪单元复位独立于 PE 热复位且 CTI 复位独立于 PE 热复位的 PE 中,CTI_TRIGOUTn 事件从 CTI 到跟踪单元的传输不受 PE 热复位的影响。

D4.6.13.1 已暂停状态下的操作

IHZLDV

外部输入选择器保证在已暂停状态下活动。这是为了确保当资源暂停时,任何交叉触发事件不会丢失,而是会在资源恢复运行时发生。TRCRSR.EXTIN 提供了一种机制来捕获已暂停状态下外部输入选择器的粘性状态,以便 ETE 状态可以被保存和恢复。

IZQFND

当一个或多个选定的外部输入已被断言时,在资源处于已暂停状态期间,跟踪单元保留一个或多个选定的外部输入已被断言的信息。

RKCXLF

当资源处于暂停中或已暂停状态、跟踪单元未禁用且未处于低功耗状态时,当外部输入选择器 n 检测到选定的外部输入被断言时,跟踪单元执行间接写入以将 TRCRSR.EXTIN[n] 设置为 1。

RQWYSK

当资源在 TRCRSR.EXTIN[n] 为 1 的情况下进入运行状态时,外部输入选择器资源在单个 PE 时钟周期内活动,跟踪单元清除 TRCRSR.EXTIN[n] 并将该操作视为对 TRCRSR 的间接写入。

D4.6.13.2 低功耗状态下的操作

RKVFVS

当跟踪单元处于低功耗状态时,外部输入选择器不活动。


D4.6.14 PE 比较器输入

ICXBPR

ETE 架构提供最多八个 PE 比较器输入,即可以由 PE 内部的比较器驱动的输入。例如,PE 可能包含实现定义的比较器。

RCNVSS

PE 比较器输入的数量由 TRCIDR4.NUMPC 指示。

RBDWHM

当 PE 在跟踪禁止区域中执行时,PE 比较器输入不活动。

IDDXFB

每个 PE 比较器输入可以以下任一方式使用:

  • 控制 ViewInst 启动/停止函数。
  • 控制单次比较器控制。
  • 作为独立资源。

ISKDCW

PE 比较器输入对资源和跟踪单元过滤的影响的时序由实现定义(IMPLEMENTATION DEFINED)。


译者注

1. 精确资源(Precise Resources)与非精确资源(Imprecise Resources)的区别

  • 精确资源 用于需要严格按指令执行顺序评估的场景,主要是 ViewInst 包含/排除函数和 ViewInst 启动/停止函数。跟踪单元在每个指令块上评估精确资源,并保持指令的执行顺序。精确资源包括地址比较器、上下文标识符比较器等。

  • 非精确资源 用于不需要严格保持指令顺序的场景。它们的评估结果可能在时间上不精确,但提供了更灵活的过滤和控制能力。非精确资源包括计数器、状态机、单次比较器控制、外部输入/输出等。

两者的核心区别在于:精确资源保证按程序顺序评估,适用于影响”是否跟踪某条指令”的决策;非精确资源则不保证严格的时间精确性,适用于计数、状态转换等不需要精确排序的控制功能。

2. 资源选择器(Resource Selectors)的工作机制

资源选择器是 ETE 跟踪架构中的核心路由机制,负责将各种资源的状态信号连接到需要使用这些信号的功能模块。其工作机制如下:

  1. 分组选择:资源按类型分组(参见表 D4-26),通过 TRCRSCTLR<n>.GROUP 字段选择特定组。
  2. 掩码选择:在选定组内,通过 TRCRSCTLR<n>.SELECT 掩码选择一个或多个具体资源。
  3. 逻辑组合:选中的资源输出通过 OR 门组合,然后可选地通过 XOR 进行反相(由 INV 位控制)。
  4. 配对组合:两个资源选择器可以配对使用,通过 AND、OR、NOT 等布尔函数组合(由 PAIRINV 字段控制,参见表 D4-27)。

资源选择器 0 固定输出 FALSE,资源选择器 1 在运行状态下固定输出 TRUE,这两个特殊选择器提供了常量和常假信号。

3. 单地址比较器(SAC)和地址范围比较器(ARC)的用途

  • 单地址比较器(SAC):比较指令地址与编程的精确地址值。用于在特定地址处触发跟踪事件,例如在某个函数入口点开始跟踪。SAC 可以关联上下文标识符比较器,增加匹配条件。最多支持 16 个 SAC,成对实现。

  • 地址范围比较器(ARC):由一对 SAC 构成,定义起始地址和结束地址,形成地址范围。当指令地址落在该范围内时匹配。用于选择特定的代码区域进行跟踪(如一个函数体)。最多支持 8 个 ARC。

两者都支持:

  • 异常级别和安全状态过滤
  • 上下文标识符关联
  • 在推测执行上匹配的可能性
  • 作为精确资源用于 ViewInst 函数

4. 计数器在跟踪中的作用

计数器在 ETE 跟踪中提供计数和条件控制功能:

  1. 事件计数:通过 CNTEVENT 指定递减条件,可对特定事件(如地址命中、状态机状态等)进行计数。
  2. 条件触发:当计数器归零时,通过 CounterAtZero 资源触发其他动作(如断言外部输出、改变跟踪状态)。
  3. 周期控制:配合重载机制,可以创建周期性行为(自重载模式)或一次性计数(常规模式)。
  4. 级联扩展:特定了计数器对(0-1、2-3)可以链接形成 32 位计数器,扩展计数范围。

计数器在跟踪中典型的应用场景包括:统计函数调用次数、控制跟踪使能的时间窗口、生成周期性事件信号等。

5. 状态机(Sequencer)的用途

状态机是一个具有 4 个状态(0-3)的有限状态机,用于实现复杂的多阶段跟踪控制逻辑:

  1. 状态跟踪控制:每个状态可以作为资源被资源选择器选中,从而控制不同阶段的跟踪行为(如在状态 0 跟踪函数 A,状态 1 跟踪函数 B)。
  2. 事件驱动的状态转换:前向转换(F0、F1、F2)和后向转换(B0、B1、B2)由独立的资源事件触发,使能灵活的控制流程。
  3. 重置功能:RST 事件可从任何状态强制回到状态 0,优先级最高。
  4. 多级跳转:支持在一个时钟周期内跳转多个状态。

典型应用:在系统启动阶段(状态 0)只跟踪关键事件,进入稳定运行后(状态 1)开始详细跟踪,检测到异常时(状态 2-3)触发外部输出等。

状态机的优先级规则:RST > 前向转换 > 后向转换,确保重置信号始终能立即生效。


附录:术语对照表

英文术语 中文翻译 说明
Trace Unit 跟踪单元 生成软件执行跟踪的硬件模块
PE (Processing Element) 处理单元 执行软件的处理器核心
ETE (Embedded Trace Extension) 嵌入式跟踪扩展 ARMv8/v9中定义跟踪能力的扩展
ETMv4 嵌入式跟踪宏单元v4 ETE的前身架构
ETR/ETB 嵌入式跟踪路由器/缓冲区 CoreSight技术中跟踪数据路由和存储组件
ATB (Advanced Trace Bus) 高级跟踪总线 AMBA总线体系中传输跟踪数据的协议
TRBE (Trace Buffer Extension) 跟踪缓冲扩展 将跟踪输出写入系统内存的架构扩展
ViewInst 指令视图函数 控制指令是否被跟踪的核心过滤函数,由S∧I∧E∧N组成
Atom Element (E/N) 原子元素(执行/未执行) 表示P0指令是否被执行的基本跟踪元素
P0 Instruction P0指令 会导致生成P0元素的指令类型(分支、异常相关指令)
P0 Element P0元素 跟踪元素流中指示程序控制流变化的关键元素
Q Element Q元素 可选的条件分支跟踪压缩元素
Cycle Count 周期计数 评估性能的处理器时钟周期计数
Timestamp 时间戳 跟踪流中的全局时间标记
Commit/Cancel 提交/取消元素 推测执行解析元素—确认或取消指令执行
Mispredict/Discard 预测错误/丢弃元素 修正分支预测或丢弃无法解析的跟踪元素
SAC (Single Address Comparator) 单地址比较器 匹配单条指令地址的比较器
ARC (Address Range Comparator) 地址范围比较器 匹配一段地址范围的比较器
IMPLEMENTATION DEFINED 实现定义的 芯片实现者自行决定但需文档化的行为
CONSTRAINED UNPREDICTABLE 受限不可预测的 架构约束在一定范围内的不可预测行为
Context Synchronization Event 上下文同步事件 确保系统寄存器写入可见的同步机制(ISB、异常等)
Trace Prohibited Region 跟踪禁止区域 不允许生成跟踪的地址区域或执行时段
Branch Broadcasting 分支广播 强制显式跟踪直接分支目标地址的功能
Return Stack 返回栈 优化函数返回地址跟踪的可选机制

图表索引

图号 描述 文件
图D4-1 跟踪单元编程状态 images/figure_D4-1.png
图D4-2 外部调试接口编程流程 images/figure_D4-2.png
图D4-3 系统指令编程流程 images/figure_D4-3.png
图D4-4 压缩和解压缩的层模型 images/figure_D4-4.png
图D4-5 Trace Info后Target Address元素示例 images/figure_D4-5.png
图D4-6 过滤区域中Trace Info后Target Address示例 images/figure_D4-5.png
图D4-7 预测错误区域中Trace Info后Target Address示例 images/figure_D4-7.png
图D4-8 Commit操作示例 images/figure_D4-8.png
图D4-9 Cancel操作示例 images/figure_D4-8.png
图D4-10 跟踪生成阶段 images/figure_D4-10.png
图D4-11 跟踪操作 images/figure_D4-11.png
图D4-12 指令块跟踪操作 images/figure_D4-12.png
图D4-13 推测跟踪操作观察 images/figure_D4-13.png
图D4-14 紧密接近位置示例 images/figure_D4-14.png
图D4-15 Atom打包决策树 images/figure_D4-15.png
图D4-16 资源操作 images/figure_D4-16.png
图D4-17 资源组织 images/figure_D4-17.png
图D4-18 精确资源路径 images/figure_D4-17.png
图D4-19 非精确资源路径 images/figure_D4-19.png
图D4-20 资源选择器 images/figure_D4-20.png
图D4-21 资源选择器对 images/figure_D4-21.png
图D4-22~D4-26 计数器操作示例 images/figure_D4-22~D4-26.png
图D4-27 链式计数器示例 images/figure_D4-27.png
图D4-28 状态机 images/figure_D4-28.png
图D4-29 状态机操作 images/figure_D4-29.png
图D4-30 状态转换示例 images/figure_D4-30.png

翻译完成 — 所有6个主要章节(D4.1~D4.6)完整翻译
原文:ARM DDI 0487, The Embedded Trace Extension
图像资源:figure_D4-1.png 至 figure_D4-30.png(从原PDF中裁剪的独立示意图)