Properly align all Multiboot2 header tags to 8 byte boundaries as per the Multiboot2 specification.
Note that the assembler directive ".align 8" is machine dependent: On i386, it means "align to 8 byte boundary". On mips, it means that the lower 8 bits of address must be zero, i.e. ".align 8" aligns to a 256 byte boundary! Therefore, this changes boot_mips.S to use ".balign 8" where it had mistakenly used ".align 8" before. The boot_i386.S file keeps using ".align 8". Note also that the Multiboot2 header termination tag (unfortunately unlabeled in the source) actually needs that extra alignment to an 8 byte boundary, as the preceding tag (framebuffer_tag_start) is 20 bytes long which is not a multiple of 8. You can add "-Wa,-adhlns=$(@:.o=.lst)" to kernel_CCASFLAGS to generate a listing file which shows the offsets of the labels in the boot_*.S files to verify the alignment issues. Note also that the "grub-file --is-x86-multiboot2" utility does not recognize the wrong alignment of the Multiboot2 header tags, as it only considers the beginning of the Multiboot2 header and completely ignores the Multiboot2 header tags. Signed-off-by: Hans Ulrich Niedermann <h...@n-dimensional.de> diff --git a/doc/boot_i386.S b/doc/boot_i386.S index 9ab016612..1418afe1a 100644 --- a/doc/boot_i386.S +++ b/doc/boot_i386.S @@ -56,6 +56,7 @@ multiboot_header: /* checksum */ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header)) #ifndef __ELF__ + .align 8 address_tag_start: .short MULTIBOOT_HEADER_TAG_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -69,6 +70,7 @@ address_tag_start: /* bss_end_addr */ .long _end address_tag_end: + .align 8 entry_address_tag_start: .short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -77,6 +79,7 @@ entry_address_tag_start: .long multiboot_entry entry_address_tag_end: #endif /* __ELF__ */ + .align 8 framebuffer_tag_start: .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -85,10 +88,12 @@ framebuffer_tag_start: .long 768 .long 32 framebuffer_tag_end: + .align 8 .short MULTIBOOT_HEADER_TAG_END .short 0 .long 8 multiboot_header_end: + multiboot_entry: /* Initialize the stack pointer. */ movl $(stack + STACK_SIZE), %esp diff --git a/doc/boot_mips.S b/doc/boot_mips.S index ed604214d..e7bb7df9f 100644 --- a/doc/boot_mips.S +++ b/doc/boot_mips.S @@ -46,8 +46,8 @@ _start: nop /* Align 64 bits boundary. */ - .align 8 - + .balign 8 + /* Multiboot header. */ multiboot_header: /* magic */ @@ -59,7 +59,8 @@ multiboot_header: /* checksum */ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_MIPS32 + (multiboot_header_end - multiboot_header)) #ifndef __ELF__ -address_tag_start: + .balign 8 +address_tag_start: .short MULTIBOOT_HEADER_TAG_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL .long address_tag_end - address_tag_start @@ -72,7 +73,8 @@ address_tag_start: /* bss_end_addr */ .long _end address_tag_end: -entry_address_tag_start: + .balign 8 +entry_address_tag_start: .short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL .long entry_address_tag_end - entry_address_tag_start @@ -80,7 +82,8 @@ entry_address_tag_start: .long multiboot_entry entry_address_tag_end: #endif /* __ELF__ */ -framebuffer_tag_start: + .balign 8 +framebuffer_tag_start: .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT_HEADER_TAG_OPTIONAL .long framebuffer_tag_end - framebuffer_tag_start @@ -88,10 +91,12 @@ framebuffer_tag_start: .long 768 .long 32 framebuffer_tag_end: + .balign 8 .short MULTIBOOT_HEADER_TAG_END .short 0 .long 8 multiboot_header_end: + multiboot_entry: /* Initialize the stack pointer. */ lui $sp, %hi (stack + STACK_SIZE) @@ -114,6 +119,6 @@ loop: nop halt_message: .asciz "Halted." - .align 8 + .balign 8 /* Our stack area. */ .comm stack, STACK_SIZE -- 2.26.2 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel