【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 专栏导读】

相关推荐
汽车仪器仪表相关领域1 天前
GT-NHVR-20-A1工业及商业用途点型可燃气体探测器:精准感知隐患,筑牢工商业安全防线
运维·网络·人工智能·功能测试·单元测试·汽车·压力测试
wanhengidc1 天前
如何有效防范网络安全威胁
运维·服务器·网络·网络协议·安全·web安全·智能手机
王琦03181 天前
第十一章 管理Linux软件包和进程
linux·运维·服务器
Cyber4K1 天前
【Nginx专项】高级进阶架构篇-Proxy正反向代理、FastCGI及PHP-FPM介绍
运维·服务器·nginx·架构·php
returnthem1 天前
【Linux基础知识】Linux自动化运维:编写Shell脚本实现自动化任务
linux·运维·自动化
实在智能RPA1 天前
零售行业上线Agent,能带来哪些运营价值?——2026年视角下的端到端智能自动化深度拆解
运维·自动化·零售
默|笙1 天前
【Linux】线程同步与互斥_日志与线程池
android·linux·运维
一条咸鱼¥¥¥1 天前
【运维笔记】华为防火墙远程接入用户开通与禁用方法
运维·网络·华为·远程用户
Asurplus1 天前
【Ngrok】Linux运行内网穿透工具Ngrok
linux·运维·服务器·内网穿透·ngrok
ancktion1 天前
ubuntu多gcc版本切换
linux·运维·ubuntu