[PATCH v1] qemu-arm: round down memory to multiple of 2MB
Heinrich Schuchardt
xypron.glpk at gmx.de
Thu Feb 11 16:34:05 CET 2021
On 11.02.21 15:56, Ard Biesheuvel wrote:
> On Thu, 11 Feb 2021 at 15:18, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>>
>> On 11.02.21 13:04, Igor Opaniuk wrote:
>>> From: Igor Opaniuk <igor.opaniuk at foundries.io>
>>>
>>> When LPAE is enabled, 1:1 mapping is created using 2 MB blocks.
>>> In case amount of memory provided to QEMU is not multiple
>>> of 2 MB, round down the amount of available memory to avoid hang
>>> during MMU initialization.
>>>
>>> How to reproduce:
>>> qemu-system-arm -machine virt -m 1058 -nographic -bios u-boot.bin - boots
>>> qemu-system-arm -machine virt -m 1057 -nographic -bios u-boot.bin - hangs
>>>
>>> DRAM: 1 GiB
>>> initcall: 60011df8
>>> initcall: 60011904
>>> New Stack Pointer is: 80fffe90
>>> initcall: 60011a20
>>> initcall: 60011bcc
>>> initcall: 60011bd4
>>> initcall: 600119b4
>>> Relocation Offset is: 22042000
>>> Relocating to 82042000, new gd at 81001ed0, sp at 80fffe90
>>> initcall: 60011b8c
>>> initcall: 82053ea0
>>> initcall: 82053ea8
>>> initcall: 60012040 (relocated to 82054040)
>>> dram_bank_mmu_setup: bank: 0
>>> --- hang here during mmu init ---
>>>
>>> Fixes: 3fa914af82("arm: qemu: implement enable_caches()")
>>> Signed-off-by: Igor Opaniuk <igor.opaniuk at foundries.io>
>>>
>>> ---
>>>
>>> board/emulation/qemu-arm/qemu-arm.c | 12 ++++++++++++
>>> 1 file changed, 12 insertions(+)
>>>
>>> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
>>> index aa68bef469..841dd7af0e 100644
>>> --- a/board/emulation/qemu-arm/qemu-arm.c
>>> +++ b/board/emulation/qemu-arm/qemu-arm.c
>>> @@ -84,6 +84,18 @@ int dram_init(void)
>>> if (fdtdec_setup_mem_size_base() != 0)
>>> return -EINVAL;
>>>
>>> + /*
>>> + * When LPAE is enabled (ARMv7),
>>> + * 1:1 mapping is created using 2 MB blocks.
>>> + *
>>> + * In case amount of memory provided to QEMU
>>> + * is not multiple of 2 MB, round down the amount
>>> + * of available memory to avoid hang during MMU
>>> + * initialization.
>>> + */
>>> + if (CONFIG_IS_ENABLED(ARMV7_LPAE))
>>> + gd->ram_size -= (gd->ram_size % 0x200000);
>>
>> Is the problem LPAE specific?
>> Couldn't you provoke same problem using an odd memory size without LPAE,
>> e.g qemu-system-arm -m 536870908 (512 MiB - 4)?
>>
>
> The above value means 512 GiB - 4 MiB, so that shouldn't be a problem.
> I don't think QEMU's -m option takes fractional megabyte values.
>
$ qemu-system-arm -machine virt -cpu cortex-a15 -m 100005k \
-bios denx/u-boot.bin -nographic
=> fdt addr $fdt_addr
=> fdt print /memory at 40000000
memory at 40000000 {
reg = <0x00000000 0x40000000 0x00000000 0x061aa000>;
device_type = "memory";
};
Granularity seems to be 0x2000 = 8 KiB.
Best regards
Heinrich
More information about the U-Boot
mailing list