zoukankan      html  css  js  c++  java
  • Rocket

    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

     

     

  • 相关阅读:
    linux安装JRE和Tomcat
    微信公众号授权登录
    linux Nginx设置多级域名
    bootstrap制作收藏夹导航
    js下拉菜单
    QQ授权登录
    centos7.6下安装LNMP环境(linux+nginx+mysql5.7+PHP)
    typora快捷键(转载)
    旋转魔方(2)-添加照片
    test
  • 原文地址:https://www.cnblogs.com/wjcdx/p/12595264.html
Copyright © 2011-2022 走看看