qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2] multiboot: Fix bss segment support


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH v2] multiboot: Fix bss segment support
Date: Mon, 19 Dec 2011 18:35:27 +0100

On 24.07.2011, at 17:55, Göran Weinholt wrote:

> Multiboot images can specify a bss segment. The boot loader must clear
> the memory of the bss and ensure that no modules or structures are
> allocated inside it. Several fields are provided in the Multiboot
> header that were previously not used properly. The header is now used
> to determine how much data should be read from the image and how much
> memory should be reserved to the bss segment.

This patch breaks the OSX booter:

  http://people.exactcode.de/~rene/mac/boot

It now fails in fread(). Please revert this change for 1.0.1 and/or provide a 
timely fix.


Alex

> 
> Signed-off-by: Göran Weinholt <address@hidden>
> ---
> hw/multiboot.c |   14 +++++++++-----
> 1 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/hw/multiboot.c b/hw/multiboot.c
> index 2426e84..a1d3f41 100644
> --- a/hw/multiboot.c
> +++ b/hw/multiboot.c
> @@ -198,11 +198,14 @@ int load_multiboot(void *fw_cfg,
>     } else {
>         /* Valid if mh_flags sets MULTIBOOT_HEADER_HAS_ADDR. */
>         uint32_t mh_header_addr = ldl_p(header+i+12);
> +        uint32_t mh_load_end_addr = ldl_p(header+i+20);
> +        uint32_t mh_bss_end_addr = ldl_p(header+i+24);
>         mh_load_addr = ldl_p(header+i+16);
>         uint32_t mb_kernel_text_offset = i - (mh_header_addr - mh_load_addr);
> +        uint32_t mb_load_size = mh_load_end_addr - mh_load_addr;
> 
>         mh_entry_addr = ldl_p(header+i+28);
> -        mb_kernel_size = kernel_file_size - mb_kernel_text_offset;
> +        mb_kernel_size = mh_bss_end_addr - mh_load_addr;
> 
>         /* Valid if mh_flags sets MULTIBOOT_HEADER_HAS_VBE.
>         uint32_t mh_mode_type = ldl_p(header+i+32);
> @@ -212,17 +215,18 @@ int load_multiboot(void *fw_cfg,
> 
>         mb_debug("multiboot: mh_header_addr = %#x\n", mh_header_addr);
>         mb_debug("multiboot: mh_load_addr = %#x\n", mh_load_addr);
> -        mb_debug("multiboot: mh_load_end_addr = %#x\n", ldl_p(header+i+20));
> -        mb_debug("multiboot: mh_bss_end_addr = %#x\n", ldl_p(header+i+24));
> +        mb_debug("multiboot: mh_load_end_addr = %#x\n", mh_load_end_addr);
> +        mb_debug("multiboot: mh_bss_end_addr = %#x\n", mh_bss_end_addr);
>         mb_debug("qemu: loading multiboot kernel (%#x bytes) at %#x\n",
> -                 mb_kernel_size, mh_load_addr);
> +                 mb_load_size, mh_load_addr);
> 
>         mbs.mb_buf = qemu_malloc(mb_kernel_size);
>         fseek(f, mb_kernel_text_offset, SEEK_SET);
> -        if (fread(mbs.mb_buf, 1, mb_kernel_size, f) != mb_kernel_size) {
> +        if (fread(mbs.mb_buf, 1, mb_load_size, f) != mb_load_size) {
>             fprintf(stderr, "fread() failed\n");
>             exit(1);
>         }
> +        memset(mbs.mb_buf + mb_load_size, 0, mb_kernel_size - mb_load_size);
>         fclose(f);
>     }
> 
> -- 
> 1.7.2.5
> 
> 




reply via email to

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