Skip to content

文档改进:添加对龙芯架构实验的相关文档 #30

Description

@Crypeter

PA实验文档中缺少对loongarch的支持,因此撰写补充文档:

龙芯手册(index.html)

交叉编译链安装(2.2.html#运行第一个c程序)

loongarch32r(手动安装到系统中)

  1. 下载已经编译好的龙芯工具链[loongson-gnu-toolchain](https://gitee.com/loongson-edu/la32r-toolchains/releases/download/v0.0.3/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0.tar.xz)

  2. 解压后添加到系统路径中

#1.解压文件(请将文件名更换为你下载的文件名)
tar -xvf toolchain.tar.xz
#假设解压后的路径为~/Downloads/toolchain(请更换为你的解压后路径)
echo "export PATH=$PATH:~/Downloads/toolchain" >> ~/.bashrc
#使用其他shell请根据自己的shell完成环境变量的修改
source ~/.bashrc
  1. 检验工具链是否成功完成添加
loongarch32r-linux-gnusf-gcc -v

成功添加后得到的结果如下

Using built-in specs.
COLLECT_GCC=loongarch32r-linux-gnusf-gcc
COLLECT_LTO_WRAPPER=/home/public/ics2023/toolchains/loongson-gnu-toolchain-8.3-x86_64-loongarch32r-linux-gnusf-v2.0/bin/../libexec/gcc/loongarch32r-linux-gnusf/8.3.0/lto-wrapper
Target: loongarch32r-linux-gnusf
Configured with: /dev/shm/build_loongarch32r-linux-gnusf_x86_64_v2.0_20230903/src/target_gcc/configure --build=x86_64-redhat-linux --host=x86_64-linux-gnu --target=loongarch32r-linux-gnusf --prefix=/dev/shm/build_loongarch32r-linux-gnusf_x86_64_v2.0_20230903/build-canadian/root/usr --with-sysroot=/dev/shm/build_loongarch32r-linux-gnusf_x86_64_v2.0_20230903/build-canadian/root/usr/loongarch32r-linux-gnusf/sysroot --with-native-system-header-dir=/usr/include --with-gxx-include-dir=/dev/shm/build_loongarch32r-linux-gnusf_x86_64_v2.0_20230903/build-canadian/root/usr/loongarch32r-linux-gnusf/sysroot/usr/include/c++ --enable-languages=c,c++,fortran --with-build-sysroot= --disable-libstdcxx --disable-libgfortran --disable-libgomp --enable-libcc1 --enable-threads=posix --enable-__cxa_atexit --enable-initfini-array --enable-nls --disable-libmpx --disable-bootstrap --with-abi=ilp32s --enable-checking=release --with-pkgversion='LoongArch GNU toolchain LA32 v2.0 (20230903)'
Thread model: posix
gcc version 8.3.0 (LoongArch GNU toolchain LA32 v2.0 (20230903))

difftest安装(2.4.html#differential-testing)

loongarch32r:[QEMU](http://www.qemu.org/). QEMU是一个完整的全系统模拟器, 支持多种ISA. 但我们只能通过基于socket的GDB协议与QEMU进行通信来获取其状态, 通信开销较大. 为了运行龙芯的QEMU, 你还需要像安装工具链一样手动的安装它:

  1. 下载已经编译好的龙芯[QEMU-la32](https://gitee.com/loongson-edu/la32r-QEMU/releases/download/v0.0.2/la32r-QEMU-x86_64-ubuntu-22.04.tar)

  2. 解压后添加到系统路径中

#1.解压文件(请将文件名更换为你下载的文件名)
tar -xvf toolchain.tar.xz
#假设解压后的路径为~/Downloads/toolchain(请更换为你的解压后路径)
echo "export PATH=$PATH:~/Downloads/toolchain" >> ~/.bashrc
#使用其他shell请根据自己的shell完成环境变量的修改
source ~/.bashrc
  1. 检验工具链是否成功完成添加
qemu-system-loongarch32 -version

如果出现报错,则补充需要的动态链接库

sudo apt install libcapstone-dev
sudo apt install libvdeplug-dev

成功安装的输出如下

QEMU emulator version 6.2.50
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
  1. 如果你在2024/5/15 之前获取nemu的代码, 请获取新版代码:
cd nemu
git pull origin master

或者手动修改代码:

@@ -29,6 +29,9 @@
29 29   #elif defined(CONFIG_ISA_x86)
30 30   #define ISA_QEMU_BIN "qemu-system-i386"
31 31   #define ISA_QEMU_ARGS
   32 + #elif defined(CONFIG_ISA_loongarch32r)
   33 + #define ISA_QEMU_BIN "qemu-system-loongarch32"
   34 + #define ISA_QEMU_ARGS "-M","ls3a5k32",
32 35   #else
33 36   #error Unsupport ISA
34 37   #endif
@@ -49,6 +52,9 @@ union isa_gdb_regs {
49 52      uint32_t eax, ecx, edx, ebx, esp, ebp, esi, edi;
50 53      uint32_t eip, eflags;
51 54      uint32_t cs, ss, ds, es, fs, gs;
   55  + #elif defined(CONFIG_ISA_loongarch32r)
   56  + uint32_t gpr[32];
   57  + uint32_t pc;
52 58.   #endif
53 59    };
54 60    struct {

异常处理相关(3.2.html中添加)

loongarch32

loongarch32提供syscall指令作为自陷指令,并提供一个EENTRY寄存器来存放入口地址,为了保存程序当前的状态,loongarch32提供一些特殊的系统寄存器,叫控制状态寄存器,在PA中,我们只使用如下如下4个CSR寄存器:

  • CRMD寄存器 - 存放当前模式信息

  • PRMD寄存器 - 存放异常前模式信息

  • ESTAT寄存器 - 存放处理器的状态

  • ERA寄存器 - 异常的返回地址

loongarch32触发异常后硬件的响应过程如下:

  1. 将 CRMD 的 PLV、IE 分别存到 PRMD 的 PPLV、PIE 中,然后将CRMD的PLV置为 0,IE 置为 0;

  2. 将当前 PC 值记录到 CSR.ERA 中

  3. 跳转到异常入口地址

loongarch32通过retn指令从异常处理过程中返回,它将将 PRMD 中的 PPLV、PIE 值恢复到 CRMD 的 PLV、IE 中,并根据ERA寄存器恢复PC

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions