blob: d69ba8488b424e449fcbd5258aba4aff0dc4fc8b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# QEMU RISC-V virt BSP
[English](README.md) | 中文
本 BSP 在 QEMU RISC-V `virt` 机器的 S-Mode 下运行 RT-Thread。目录名为兼容
现有工程继续保留,Kconfig 内部同时支持 RV32 和 RV64,默认选择 RV64。目前
RT-Thread Smart 仍只支持 RV64;RV32 运行标准版 RT-Thread。
## 编译
安装 SCons、QEMU RISC-V system emulator 和 RISC-V GCC 工具链。编译 RV32
时,工具链必须包含所选 RV32 ABI 的 multilib。
```sh
export RTT_EXEC_PATH=/path/to/toolchain/bin
export RTT_CC_PREFIX=riscv64-unknown-elf-
scons --menuconfig
scons -j$(nproc)
```
位宽在 `RISC-V XLEN` 中选择。重新生成配置后会更新 `rtconfig.h`,编译产物为
`rtthread.elf` 和 `rtthread.bin`。BSP 把 `ARCH_RAM_OFFSET` 设为 `0x80000000`,
RV32 使用 4 MiB image offset,RV64 使用 2 MiB image offset,与 QEMU/OpenSBI
的默认装载地址保持一致,不需要 BSP 本地链接脚本。
## 运行
```sh
./qemu.py
```
RV32 和 RV64 都默认启用 QEMU user 网络和一个 virtio block 磁盘。RV64
另外默认启用 AIA(APLIC/IMSIC)、NVMe、virtio-console 和 PCI serial。
RV32 默认使用 PLIC/ACLINT 和 legacy virtio-mmio,不默认挂载 NVMe 和两个
附加控制台。缺失的 qcow2 镜像会自动创建,存储设备只保留 virtio block
与 NVMe 两类。
在 QEMU 10.1 与 OpenSBI 1.5.1 组合下,RV32 S-mode AIA 能进入 IMSIC 初始化,
但访问 `siselect/sireg` 时会触发非法指令。`-aia` 参数仍可用于测试新版
模拟器和固件组合,但不作为 RV32 默认值。
常用参数:
```sh
./qemu.py -no-aia
./qemu.py -no-net -no-nvme
./qemu.py -nvme -virtio-console -pci-serial
./qemu.py -pci
./qemu.py -graphic
./qemu.py -dumpdtb qemu-virt.dtb
./qemu.py -dry-run
```
QEMU 核数必须与内核配置中的 `RT_CPUS_NR` 一致。调整 `-smp` 前应先修改
`RT_CPUS_NR` 并重新编译;当前内核没有独立的 online CPU mask,因此脚本会拒绝
核数不匹配的启动方式。
启用 `ARCH_RISCV_VECTOR` 后,脚本会从 `rtconfig.h` 读取 VLEN 并同步配置
QEMU。内核未启用 Vector 时,也可以用 `-v` 强制 QEMU 使用默认的 128-bit
Vector 配置。
## 调试
让 QEMU 暂停等待 GDB:
```sh
./qemu.py -debug
riscv64-linux-gnu-gdb rtthread.elf -ex "target remote :1234"
```
RV32 构建应使用与对应位宽和工具链匹配的 GDB。
|