diff mbox

arm: dtb: Align dtb to 64K because some kernels use 64K page size.

Message ID 1417443189-16679-1-git-send-email-rjones@redhat.com
State New
Headers show

Commit Message

Richard W.M. Jones Dec. 1, 2014, 2:13 p.m. UTC
Resolves: https://bugs.launchpad.net/qemu/+bug/1383857
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
---
 hw/arm/boot.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Peter Maydell Dec. 1, 2014, 2:57 p.m. UTC | #1
On 1 December 2014 at 14:13, Richard W.M. Jones <rjones@redhat.com> wrote:
> Resolves: https://bugs.launchpad.net/qemu/+bug/1383857
> Signed-off-by: Richard W.M. Jones <rjones@redhat.com>

This is really a kernel bug.
https://www.kernel.org/doc/Documentation/arm64/booting.txt
just says "The device tree blob (dtb) must be placed on an
8-byte boundary within the first 512 megabytes from the start
of the kernel image and must not cross a 2-megabyte boundary."

and doesn't make any requirements about it not overlapping
a page with the initrd.

> ---
>  hw/arm/boot.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> index 0014c34..a859922 100644
> --- a/hw/arm/boot.c
> +++ b/hw/arm/boot.c
> @@ -632,11 +632,11 @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
>           */
>          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
> +             * kernels will trash anything in the page the initrd
>               * ends in, so make sure the DTB isn't caught up in that.
>               */
>              hwaddr dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
> -                                             4096);
> +                                             65536);

I'd rather we didn't do this unconditionally, because for some of
our board models 64K is a significant proportion of their total RAM.

-- PMM
diff mbox

Patch

diff --git a/hw/arm/boot.c b/hw/arm/boot.c
index 0014c34..a859922 100644
--- a/hw/arm/boot.c
+++ b/hw/arm/boot.c
@@ -632,11 +632,11 @@  void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
          */
         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
+             * kernels will trash anything in the page the initrd
              * ends in, so make sure the DTB isn't caught up in that.
              */
             hwaddr dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
-                                             4096);
+                                             65536);
             if (load_dtb(dtb_start, info, 0) < 0) {
                 exit(1);
             }