From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1ZPCre-0007rh-2D for mharc-grub-devel@gnu.org; Tue, 11 Aug 2015 12:57:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46081) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZPCrb-0007rC-48 for grub-devel@gnu.org; Tue, 11 Aug 2015 12:57:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZPCrT-0002DN-CG for grub-devel@gnu.org; Tue, 11 Aug 2015 12:57:23 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:51368) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZPCrT-0002DI-3S for grub-devel@gnu.org; Tue, 11 Aug 2015 12:57:15 -0400 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t7BGv3bq008046 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 11 Aug 2015 16:57:04 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t7BGv2eN017631 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 11 Aug 2015 16:57:03 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id t7BGv1Uu006096; Tue, 11 Aug 2015 16:57:01 GMT Received: from l.oracle.com (/10.137.176.158) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 11 Aug 2015 09:57:00 -0700 Received: by l.oracle.com (Postfix, from userid 1000) id D68746A3C73; Tue, 11 Aug 2015 12:56:58 -0400 (EDT) Date: Tue, 11 Aug 2015 12:56:58 -0400 From: Konrad Rzeszutek Wilk To: Daniel Kiper Subject: Re: [PATCH v2 23/23] x86: add multiboot2 protocol support for relocatable images Message-ID: <20150811165658.GC32231@l.oracle.com> References: <1437402558-7313-1-git-send-email-daniel.kiper@oracle.com> <1437402558-7313-24-git-send-email-daniel.kiper@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1437402558-7313-24-git-send-email-daniel.kiper@oracle.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 156.151.31.81 Cc: jgross@suse.com, grub-devel@gnu.org, wei.liu2@citrix.com, keir@xen.org, ian.campbell@citrix.com, stefano.stabellini@eu.citrix.com, andrew.cooper3@citrix.com, roy.franz@linaro.org, ning.sun@intel.com, david.vrabel@citrix.com, jbeulich@suse.com, phcoder@gmail.com, xen-devel@lists.xenproject.org, qiaowei.ren@intel.com, richard.l.maliszewski@intel.com, gang.wei@intel.com, fu.wei@linaro.org X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Aug 2015 16:57:24 -0000 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 > --- > 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