[multiboot] Allow for unspecified {load,bss}_end_addr for raw images
authorMichael Brown <mcb30@etherboot.org>
Sat, 6 Sep 2008 00:57:25 +0000 (01:57 +0100)
committerMichael Brown <mcb30@etherboot.org>
Sat, 6 Sep 2008 00:57:52 +0000 (01:57 +0100)
The multiboot specification states that, for raw images, if
load_end_addr is zero then it should be interpreted as meaning "use
the entire file", and if bss_end_addr is zero it should be interpreted
as meaning "no bss".

src/arch/i386/image/multiboot.c

index 3aa52e4..a4a340f 100644 (file)
@@ -360,8 +360,11 @@ static int multiboot_load_raw ( struct image *image,
 
        /* Verify and prepare segment */
        offset = ( hdr->offset - hdr->mb.header_addr + hdr->mb.load_addr );
-       filesz = ( hdr->mb.load_end_addr - hdr->mb.load_addr );
-       memsz = ( hdr->mb.bss_end_addr - hdr->mb.load_addr );
+       filesz = ( hdr->mb.load_end_addr ?
+                  ( hdr->mb.load_end_addr - hdr->mb.load_addr ) :
+                  ( image->len - offset ) );
+       memsz = ( hdr->mb.bss_end_addr ?
+                 ( hdr->mb.bss_end_addr - hdr->mb.load_addr ) : filesz );
        buffer = phys_to_user ( hdr->mb.load_addr );
        if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) {
                DBGC ( image, "MULTIBOOT %p could not prepare segment: %s\n",