qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [FOR 0.12][PATCH] Fix loading of ELF multiboot kernels


From: Markus Armbruster
Subject: Re: [Qemu-devel] [FOR 0.12][PATCH] Fix loading of ELF multiboot kernels
Date: Wed, 16 Dec 2009 10:51:08 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux)

Kevin Wolf <address@hidden> writes:

> The multiboot implementation assumed that there is only one program header
> (which contains the entry point) and that the entry point is at the start of
> the code. This doesn't hold true generally and caused too little data to be
> loaded.

Out of curiosity: does this affect images people actually use?
Examples?

> Fix the loading code to pass the whole loaded data to the Multiboot Option 
> ROM.
>
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  hw/loader.c |    2 --
>  hw/pc.c     |   10 ++++++----
>  2 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/hw/loader.c b/hw/loader.c
> index 2d7a2c4..4c6981f 100644
> --- a/hw/loader.c
> +++ b/hw/loader.c
> @@ -718,8 +718,6 @@ int rom_copy(uint8_t *dest, target_phys_addr_t addr, 
> size_t size)
>      QTAILQ_FOREACH(rom, &roms, next) {
>          if (rom->max)
>              continue;
> -        if (rom->min > addr)
> -            continue;
>          if (rom->min + rom->romsize < addr)
>              continue;
>          if (rom->min > end)

I don't understand this hunk.

> diff --git a/hw/pc.c b/hw/pc.c
> index 8c1b7ea..fcebe3d 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -560,19 +560,21 @@ static int load_multiboot(void *fw_cfg,
>      }
>      if (!(flags & 0x00010000)) { /* MULTIBOOT_HEADER_HAS_ADDR */
>          uint64_t elf_entry;
> +        uint64_t elf_low, elf_high;
>          int kernel_size;
>          fclose(f);
> -        kernel_size = load_elf(kernel_filename, 0, &elf_entry, NULL, NULL,
> +        kernel_size = load_elf(kernel_filename, 0, &elf_entry, &elf_low, 
> &elf_high,
>                                 0, ELF_MACHINE, 0);
>          if (kernel_size < 0) {
>              fprintf(stderr, "Error while loading elf kernel\n");
>              exit(1);
>          }
> -        mh_load_addr = mh_entry_addr = elf_entry;
> -        mb_kernel_size = kernel_size;
> +        mh_load_addr = elf_low;
> +        mb_kernel_size = elf_high - elf_low;
> +        mh_entry_addr = elf_entry;
>  
>          mb_kernel_data = qemu_malloc(mb_kernel_size);
> -        if (rom_copy(mb_kernel_data, elf_entry, kernel_size) != kernel_size) 
> {
> +        if (rom_copy(mb_kernel_data, mh_load_addr, mb_kernel_size) != 
> mb_kernel_size) {
>              fprintf(stderr, "Error while fetching elf kernel from rom\n");
>              exit(1);
>          }

I get this part, and it looks good.




reply via email to

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