【ARM Coresight Debug 系列 -- ARMv8/v9 软件实现断点地址设置】

请阅读【嵌入式开发学习必备专栏 】


文章目录

ARMv8/v9 软件设置断点地址

在ARMv8/9架构中,可以通过寄存器 DBGBVR0_EL1 设置断点。这个寄存器是一系列调试断点值寄存器中的第一个DBGBVRn_EL1,其中n表示寄存器编号,对于ARMv8/9,通常可以有多个这样的寄存器,具体数量取决于实现:

shell 复制代码
• DBGBCR0_EL1 and DBGBVR0_EL1 are for breakpoint number zero.
• DBGBCR1_EL1 and DBGBVR1_EL1 are for breakpoint number one.
• DBGBCR2_EL1 and DBGBVR2_EL1 are for breakpoint number two.
• ...
• ...
• DBGBCR<n-1>_EL1 and DBGBVR<n-1>_EL1 are for breakpoint number (n-1).

DBGBVR0_EL1允许在EL1(异常级别1,通常是操作系统级别)控制下设置断点,从而帮助开发人员进行代码调试。

DBGBVR0_EL1寄存器通常在软件调试过程中使用,它使得调试器能够指定程序中的一个地址,当处理器执行到这个地址时自动触发一个调试事件(如断点异常)。这对于调试复杂的软件问题非常有用,尤其是在需要理解程序流程或识别特定代码执行路径时。

此外DBGBVR0_EL1 可以进行下面内容匹配:

csharp 复制代码
--- An instruction virtual address.
--- A Context ID.
--- A VMID value.
--- A concatenation of both a Context ID value and a VMID value.

关于 ARM Debug 相关内容推荐阅读请阅读 【ARM Coresight SoC-400/SoC-600
专栏导读】

为了方便测试,在PC执行到设置的断点地址之后让CPU停下来,这里需要配置下系统debug 寄存器 EDSCR.HDE: Halting debug enable 位,EDSCR 寄存器的内容如下:

STATUS, bits [5:0]: debug 状态的 flag, 具体含义如下:

  • 0b000001 PE is restarting, exiting Debug state.
  • 0b000010 PE is in Non-debug state.
  • 0b000111 Breakpoint.
  • 0b010011 External debug request.
  • 0b011011 Halting step, normal.
  • 0b011111 Halting step, exclusive.
  • 0b100011 OS Unlock Catch.
  • 0b100111 Reset Catch.
  • 0b101011 Watchpoint.
  • 0b101111 HLT instruction.
  • 0b110011 Software access to debug register.
  • 0b110111 Exception Catch.
  • 0b111011 Halting step, no syndrome

其它位的含义这里就不再过多介绍

注意 :为了使软件可以配置对 breakpoint 相关寄存器进行配置,还需要对寄存器oslar_el1配置,进行解锁操作。

在断点地址配置好之后,如还需配置具体的触发方式及断点使能配置,需要对寄存器DBGBCR<n>:Debug Breakpoint Control Registers, n = 0 - 15

c 复制代码
Bit[13]   (HMC) - 1'b1    - State matching (match all states)
Bits[8:5] (BAS) - 4'b1111 - Match A32/A64 instructions
Bits[2:1] (PMC) - 2'b11   - State matching (match all states)
Bit[0]    (E)   - 1'b1    - Enable this breakpoint

断点地址软件配置流程

  1. 设置断点地址 :将你希望断点触发的代码地址写入DBGBVR0_EL1
  2. 配置断点控制寄存器(DBGBCR0_EL1) :与DBGBVR0_EL1一起使用的还有控制寄存器(例如DBGBCR0_EL1),它用于配置断点的类型(如硬件断点)和行为(如断点触发条件)。你需要根据需求配置这些控制寄存器,以确保断点以正确的方式被触发。
  3. 运行调试会话 :当程序执行到达DBGBVR0_EL1指定的地址时,将触发断点,此时可以通过调试器查看程序状态,包括寄存器、内存和其他有用的调试信息。
  4. 处理断点触发:一旦断点触发,你可以使用调试器来检查程序的状态、修改变量或寄存器的值,或是单步执行程序来进一步调试。

代码实现

c 复制代码
cpu_bkpt_test:
    stp  x0, x1, [sp, #-0x10]!
    mrs     x0, mdscr_el1
    orr     x0, x0, #(0x1 << 14)   
    msr     mdscr_el1, x0
    mov     x0, #0
    msr     oslar_el1, x0          
    isb

    adr     x0, bkpt0
    msr     dbgbvr0_el1, x0   

    mov     x0, #0x21E7       
    msr     dbgbcr0_el1, x0  
    isb

bkpt0:
    bl bkpt_test
    ldp x0, x1, [sp], #0x10
    ret

关于 ARMv8/v9 汇编指令的学习推荐阅读:ARM64 常见汇编指令学习

为了方便观察测试,在汇编代码中调用一个打印函数,如果测试不成功,会进行打印,具体实现如下:

c 复制代码
void bkpt_test(void)
{
        log_info("-------------\n");
}

在执行到上面断点函数bkpt0之后,可以通过trace32观察到 trace32 状态改变:


关于 trace32 的使用推荐阅读专栏请阅读【Trace32 ARM 专栏导读】

相关推荐
乘云数字DATABUFF1 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--3 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森3 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB5 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode6 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220707 天前
如何搭建本地yum源(上)
运维
大树8810 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠10 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质10 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务