[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[MULTIBOOT2 SPEC PATCH v3 4/4] multiboot2: fix example kernel header tag
From: |
Hans Ulrich Niedermann |
Subject: |
[MULTIBOOT2 SPEC PATCH v3 4/4] multiboot2: fix example kernel header tag alignment |
Date: |
Fri, 8 May 2020 06:50:49 +0200 |
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 <address@hidden>
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