Learn the architecture - Understanding Armv9-A trace

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述


Learn the architecture - Understanding Armv9-A trace

2. Embedded Trace Extension

ETE(Embedded Trace Extension)是Armv9-A处理器的追踪架构。ETE与Arm ETMv4架构有许多相似之处,这些相似之处在ETE和ETMv4实现之间创建了一个兼容的追踪编程和解码环境。

类似于ETMv4,ETE追踪以下软件控制流元素:

  • 直接和间接分支
  • ISB(指令同步障碍)
  • WFE(等待事件)和WFI(等待中断)
  • TSTART(追踪开始)
  • 异常

一些元素是可选追踪的,例如“IMPLEMENTATION DEFINED”异常。IMPLEMENTATION DEFINED 异常的例子包括错误纠错码(ECC)纠错和程序执行的通用重播。

ETE并不支持ETMv4的所有功能。例如,不能使用一个ETE追踪单元追踪多个PE(处理单元),但在ETMv4中可以。此外,ETE不支持数据追踪。

为了帮助调试,该架构具有许多功能来修改追踪流以提供额外的信息。下表描述了修改追踪流的特性:

在这里插入图片描述
寄存器 TRCIDR0 到 TRCIDR13 指示了实现了哪些特性。以下章节涵盖了从软件或外部调试器的角度来看是相关的 ETE 主题。

2.1 Reset

追踪单元复位将所有追踪和管理寄存器设置为各自的寄存器描述值。当追踪单元核心电源域上电时,会应用复位。系统是否具有在需要时启动追踪单元复位的机制是由实现定义的。与先前的追踪体系结构不同,ETE 不支持多种类型的复位。

PE 温复位不会导致追踪单元复位。如果目标具有高级追踪总线(ATB)或其他追踪输出接口,建议实现输出路径,以便 PE 温复位不会受到影响。这种缺乏影响确保了通过 PE 温复位进行跟踪以帮助低级调试场景是可能的。

在具有 FEAT_TRF 的 PE 中,当发生 PE 冷复位时,EDSCR.TFO 被复位为 0b0。这个 EDSCR.TFO 复位禁止追踪,直到软件明确允许为止。如果需要从 PE 执行开始进行追踪,调试器必须确保在 PE 开始执行指令之前,对任何相关的控制进行了编程。调试器可能会将 PE 置于调试状态,以确保在 PE 开始执行指令之前已对寄存器进行了编程。

2.2 Prohibited regions

一个可执行程序可能包含不允许追踪的代码区域。这些禁止的区域可能与不同的安全状态相关,或者与PE进入特权模式以执行某些代码相关。如果在禁止的区域启用了跟踪单元,那么直到PE离开禁止的区域,跟踪单元将不生成任何跟踪。

禁止的区域是使用FEAT_TRF系统寄存器或认证接口或接口进行设置的。FEAT_TRF定义了可通过MRS和MSR指令访问的系统寄存器,用于编程跟踪设置。认证接口使用硬件信号来定义在目标上可以进行调试和跟踪的内容。跟踪单元可能会实现像Arm CoreSight架构规范中定义的CoreSight认证接口这样的可选认证接口。

禁止的区域可能会在执行过程中发生变化。例如,认证接口可能会更改,禁止在以前可能的区域进行跟踪。例如,如果认证接口更改以禁止安全状态,则将无法跟踪安全状态。

当PE从禁止的区域执行时,跟踪单元不执行以下操作:

  • 追踪指令
  • 追踪PE复位和系统错误等异常事件
  • 将指令地址比较器与禁止区域中的任何指令进行匹配
  • 输出提供有关在禁止区域中执行的信息的任何跟踪。这些信息的示例包括:
    • 执行的上下文
    • 指令地址
    • 禁止区域中第一条指令的地址

如果在PE在禁止的区域执行时启用了周期计数,周期计数器将继续计数。当PE离开禁止的区域时,所计数的周期将包括在一般的周期计数值中。

PE通过以下方法之一离开禁止的区域:

  • 上下文同步事件,例如PE发生或返回异常
  • 认证接口更改

2.3 Power states and domains

跟踪单元可能实现不同的电源状态,以提高目标能效。在Arm Architecture Reference Manual for ARMv8-A architecture profile中定义了四种可能的电源状态:Normal(正常)、Standby(待机)、Retention(保持)和Powerdown(关机)。

