QEMU AARCH64“虚拟”机器SMP CPU从“运行”状态到“停止”状态开始

问题描述 投票:0回答:1

我正在研究裸机。没有Linux,库等。我正在ASM中编写处理器启动代码,然后跳转到编译的C代码。

我的命令行是:

% qemu-system-aarch64 \
   -s -S \
   -machine virt,secure=on,virtualization=on \
   -cpu cortex-a53 \
   -d int \
   -m 512M \
   -smp 4 \
   -display none \
   -nographic \
   -semihosting \
   -serial mon:stdio \
   -kernel my_file.elf \
   -device loader,addr=0x40004000,cpu-num=0 \
   -device loader,addr=0x40004000,cpu-num=1 \
   -device loader,addr=0x40004000,cpu-num=2 \
   -device loader,addr=0x40004000,cpu-num=3 \
   ;

当我开始连接gcc时,可以看到:

(gdb) info threads
  Id   Target Id     Frame
 * 1   Thread 1.1 (CPU#0 [running]) _start () at .../start.S:20
   2   Thread 1.2 (CPU#1 [halted ]) _start () at .../start.S:20
   3   Thread 1.3 (CPU#2 [halted ]) _start () at .../start.S:20
   4   Thread 1.4 (CPU#3 [halted ]) _start () at .../start.S:20

我希望其他三个处理器以“运行”状态而不是“暂停”状态启动。怎么样?

请注意,我的DTS包含此部分:

psci {
    migrate = < 0xc4000005 >;
    cpu_on = < 0xc4000003 >;
    cpu_off = < 0x84000002 >;
    cpu_suspend = < 0xc4000001 >;
    method = "smc";
    compatible = "arm,psci-0.2\0arm,psci";
};

但是,我不确定该怎么办。添加许多这种形式的行,似乎无济于事:

-device loader,addr=0xc4000003,data=0x80000000,data-len=4

我不确定我是否在ARM PSCI方面步入正轨? ARM的规范似乎定义了“接口”,而不是系统的“实现”。但是,我不认为PSCI是“虚拟”文档/源中提到的“真实”寄存器。 DTS中没有提到“ SMC”设备。

QEMU如何确定SMP处理器在启动时是“运行”还是“停止”,以及如何影响?

qemu arm64
1个回答
0
投票

这取决于主板型号-通常,我们会遵循硬件的功能,有些主板会从加电时启动所有CPU,有些则不会。对于“虚拟”板(特定于QEMU),我们通常使用PSCI,这是Arm标准固件接口,用于为SMP CPU供电(包括其他功能);您还可以将其用于“关闭整个电源”。机器”)。在启动时,只有主CPU在运行,而来宾代码的工作是使用PSCI API启动辅助。这就是DTS中的psci节点告诉来宾的信息,它告诉来宾的PSCI ABI QEMU实现了什么特定形式,特别是来宾是否应使用“ hvc”或“ smc”指令来调用PSCI函数。 QEMU在这里所做的是模拟“硬件+固件”组合-来宾执行“ smc”指令,QEMU执行在EL3上运行的一些固件代码将在实际硬件上执行的动作。

virt板还具有另一种操作模式,该模式适用于您要运行本身为EL3固件的客户机(例如,如果要在EL3上运行OVMF / UEFI)。如果使用-machine secure = true启动QEMU以启用EL3仿真,并且还通过-bios或-drive if = pflash,...提供来宾固件blob,则QEMU将假定您的固件要在EL3上运行并提供PSCI本身提供服务,因此它将从所有CPU上电开始,并让固件处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.