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

news2025/4/4 19:55:13


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


文章目录

    • ARMv8/v9 软件设置断点地址
      • 断点地址软件配置流程
      • 代码实现

ARMv8/v9 软件设置断点地址

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

• 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 可以进行下面内容匹配:

— 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
在这里插入图片描述

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. 处理断点触发:一旦断点触发,你可以使用调试器来检查程序的状态、修改变量或寄存器的值,或是单步执行程序来进一步调试。

代码实现

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 常见汇编指令学习

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

void bkpt_test(void)
{
        log_info("-------------\n");
}

在执行到上面断点函数bkpt0之后,可以通过trace32观察到 trace32 状态改变:
在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chromium源码阅读:深入理解Mojo框架的设计思想,并掌握其基本用法(1)

Mojo简介 Mojo 是一个运行时库的集合&#xff0c;提供与平台无关的通用 IPC 原语抽象、消息 IDL 格式以及具有针对多种目标语言的代码生成的绑定库&#xff0c;以便于跨任意进程间和进程内边界传递消息。 Mojo 分为清晰分离的层&#xff0c;子组件的基本层次结构如下&#xff…

GraphQL(7):ConstructingTypes

1 使用GraphQLObjectType 定义type&#xff08;类型&#xff09; 不使用ConstructingTypes定义方式如下&#xff1a; 使用ConstructingTypes定义方式如下&#xff1a; 更接近于构造函数方式 var AccountType new graphql.GraphQLObjectType({name: Account,fields: {name: …

微软Win10 21H2/22H2六月更新补丁KB5039211来了!附完整更新日志

系统之家于6月12日发出最新报道&#xff0c;微软为 Windows 10 用户发布了六月的安全更新补丁KB5039211。对于 21H2 版本的用户&#xff0c;系统版本号将升级至 19044.4529&#xff1b;而对于 22H2 版本&#xff0c;版本号则提升至 19045.4529。此次更新的亮点在于增强了系统的…

批量放大PNG图片至指定像素,画质优先,轻松提升图片品质与视觉体验!

在数字化时代&#xff0c;图片已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;很多时候我们面临着这样的问题&#xff1a;手头的Png图片尺寸太小&#xff0c;无法满足我们的需求&#xff1b;或者想要将图片放大&#xff0c;却又担心画质受损。别担心&#xff0c;现…

深度学习实战79-ChatTTS实现有感情有笑声的语音,无法分辨是人还是机器的语音

大家好,我是微学AI,今天给大介绍一下深度学习实战79-ChatTTS实现有感情有笑声的语音,本地部署运行,难以分辨是人还是机器的语音。ChatTTS是文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。ChatTTS模型代码已经开源,但是很多人启动不起来,会遇到各种的问…

R可视化:R语言基础图形合集

R语言基础图形合集 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 基础图形可视化 数据分析的图形可视化是了解数据分布、波动和相关性等属性必…

深入浅出通信原理 | 通信系统中的性能指标评估

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、通信系统中的性能指…

数据结构与算法笔记:基础篇 -递归树:如何借助树来求解递归算法的时间复杂度?

概述 我们都知道&#xff0c;递归代码的时间复杂度分析起来很麻烦。在《排序(下)》哪里讲过&#xff0c;如何用递推公式&#xff0c;求解归并排序、快速排序的时间复杂度&#xff0c;但是有些情况&#xff0c;比如快排的平均时间复杂度的分析&#xff0c;用递推公式的话&#…

远程主机强迫关闭了一个现有的连接redis

引言 在使用 Redis 进行开发和运维过程中&#xff0c;我们可能会遇到 Redis 连接被远程主机强制关闭的情况。本文将介绍造成这种情况的原因&#xff0c;并给出一些处理方法和建议。 远程主机强制关闭连接的原因 远程主机强制关闭连接通常是由于网络不稳定、连接超时、Redis 配…

Linux网络 - HTTP协议

文章目录 前言一、HTTP协议1.urlurl特殊字符 requestrespond 总结 前言 上一章内容我们讲了在应用层制定了我们自己自定义的协议、序列化和反序列化。 协议的制定相对来讲还是比较麻烦的&#xff0c;不过既然应用层的协议制定是必要的&#xff0c;那么肯定已经有许多计算机大佬…

看国足!不破不立!层次越低的家庭,语言攻击性越强——早读(逆天打工人爬取热门微信文章解读)

你昨晚看国足了吗&#xff1f; 引言Python 代码第一篇 洞见 层次越低的家庭&#xff0c;语言攻击性越强第二篇结尾 引言 昨天看了国足比赛 输了韩国一个球 剩下大概率的出线希望 除非泰国赢新加坡 且3个球或者以上 泰国稍强于新加坡 但并不到打进3个球的地步 都觉得2个球已经是…

每日5题Day22 - LeetCode 106 - 110

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {…

质数(素数)的几种判断方法

判断一个数是否为质数/合数是在数据处理中经常遇到的问题&#xff0c;如何解决这个问题&#xff0c;作者总结了如下几种算法。 质数的定义&#xff1a; 一个数如果除了1 和 其本身外&#xff0c;不能被其它数整除&#xff0c;就称这个数为质数&#xff08;或素数&#xff09;…

【计算机体系结构复习】

一.选择题&#xff08;2 X 15) 第五章第六章没有 第一章 第二章 第三章 第四章 第七章 第八章 二.主观题 第一章 1.7 1.11 怎么计算程序执行时间CPI、MIPS CPI变化&#xff0c;系统性能怎么变&#xff08;上课例子&#xff09; p9 例1.3 第二章 哈夫曼…

CVE-2012-2122-mysql未授权访问漏洞复现-vulhub

1.原理 参考&#xff1a;CVE-2012-2122 Mysql身份认证漏洞及利用-CSDN博客 简单来说&#xff0c;除了配置上的问题以外&#xff0c;是密码的验证出现了漏洞&#xff0c;导致尝试次数多了之后直接可以登入 使用&#xff1a;kalivulhub 2.复现 开一下镜像&#xff0c;用的是v…

Michael.W基于Foundry精读Openzeppelin第57期——ReentrancyGuard.sol

Michael.W基于Foundry精读Openzeppelin第57期——ReentrancyGuard.sol 0. 版本0.1 ReentrancyGuard.sol 1. 目标合约2. 代码精读2.1 constructor()2.2 modifier nonReentrant() 0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#xff1a;v1.5.6 0.1 Reen…

docker-compose Install wiki

wiki 前言 最强大和可扩展的开源Wiki软件,使用Wiki.js漂亮而直观的界面,让编写文档成为一种乐趣 前提要求 安装 docker docker-compose 参考创建一键安装wiki wiki 安装目录/wikiwiki端口83admin 端口 84postgres 端口5432postgres 库 wikipostgres 用户 wikijspostgres 密…

【启明智显方案分享】ESP32-S3与GPT AI融合的智能问答嵌入式设备应用解决方案

一、引言 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;嵌入式设备正逐渐变得智能化。本解决方案是启明智显通过结合ESP32-S3的低功耗、高性能特性和GPT&#xff08;Generative Pre-trained Transformer&#xff09;…

简单了解java中线程的使用

线程 1、线程的相关概念 1.1、并行和并发 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行 并发&#xff1a;在同一时刻&#xff0c;有多个任务在单个CPU上交替执行 1.2、进程和线程 进程&#xff1a;就是在多任务管理系统中&#xff0c;每个独立执…

【MySQL】表的基本增删查改(结合案例)

文章目录 1.前言2.插入数据&#xff08;Create&#xff09;2.1案例2.2单行数据全列插入2.3多行数据指定列插入2.4插入否则更新2.5替换 3. 读取数据(Retireve)3.1案例3.2全列查询3.3指定列查询3.4查询字段为表达式3.5为查询结果起别名3.6去重3.7where条件3.7.1案例 3.8排序3.9筛…