qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] fix multiboot loading if load_end_addr == 0


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] fix multiboot loading if load_end_addr == 0
Date: Wed, 30 May 2012 10:12:56 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1

On 03/27/2012 03:27 AM, Scott Moser wrote:
The previous multiboot load code did not treat the case where
load_end_addr was 0 specially.  The multiboot specification says the
following:
  * load_end_addr
    Contains the physical address of the end of the data segment.
    (load_end_addr - load_addr) specifies how much data to load. This
    implies that the text and data segments must be consecutive in the
    OS image; this is true for existing a.out executable formats. If
    this field is zero, the boot loader assumes that the text and data
    segments occupy the whole OS image file.

Signed-off-by: Scott Moser<address@hidden>

Applied.  Thanks.

Regards,

Anthony Liguori


diff --git a/hw/multiboot.c b/hw/multiboot.c
index b4484a3..b1e04c5 100644
--- a/hw/multiboot.c
+++ b/hw/multiboot.c
@@ -202,10 +202,16 @@ int load_multiboot(void *fw_cfg,
          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;
-
+        uint32_t mb_load_size = 0;
          mh_entry_addr = ldl_p(header+i+28);
-        mb_kernel_size = mh_bss_end_addr - mh_load_addr;
+
+        if (mh_load_end_addr) {
+            mb_kernel_size = mh_bss_end_addr - mh_load_addr;
+            mb_load_size = mh_load_end_addr - mh_load_addr;
+        } else {
+            mb_kernel_size = kernel_file_size - mb_kernel_text_offset;
+            mb_load_size = mb_kernel_size;
+        }

          /* Valid if mh_flags sets MULTIBOOT_HEADER_HAS_VBE.
          uint32_t mh_mode_type = ldl_p(header+i+32);





reply via email to

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