[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2] multiboot: Fix bss segment support
From: |
malc |
Subject: |
Re: [Qemu-devel] [PATCH v2] multiboot: Fix bss segment support |
Date: |
Sun, 24 Jul 2011 20:20:15 +0400 (MSD) |
User-agent: |
Alpine 2.00 (LNX 1167 2008-08-23) |
On Sun, 24 Jul 2011, 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.
>
> 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) {
Not that it matters, but.. you are asking to read mb_load_size records of
1 byte each, it's simple to ask for one record of mb_load_size as a bonus
check becomes != 1 thus saving 11 bytes making the earth that much
greener.
> fprintf(stderr, "fread() failed\n");
> exit(1);
> }
> + memset(mbs.mb_buf + mb_load_size, 0, mb_kernel_size - mb_load_size);
> fclose(f);
> }
>
>
--
mailto:address@hidden