Rocket - debug - TLDebugModuleInner - Hart Bus Access
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的更多相关文章
- Rocket - debug - TLDebugModuleInner - Drive Custom Access
https://mp.weixin.qq.com/s/1bIqzDYXM36MIfSsjvvYIw 简单介绍TLDebugModuleInner中的针对Custom的访问. 1. customNode ...
- Rocket - debug - TLDebugModuleInner - Program Buffer Access
https://mp.weixin.qq.com/s/EJVqw7JPjjaib68tENl5AQ 简单介绍TLDebugModuleInner中的Program Buffer Access. 1. ...
- Rocket - debug - TLDebugModuleInner
https://mp.weixin.qq.com/s/jkiHceU0HaJbHGvHiU-QOA 简单介绍TLDebugModuleInner的实现. 1. 引入全局配置 1) cfg 引入Debu ...
- Rocket - debug - TLDebugModuleInner - Abstract Data
https://mp.weixin.qq.com/s/DOLkEi-_qQt6lWOhJ2hxVQ 简单介绍TLDebugModuleInner中抽象数据寄存器的实现. 1. abstractData ...
- Rocket - debug - TLDebugModuleInner - Abstract Command State Machine
https://mp.weixin.qq.com/s/RcXI8uEHvZHGCvX3DoVR4Q 简单介绍TLDebugModuleInner中处理抽象命令时的状态机. 1. CtrlState 定 ...
- Rocket - debug - TLDebugModuleInner - DMI Register Control and Status
https://mp.weixin.qq.com/s/tI41wu0xaIQ5PRq6F82tNw 简单介绍TLDebugModuleInner中生成DMI控制和状态寄存器使用到的状态. 1. abs ...
- Rocket - debug - TLDebugModuleInner - Abstract Command Decoding & Generation
https://mp.weixin.qq.com/s/0zKSTktxgzo5uCUphqaWSQ 介绍抽象命令的解码和生成. 1. accessRegisterCommandReg accessRe ...
- Rocket - debug - TLDebugModuleInner - ROM Generation
https://mp.weixin.qq.com/s/j_CgHU4PnY82NMwJzOqHYg 简单介绍Variable ROM Generation. 1. jalAbstract jalAbs ...
- Rocket - debug - TLDebugModuleInner - Program Buffer
https://mp.weixin.qq.com/s/kjhJJ3moRQzxHt6pJOXEgg 简单介绍TLDebugModuleInner中Program Buffer寄存器的实现. 1. pr ...
随机推荐
- 浅析Spring中AOP的实现原理——动态代理
一.前言 最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...
- uCOS2014.1.11(转载)(void*)0 的理解
一般把(void*)0定义为NULL表示这是个空指针void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据.众所周知,如果指针p1和p2的类型 ...
- csu1617]强连通分量
题意:定义域属于一个集合S={0,1,...,n-1},求S的子集个数,满足以子集的元素为定义域的函数P(x)的值域等于子集本身. 思路:以元素为点,x到P(x)连一条有向边,不难发现,如果有一个有向 ...
- Istio的流量管理(实操一)(istio 系列三)
Istio的流量管理(实操一)(istio 系列三) 使用官方的Bookinfo应用进行测试.涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求 ...
- WriteUp_easy_sql_堆叠注入_强网杯2019
题目描述 随便注 解题过程 查看源码,发现应该不适合sqlmap自动化注入,该题应该是让你手工注入: <!-- sqlmap是没有灵魂的 --> <form method=" ...
- PC、APP、H5三端测试的区别
一,针对同一个系统功能的测试,三端所测的业务流程是一样的 二,一般情况下手机端和PC端都对应一套后台服务,比如说笔者公司所开发的互联网金融平台,整个平台做了分布式服务架构,后台服务包括用户服务.交易服 ...
- java 使用抽象工厂封装特性方法
1.创建抽象类:封装含有相同特性的方法. */ public abstract class AbstractPayment { public abstract String progress() th ...
- Spark Streaming 整合 Flume
Spark Streaming 整合 Flume 一.简介二.推送式方法 2.1 配置日志收集Flume 2.2 项目依赖 2.3 Spark Strea ...
- webstorm-在不删除硬盘文件的条件下移除项目
一段时间没用之后会忘记如何在webstorm里移除一个项目,要花很长的时间去找到底如何才能移除,所以特地把它记录下来了,方便下次忘记的时候可以查阅 把鼠标移在你要移除的那个项目上然后按下Delete键 ...
- Istio Sidecar注入原理
概念 简单来说,Sidecar 注入会将额外容器的配置添加到 Pod 模板中.这里特指将Envoy容器注应用所在Pod中. Istio 服务网格目前所需的容器有: istio-init 用于设置 ip ...