[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/4] hw/arm/boot: Diagnose layouts that put i
From: |
Alex Bennée |
Subject: |
Re: [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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH v2 2/4] hw/arm/boot: Diagnose layouts that put initrd or DTB off the end of RAM,
Alex Bennée <=