浏览代码

[multiboot] Allow for unspecified {load,bss}_end_addr for raw images

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".
tags/v0.9.4
Michael Brown 16 年前
父节点
当前提交
2e03610c0d
共有 1 个文件被更改,包括 5 次插入2 次删除
  1. 5
    2
      src/arch/i386/image/multiboot.c

+ 5
- 2
src/arch/i386/image/multiboot.c 查看文件

360
 
360
 
361
 	/* Verify and prepare segment */
361
 	/* Verify and prepare segment */
362
 	offset = ( hdr->offset - hdr->mb.header_addr + hdr->mb.load_addr );
362
 	offset = ( hdr->offset - hdr->mb.header_addr + hdr->mb.load_addr );
363
-	filesz = ( hdr->mb.load_end_addr - hdr->mb.load_addr );
364
-	memsz = ( hdr->mb.bss_end_addr - hdr->mb.load_addr );
363
+	filesz = ( hdr->mb.load_end_addr ?
364
+		   ( hdr->mb.load_end_addr - hdr->mb.load_addr ) :
365
+		   ( image->len - offset ) );
366
+	memsz = ( hdr->mb.bss_end_addr ?
367
+		  ( hdr->mb.bss_end_addr - hdr->mb.load_addr ) : filesz );
365
 	buffer = phys_to_user ( hdr->mb.load_addr );
368
 	buffer = phys_to_user ( hdr->mb.load_addr );
366
 	if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) {
369
 	if ( ( rc = prep_segment ( buffer, filesz, memsz ) ) != 0 ) {
367
 		DBGC ( image, "MULTIBOOT %p could not prepare segment: %s\n",
370
 		DBGC ( image, "MULTIBOOT %p could not prepare segment: %s\n",

正在加载...
取消
保存