mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86: add multiboot2 protocol support for relocatable images
Add multiboot2 protocol support for relocatable images. Only GRUB2 with "multiboot2: Add support for relocatable images" patch understands that feature. Older multiboot protocol (regardless of version) compatible loaders ignore it and everything works as usual. Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> Acked-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Doug Goldstein <cardoe@cardoe.com>
This commit is contained in:
1 parent
f5f16adbce
commit
f75a30496c
3 files changed
+30
No files matched your search
@@ -81,6 +81,13 @@ multiboot2_header_start:
|
||||
/* Align modules at page boundry. */
|
||||
mb2ht_init MB2_HT(MODULE_ALIGN), MB2_HT(REQUIRED)
|
||||
|
||||
/* Load address preference. */
|
||||
mb2ht_init MB2_HT(RELOCATABLE), MB2_HT(OPTIONAL), \
|
||||
sym_offs(start), /* Min load address. */ \
|
||||
0xffffffff, /* The end of image max load address (4 GiB - 1). */ \
|
||||
0x200000, /* Load address alignment (2 MiB). */ \
|
||||
MULTIBOOT2_LOAD_PREFERENCE_HIGH
|
||||
|
||||
/* Console flags tag. */
|
||||
mb2ht_init MB2_HT(CONSOLE_FLAGS), MB2_HT(OPTIONAL), \
|
||||
MULTIBOOT2_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED
|
||||
@@ -403,6 +410,15 @@ __start:
|
||||
cmp %edi,MB2_fixed_total_size(%ebx)
|
||||
jbe trampoline_bios_setup
|
||||
|
||||
/* Get Xen image load base address from Multiboot2 information. */
|
||||
cmpl $MULTIBOOT2_TAG_TYPE_LOAD_BASE_ADDR,MB2_tag_type(%ecx)
|
||||
jne .Lmb2_mem_lower
|
||||
|
||||
mov MB2_load_base_addr(%ecx),%esi
|
||||
sub $XEN_IMG_OFFSET,%esi
|
||||
jmp .Lmb2_next_tag
|
||||
|
||||
.Lmb2_mem_lower:
|
||||
/* Get mem_lower from Multiboot2 information. */
|
||||
cmpl $MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO,MB2_tag_type(%ecx)
|
||||
cmove MB2_mem_lower(%ecx),%edx
|
||||
|
||||
@@ -173,6 +173,7 @@ void __dummy__(void)
|
||||
OFFSET(MB2_fixed_total_size, multiboot2_fixed_t, total_size);
|
||||
OFFSET(MB2_tag_type, multiboot2_tag_t, type);
|
||||
OFFSET(MB2_tag_size, multiboot2_tag_t, size);
|
||||
OFFSET(MB2_load_base_addr, multiboot2_tag_load_base_addr_t, load_base_addr);
|
||||
OFFSET(MB2_mem_lower, multiboot2_tag_basic_meminfo_t, mem_lower);
|
||||
OFFSET(MB2_efi64_st, multiboot2_tag_efi64_t, pointer);
|
||||
OFFSET(MB2_efi64_ih, multiboot2_tag_efi64_ih_t, pointer);
|
||||
|
||||
@@ -59,11 +59,17 @@
|
||||
#define MULTIBOOT2_HEADER_TAG_EFI_BS 7
|
||||
#define MULTIBOOT2_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
|
||||
#define MULTIBOOT2_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
|
||||
#define MULTIBOOT2_HEADER_TAG_RELOCATABLE 10
|
||||
|
||||
/* Header tag flags. */
|
||||
#define MULTIBOOT2_HEADER_TAG_REQUIRED 0
|
||||
#define MULTIBOOT2_HEADER_TAG_OPTIONAL 1
|
||||
|
||||
/* Where image should be loaded (suggestion not requirement). */
|
||||
#define MULTIBOOT2_LOAD_PREFERENCE_NONE 0
|
||||
#define MULTIBOOT2_LOAD_PREFERENCE_LOW 1
|
||||
#define MULTIBOOT2_LOAD_PREFERENCE_HIGH 2
|
||||
|
||||
/* Header console tag console_flags. */
|
||||
#define MULTIBOOT2_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
|
||||
#define MULTIBOOT2_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
|
||||
@@ -90,6 +96,7 @@
|
||||
#define MULTIBOOT2_TAG_TYPE_EFI_BS 18
|
||||
#define MULTIBOOT2_TAG_TYPE_EFI32_IH 19
|
||||
#define MULTIBOOT2_TAG_TYPE_EFI64_IH 20
|
||||
#define MULTIBOOT2_TAG_TYPE_LOAD_BASE_ADDR 21
|
||||
|
||||
/* Multiboot 2 tag alignment. */
|
||||
#define MULTIBOOT2_TAG_ALIGN 8
|
||||
@@ -117,6 +124,12 @@ typedef struct {
|
||||
u32 size;
|
||||
} multiboot2_tag_t;
|
||||
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 size;
|
||||
u32 load_base_addr;
|
||||
} multiboot2_tag_load_base_addr_t;
|
||||
|
||||
typedef struct {
|
||||
u32 type;
|
||||
u32 size;
|
||||
|
||||