Description
PA实验文档中缺少对loongarch的支持,因此撰写补充文档:
龙芯手册(index.html)
-
loongarch32r 手册
交叉编译链安装(2.2.html#运行第一个c程序)
loongarch32r(手动安装到系统中)
-
下载已经编译好的龙芯工具链[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)
-
解压后添加到系统路径中
#1.解压文件(请将文件名更换为你下载的文件名)
tar -xvf toolchain.tar.xz
#假设解压后的路径为~/Downloads/toolchain(请更换为你的解压后路径)
echo "export PATH=$PATH:~/Downloads/toolchain" >> ~/.bashrc
#使用其他shell请根据自己的shell完成环境变量的修改
source ~/.bashrc
- 检验工具链是否成功完成添加
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, 你还需要像安装工具链一样手动的安装它:
-
下载已经编译好的龙芯[QEMU-la32](https://gitee.com/loongson-edu/la32r-QEMU/releases/download/v0.0.2/la32r-QEMU-x86_64-ubuntu-22.04.tar)
-
解压后添加到系统路径中
#1.解压文件(请将文件名更换为你下载的文件名)
tar -xvf toolchain.tar.xz
#假设解压后的路径为~/Downloads/toolchain(请更换为你的解压后路径)
echo "export PATH=$PATH:~/Downloads/toolchain" >> ~/.bashrc
#使用其他shell请根据自己的shell完成环境变量的修改
source ~/.bashrc
- 检验工具链是否成功完成添加
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
- 如果你在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触发异常后硬件的响应过程如下:
-
将 CRMD 的 PLV、IE 分别存到 PRMD 的 PPLV、PIE 中,然后将CRMD的PLV置为 0,IE 置为 0;
-
将当前 PC 值记录到 CSR.ERA 中
-
跳转到异常入口地址
loongarch32通过retn
指令从异常处理过程中返回,它将将 PRMD 中的 PPLV、PIE 值恢复到 CRMD 的 PLV、IE 中,并根据ERA寄存器恢复PC