https://mp.weixin.qq.com/s/deNMEyJ1idJDVoZwwo0A1A

简单介绍TLDebugModuleInner中核心总线访问(Hart Bus Access)。

参考资料:

a. https://github.com/pulp-platform/riscv-dbg/blob/master/doc/debug-system.md

b. RISC-V External Debug Support Version 0.13.2 Appendix A.2

1. Hart Bus Access

tlNode定义了4K的地址空间,供核心访问:

这段地址空间是可执行的:executable=true.

地址空间中的各个主要地址在DsbRegAddrs中定义:

根据参考资料中的说法,几个关键地址的定义如下:

地址0x0800-0x1000中定义的是一段ROM:

可以看到这是根据DebugRomContents中的内容生成一个个只读寄存器。

2. DebugRomContents

DebugRomContents是一组指令,以数据形式直接定义:

这组binary数据可以被反汇编。

1) 将这组数据以二进制形式存放在文件中,这里使用C语言代码进行:

rombase.bin使用xxd查看二进制内容如下:

2) 使用riscv64-linux-gnu-objdump进行反汇编,即可得到汇编指令:

3. addr: 800

这段指令存放的地址为0x800,也就是在核心接收到调试模块发出的halt请求后,会将pc设置为这个地址,进而从此处开始执行。

这个0x800出现在rocket/CSR.scala中:

debugTVec存入到tvec中,进而输出到io.evec中:

io.evec最后会进入到pc中:

4. Debug ROM

1) 跳转地址:0x800, 0x804, 0x808

这三个地址的意义分别为:

2) Halt处理

核心跳转到0x800时开始执行:

a. j 0xc:跳到0xc处开始执行;

b. 把s0保存到dscrach寄存器中;

c. 把mhartid写入到0x100地址,也就是HALTED地址处:

进而写入到hartHaltedId中:

d. 以hart id为偏移量,读取FLAGS地址段(0x400~0x800, 0x400=1024)中对应字节的值,该字节的结构如下:

e. 若对应字节的go/resume都为0,则跳到0x24+0x14=0x38处执行。进而再跳到768=0x300=WHERETO处执行。WHERETO地址处的指令跳到抽象命令地址执行。如果没有抽象命令请求,则抽象命令地址处的指令是nop, ebreak,进而又跳入0x800处执行。

f. 若go/resume不是全0,而go=0,也就是resume=1,那么就是调试器请求核心恢复。跳到0x3c处执行。

g. 恢复s0寄存器的值,把GOING地址处写0. 跳到WHERETO进而开始执行抽象命令。

3) Resume处理

从调试状态恢复到正常执行:

a. 把mhartid写入到RESUMING地址处,也就是0x108地址处;

b. 恢复s0寄存器,使用dret指令恢复正常运行;

4) Exception处理

在EXCEPTION=0x10c地址处写0,进而调用ebreak指令把控制权交给调试器。

5. 附录

1) C

#include <stdio.h>

char rombase[] = {

0x6f, 0x00, 0xc0, 0x00, 0x6f, 0x00, 0x80, 0x03, 0x6f, 0x00, 0x40, 0x04,

0x0f, 0x00, 0xf0, 0x0f, 0x73, 0x10, 0x24, 0x7b, 0x73, 0x24, 0x40, 0xf1,

0x23, 0x20, 0x80, 0x10, 0x03, 0x44, 0x04, 0x40, 0x13, 0x74, 0x34, 0x00,

0xe3, 0x08, 0x04, 0xfe, 0x13, 0x74, 0x14, 0x00, 0x63, 0x08, 0x04, 0x00,

0x73, 0x24, 0x20, 0x7b, 0x23, 0x22, 0x00, 0x10, 0x67, 0x00, 0x00, 0x30,

0x73, 0x24, 0x40, 0xf1, 0x23, 0x24, 0x80, 0x10, 0x73, 0x24, 0x20, 0x7b,

0x73, 0x00, 0x20, 0x7b, 0x23, 0x26, 0x00, 0x10, 0x73, 0x00, 0x10, 0x00

};

int main(int argc, char *argv[])

{

FILE *fp = NULL;

fp = fopen("rombase.bin", "a+");

fwrite(rombase, 1, sizeof(rombase), fp);

fclose(fp);

return 0;

}

2) ASM

0: 00c0006f j 0xc

4: 0380006f j 0x3c

8: 0440006f j 0x4c

c: 0ff0000f fence

10: 7b241073 csrw dscratch,s0

14: f1402473 csrr s0,mhartid

18: 10802023 sw s0,256(zero) # 0x100

1c: 40044403 lbu s0,1024(s0)

20: 00347413 andi s0,s0,3

24: fe0408e3 beqz s0,0x14

28: 00147413 andi s0,s0,1

2c: 00040863 beqz s0,0x3c

30: 7b202473 csrr s0,dscratch

34: 10002223 sw zero,260(zero) # 0x104

38: 30000067 jr 768(zero) # 0x0

3c: f1402473 csrr s0,mhartid

40: 10802423 sw s0,264(zero) # 0x108

44: 7b202473 csrr s0,dscratch

48: 7b200073 dret

4c: 10002623 sw zero,268(zero) # 0x10c

50: 00100073 ebreak

Rocket - debug - TLDebugModuleInner - Hart Bus Access的更多相关文章

  1. Rocket - debug - TLDebugModuleInner - Drive Custom Access

    https://mp.weixin.qq.com/s/1bIqzDYXM36MIfSsjvvYIw 简单介绍TLDebugModuleInner中的针对Custom的访问. 1. customNode ...

  2. Rocket - debug - TLDebugModuleInner - Program Buffer Access

    https://mp.weixin.qq.com/s/EJVqw7JPjjaib68tENl5AQ 简单介绍TLDebugModuleInner中的Program Buffer Access. 1. ...

  3. Rocket - debug - TLDebugModuleInner

    https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入Debu ...

  4. Rocket - debug - TLDebugModuleInner - Abstract Data

    https://mp.weixin.qq.com/s/DOLkEi-_qQt6lWOhJ2hxVQ 简单介绍TLDebugModuleInner中抽象数据寄存器的实现. 1. abstractData ...

  5. Rocket - debug - TLDebugModuleInner - Abstract Command State Machine

    https://mp.weixin.qq.com/s/RcXI8uEHvZHGCvX3DoVR4Q 简单介绍TLDebugModuleInner中处理抽象命令时的状态机. 1. CtrlState 定 ...

  6. Rocket - debug - TLDebugModuleInner - DMI Register Control and Status

    https://mp.weixin.qq.com/s/tI41wu0xaIQ5PRq6F82tNw 简单介绍TLDebugModuleInner中生成DMI控制和状态寄存器使用到的状态. 1. abs ...

  7. Rocket - debug - TLDebugModuleInner - Abstract Command Decoding & Generation

    https://mp.weixin.qq.com/s/0zKSTktxgzo5uCUphqaWSQ 介绍抽象命令的解码和生成. 1. accessRegisterCommandReg accessRe ...

  8. Rocket - debug - TLDebugModuleInner - ROM Generation

    https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...

  9. Rocket - debug - TLDebugModuleInner - Program Buffer

    https://mp.weixin.qq.com/s/kjhJJ3moRQzxHt6pJOXEgg 简单介绍TLDebugModuleInner中Program Buffer寄存器的实现. 1. pr ...

随机推荐

  1. 吃零食 csust oj 贪心

    吃零食 桌上有n袋零食,不同的零食会有不同的美味程度wi和腐坏程度di,每种零食在一单位时间内美味程度都会下降di,但是不会降到0以下. qwb每一单位时间可以吃掉一袋零食.现在qwb想要在吃完所有零 ...

  2. 【杂谈】Disruptor——RingBuffer问题整理(一)

    纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...

  3. 花了几天入门Storm,上了一版,全是Bug

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 听说过大数据的同学应该都听说过Storm吧?其实 ...

  4. python语法学习第十一天--模块

    容器----------->数据的封装 函数----------->语句的封装 类-------------->方法和属性的封装 模块----------->程序本身  导入: ...

  5. [hdu5593 ZYB's Tree] 树上统计

    题意:给1棵N(≤500,000)个节点的树,每条边边权为1,求距离每个点距离不超过K(K≤10)的点的个数的xor和. 思路:由于K很小,可以考虑把距离作为状态的一部分,然后研究父子之间状态的联系. ...

  6. lsof 命令用法:查看已删除空间却没有释放的进程

    查看已经删除的文件,空间有没有释放,没有的话kill掉pid lsof -n |grep deleted lsof简介lsof(list open files)是一个列出当前系统打开文件的工具. 问题 ...

  7. 简单的Java实现Netty进行通信

    使用Java搭建一个简单的Netty通信例子 看过dubbo源码的同学应该都清楚,使用dubbo协议的底层通信是使用的netty进行交互,而最近看了dubbo的Netty部分后,自己写了个简单的Net ...

  8. 以前的一些word的整理

    LAMP部署 环境:虚拟机centos7 安装apache: 命令:yum install -y httpd (在执行这个命令时,可能会遇到运行yum时出现/var/run/yun.pid已被锁定,P ...

  9. 手机APP自动化环境搭建

    1 摘要 近年来,随着移动应用从数量上和逻辑复杂程度上的增长,以及产品发布周期的紧缩,使得回归测试迫在眉睫,鉴于此APP自动化测试变得越来流行,当前主流的APP自动化工具有:Appium.Roboti ...

  10. 「雕爷学编程」Arduino动手做(24)——水位传感器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...