跟踪单元可能实现等效于Standby状态的低功耗状态。在低功耗状态下,跟踪单元核心电源域处于开启状态,但能耗降低。在低功耗状态下,跟踪单元可从软件和外部调试器访问。

当跟踪单元处于低功耗状态时,跟踪单元执行以下操作:

  • 不生成任何跟踪。这种跟踪缺失包括ETEEvent跟踪。
  • 跟踪资源,如计数器和单次比较器控制,保持与进入低功耗状态之前相同的状态。
  • 所有外部输出均被拉低。
  • 可能不会识别外部事件,如外部输入。
  • 时间戳请求可能会被忽略。
  • 根据IMPLEMENTATION DEFINED设置,周期计数器可能会继续计数。

进入低功耗状态的原因有:

  • PE处于由于Wait for Event(WFE)机制而引起的低功耗状态。
  • PE处于由于Wait for Interrupt(WFI)机制而引起的低功耗状态。
  • PE处于调试状态。
  • 跟踪单元被禁用。

在PE处于低功耗状态时,跟踪单元可能会间歇性地离开和重新进入低功耗状态。如果发生重新进入,资源和跟踪生成可能会间歇性地变为活动状态。当低功耗状态是间歇性的时,跟踪单元的行为是IMPLEMENTATION DEFINED。

可以通过启用TRCEVENTCTL1R.LPOVERRIDE来防止跟踪单元进入低功耗状态。ETE Low-power Override模式不影响PE。由于该模式不影响PE,PE可以进入低功耗模式。如果PE进入低功耗模式,ETE跟踪会受到影响。

跟踪单元可能实现的其他可能的电源状态包括Retention和Powerdown状态。在Retention和Powerdown电源状态中,跟踪单元电源域被关闭。在这两种电源状态下,不会生成跟踪,并且外部调试器无法访问跟踪单元。

要确定跟踪单元的电源状态,请读取TRCPDSR。

先前的Arm跟踪架构支持ETE中的多个电源域。ETE仅支持单个电源域,因此TRCPDSR.POWER始终为0b1。

跟踪单元和PE可能位于单独的电源域中。如果跟踪单元位于单独的电源域中,关闭跟踪单元可能不会关闭PE。如果PE被关闭,跟踪单元也会被关闭。

如果跟踪单元与已禁用的PE关联,跟踪单元的核心电源域将被关闭或保持在复位状态。

2.4 PE in Debug state

外部调试器可能将PE置于调试状态,以检查PE的状态并进行程序执行分析。
当PE进入调试状态时,跟踪单元执行以下操作:

  • 不会追踪指令。
  • 跟踪过滤处于非活动状态。
  • 保持跟踪过滤状态。

如果PE在调试状态下复位,PE将离开调试状态。根据跟踪单元的设置,PE退出调试状态后,跟踪单元可能会恢复跟踪。

2.5 Filtering trace generation

在捕获PE执行过程时,可能会生成大量的跟踪数据。ETE提供了过滤功能,使您能够仅捕获感兴趣的代码或执行时段。过滤功能减少了生成的跟踪数据量,从而降低了跟踪PE所需的跟踪带宽和存储量。当不使用跟踪过滤时,跟踪单元追踪所有指令。

下表描述了ETE支持的跟踪过滤类型:
在这里插入图片描述

3. Trace Buffer Extension

TRBE(Trace Buffer Unit)是一个将跟踪单元生成的跟踪存储到系统内存的跟踪缓冲器单元。例如,TRBE可以捕获由跟踪单元为特定PE生成的跟踪。

跟踪缓冲器具有以下特性:

  • 可以是物理寻址或虚拟寻址(通常是虚拟寻址)。
  • 具有所有权的翻译机制。
  • 由指针寄存器定义。
  • 其操作受外部事件(如触发器)的影响。

以下各节进一步描述了TRBE的特性。

3.1 Trace buffer writes

跟踪缓冲器可以是虚拟寻址或物理寻址。通常情况下,跟踪缓冲器是虚拟寻址的。该缓冲器被指定为指定地址空间中的单一连续区域。

在使用虚拟寻址时,缓冲器在虚拟地址空间中必须是连续的,但在物理内存中可能不是连续的。物理寻址跟踪缓冲器可以帮助调试软件更改虚拟地址映射。

