ppce500 通用平台(ppce500)
PPC 版 QEMU 支持专为模拟和虚拟化设计的特殊 ppce500 机器。
支持的设备
ppce500 机器支持以下设备:
PowerPC e500 系列核心(e500v2/e500mc/e5500/e6500)
配置、控制和状态寄存器(CCSR)
支持 MSI 的多核可编程中断控制器(MPIC)
一个 16550A UART 设备
一个 Freescale MPC8xxx I2C 控制器
一个通过 I2C 连接的 Pericom pt7c4338 RTC
一个 Freescale MPC8xxx GPIO 控制器
通过一个 GPIO 引脚提供的关机功能
一个 Freescale MPC8xxx PCI 主机控制器
通过 PCI 总线连接的 VirtIO 设备
一个 Freescale 增强型安全数字主机控制器(eSDHC)
一个 Freescale 增强型三速以太网控制器(eTSEC)
硬件配置信息
如果未指定 -dtb 选项,ppce500 机器会自动生成设备树二进制文件(“dtb”)并传给客户机,其中提供系统中各种设备的地址、中断线和其他配置信息。
如果用户希望提供自己的 DTB,可以使用 -dtb 选项。这些 DTB 应满足以下要求:
/cpus 节点下的子节点数量应与 QEMU 的
-smp选项匹配/memory 的 reg 大小应与 QEMU 通过
-m选择的 ram_size 匹配
qemu-system-ppc 和 qemu-system-ppc64 都提供以下 32 位 PowerPC CPU 的模拟:
e500v2
e500mc
此外,qemu-system-ppc64 还支持以下 64 位 PowerPC CPU:
e5500
e6500
可以通过 -cpu 命令行选项指定 CPU 类型。如果未指定,会创建使用 e500v2 核心的机器。以下示例创建基于 e6500 的机器:
$ qemu-system-ppc64 -nographic -M ppce500 -cpu e6500
启动选项
ppce500 机器可以使用标准 -kernel 功能启动,加载操作系统内核(例如 Linux)或 U-Boot 固件等载荷。
省略 -bios 时,使用默认的 pc-bios/u-boot.e500 固件镜像作为 BIOS。QEMU 根据下表选择要执行的载荷:
-bios |
-kernel |
载荷 |
|---|---|---|
N |
N |
u-boot |
N |
Y |
kernel |
Y |
任意 |
u-boot |
同时指定 -bios 和 -kernel 时,QEMU 加载 U-Boot,随后 U-Boot 通过内置 "bootm" 命令自动加载 -kernel 参数指定的内核镜像,因此这种情况下需要传统 uImage 格式。
运行 Linux 内核
撰写本文时测试了 Linux 主线 v5.11 发布版。要构建能够由 ppce500 机器以 64 位模式启动的 Linux 主线内核,只需使用以下 defconfig 配置内核:
$ export ARCH=powerpc
$ export CROSS_COMPILE=powerpc-linux-
$ make corenet64_smp_defconfig
$ make menuconfig
然后手动选择以下配置:
Platform support > Freescale Book-E Machine Type > QEMU generic e500 platform
在 QEMU 中使用 ppce500 机器启动新构建的 Linux 内核:
$ qemu-system-ppc64 -M ppce500 -cpu e5500 -smp 4 -m 2G \
-display none -serial stdio \
-kernel vmlinux \
-initrd /path/to/rootfs.cpio \
-append "root=/dev/ram"
要构建能够由 ppce500 机器以 32 位模式启动的 Linux 主线内核,采用相同的 64 位配置步骤,但 defconfig 文件应使用 corenet32_smp_defconfig。
启动 32 位 Linux 内核:
$ qemu-system-ppc64 -M ppce500 -cpu e500mc -smp 4 -m 2G \
-display none -serial stdio \
-kernel vmlinux \
-initrd /path/to/rootfs.cpio \
-append "root=/dev/ram"
运行 U-Boot
撰写本文时测试了 U-Boot 主线 v2021.07 发布版。要构建能够由 ppce500 机器启动的 U-Boot 主线引导加载程序,请使用 qemu-ppce500_defconfig,命令与上述 Linux 构建命令类似:
$ export CROSS_COMPILE=powerpc-linux-
$ make qemu-ppce500_defconfig
将在构建树中得到 u-boot 文件。
U-Boot 启动时,如果使用 -cpu e6500,会看到以下内容:
CPU: Unknown, Version: 0.0, (0x00000000)
Core: e6500, Version: 2.0, (0x80400020)
这是因为我们只向 QEMU 指定了核心名称,它没有能够代表实际集成该核心的 SoC 的有效 SVR 值。可以指定 QEMU 内置支持的真实 SoC 设备,但这些 SoC 都是基于 e500v2 的 MPC85xx 系列,因此无法测试为 P4080(e500mc)、P5020(e5500)和 T2080(e6500)构建的内容。
网络
默认情况下,一个标准 VirtIO PCI 网络设备作为以太网接口连接到 PCI 地址 0.1.0,但可以将其切换为 e1000 网卡:
$ qemu-system-ppc64 -M ppce500 -smp 4 -m 2G \
-display none -serial stdio \
-bios u-boot \
-nic tap,ifname=tap0,script=no,downscript=no,model=e1000
如果向 QEMU 传入 “-device eTSEC”,ppce500 机器还可以动态实例化 eTSEC 设备:
-netdev tap,ifname=tap0,script=no,downscript=no,id=net0 -device eTSEC,netdev=net0
闪存驱动器上的根文件系统
根文件系统除了放在 RAM 磁盘上,也可以放在 CFI 闪存中。给定一个大小必须为二的幂的 ext2 镜像,可按以下方式使用:
$ qemu-system-ppc64 -M ppce500 -cpu e500mc -smp 4 -m 2G \
-display none -serial stdio \
-kernel vmlinux \
-drive if=pflash,file=/path/to/rootfs.ext2,format=raw \
-append "rootwait root=/dev/mtdblock0"
根文件系统也可以放在模拟 SD 卡中,其大小同样必须为二的幂:
$ qemu-system-ppc64 -M ppce500 -cpu e500mc -smp 4 -m 2G \
-display none -serial stdio \
-kernel vmlinux \
-device sd-card,drive=mydrive \
-drive id=mydrive,if=none,file=/path/to/rootfs.ext2,format=raw \
-append "rootwait root=/dev/mmcblk0"