快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
- 付费专栏-付费课程 【购买须知】:
- 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 — 适合小白入门
- 【目录】ARMv8/ARMv9架构高级进阶-[目录]👈👈👈 — 高级进阶、小白勿买
- 【加群】ARM/TEE/ATF/SOC/芯片/安全-学习交流群 — 加群哦
Armv8-A external debug
2 External debug
外部调试模型是在被调试的处理单元(PE)外部托管调试器时使用的。外部调试器可以通过以下操作控制PE:
- 当发生调试事件时停止程序执行
- 检查体系结构寄存器的状态
- 修改体系结构寄存器的状态
- 在PE上运行指令以访问内存
外部调试器通过配置调试事件来控制核心进入调试状态。
通过编程调试逻辑或通过向核心发出调试停止请求的信号来配置调试事件。下面的图表说明了外部调试器的设置:
2.1 External debug interface
在调试状态下,PE在指令传输寄存器(ITR)中执行指令。外部调试器通过外部调试接口将指令插入ITR。调试通信通道(DCC)允许PE与外部调试器之间进行通信。
下图说明了使用外部调试器接口的Arm核心的调试设置:
3 Debug state
调试状态是外部调试模型的基础。外部调试器通过编程调试逻辑引发调试事件时,会导致PE进入调试状态。外部调试也称为暂停调试模式。当PE进入调试状态时,按照以下顺序发生以下事情:
- PE停止执行程序计数器指示的位置的指令。相反,调试器通过外部调试接口控制PE。
- 调试器通过外部调试接口使用指令传输寄存器(ITR)向PE传递指令以在调试状态下执行。
- 使用通过ITR执行的指令,调试器可以读取/写入体系结构寄存器,例如通用寄存器、系统寄存器和浮点寄存器。
- 使用通过ITR执行的指令,调试器可以读取/写入内存位置。
- DCC的数据传输寄存器可以通过外部调试接口和系统寄存器接口访问。DCC在PE和外部调试器之间交换数据中发挥重要作用。
- 在调试状态下,PE无法处理中断。
3.1 Debug state entry and exit
当PE进入调试状态时:
- PE在进入调试状态之前的PSTATE存储在调试保存程序状态寄存器(DSPSR)中。
- 首选重启地址存储在调试链接寄存器(DLR)中。
- PE停止执行由程序计数器指向的代码。
- 不处理中断。
- 外部调试器接管PE的控制。
在PE处于调试状态时,外部调试器可以:
- 查看和修改内存位置和体系结构寄存器的内容,包括DLR和DSPSR。
- 使用ITR向PE传递指令以在调试状态下执行。
- 使用调试通信通道(DCC)向PE传递数据,并从PE接收数据。
- 通过使用DCPS和DRPS指令更改异常级别。
- 通过触发重新启动请求退出调试状态。
在来自外部调试器的重新启动请求时,PE退出调试状态。当PE退出调试状态时,PE:
- 将程序计数器设置为DLR中的地址。
- 从DSPSR中还原PSTATE。
- 开始执行由程序计数器指向的指令。
下图说明了调试状态的进入和退出:
外部调试对以下方面很有用:
- 硬件调试:在系统首次上电并且某些软件功能不可用时进行开发调试。
- 对嵌套在系统深处的处理器核(PE)进行调试
4 Debug Access Port
在外部调试模型中,使用外部调试接口访问调试寄存器。访问外部调试接口的方式由实现定义。然而,大多数Armv8-A系统包括一个调试访问端口(DAP),用于通过芯片外部调试器访问外部调试接口。例如,使用第二个PE调试一个PE的芯片上的外部调试器,使用内存映射接口来访问外部调试接口。
以下图示说明了使用DAP访问外部调试接口:
外部调试寄存器,也称为停机模式调试寄存器,通常以ED为前缀,例如EDSCR。两个重要的外部调试寄存器是:
- EDSCR:外部调试状态和控制寄存器
- EDECR:外部调试执行控制寄存器
5 Enabling external debug
外部调试模式不包含任何全局启用位。对于每个外部调试事件,可以编程相应的控制位以启用对该外部调试事件的处理器暂停。
断点和监视点是自托管调试器和外部调试器之间共享的资源。将EDSCR.HDE设置为1会导致断点和监视点暂停PE。
外部调试器可能需要进行身份验证。如果外部调试器未进行身份验证,则可能禁止停机Arm实现。身份验证的详细信息由实现定义。身份验证可能以分层的方式存在。这意味着在此期间可能需要一级身份验证,该身份验证可能会在PE的非安全执行中启用停机。还可能需要另一级身份验证以允许在PE的安全执行中暂停。
5.1 Handshake between the external debugger and the PE
当PE进入Debug状态时,外部调试器接管PE的控制。当PE退出Debug状态,继续程序的正常执行时,外部调试器还启动PE。用于在外部调试器和PE之间传递控制的机制称为握手。让我们更详细地看看这个过程。
外部调试器和PE之间的典型握手包括以下操作,按照这个顺序进行:
- 外部调试器配置PE的调试逻辑,以在程序执行的关键点生成调试事件。例如,外部调试器在子例程的起始地址上配置断点。
- 当程序达到关键点时,将生成调试事件,导致PE进入Debug状态。 PE的外部调试器寄存器指示PE在Debug状态下的状态。
- 外部调试器轮询PE的外部调试寄存器以指示Debug状态。
- 外部调试器查询程序状态并向PE发出重新启动请求。
以下图和表说明了外部调试器和核心之间的握手序列:
6 External debug events
在本指南的这一部分,我们描述了可以导致PE进入Debug状态的调试事件。以下是每个事件的摘要:
-
External debug request debug event
- 这个事件是处理器的输入触发事件。当这个事件被断言时,PE进入Debug状态。
-
Halt instruction debug event
- 每当PE执行HLT指令时生成此事件。
-
Halting step debug event
- 在PE执行指令或异常之后立即生成此事件,同时PE不处于Debug状态。
-
Exception catch debug event
- 在PE执行异常或异常返回之后立即生成此事件。
-
Reset catch debug event
- 在复位之后,PE开始执行复位后的指令之前立即生成此事件。
-
Software access debug event
- 当PE尝试访问调试系统寄存器时生成此事件,例如断点和监视点控制寄存器。
-
OS unlock catch debug event
- 当操作系统锁定状态从锁定更改为解锁时生成此事件。
-
Breakpoint event
- 每当PE尝试从特定地址执行指令或数据时生成此事件。
-
Watchpoint event
- 每当PE从特定地址访问数据时生成此事件。
断点和监视点是自托管调试器和外部调试器之间共享的资源。如果启用了停机调试模式,则断点事件或监视点事件会导致PE进入Debug状态。否则,如果启用了自托管调试,则生成调试异常。
让我们更详细地看看每一个事件。
6.1 External debug request event
External Debug Request Debug Event
外部调试请求事件是处理器的输入触发事件。当此事件被断言时,PE进入Debug状态。调试器通过断言外部调试请求来强制PE进入Debug状态,然后外部调试器控制PE。跨触发接口寄存器用于生成外部调试请求事件。
如果在PE已经处于Debug状态时断言外部调试请求,则会忽略该请求。要退出Debug状态,外部调试器向处理器断言重新启动请求。重新启动请求是对处理器的输入信号。当重新启动请求被断言时,处理器退出Debug状态。
6.2 Halt instruction debug event
Halt Instruction Debug Event
停机指令调试事件允许外部调试器在PE尝试执行HLT指令时接管PE的控制。HLT指令是停机软件断点指令。当HLT指令被提交执行时,如果EDSCR.HDE为1,则生成停机指令调试事件。在执行HLT指令时,如果EDSCR.HDE为1,则PE进入Debug状态并将控制权交给外部调试器。
通常,调试器会用HLT指令替换程序指令以触发停机指令调试事件。在此事件之后,外部调试器控制PE。
要退出Debug状态,外部调试器向处理器断言重新启动请求。
6.3 Halting step debug event
Halting Step Debug Event
停机步调试事件允许外部调试器接管正在调试的程序的控制。这发生在PE执行每个单独的指令或异常之后,而PE不处于Debug状态。启用停机步调试事件时,每当在PE中执行指令或异常时,PE都会进入Debug状态。
编程停机步调试事件:
当PE处于Debug状态时,外部调试器通过将EDECR.SS写入1来启用停机步。
外部调试器向PE发出退出Debug状态的信号。
在退出Debug状态后,PE执行由程序计数器(PC)指向的指令。在执行下一条指令之前,PE会再次进入Debug状态,从而将控制权交给外部调试器。
要退出Debug状态,外部调试器向处理器断言重新启动请求。
6.4 Exception catch debug event
Exception Catch Debug Event
异常捕获调试事件允许外部调试器在PE执行异常或异常返回时接管控制。对于每个异常级别,ED异常捕获控制寄存器(EDECCR)包括用于异常和异常返回的独立控制位。在EDECCR中设置位,当PE执行带有EDECCR指示的目标异常级别的异常或异常返回时,PE将进入Debug状态。
当在异常入口处生成异常捕获调试事件时,PE将在异常入口的一部分进入Debug状态,然后才执行异常处理程序的第一条指令。
当在异常返回时生成异常捕获调试事件时,PE将在异常返回地址的第一条指令执行之前进入Debug状态。
要退出Debug状态,外部调试器向处理器断言重新启动请求。
6.5 Reset catch debug event
Reset Catch Debug Event
复位捕获调试事件允许外部调试器在复位后立即接管PE的控制。
要启用复位捕获调试事件,设置External Debug Execution Control Register(EDECR)或Cross Trigger Interface Device Control register(CTIDEVCTL)中的Reset Catch Debug Event(RCE)位。
当外部调试器设置RCE位时,将在PE复位时生成复位捕获调试事件。在执行复位后的第一条指令之前,PE将进入Debug状态并将控制权交给外部调试器。复位可以是PE的热复位或冷复位。
要退出Debug状态,外部调试器向处理器断言重新启动请求。
6.6 Software access debug event
Software Access Debug Event
软件访问调试事件允许外部调试器在PE软件试图访问以下寄存器时接管PE的控制:
- Debug Breakpoint Value Registers(DBGBVRn_EL1),包括AArch32状态的DBGBXVRn
- Debug Breakpoint Control Registers(DBGBCRn_EL1)
- Debug Watchpoint Value Registers(DBGWVRn_EL1)
- Debug Watchpoint Control Registers(DBGWCRn_EL1)
外部调试器可以通过设置External Debug Status and Control Register(EDSCR)中的TDA位来启用软件访问调试事件。
当外部调试器设置TDA位时,PE进入Debug状态,并在PE软件尝试访问任何以下调试系统寄存器时将控制权交给外部调试器:
- AArch64:DBGBCR_EL1、DBGBVR_EL1、DBGWCR_EL1、DBGWVR_EL1
- AArch32:DBGBCR、DBGBVR、DBGBXVR、DBGWCR、DBGWVR
对上述寄存器的内存映射访问不会生成软件访问调试事件。
要退出Debug状态,外部调试器向处理器断言重新启动请求。
6.7 OS unlock catch debug event
OS Unlock Catch Debug Event
一些调试寄存器的内容在PE断电时会丢失。为了在复位后启用处理器的调试能力,必须在断电之前将调试寄存器的内容保存到非易失性存储器中,并在系统复位时进行恢复。Armv8-A架构通过OS保存机制启用了对Debug寄存器内容的保存,并通过OS恢复机制进行了恢复。
PE软件执行保存和恢复操作。在保存Debug寄存器内容时,PE软件锁定OS锁定,以禁止外部调试访问Debug寄存器。在恢复Debug寄存器内容后,PE软件解锁OS锁定。
OS解锁捕获调试事件允许外部调试器在OS恢复序列后立即接管PE。此事件强制PE在复位后恢复Debug寄存器内容后立即进入Debug状态。
控制位EDECR.OSUCE启用了OS解锁捕获调试事件。
6.8 Breakpoint event
Breakpoint Event
当PE尝试从特定地址执行指令时,将生成断点事件。硬件断点寄存器可以编程为程序的地址。当PE尝试执行从已编程地址获取的指令时,将生成断点事件。
当生成断点事件时,如果以下条件满足,则会生成Debug状态的进入:
- EDSCR.HDE == 1。这些事件已启用暂停调试。
- 认证信号表明调试器已对PE的当前安全状态进行了足够的身份验证。
断点设置使用硬件寄存器,因此通常称为硬件断点。
设置断点事件的步骤:
- 外部调试器将指令的地址编程到断点值寄存器DBGBVR。
- 外部调试器设置启用位DBGBCR.E以启用断点事件。
以下图示说明了一个断点事件,其中PE尝试执行已设置断点的SUB指令:
硬件断点可以根据PE执行时的以下断点匹配进行编程以生成断点事件:
-
未关联的指令地址匹配
- PE从虚拟地址执行,其值与DBGBVR寄存器相同,并且PE的当前状态与DBGBCR中的设置匹配。
-
未关联的上下文ID匹配
- PE在CONTEXTIDR_EL1/CONTEXTIDR_EL2的值与DBGBVR寄存器相同时执行指令,并且PE的当前状态与DBGBCR中的设置匹配。DBGBCR.BT定义了是使用CONTEXTIDR_EL1还是CONTEXTIDR_EL2。这些断点可用于在应用程序或操作系统被调度执行时将控制路由到外部调试器。
-
未关联的VMID匹配
- PE在VTTBR_EL2.VMID与DBGBVR寄存器内容相同时执行指令,并且PE的当前状态与DBGBCR中的设置匹配。这些断点可用于在操作系统被调度执行时将控制路由到外部调试器。
-
未关联的上下文ID和VMID匹配
- PE在CONTEXTIDR_EL1和VTTBR_EL2.VMID与DBGBVR寄存器内容相同时执行指令,并且PE的当前状态与DBGBCR中的设置匹配。这些断点可用于在操作系统中的应用程序被调度执行时将控制路由到外部调试器。
-
关联断点
- 地址匹配断点可以与上下文或VMID断点关联。这些断点可用于在PE从应用程序或操作系统中的指令地址执行时将控制路由到外部调试器。
断点控制寄存器DBGBCR_EL1包含断点的控制,例如启用控制。
断点值寄存器DBGBVR_EL1保存用于断点匹配的值。该值可以是以下之一:
- 指令虚拟地址
- 一个或两个上下文ID
- 一个VMID值
- 上下文ID值和VMID值的串联
Armv8-A架构支持实现2-16个硬件断点。一个实现支持多少个硬件断点是一个由实现定义的选择。根据硬件断点单元的可用性,可以在一个实现上同时设置该数量的硬件断点。寄存器ID_AA64DFR0_EL1.BRPs指示实现了多少个断点单元。
通过编程单个调试断点控制寄存器DBGBCR_El1.E的E位,可以启用或禁用每个断点单元。每个断点单元都有一个相应的控制寄存器。根据实现的断点数量,这些寄存器按照顺序编号,例如:
- DBGBCR0_EL1和DBGBVR0_EL1对应断点编号零。
- DBGBCR1_EL1和DBGBVR1_EL1对应断点编号一。
- DBGBCR2_EL1和DBGBVR2_EL1对应断点编号二。
- DBGBCR_EL1和DBGBVR_EL1对应断点编号n。
6.9 Watchpoint event
观察点事件在PE从特定地址或地址范围访问数据存储器时生成。硬件观察点寄存器可以编程为数据存储器位置的地址。当PE尝试从编程地址访问数据时,将生成观察点事件。
当生成观察点事件时,如果满足以下条件,PE将进入调试状态:
- EDSCR.HDE == 1,为这些事件启用暂停调试。
- 身份验证信号表明调试器已对PE的当前安全状态进行了足够的身份验证。
观察点永远不会在指令提取时生成观察点调试事件。
以下是按顺序设置观察点事件的步骤:
- 外部调试器将数据的地址编程到观察点值寄存器DBGWVR中。
- 外部调试器通过设置启用位DBGWCR.E在观察点控制寄存器DBGWCR中启用观察点。
以下图示了当PE尝试执行已设置观察点的指令时观察点事件的情况:
DBGWVR的低位可以在地址比较中进行掩码。这允许ED在地址范围内设置观察点事件。
观察点可以:
- 编程为仅在读取访问、仅在写入访问或两种访问类型上生成观察点调试事件
- 关联到关联上下文断点,因此仅在地址匹配发生时PE处于特定上下文时才生成观察点调试事件
Armv8-A架构支持实现2-16个硬件观察点。实现支持多少个硬件观察点是一个由实现定义的选择。根据硬件观察点单元的可用性,可以在一个实现上同时设置相应数量的观察点。寄存器ID_AA64DFR0_EL1.WRPs指示实现了多少个观察点单元。
可以通过编程单个调试观察点控制寄存器DBGWCR_EL1.E的E位来启用或禁用单个观察点单元。每个观察点单元都有一个相应的控制寄存器。根据实现了多少个观察点,这些寄存器被按顺序编号,例如:
- DBGWCR0_EL1和DBGWVR0_EL1用于观察点编号为零。
- DBGWCR1_EL1和DBGWVR1_EL1用于观察点编号为一。
- DBGWCR2_EL2和DBGWVR2_EL1用于观察点编号为二。
- DBGWCR_EL1和DBGWVR_EL1用于观察点编号为n。
7 Embedded Cross Trigger
嵌入式交叉触发(ECT)是在Armv8-A系统中由外部调试器使用的机制,用于生成调试事件。ECT还在系统内的一个代理到另一个代理之间传递事件。
外部调试器使用ECT生成调试请求触发器或重启请求触发器。这些触发器在处理器之间路由事件。例如,这些触发器可以将来自一个处理器的交叉停机事件路由到系统中的其他处理器,以便在系统中的一个处理器停机时所有处理器都停机。
Armv8-A实现中的ECT支持:
- 交叉触发接口(CTI)
- 输入和输出触发器
- 交叉触发矩阵(CTM)
CTI提供了在Armv8-A系统的各个组件之间路由触发事件的能力。例如,可以将触发事件路由到中断控制器,例如跟踪单元,或系统中的其他处理器。
如果系统中存在多个CTI块,我们可以使用CTM在CTI块之间传递事件。CTM使用以下IO通道在CTM块之间传递事件:
- 输入触发器 – 从PE到CTI的触发器事件输入。
- 输出触发器 – 从CTI到PE的触发器事件输出。
- 输入通道 – 从CTM到CTI的通道事件输入。这些可以通过ECT编程模型中存在的寄存器CTIAPPPULSE、CTIAPPSET和CTIAPPCLEAR直接访问。
- 输出通道 – 从CTI到CTM的通道事件输出。
Armv8-A PE的ECT中存在的一些CTI输出触发器具有固定的含义:
- 输出触发事件0 – 调试请求触发事件。这是CTI的输出触发事件和处理器的输入触发事件,由CTI断言以将处理器置于调试状态。触发事件在被调试器确认之前一直处于断言状态。如果处理器已经处于调试状态,则处理器忽略触发事件,但CTI继续断言它,直到被调试器移除。
- 输出触发事件1 – 重启请求触发事件。这是从CTI到PE的输出触发事件,用于强制PE退出调试状态。
- 输入触发事件0 – 交叉停机请求触发事件。这是从PE到CTI的输入触发器。此事件可以被路由到系统中的其他代理。例如,它可以被路由为另一个PE的调试请求事件。
8 Check your knowledge
-
What is the debug model called when the debugger is external to the Processor Element (PE)?
- External debug
-
What is the basis for the external debug model?
- Debug state
-
List four debug events that are supported by external debug.
- Reset catch, halt step, debug request, and OS unlock catch.
-
What is the basis for the self-hosted debug model?
- Debug exceptions
-
How do you disable external debug?文章来源:https://www.toymoban.com/news/detail-790445.html
- There are no global bits to disable external debug.
-
How many hardware breakpoints and watchpoints are supported in an Arm core?文章来源地址https://www.toymoban.com/news/detail-790445.html
- The number of hardware breakpoints and watchpoints that are supported in an Arm core is IMPLEMENTATION DEFINED.
到了这里,关于Armv8-A external debug的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!