三个缓冲器指针寄存器定义了跟踪缓冲器:

  • 基础指针(Base pointer):跟踪缓冲器的起始地址。
  • 限制指针(Limit pointer):跟踪缓冲器的结束地址。
  • 当前写指针(current write pointer):下一条跟踪数据值写入内存的地址。

必须将基础指针和限制指针对齐至少4KB。此对齐要求意味着缓冲器至少为一个完整的虚拟页的大小。当前写指针的所需对齐方式由IMPLEMENTATION DEFINED定义。

TRBLIMITR_EL1.nVM确定跟踪缓冲器指针是虚拟寻址还是物理寻址。当指针是虚拟地址时,所有虚拟地址都符合所属的翻译机制。所属的翻译机制将在以下部分描述。

翻译后备缓存(TLB)可能会缓存TRBE使用的翻译。由PE执行的任何TLB维护操作都会影响TRBE的TLB缓存的翻译。此外,PE执行的任何高速缓存维护操作都会影响TRBE的数据缓存。如果实现了Memory Tagging Extension(FEAT_MTE),则跟踪缓冲器单元对跟踪缓冲器的每次访问生成一个未经检查的访问。即使访问到Tagged Normal内存类型时,此访问类型也是真实的。

3.2 Owning translation regime

所属的安全状态和所属的异常级别定义了所属的翻译机制。所属的翻译机制使用其地址翻译表数据来确定写入系统内存的跟踪数据事务的属性。

在实践中,所属的翻译机制映射到管理TRBE的软件执行的安全状态和异常级别。例如,如果富操作系统配置了TRBE,所属的安全状态和异常级别可能是非安全EL1。

以下之一定义了所属的安全状态:

  • 是否实现了EL3和PE的执行安全状态,或者
  • MDCR_EL3.NSTB

可能的所属安全状态为安全或非安全。如果实现了Realm Management Extension(RME),则另一个可能的所属安全状态是Realm。

以下之一定义了所属的异常级别:

  • 是否实现了EL2并且对所属的安全状态启用了EL2,或者
  • MDCR_EL2.E2TB

可能的所属异常级别为EL2或EL1。

当跟踪缓冲器是虚拟寻址时,对跟踪缓冲器的写入使用所属异常级别的翻译表条目。例如,如果所属的异常级别是EL2,那么从EL1进行跟踪时,跟踪缓冲器写入使用EL2的翻译表。

如果实现了Memory System Resource Partitioning and Monitoring(MPAM)Extension(FEAT_MPAM),则跟踪缓冲器访问使用所属异常级别和所属安全状态的MPAM值。

3.3 Prohibited regions

如果所属的翻译机制不在上下文中,那么将禁止跟踪。这种禁止发生在以下情况:

  • PE正在比所属的异常级别更高的异常级别执行。
  • PE未在所属的安全状态中执行。

例如,如果PE在EL2中执行而所属的异常级别为EL1,那么将禁止EL2跟踪。如果某个区域被禁止,将不会捕获任何跟踪。

以下表总结了所属的异常级别、所属的安全状态、所属的翻译机制和禁止跟踪区域之间的关系:
在这里插入图片描述
自托管跟踪扩展(FEAT_TRF)还定义了何时禁止跟踪。以下寄存器位定义了FEAT_TRF禁止的区域:

  • SCR_EL3.NS
  • MDCR_EL3.STE
  • MDCR_EL3.NSTB
  • MDCR_EL2.E2TB
  • SCR_EL3.EEL2
  • HCR_EL2.TGE
  • TRFCR_EL2.E2TRE
  • TRFCR_EL1.E1TRE
  • TRFCR_EL2.E0HTRE
  • TRFCR_EL1.E0TRE

由所属的异常级别、所属的安全状态和FEAT_TRF创建的禁止区域会增加到跟踪单元定义的禁止区域中。

3.4 Operation

当自托管跟踪被启用且TRBLIMITR_EL1.E为0b1时,TRBE被启用。如果TRBE被禁用,它将不会从跟踪单元收集跟踪数据。

TRBE在启用且TRBSR_EL1.S为0b0时正在运行。当TRBE被启用且TRBSR_EL1.S为0b1时,TRBE跟踪收集停止。

当TRBE正在运行时,跟踪数据从跟踪单元中收集。TRBE会接受数据并将其写入系统内存,或者不接受数据。如果数据未被接受,跟踪单元将保留数据。如果在TRBE能够接受数据之前跟踪单元缓冲区空间用尽,缓冲区将溢出,数据将丢失。TRBE无法接受跟踪数据的一个可能原因是其内部缓冲区已满。

TRBE支持以下跟踪缓冲器模式:

  • 循环缓冲模式:当当前写指针达到限制指针时,通过将当前写指针设置为基础指针,缓冲器被包装。这种包装意味着最新的跟踪数据将覆盖最旧的跟踪数据。
  • 包装模式:与循环缓冲模式相同,只是在当前写指针包装时生成中断请求。
  • 填充模式:与包装模式相同,只是当当前写指针包装时,跟踪收集停止。

TRBLIMITR_EL1.FM控制跟踪缓冲器模式。

在软件中,您可以配置性能监视单元(PMU)来计算跟踪缓冲器包装的次数。

3.5 Triggers

TRBE支持检测由跟踪单元生成的触发器。触发器用于在感兴趣的点周围捕获跟踪。

触发计数器用于在检测到的触发器之前、周围或之后收集跟踪。在检测到的触发器后,当达到编程的触发计数器值时,触发事件发生。触发计数器值由软件进行编程。如果TRBE被禁用,则不会生成触发事件。

TRBE支持以下触发器模式:

  • 停止触发:在触发事件后,停止跟踪收集并生成中断请求。
  • IRQ触发:在触发事件后,生成中断请求。
  • 忽略触发:TBRE忽略触发器。

4. Example system

本节提供了关于Armv9-A跟踪系统的信息。要了解目标的跟踪系统是如何实现的,请阅读目标实现文档。

Armv9-A跟踪系统必须遵守以下规则:

  • 如果实现了ETE跟踪单元,则必定实现了TRBE。
  • 如果实现了TRBE,则必定使用了实现ETE的跟踪单元。
  • 如果实现了TRBE,则必定实现了FEAT_TRF。
  • 如果启用了TRBE,则跟踪单元只发送跟踪数据到TRBE。
  • 当TRBE被禁用时,跟踪单元可能将跟踪数据发送到一个或多个IMPLEMENTATION DEFINED跟踪输出接口。一个常见的跟踪输出接口是AMBA ATB接口,用于将跟踪导出到CoreSight跟踪子系统。
  • 每个处理器中有一个ETE跟踪单元。
  • 每个处理器中有一个TRBE。
  • 处理器不共享ETE跟踪单元。以前的跟踪体系结构允许跟踪单元共享。如果处理器永久禁用,建议将该处理器的跟踪单元从目标设计中移除。或者,在相关的CoreSight ROM表中标记跟踪单元为不存在,以便不使用该跟踪单元。
  • Armv9-A目标可以在芯片内或芯片外捕获跟踪。在芯片内捕获跟踪意味着将捕获的跟踪数据存储在目标上。捕获的跟踪数据存储到以下位置:
    • 通过类似于TRBE的缓冲器存储在主系统内存中。
    • 通过类似于ETR的主系统总线存储在共享系统内存中。
    • 通过类似于ETB的专用芯片内缓冲器存储。
      捕获的芯片内跟踪数据可以在目标上进行分析,或者稍后从目标上取出以进行分析。在芯片外捕获跟踪意味着将跟踪数据发送到芯片外进行分析。跟踪数据通过ATB和CoreSight跟踪子系统或IMPLEMENTATION DEFINED接口发送到芯片外。通常,外部调试器会分析芯片外的跟踪数据。

以下示意图展示了具有ETE跟踪单元和TRBE的Armv9-A跟踪系统的可能结构:

在这里插入图片描述
ETE跟踪单元基于PE执行的跟踪流生成跟踪数据。TRBE从跟踪单元收集跟踪数据并将数据存储到内存系统。软件可以在芯片上分析存储的跟踪数据,也可以将其发送到芯片外以供后续分析。

如果TRBE指针是虚拟地址,则TRBE使用为所属翻译机制的MMU设置的翻译表。如果TRBE被禁用,如果存在IMPLEMENTATION DEFINED接口(如连接到CoreSight系统的ATB),ETE跟踪数据将发送到此接口。

您可以刷新跟踪单元,以使跟踪流对SoC上的其他PE等观察者可见。跟踪单元刷新发生在以下情况:

  • 从已启用到已禁用状态的过渡。
  • 跟踪捕获基础设施请求时。
  • 如果实现了并启用了TRBE,则执行TSB CSYNC指令。
    TSB CSYNC与DSB操作一起用于刷新跟踪到TRBE。如果实现了FEAT_TRBE,有可能在调试状态中执行TSB CSYNC指令。

由于PE和ETE跟踪单元之间的密切关系,在某些跟踪实现中,跟踪单元可能会影响PE的性能。

您可以编程ETE跟踪单元和TRBE以响应某些输入或驱动输出事件到更广泛的系统。以下是输入和输出反应的示例:

  • 跟踪单元接收或生成PMU事件。
  • 跟踪单元对来自Cross Trigger Interface(CTI)的事件作出反应。外部调试器可能使用CTI来控制跟踪功能。
  • TRBE通过通用中断控制器(GIC)发送中断请求,通知PE发生中止或跟踪缓冲区填充。

5. Trace capture examples

该指南提供了四个跟踪示例,展示了创建最小化ETE跟踪单元和TRBE跟踪设置所需的基本编程。您的跟踪环境可能需要更多步骤才能实现可工作的ETE和TRBE跟踪设置。要查看更多步骤,请阅读您的板子文档。

这些示例是使用以下工具运行的:

  • Arm AEMvA Fixed Virtual Platform(FVP)模型:Fast Models版本11.16及更高版本支持ETE和TRBE。
  • Arm Development Studio:Arm DS Platinum版本2021.a及更高版本支持ETE。
  • OpenCSD:一个开源的Arm跟踪解码库。该库需要在Linux主机上运行。
    要下载这四个示例,请单击“下载”并选择“Armv-9A_trace_examples.zip”。有关运行示例的更多信息,请阅读附带的README.txt。这四个示例分别是:
  • el1_self_hosted_trace:配置和跟踪EL1,非安全指令执行。
  • el2_self_hosted_trace:配置和跟踪EL2,非安全指令执行。
  • el2_el1_self_hosted_trace:配置和跟踪EL2和EL1,非安全指令执行。TRBE的所属异常级别为EL2。
  • el2_controlled_self_hosted_trace:配置和跟踪EL2和EL1,非安全指令执行。在执行过程中,将EL1从禁止跟踪区域更改为允许跟踪区域。TRBE的所属异常级别为EL2。

以下各节解释了每个示例的程序流、设置和差异。

5.1 el1_self_hosted_trace example

以下示意图显示了el1_self_hosted_trace示例的程序流程:

在这里插入图片描述

在程序流程中,在配置ETE跟踪单元和TRBE之前,必须确保它们处于禁用且空闲状态。当组件已启用或不处于空闲状态时,对寄存器的写入将被忽略或导致不可预测的行为。TRCSTATR.IDLE指示跟踪单元是否处于空闲状态。

为确保TRBE准备好从跟踪单元收集跟踪数据,在启用跟踪单元之前启用TRBE。在确保TRBE收集所有生成的跟踪数据之前,禁用跟踪单元。

在示例中,TRBE使用虚拟指针地址。由于使用虚拟指针地址,因此在启用TRBE之前配置了翻译表并启用了MMU。

以下表格解释了示例中的跟踪单元和TRBE的操作以及寄存器设置。操作和设置按异常级别组织。

在EL3中,使用以下TRBE设置:

在这里插入图片描述
在EL1中,执行以下ETE跟踪单元和TRBE的操作和设置:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Arm DS中运行示例直至WFI指令后,下载并保存ETE跟踪数据至TRBE。保存的跟踪数据使用OpenCSD trc_pkt_lister程序进行解码。OpenCSD trc_pkt_lister程序解码构成已收集跟踪流的跟踪包。

有关跟踪包的更多信息,请阅读Arm®架构参考手册补充Armv9的协议描述部分,适用于Armv9-A架构配置文件。

使用trc_pkt_lister程序,所有解码后的跟踪数据都以Idx:; ID:开头。Idx:显示跟踪流中跟踪包的索引。 给出索引号。ID:显示解码的跟踪包的跟踪ID。 是跟踪ID编号。

以下表格显示了由el1_self_hosted_trace示例生成的跟踪数据的OpenCSD trc_pkt_lister程序输出:

为简化解码输出,已删除Idx:; ID:。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 el2_self_hosted_trace example

el2_self_hosted_trace示例具有与el1_self_hosted_trace示例相同的程序流。两个示例之间的主要区别在于el1_self_hosted_trace示例跟踪EL1执行,而el2_self_hosted_trace示例跟踪EL2执行。

