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
|
qemu-system-arm: unable to use LPAE
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:
1. ./configure --target-list=arm-softmmu
2. make
3.
./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.
https://gitlab.com/realhezhe/qemu/-/commit/4dad8167c1c1a7695af88d8929e8d7f6399177de
`hw/arm/virt.c`
```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..
39a1fd2528 ("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.
|