qemu-system-arm: unable to use LPAE
Host environment
- Operating system: Ubuntu 18.04.6 LTS
- OS/kernel version: Linux 4.15.0-163-generic #171 (closed)-Ubuntu SMP Fri Nov 5 11:55:11 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
- Architecture: x86_64
- QEMU flavor: qemu-system-arm
- QEMU version: QEMU emulator version 7.0.50 (v7.0.0-1865-g9ac873a4-dirty)
- QEMU command line:
./qemu-system-arm 
 -machine virt,highmem=on
 -cpu cortex-a15 -smp 4
 -m 4096
 -kernel ./zImage
 -drive id=disk0,file=./rootfs.ext4,if=none,format=raw
 -object rng-random,filename=/dev/urandom,id=rng0
 -device virtio-rng-pci,rng=rng0
 -device virtio-blk-device,drive=disk0
 -device virtio-gpu-pci
 -serial mon:stdio -serial null
 -nographic
 -append 'root=/dev/vda rw mem=4096M ip=dhcp console=ttyAMA0 console=hvc0'
Emulated/Virtualized environment
- Operating system: irrelevant
- OS/kernel version: 5.15.38-yocto-standard
- Architecture: qemuarm cortex-a15
Description of problem
Failed to run qemu: qemu-system-arm: Addressing limited to 32 bits, but memory exceeds it by 1073741824 bytes
Steps to reproduce
- ./configure --target-list=arm-softmmu
- make
./qemu-system-arm 
-machine virt,highmem=on 
-cpu cortex-a15 -smp 4 
-m 4096 
-kernel ./zImage 
-drive id=disk0,file=./rootfs.ext4,if=none,format=raw 
-object rng-random,filename=/dev/urandom,id=rng0 
-device virtio-rng-pci,rng=rng0 
-device virtio-blk-device,drive=disk0 
-device virtio-gpu-pci 
-serial mon:stdio -serial null 
-nographic 
-append 'root=/dev/vda rw mem=4096M ip=dhcp console=ttyAMA0 console=hvc0'
Additional information
We set physical address bits to 40 if ARM_FEATURE_LPAE is enabled. But ARM_FEATURE_V7VE also implies ARM_FEATURE_LPAE as set later in arm_cpu_realizefn.
We should add condition for ARM_FEATURE_V7VE, otherwise we would not be able to use highmem larger than 3GB even though we have enabled highmem, since we would fail and return right from machvirt_init.
I have already made a patch to fix this issue.
realhezhe/qemu@4dad8167
hw/arm/virt.c
        if (object_property_get_bool(cpuobj, "aarch64", NULL)) {
            pa_bits = arm_pamax(armcpu);
        } else if (arm_feature(&armcpu->env, ARM_FEATURE_LPAE)) {
        } else if (arm_feature(&armcpu->env, ARM_FEATURE_LPAE)
                || arm_feature(&armcpu->env, ARM_FEATURE_V7VE)) {
            /* v7 with LPAE */
            pa_bits = 40;
        } else {After applying the patch, I can make sure that the pa_bits has already been set to 40, but qemu hangs later. By bisecting I found if the following commit is reverted qemu can boot up successfully.. 39a1fd25 ("target/arm: Fix handling of LPAE block descriptors")
It can't be quickly determined what's going on here at my side. Maybe the author can help give some hints. Thanks.