以下列举了el2_self_hosted_trace和el1_self_hosted_trace示例之间的区别:
在这里插入图片描述
el2_self_hosted_trace示例的解码跟踪数据与el1_self_hosted_trace示例类似。两个示例之间的主要区别在于el2_self_hosted_trace示例显示的跟踪数据是在EL2中执行而不是EL1中生成的。

5.3 el2_el1_self_hosted_trace example

与之前的示例不同,el2_el1_self_hosted_trace示例跟踪两个异常级别,EL2和EL1。为了跟踪EL2和EL1,el2_el1_self_hosted_trace示例合并了之前示例中的ETE跟踪单元和TRBE寄存器设置。

例如,要启用EL2、EL1和EL0跟踪,TRFCR_EL2.E0HTRE、TRFCR_EL2.E2TRE、TRFCR_EL1.E0TRE和TRFCR_EL1.E1TRE都被设置为1。另一个例子是,为了允许跟踪非安全EL2和EL1,TRCVICTLR.EXLEVEL_NS_EL2和TRCVICTLR.EXLEVEL_NS_EL1都被设置为0。

以下示意图显示了el2_el1_self_hosted_trace示例的程序流程:
在这里插入图片描述
在此示例中,TRBE的所属异常级别为EL2。由于所属异常级别为EL2,因此以下情况为真:

  • 使用EL2翻译体制对虚拟寻址的TRBE指针进行翻译。
  • 在禁用TRBE之前,代码必须跳转到EL2。通过执行HVC指令执行跳转。

相同的循环在EL2和EL1中都被跟踪,因此循环的跟踪数据解码对于两个异常级别都是相同的。与先前的示例不同,解码后的跟踪数据有以下不同之处:

  • 存在两个OCSD_GEN_TRC_ELEM_PE_CONTEXT消息:一个用于在EL2中进行跟踪,另一个用于在EL1中进行跟踪。
  • 在EL2跟踪解码部分的末尾,出现以下消息:
    OCSD_GEN_TRC_ELEM_INSTR_RANGE(exec range=0x800002bc:[0x800002d0] num_i(5)
    last_sz(4) (ISA=A64) E iBR A64:eret
    该消息对应于执行了五条指令,其中最后一条指令是一条ERET指令,从EL2跳转到EL1。
  • 在EL1跟踪解码部分的开头,显示已执行四条ISB指令。这些ISB指令对应于在EL1翻译表设置和MMU启用代码期间执行的ISB指令。

5.4 el2_controlled_self_hosted_trace example

el2_controlled_self_hosted_trace示例与el2_el1_self_hosted_trace示例类似,都跟踪两个异常级别,EL2和EL1。但是,在el2_controlled_self_hosted_trace示例中,EL2中的ETE跟踪单元和自托管跟踪扩展设置代码最初禁止了EL1的跟踪。

以下示意图显示了el2_controlled_self_hosted_trace示例的程序流程:
在这里插入图片描述
在程序流程中,初始的ETE跟踪单元和自托管跟踪扩展设置仅启用了EL2,而未启用EL1。由于禁止了EL1跟踪,因此在EL1中执行的第一个循环未被跟踪。为了启用EL1跟踪,代码通过执行HVC指令跳回到EL2。

在启用EL1跟踪之前,禁用了跟踪单元和TRBE。禁用这些组件是为了避免寄存器写入未发生或引起不可预测的行为。

通过设置以下内容来启用EL1跟踪:

  • TRCVICTLR.EXLEVEL_NS_EL1为0
  • TRFCR_EL1.E0TRE和TRFCR_EL1.E1TRE为1

在启用EL1跟踪后,启用跟踪单元和TRBE,并且代码跳回到EL1。执行第二个循环,这个循环现在会被跟踪,因为EL1跟踪现在已启用。在第二个循环后,禁用跟踪单元和TRBE。与el2_el1_self_hosted_trace示例中一样,代码跳转到EL2以禁用TRBE。

以下表格显示了由el2_controlled_self_hosted_trace示例生成的跟踪数据的OpenCSD trc_pkt_lister程序输出:

为简化解码输出,移除了Idx:; ID:。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
正如解码输出所示,当禁止EL1跟踪时,就不会捕获EL1的跟踪。这缺乏跟踪数据显示了ETE和自托管跟踪扩展对生成哪些跟踪数据具有控制权。

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码改变世界ctw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值