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, and boot_i386.S to use ".balign 8" as well for consistency. Note also that the Multiboot2 header termination tag (not labeled in the source) actually needs that explicit alignment to an 8 byte boundary in the example kernel, as the preceding tag (framebuffer_tag_start) is 20 bytes long which is not a multiple of 8 bytes. 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 you cannot detect the wrong header tag alignment using the "grub-file --is-x86-multiboot2" utility. It only considers the Multiboot2 header magic fields while completely ignoring 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..0e8118b2a 100644 --- a/doc/boot_i386.S +++ b/doc/boot_i386.S @@ -43,7 +43,7 @@ _start: jmp multiboot_entry /* Align 64 bits boundary. */ - .align 8 + .balign 8 /* Multiboot header. */ multiboot_header: @@ -56,6 +56,7 @@ multiboot_header: /* checksum */ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header)) #ifndef __ELF__ + .balign 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: + .balign 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__ */ + .balign 8 framebuffer_tag_start: .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -85,6 +88,7 @@ framebuffer_tag_start: .long 768 .long 32 framebuffer_tag_end: + .balign 8 .short MULTIBOOT_HEADER_TAG_END .short 0 .long 8 diff --git a/doc/boot_mips.S b/doc/boot_mips.S index ed604214d..a8d3fb0e4 100644 --- a/doc/boot_mips.S +++ b/doc/boot_mips.S @@ -46,7 +46,7 @@ _start: nop /* Align 64 bits boundary. */ - .align 8 + .balign 8 /* Multiboot header. */ multiboot_header: @@ -59,6 +59,7 @@ multiboot_header: /* checksum */ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_MIPS32 + (multiboot_header_end - multiboot_header)) #ifndef __ELF__ + .balign 8 address_tag_start: .short MULTIBOOT_HEADER_TAG_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -72,6 +73,7 @@ address_tag_start: /* bss_end_addr */ .long _end address_tag_end: + .balign 8 entry_address_tag_start: .short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -80,6 +82,7 @@ entry_address_tag_start: .long multiboot_entry entry_address_tag_end: #endif /* __ELF__ */ + .balign 8 framebuffer_tag_start: .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT_HEADER_TAG_OPTIONAL @@ -88,6 +91,7 @@ framebuffer_tag_start: .long 768 .long 32 framebuffer_tag_end: + .balign 8 .short MULTIBOOT_HEADER_TAG_END .short 0 .long 8 @@ -114,6 +118,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