[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2 23/23] x86: add multiboot2 protocol support for relocatable images



On Mon, Jul 20, 2015 at 04:29:18PM +0200, Daniel Kiper wrote:
> Add multiboot2 protocol support for relocatable images. Only GRUB2
> with relevant patches understands that feature. Older multiboot

You may want to enumerate what those 'relevant' patches are.

> protocol (regardless of version) compatible loaders ignore it
> and everything works as usual.
> 
> Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
> ---
>  xen/arch/x86/boot/head.S          |   46 
> +++++++++++++++++++++++++++++--------
>  xen/arch/x86/x86_64/asm-offsets.c |    1 +
>  xen/include/xen/multiboot2.h      |   13 +++++++++++
>  3 files changed, 50 insertions(+), 10 deletions(-)
> 
> diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S
> index d484f68..2520e48 100644
> --- a/xen/arch/x86/boot/head.S
> +++ b/xen/arch/x86/boot/head.S
> @@ -81,6 +81,13 @@ multiboot1_header_end:
>          /* 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_phys(start), /* Min load address. */ \

We could go straight to __start?

> +                   0xffffffff, /* 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
> @@ -176,30 +183,39 @@ efi_multiboot2_proto:
>          lea     MB2_fixed_sizeof(%rbx),%rcx
>  
>  0:
> +        /* Get Xen image base address from Multiboot2 information. */
> +        cmpl    $MULTIBOOT2_TAG_TYPE_BASE_ADDR,MB2_tag_type(%rcx)
> +        jne     1f
> +
> +        mov     MB2_base_addr(%rcx),%ebp
> +        sub     $XEN_IMG_OFFSET,%rbp
> +        jmp     4f
> +
> +1:
>          /* Get EFI SystemTable address from Multiboot2 information. */
>          cmpl    $MULTIBOOT2_TAG_TYPE_EFI64,MB2_tag_type(%rcx)
> -        jne     1f
> +        jne     2f
>  
>          mov     MB2_efi64_st(%rcx),%rsi
>  
>          /* Do not go into real mode on EFI platform. */
>          movb    $1,skip_realmode(%rip)
> -        jmp     3f
> +        jmp     4f
>  
> -1:
> +2:
>          /* Get EFI ImageHandle address from Multiboot2 information. */
>          cmpl    $MULTIBOOT2_TAG_TYPE_EFI64_IH,MB2_tag_type(%rcx)
> -        jne     2f
> +        jne     3f
>  
>          mov     MB2_efi64_ih(%rcx),%rdi
> -        jmp     3f
> +        jmp     4f
>  
> -2:
> +3:
>          /* Is it the end of Multiboot2 information? */
>          cmpl    $MULTIBOOT2_TAG_TYPE_END,MB2_tag_type(%rcx)
>          je      run_bs
>  
> -3:
> +4:
>          /* Go to next Multiboot2 information tag. */
>          add     MB2_tag_size(%rcx),%ecx
>          add     $(MULTIBOOT2_TAG_ALIGN-1),%rcx
> @@ -297,14 +313,23 @@ multiboot2_proto:
>          lea     MB2_fixed_sizeof(%ebx),%ecx
>  
>  0:
> +        /* Get Xen image base address from Multiboot2 information. */
> +        cmpl    $MULTIBOOT2_TAG_TYPE_BASE_ADDR,MB2_tag_type(%ecx)
> +        jne     1f
> +
> +        mov     MB2_base_addr(%ecx),%ebp
> +        sub     $XEN_IMG_OFFSET,%ebp
> +        jmp     3f
> +
> +1:
>          /* Get mem_lower from Multiboot2 information. */
>          cmpl    $MULTIBOOT2_TAG_TYPE_BASIC_MEMINFO,MB2_tag_type(%ecx)
> -        jne     1f
> +        jne     2f
>  
>          mov     MB2_mem_lower(%ecx),%edx
> -        jmp     trampoline_bios_setup
> +        jmp     3f
>  
> -1:
> +2:
>          /* EFI mode is not supported via legacy BIOS path. */
>          cmpl    $MULTIBOOT2_TAG_TYPE_EFI32,MB2_tag_type(%ecx)
>          je      mb2_too_old
> @@ -316,6 +341,7 @@ multiboot2_proto:
>          cmpl    $MULTIBOOT2_TAG_TYPE_END,MB2_tag_type(%ecx)
>          je      trampoline_bios_setup
>  
> +3:
>          /* Go to next Multiboot2 information tag. */
>          add     MB2_tag_size(%ecx),%ecx
>          add     $(MULTIBOOT2_TAG_ALIGN-1),%ecx
> diff --git a/xen/arch/x86/x86_64/asm-offsets.c 
> b/xen/arch/x86/x86_64/asm-offsets.c
> index b7aed49..5345a9e 100644
> --- a/xen/arch/x86/x86_64/asm-offsets.c
> +++ b/xen/arch/x86/x86_64/asm-offsets.c
> @@ -172,6 +172,7 @@ void __dummy__(void)
>      DEFINE(MB2_fixed_sizeof, sizeof(multiboot2_fixed_t));
>      OFFSET(MB2_tag_type, multiboot2_tag_t, type);
>      OFFSET(MB2_tag_size, multiboot2_tag_t, size);
> +    OFFSET(MB2_base_addr, multiboot2_tag_base_addr_t, 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);
> diff --git a/xen/include/xen/multiboot2.h b/xen/include/xen/multiboot2.h
> index 09ee64e..a63c4d6 100644
> --- a/xen/include/xen/multiboot2.h
> +++ b/xen/include/xen/multiboot2.h
> @@ -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


Would be good for all of this (with the other MULTIBOOT2..)
to be aligned on the same column-ish.

> +
>  /* 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_BASE_ADDR                21
>  
>  /* Multiboot 2 tag alignment. */
>  #define MULTIBOOT2_TAG_ALIGN                 8
> @@ -120,6 +127,12 @@ typedef struct {
>  typedef struct {
>      u32 type;
>      u32 size;
> +    u32 base_addr;
> +} multiboot2_tag_base_addr_t;
> +
> +typedef struct {
> +    u32 type;
> +    u32 size;
>      char string[0];
>  } multiboot2_tag_string_t;
>  
> -- 
> 1.7.10.4
> 

Otherwise, Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.