In the cases of users have preferences over Multiboot2 module load addresses, currently GRUB has no way to achieve it.
Similar to the relocatable header tag, this new tag allows users to specify the minimum and maximum load addresses, and other load preferences on Multiboot2 modules. Signed-off-by: Zide Chen <[email protected]> --- doc/multiboot.texi | 41 +++++++++++++++++++++++++++++++++++++++++ doc/multiboot2.h | 11 +++++++++++ 2 files changed, 52 insertions(+) diff --git a/doc/multiboot.texi b/doc/multiboot.texi index df8a0d056e76..758ef7fd1e2d 100644 --- a/doc/multiboot.texi +++ b/doc/multiboot.texi @@ -356,6 +356,7 @@ executable header. * Module alignment tag:: * EFI boot services tag:: * Relocatable header tag:: +* Module load preferences tag:: @end menu @@ -730,6 +731,46 @@ Boot loader should follow it. @samp{0} means none, @samp{1} means load image at lowest possible address but not lower than min_addr and @samp{2} means load image at highest possible address but not higher than max_addr. + +@node Module load preferences tag +@subsection Module load preferences tag + +@example +@group + +-------------------+ +u16 | type = 11 | +u16 | flags | +u32 | size = 20 | +u32 | min_addr | +u32 | max_addr | +u32 | preference | + +-------------------+ +@end group +@end example + +This tag is independent to the relocatable header tag. All of the +address fields in this tag are physical addresses. + +The meaning of each field is as follows: + +@table @code +@item min_addr +Lowest possible physical address at which any modules should be +loaded. The bootloader cannot load any part of any modules below +this address. + +@item max_addr +Highest possible physical address at which any loaded modules should +end. The bootloader cannot load any part of any modules above this +address. + +@item preference +It contains load address placement suggestion for boot loader. +Boot loader should follow it. @samp{0} means load modules not lower +than min_addr and not higher than max_addr, but no preference on either +lower or higher address. @samp{1} means load modules at lowest possible +address but not lower than min_addr. @samp{2} means load modules at +highest possible address but not higher than max_addr. @end table @node Machine state diff --git a/doc/multiboot2.h b/doc/multiboot2.h index b181607075b2..a68013ad932f 100644 --- a/doc/multiboot2.h +++ b/doc/multiboot2.h @@ -75,6 +75,7 @@ #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 #define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 +#define MULTIBOOT_HEADER_TAG_MODULE_LOAD_PREFERENCES 11 #define MULTIBOOT_ARCHITECTURE_I386 0 #define MULTIBOOT_ARCHITECTURE_MIPS32 4 @@ -179,6 +180,16 @@ struct multiboot_header_tag_relocatable multiboot_uint32_t preference; }; +struct multiboot_header_tag_module_load_preferences +{ + multiboot_uint16_t type; + multiboot_uint16_t flags; + multiboot_uint32_t size; + multiboot_uint32_t min_addr; + multiboot_uint32_t max_addr; + multiboot_uint32_t preference; +}; + struct multiboot_color { multiboot_uint8_t red; -- 2.17.1 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
