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

2015-08-14 Thread Konrad Rzeszutek Wilk
On Fri, Aug 14, 2015 at 01:57:01PM +0200, Daniel Kiper wrote:
 On Tue, Aug 11, 2015 at 12:56:58PM -0400, Konrad Rzeszutek Wilk wrote:
  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.ki...@oracle.com
   ---
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?
 
 This specifies lowest load address not entry point.

Ah right. And the __start can be moved somewhere inside the .text
code, while 'start' is always at offset 0. Thank you!

 
 Daniel

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


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

2015-08-14 Thread Daniel Kiper
On Tue, Aug 11, 2015 at 12:56:58PM -0400, Konrad Rzeszutek Wilk wrote:
 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.ki...@oracle.com
  ---
   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?

This specifies lowest load address not entry point.

Daniel

___
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel


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

2015-08-11 Thread Konrad Rzeszutek Wilk
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.ki...@oracle.com
 ---
  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?

 +   0x, /* Max load address (4 GiB - 1). */ \
 +   0x20, /* 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_EFI328
  #define 

[PATCH v2 23/23] x86: add multiboot2 protocol support for relocatable images

2015-07-20 Thread Daniel Kiper
Add multiboot2 protocol support for relocatable images. Only GRUB2
with relevant patches understands that feature. Older multiboot
protocol (regardless of version) compatible loaders ignore it
and everything works as usual.

Signed-off-by: Daniel Kiper daniel.ki...@oracle.com
---
 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. */ \
+   0x, /* Max load address (4 GiB - 1). */ \
+   0x20, /* 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