From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Daniel Kiper <daniel.kiper@oracle.com>, xen-devel@lists.xenproject.org
Cc: keir@xen.org, ian.campbell@citrix.com,
stefano.stabellini@eu.citrix.com, ross.philipson@citrix.com,
roy.franz@linaro.org, ning.sun@intel.com, jbeulich@suse.com,
qiaowei.ren@intel.com, richard.l.maliszewski@intel.com,
gang.wei@intel.com, fu.wei@linaro.org
Subject: Re: [PATCH v2 5/5] xen/x86: Add multiboot2 protocol support
Date: Wed, 24 Sep 2014 20:14:03 +0100 [thread overview]
Message-ID: <542317FB.5070905@citrix.com> (raw)
In-Reply-To: <1411579162-27503-6-git-send-email-daniel.kiper@oracle.com>
On 24/09/14 18:19, Daniel Kiper wrote:
> Add multiboot2 protocol support. This way we are laying the foundation
> for EFI + GRUB2 + Xen development.
>
> Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Much clearer than before.
Can I suggest retroactively renaming the old multiboot bits to
multiboot1 to make a more marked difference between between
"multiboot1_proto" and "multiboot2_proto" ?
It would also be better to split the changing of multiboot1 and
shuffling of memory calculations away from the introduction of multiboot2.
> ---
> v2 - suggestions/fixes:
> - use "for" instead of "while" for loops
> (suggested by Jan Beulich),
> - properly parenthesize macro arguments
>
> char *boot_loader_name;
> (suggested by Jan Beulich),
> - change some local variables types
> (suggested by Jan Beulich),
> - use meaningful labels
> (suggested by Andrew Cooper and Jan Beulich),
> - use local labels
> (suggested by Jan Beulich),
> - fix coding style
> (suggested by Jan Beulich),
> - patch split rearrangement
> (suggested by Andrew Cooper and Jan Beulich).
> ---
> xen/arch/x86/boot/head.S | 117 +++++++++++++-
> xen/arch/x86/boot/reloc.c | 103 +++++++++++-
> xen/include/xen/multiboot2.h | 354 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 567 insertions(+), 7 deletions(-)
> create mode 100644 xen/include/xen/multiboot2.h
>
> diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
> index 7e48833..4331821 100644
> --- a/xen/arch/x86/boot/head.S
> +++ b/xen/arch/x86/boot/head.S
> @@ -1,5 +1,6 @@
> #include <xen/config.h>
> #include <xen/multiboot.h>
> +#include <xen/multiboot2.h>
> #include <public/xen.h>
> #include <asm/asm_defns.h>
> #include <asm/desc.h>
> @@ -33,6 +34,68 @@ ENTRY(start)
> /* Checksum: must be the negated sum of the first two fields. */
> .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
>
> +/*** MULTIBOOT2 HEADER ****/
> +/* Some ideas are taken from grub-2.00/grub-core/tests/boot/kernel-i386.S file. */
> + .align MULTIBOOT2_HEADER_ALIGN
> +
> +.Lmultiboot2_header:
> + /* Magic number indicating a Multiboot2 header. */
> + .long MULTIBOOT2_HEADER_MAGIC
> + /* Architecture: i386. */
> + .long MULTIBOOT2_ARCHITECTURE_I386
> + /* Multiboot2 header length. */
> + .long .Lmultiboot2_header_end - .Lmultiboot2_header
> + /* Multiboot2 header checksum. */
> + .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + \
> + (.Lmultiboot2_header_end - .Lmultiboot2_header))
> +
> + /* Multiboot2 tags... */
> +.Lmultiboot2_info_req:
> + /* Multiboot2 information request tag. */
> + .short MULTIBOOT2_HEADER_TAG_INFORMATION_REQUEST
> + .short MULTIBOOT2_HEADER_TAG_REQUIRED
> + .long .Lmultiboot2_info_req_end - .Lmultiboot2_info_req
> + .long MULTIBOOT2_TAG_TYPE_MMAP
> +.Lmultiboot2_info_req_end:
> +
> + /*
> + * Align Xen image and modules at page boundry.
> + *
> + * .balignl MULTIBOOT2_TAG_ALIGN, MULTIBOOT2_TAG_TYPE_END is a hack
> + * to avoid bug related to Multiboot2 information request tag in earlier
> + * versions of GRUB2.
> + *
> + * DO NOT MOVE THIS TAG! ANY CHANGE HERE MAY BREAK COMPATIBILITY
> + * WITH EARLIER GRUB2 VERSIONS!
> + */
> + .balignl MULTIBOOT2_TAG_ALIGN, MULTIBOOT2_TAG_TYPE_END
> + .short MULTIBOOT2_HEADER_TAG_MODULE_ALIGN
> + .short MULTIBOOT2_HEADER_TAG_REQUIRED
> + .long 8 /* Tag size. */
> +
> + /* Console flags tag. */
> + .align MULTIBOOT2_TAG_ALIGN
> + .short MULTIBOOT2_HEADER_TAG_CONSOLE_FLAGS
> + .short MULTIBOOT2_HEADER_TAG_OPTIONAL
> + .long 12 /* Tag size. */
> + .long MULTIBOOT2_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED
> +
> + /* Framebuffer tag. */
> + .align MULTIBOOT2_TAG_ALIGN
> + .short MULTIBOOT2_HEADER_TAG_FRAMEBUFFER
> + .short MULTIBOOT2_HEADER_TAG_OPTIONAL
> + .long 20 /* Tag size. */
> + .long 0 /* Number of the columns - no preference. */
> + .long 0 /* Number of the lines - no preference. */
> + .long 0 /* Number of bits per pixel - no preference. */
> +
> + /* Multiboot2 header end tag. */
> + .align MULTIBOOT2_TAG_ALIGN
> + .short MULTIBOOT2_HEADER_TAG_END
> + .short 0
> + .long 8 /* Tag size. */
> +.Lmultiboot2_header_end:
> +
> .section .init.rodata, "a", @progbits
> .align 4
>
> @@ -81,10 +144,56 @@ __start:
> mov %ecx,%es
> mov %ecx,%ss
>
> + /* Assume multiboot[12].mem_lower is 0 if not set by bootloader */
> + xor %edx,%edx
> +
This change does not match its comment, and seems to have appeared from
nowhere.
> /* Check for Multiboot bootloader */
> cmp $MULTIBOOT_BOOTLOADER_MAGIC,%eax
> - jne not_multiboot
> + je multiboot_proto
> +
> + /* Check for Multiboot2 bootloader */
> + cmp $MULTIBOOT2_BOOTLOADER_MAGIC,%eax
> + je multiboot2_proto
> +
> + jmp not_multiboot
> +
> +multiboot_proto:
> + /* Get mem_lower from Multiboot information */
> + testb $MBI_MEMLIMITS,(%ebx)
> + jz trampoline_setup /* not available? BDA value will be fine */
> +
> + mov 4(%ebx),%edx
> + shl $10-4,%edx
> + jmp trampoline_setup
>
> +multiboot2_proto:
> + /* Get Multiboot2 information address */
> + mov %ebx,%ecx
> +
> + /* Skip Multiboot2 information fixed part */
> + add $8,%ecx
> +
> +0:
> + /* Get mem_lower from Multiboot2 information */
> + cmpl $MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO,(%ecx)
> + jne 1f
> +
> + mov 8(%ecx),%edx
> + shl $10-4,%edx
> + jmp trampoline_setup
> +
> +1:
> + /* Is it the end of Multiboot2 information? */
> + cmpl $MULTIBOOT2_TAG_TYPE_END,(%ecx)
> + je trampoline_setup
> +
> + /* Go to next Multiboot2 information tag */
> + add 4(%ecx),%ecx
> + add $(MULTIBOOT2_TAG_ALIGN-1),%ecx
> + and $~(MULTIBOOT2_TAG_ALIGN-1),%ecx
> + jmp 0b
> +
> +trampoline_setup:
> /* Set up trampoline segment 64k below EBDA */
> movzwl 0x40e,%ecx /* EBDA segment */
> cmp $0xa000,%ecx /* sanity check (high) */
> @@ -99,12 +208,8 @@ __start:
> * Compare the value in the BDA with the information from the
> * multiboot structure (if available) and use the smallest.
> */
> - testb $MBI_MEMLIMITS,(%ebx)
> - jz 2f /* not available? BDA value will be fine */
> - mov 4(%ebx),%edx
> - cmp $0x100,%edx /* is the multiboot value too small? */
> + cmp $0x4000,%edx /* is the multiboot value too small? */
You are going to need some justification for changing this lower bound
of memory.
> jb 2f /* if so, do not use it */
> - shl $10-4,%edx
> cmp %ecx,%edx /* compare with BDA value */
> cmovb %edx,%ecx /* and use the smaller */
>
> diff --git a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c
> index 35a991e..572421f 100644
> --- a/xen/arch/x86/boot/reloc.c
> +++ b/xen/arch/x86/boot/reloc.c
> @@ -19,9 +19,13 @@ typedef unsigned long long u64;
>
> #include "../../../include/xen/compiler.h"
> #include "../../../include/xen/multiboot.h"
> +#include "../../../include/xen/multiboot2.h"
>
> #include "../../../include/asm/mbd.h"
>
> +#define ALIGN_UP(addr, align) \
> + (((addr) + (typeof(addr))(align) - 1) & ~((typeof(addr))(align) - 1))
> +
> /*
> * __HERE__ IS ENTRY POINT!!!
> *
> @@ -143,6 +147,100 @@ static mbd_t *mb_mbd(mbd_t *mbd, multiboot_info_t *mbi)
> return mbd;
> }
>
> +static mbd_t *mb2_mbd(mbd_t *mbd, void *mbi)
> +{
> + boot_module_t *mbd_mods;
> + memory_map_t *mmap_dst;
> + multiboot2_memory_map_t *mmap_src;
> + multiboot2_tag_t *tag;
> + u32 ptr;
> + unsigned int i, mod_idx = 0;
> +
> + /* Skip Multiboot2 information fixed part. */
> + tag = mbi + sizeof(u32) * 2;
> +
> + for ( ; ; )
> + {
> + if ( tag->type == MULTIBOOT2_TAG_TYPE_MODULE )
> + ++mbd->mods_nr;
> + else if ( tag->type == MULTIBOOT2_TAG_TYPE_END )
> + {
> + mbd->mods = alloc_struct(mbd->mods_nr * sizeof(boot_module_t));
> + mbd_mods = (boot_module_t *)mbd->mods;
> + break;
> + }
> +
> + /* Go to next Multiboot2 information tag. */
> + tag = (multiboot2_tag_t *)(ALIGN_UP((u32)tag + tag->size, MULTIBOOT2_TAG_ALIGN));
> + }
> +
> + /* Skip Multiboot2 information fixed part. */
> + tag = mbi + sizeof(u32) * 2;
> +
> + for ( ; ; )
> + {
> + switch ( tag->type )
> + {
> + case MULTIBOOT2_TAG_TYPE_BOOT_LOADER_NAME:
> + ptr = (u32)((multiboot2_tag_string_t *)tag)->string;
> + mbd->boot_loader_name = copy_string(ptr);
> + break;
> +
> + case MULTIBOOT2_TAG_TYPE_CMDLINE:
> + ptr = (u32)((multiboot2_tag_string_t *)tag)->string;
> + mbd->cmdline = copy_string(ptr);
> + break;
> +
> + case MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO:
> + mbd->mem_lower = ((multiboot2_tag_basic_meminfo_t *)tag)->mem_lower;
> + mbd->mem_upper = ((multiboot2_tag_basic_meminfo_t *)tag)->mem_upper;
> + break;
> +
> + case MULTIBOOT2_TAG_TYPE_MMAP:
> + mbd->mmap_size = ((multiboot2_tag_mmap_t *)tag)->size;
> + mbd->mmap_size -= sizeof(multiboot2_tag_mmap_t);
> + mbd->mmap_size += sizeof(((multiboot2_tag_mmap_t){0}).entries);
> + mbd->mmap_size /= ((multiboot2_tag_mmap_t *)tag)->entry_size;
> + mbd->mmap_size *= sizeof(memory_map_t);
> +
> + mbd->mmap = alloc_struct(mbd->mmap_size);
> +
> + mmap_src = ((multiboot2_tag_mmap_t *)tag)->entries;
> + mmap_dst = (memory_map_t *)mbd->mmap;
> +
> + for ( i = 0; i < mbd->mmap_size / sizeof(memory_map_t); ++i )
> + {
> + mmap_dst[i].size = sizeof(memory_map_t);
> + mmap_dst[i].size -= sizeof(((memory_map_t){0}).size);
> + mmap_dst[i].base_addr_low = (u32)mmap_src[i].addr;
> + mmap_dst[i].base_addr_high = (u32)(mmap_src[i].addr >> 32);
> + mmap_dst[i].length_low = (u32)mmap_src[i].len;
> + mmap_dst[i].length_high = (u32)(mmap_src[i].len >> 32);
> + mmap_dst[i].type = mmap_src[i].type;
> + }
> + break;
> +
> + case MULTIBOOT2_TAG_TYPE_MODULE:
> + mbd_mods[mod_idx].start = (u32)((multiboot2_tag_module_t *)tag)->mod_start;
> + mbd_mods[mod_idx].end = (u32)((multiboot2_tag_module_t *)tag)->mod_end;
> + ptr = (u32)((multiboot2_tag_module_t *)tag)->cmdline;
> + mbd_mods[mod_idx].cmdline = copy_string(ptr);
> + mbd_mods[mod_idx].relocated = 0;
> + ++mod_idx;
> + break;
> +
> + case MULTIBOOT2_TAG_TYPE_END:
> + return mbd;
> +
> + default:
> + break;
> + }
> +
> + /* Go to next Multiboot2 information tag. */
> + tag = (multiboot2_tag_t *)(ALIGN_UP((u32)tag + tag->size, MULTIBOOT2_TAG_ALIGN));
> + }
> +}
> +
> static mbd_t __used *__reloc(void *mbi, u32 mb_magic)
> {
> mbd_t *mbd;
> @@ -150,5 +248,8 @@ static mbd_t __used *__reloc(void *mbi, u32 mb_magic)
> mbd = (mbd_t *)alloc_struct(sizeof(mbd_t));
> zero_struct((u32)mbd, sizeof(mbd_t));
>
> - return mb_mbd(mbd, mbi);
> + if ( mb_magic == MULTIBOOT_BOOTLOADER_MAGIC )
> + return mb_mbd(mbd, mbi);
> + else
> + return mb2_mbd(mbd, mbi);
> }
> diff --git a/xen/include/xen/multiboot2.h b/xen/include/xen/multiboot2.h
This multiboot2.h is huge - can we get away with only including struct
definitions for tags we currently use/support?
~Andrew
> new file mode 100644
> index 0000000..47ca08e
> --- /dev/null
> +++ b/xen/include/xen/multiboot2.h
> @@ -0,0 +1,354 @@
> +/*
> + * Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
> + *
> + * multiboot2.h - Multiboot 2 header file.
> + *
> + * Based on grub-2.00/include/multiboot2.h file.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the "Software"), to
> + * deal in the Software without restriction, including without limitation the
> + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
> + * sell copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
> + * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
> + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
> + * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#ifndef __MULTIBOOT2_H__
> +#define __MULTIBOOT2_H__
> +
> +/* The magic field should contain this. */
> +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
> +
> +/* This should be in %eax on x86 architecture. */
> +#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
> +
> +/* How many bytes from the start of the file we search for the header. */
> +#define MULTIBOOT2_SEARCH 32768
> +
> +/* Multiboot 2 header alignment. */
> +#define MULTIBOOT2_HEADER_ALIGN 8
> +
> +/* Alignment of multiboot 2 modules. */
> +#define MULTIBOOT2_MOD_ALIGN 0x00001000
> +
> +/* Alignment of the multiboot 2 info structure. */
> +#define MULTIBOOT2_INFO_ALIGN 0x00000008
> +
> +/* Multiboot 2 architectures. */
> +#define MULTIBOOT2_ARCHITECTURE_I386 0
> +#define MULTIBOOT2_ARCHITECTURE_MIPS32 4
> +
> +/* Header tag types. */
> +#define MULTIBOOT2_HEADER_TAG_END 0
> +#define MULTIBOOT2_HEADER_TAG_INFORMATION_REQUEST 1
> +#define MULTIBOOT2_HEADER_TAG_ADDRESS 2
> +#define MULTIBOOT2_HEADER_TAG_ENTRY_ADDRESS 3
> +#define MULTIBOOT2_HEADER_TAG_CONSOLE_FLAGS 4
> +#define MULTIBOOT2_HEADER_TAG_FRAMEBUFFER 5
> +#define MULTIBOOT2_HEADER_TAG_MODULE_ALIGN 6
> +#define MULTIBOOT2_HEADER_TAG_EFI_BS 7
> +
> +/* Header tag flags. */
> +#define MULTIBOOT2_HEADER_TAG_REQUIRED 0
> +#define MULTIBOOT2_HEADER_TAG_OPTIONAL 1
> +
> +/* Header console tag console_flags. */
> +#define MULTIBOOT2_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
> +#define MULTIBOOT2_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
> +
> +/* Flags set in the 'flags' member of the multiboot header. */
> +#define MULTIBOOT2_TAG_TYPE_END 0
> +#define MULTIBOOT2_TAG_TYPE_CMDLINE 1
> +#define MULTIBOOT2_TAG_TYPE_BOOT_LOADER_NAME 2
> +#define MULTIBOOT2_TAG_TYPE_MODULE 3
> +#define MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO 4
> +#define MULTIBOOT2_TAG_TYPE_BOOTDEV 5
> +#define MULTIBOOT2_TAG_TYPE_MMAP 6
> +#define MULTIBOOT2_TAG_TYPE_VBE 7
> +#define MULTIBOOT2_TAG_TYPE_FRAMEBUFFER 8
> +#define MULTIBOOT2_TAG_TYPE_ELF_SECTIONS 9
> +#define MULTIBOOT2_TAG_TYPE_APM 10
> +#define MULTIBOOT2_TAG_TYPE_EFI32 11
> +#define MULTIBOOT2_TAG_TYPE_EFI64 12
> +#define MULTIBOOT2_TAG_TYPE_SMBIOS 13
> +#define MULTIBOOT2_TAG_TYPE_ACPI_OLD 14
> +#define MULTIBOOT2_TAG_TYPE_ACPI_NEW 15
> +#define MULTIBOOT2_TAG_TYPE_NETWORK 16
> +#define MULTIBOOT2_TAG_TYPE_EFI_MMAP 17
> +#define MULTIBOOT2_TAG_TYPE_EFI_BS 18
> +
> +/* Multiboot 2 tag alignment. */
> +#define MULTIBOOT2_TAG_ALIGN 8
> +
> +/* Memory types. */
> +#define MULTIBOOT2_MEMORY_AVAILABLE 1
> +#define MULTIBOOT2_MEMORY_RESERVED 2
> +#define MULTIBOOT2_MEMORY_ACPI_RECLAIMABLE 3
> +#define MULTIBOOT2_MEMORY_NVS 4
> +#define MULTIBOOT2_MEMORY_BADRAM 5
> +
> +/* Framebuffer types. */
> +#define MULTIBOOT2_FRAMEBUFFER_TYPE_INDEXED 0
> +#define MULTIBOOT2_FRAMEBUFFER_TYPE_RGB 1
> +#define MULTIBOOT2_FRAMEBUFFER_TYPE_EGA_TEXT 2
> +
> +#ifndef __ASSEMBLY__
> +typedef struct {
> + /* Must be MULTIBOOT2_MAGIC - see above. */
> + u32 magic;
> +
> + /* ISA */
> + u32 architecture;
> +
> + /* Total header length. */
> + u32 header_length;
> +
> + /* The above fields plus this one must equal 0 mod 2^32. */
> + u32 checksum;
> +} multiboot2_header_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> +} multiboot2_header_tag_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 requests[0];
> +} multiboot2_header_tag_information_request_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 header_addr;
> + u32 load_addr;
> + u32 load_end_addr;
> + u32 bss_end_addr;
> +} multiboot2_header_tag_address_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 entry_addr;
> +} multiboot2_header_tag_entry_address_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 console_flags;
> +} multiboot2_header_tag_console_flags_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 width;
> + u32 height;
> + u32 depth;
> +} multiboot2_header_tag_framebuffer_t;
> +
> +typedef struct {
> + u16 type;
> + u16 flags;
> + u32 size;
> + u32 width;
> + u32 height;
> + u32 depth;
> +} multiboot2_header_tag_module_align_t;
> +
> +typedef struct {
> + u8 red;
> + u8 green;
> + u8 blue;
> +} multiboot2_color_t;
> +
> +typedef struct __packed {
> + u64 addr;
> + u64 len;
> + u32 type;
> + u32 zero;
> +} multiboot2_memory_map_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> +} multiboot2_tag_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + char string[0];
> +} multiboot2_tag_string_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 mod_start;
> + u32 mod_end;
> + char cmdline[0];
> +} multiboot2_tag_module_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 mem_lower;
> + u32 mem_upper;
> +} multiboot2_tag_basic_meminfo_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 biosdev;
> + u32 slice;
> + u32 part;
> +} multiboot2_tag_bootdev_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 entry_size;
> + u32 entry_version;
> + multiboot2_memory_map_t entries[0];
> +} multiboot2_tag_mmap_t;
> +
> +typedef struct {
> + u8 external_specification[512];
> +} multiboot2_vbe_info_block_t;
> +
> +typedef struct {
> + u8 external_specification[256];
> +} multiboot2_vbe_mode_info_block_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> +
> + u16 vbe_mode;
> + u16 vbe_interface_seg;
> + u16 vbe_interface_off;
> + u16 vbe_interface_len;
> +
> + multiboot2_vbe_info_block_t vbe_control_info;
> + multiboot2_vbe_mode_info_block_t vbe_mode_info;
> +} multiboot2_tag_vbe_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> +
> + u64 framebuffer_addr;
> + u32 framebuffer_pitch;
> + u32 framebuffer_width;
> + u32 framebuffer_height;
> + u8 framebuffer_bpp;
> + u8 framebuffer_type;
> + u16 reserved;
> +} multiboot2_tag_framebuffer_common_t;
> +
> +typedef struct {
> + multiboot2_tag_framebuffer_common_t common;
> +
> + union {
> + struct {
> + u16 framebuffer_palette_num_colors;
> + multiboot2_color_t framebuffer_palette[0];
> + };
> + struct {
> + u8 framebuffer_red_field_position;
> + u8 framebuffer_red_mask_size;
> + u8 framebuffer_green_field_position;
> + u8 framebuffer_green_mask_size;
> + u8 framebuffer_blue_field_position;
> + u8 framebuffer_blue_mask_size;
> + };
> + };
> +} multiboot2_tag_framebuffer_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 num;
> + u32 entsize;
> + u32 shndx;
> + char sections[0];
> +} multiboot2_tag_elf_sections_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u16 version;
> + u16 cseg;
> + u32 offset;
> + u16 cseg_16;
> + u16 dseg;
> + u16 flags;
> + u16 cseg_len;
> + u16 cseg_16_len;
> + u16 dseg_len;
> +} multiboot2_tag_apm_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 pointer;
> +} multiboot2_tag_efi32_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u64 pointer;
> +} multiboot2_tag_efi64_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u8 major;
> + u8 minor;
> + u8 reserved[6];
> + u8 tables[0];
> +} multiboot2_tag_smbios_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u8 rsdp[0];
> +} multiboot2_tag_old_acpi_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u8 rsdp[0];
> +} multiboot2_tag_new_acpi_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u8 dhcpack[0];
> +} multiboot2_tag_network_t;
> +
> +typedef struct {
> + u32 type;
> + u32 size;
> + u32 descr_size;
> + u32 descr_vers;
> + u8 efi_mmap[0];
> +} multiboot2_tag_efi_mmap_t;
> +#endif /* __ASSEMBLY__ */
> +
> +#endif /* __MULTIBOOT2_H__ */
next prev parent reply other threads:[~2014-09-24 19:14 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-24 17:19 [PATCH v2 0/5] xen: Break multiboot (v1) dependency and add multiboot2 support Daniel Kiper
2014-09-24 17:19 ` [PATCH v2 1/5] xen/x86: Introduce MultiBoot Data (MBD) type Daniel Kiper
2014-09-24 18:40 ` Andrew Cooper
2014-09-25 9:22 ` Jan Beulich
2014-09-25 12:56 ` Daniel Kiper
2014-09-25 13:24 ` Jan Beulich
2014-09-25 19:24 ` Daniel Kiper
2014-09-26 8:13 ` Jan Beulich
2014-09-24 17:19 ` [PATCH v2 2/5] xen/x86: Define e820 entries counter as unsigned int Daniel Kiper
2014-09-24 18:10 ` Andrew Cooper
2014-09-24 17:19 ` [PATCH v2 3/5] xen/x86: Migrate to boot_info structure Daniel Kiper
2014-09-24 19:00 ` Andrew Cooper
2014-09-25 9:43 ` Ian Campbell
2014-09-25 12:32 ` Daniel Kiper
2014-09-24 17:19 ` [PATCH v2 4/5] xen/x86: Use constant as multiboot protocol identifier Daniel Kiper
2014-09-24 18:11 ` Andrew Cooper
2014-09-24 17:19 ` [PATCH v2 5/5] xen/x86: Add multiboot2 protocol support Daniel Kiper
2014-09-24 19:14 ` Andrew Cooper [this message]
2014-09-25 18:42 ` Daniel Kiper
2014-09-25 18:52 ` Andrew Cooper
2014-09-24 17:48 ` [PATCH v2 0/5] xen: Break multiboot (v1) dependency and add multiboot2 support Roy Franz
2014-09-25 9:15 ` Jan Beulich
2014-09-25 9:45 ` Ian Campbell
2014-09-25 13:01 ` Daniel Kiper
2014-09-25 15:56 ` Roy Franz
2014-09-25 19:47 ` Daniel Kiper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=542317FB.5070905@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=daniel.kiper@oracle.com \
--cc=fu.wei@linaro.org \
--cc=gang.wei@intel.com \
--cc=ian.campbell@citrix.com \
--cc=jbeulich@suse.com \
--cc=keir@xen.org \
--cc=ning.sun@intel.com \
--cc=qiaowei.ren@intel.com \
--cc=richard.l.maliszewski@intel.com \
--cc=ross.philipson@citrix.com \
--cc=roy.franz@linaro.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.