qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [Qemu-devel] [PATCH v2 2/4] hw/arm/boot: Diagnose layouts


From: Alex Bennée
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH v2 2/4] hw/arm/boot: Diagnose layouts that put initrd or DTB off the end of RAM
Date: Thu, 13 Jun 2019 13:47:59 +0100
User-agent: mu4e 1.3.2; emacs 26.1

Peter Maydell <address@hidden> writes:

> We calculate the locations in memory where we want to put the
> initrd and the DTB based on the size of the kernel, since they
> come after it. Add some explicit checks that these aren't off the
> end of RAM entirely.
>
> (At the moment the way we calculate the initrd_start means that
> it can't ever be off the end of RAM, but that will change with
> the next commit.)
>
> Signed-off-by: Peter Maydell <address@hidden>

Reviewed-by: Alex Bennée <address@hidden>

> ---
>  hw/arm/boot.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
>
> diff --git a/hw/arm/boot.c b/hw/arm/boot.c
> index 0bb9a7d5b5c..935be3b92a5 100644
> --- a/hw/arm/boot.c
> +++ b/hw/arm/boot.c
> @@ -1055,11 +1055,25 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
>          error_report("could not load kernel '%s'", info->kernel_filename);
>          exit(1);
>      }
> +
> +    if (kernel_size > info->ram_size) {
> +        error_report("kernel '%s' is too large to fit in RAM "
> +                     "(kernel size %d, RAM size %" PRId64 ")",
> +                     info->kernel_filename, kernel_size, info->ram_size);
> +        exit(1);
> +    }
> +
>      info->entry = entry;
>      if (is_linux) {
>          uint32_t fixupcontext[FIXUP_MAX];
>
>          if (info->initrd_filename) {
> +
> +            if (info->initrd_start >= ram_end) {
> +                error_report("not enough space after kernel to load initrd");
> +                exit(1);
> +            }
> +
>              initrd_size = load_ramdisk_as(info->initrd_filename,
>                                            info->initrd_start,
>                                            ram_end - info->initrd_start, as);
> @@ -1075,6 +1089,11 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
>                               info->initrd_filename);
>                  exit(1);
>              }
> +            if (info->initrd_start + initrd_size > info->ram_size) {
> +                error_report("could not load initrd '%s': "
> +                             "too big to fit into RAM after the kernel",
> +                             info->initrd_filename);
> +            }
>          } else {
>              initrd_size = 0;
>          }
> @@ -1110,6 +1129,10 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
>              /* Place the DTB after the initrd in memory with alignment. */
>              info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
>                                             align);
> +            if (info->dtb_start >= ram_end) {
> +                error_report("Not enough space for DTB after kernel/initrd");
> +                exit(1);
> +            }
>              fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start;
>              fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32;
>          } else {


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]