- Fix -kernel boot for AArch64 * Patches added: 0044-hw-arm-boot-Increase-fdt-alignment.patch - Patch queue updated from git://github.com/openSUSE/qemu.git opensuse-2.3 - Fix -kernel boot for AArch64 * Patches added: 0044-hw-arm-boot-Increase-fdt-alignment.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=266
44 lines
1.8 KiB
Diff
44 lines
1.8 KiB
Diff
From 90808c2a055b1e6332db307ca34ab682be60cfbf Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Mon, 13 Jul 2015 17:46:04 +0200
|
|
Subject: [PATCH] hw/arm/boot: Increase fdt alignment
|
|
|
|
The Linux kernel on aarch64 creates a page table entry at early bootup
|
|
that spans the 2MB range on memory spanning the fdt start address:
|
|
|
|
[ ALIGN_DOWN(fdt, 2MB) ... ALIGN_DOWN(fdt, 2MB) + 2MB ]
|
|
|
|
This means that when our current 4k alignment happens to fall at the end
|
|
of the aligned region, Linux tries to access memory that is not mapped.
|
|
|
|
The easy fix is to instead increase the alignment to 2MB, making Linux's
|
|
logic always succeed.
|
|
|
|
Reported-by: Andreas Schwab <schwab@suse.de>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
---
|
|
hw/arm/boot.c | 8 ++++----
|
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
|
|
index a48d1b2..52cbd33 100644
|
|
--- a/hw/arm/boot.c
|
|
+++ b/hw/arm/boot.c
|
|
@@ -739,12 +739,12 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
|
|
* we point to the kernel args.
|
|
*/
|
|
if (have_dtb(info)) {
|
|
- /* Place the DTB after the initrd in memory. Note that some
|
|
- * kernels will trash anything in the 4K page the initrd
|
|
- * ends in, so make sure the DTB isn't caught up in that.
|
|
+ /* Place the DTB after the initrd in memory. Note that the kernel
|
|
+ * maps [ ALIGN_DOWN(fdt, 2MB) ... ALGIN_DOWN(fdt, 2MB) + 2MB ]
|
|
+ * and thus needs the fdt be preferably in its own 2MB window.
|
|
*/
|
|
hwaddr dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
|
|
- 4096);
|
|
+ 2 * 1024 * 1024);
|
|
if (load_dtb(dtb_start, info, 0) < 0) {
|
|
exit(1);
|
|
}
|