[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 16/18] xenpvh: support building a standalone image
From: |
Juergen Gross |
Subject: |
[PATCH v2 16/18] xenpvh: support building a standalone image |
Date: |
Tue, 9 Oct 2018 13:03:15 +0200 |
Support mkimage for xenpvh.
In order to avoid using plain integers for the ELF notes use the
available Xen include instead. While at it replace the plain numbers
for Xen PV mode, too.
Signed-off-by: Juergen Gross <address@hidden>
---
V2: some style adjustments (Daniel Kiper)
use defines for elf-notes (Daniel Kiper)
I didn't replace the 4096 by a PAGE_SIZE macro as requested by Daniel,
as there isn't such a macro easily available for util/mkimage.c and
I didn't introduce its usage.
---
include/grub/util/mkimage.h | 3 ++-
util/grub-mkimage32.c | 4 +++-
util/grub-mkimage64.c | 4 +++-
util/grub-mkimagexx.c | 58 +++++++++++++++++++++++++++++++++++++--------
util/mkimage.c | 23 +++++++++++++++++-
5 files changed, 78 insertions(+), 14 deletions(-)
diff --git a/include/grub/util/mkimage.h b/include/grub/util/mkimage.h
index b3a5ca132..3f5bc2e00 100644
--- a/include/grub/util/mkimage.h
+++ b/include/grub/util/mkimage.h
@@ -71,7 +71,8 @@ struct grub_install_image_target_desc
IMAGE_I386_IEEE1275,
IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
IMAGE_FULOONG2F_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC,
- IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO
+ IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO,
+ IMAGE_XENPVH
} id;
enum
{
diff --git a/util/grub-mkimage32.c b/util/grub-mkimage32.c
index 1f2ccccd2..409d487d6 100644
--- a/util/grub-mkimage32.c
+++ b/util/grub-mkimage32.c
@@ -17,7 +17,9 @@
# define ELF_R_SYM(val) ELF32_R_SYM(val)
# define ELF_R_TYPE(val) ELF32_R_TYPE(val)
# define ELF_ST_TYPE(val) ELF32_ST_TYPE(val)
-#define XEN_NOTE_SIZE 132
+
+#define XEN_NOTE_SIZE 132
+#define XENPVH_NOTE_SIZE 20
#ifndef GRUB_MKIMAGEXX
#include "grub-mkimagexx.c"
diff --git a/util/grub-mkimage64.c b/util/grub-mkimage64.c
index 4ff72a625..8bc93ea5a 100644
--- a/util/grub-mkimage64.c
+++ b/util/grub-mkimage64.c
@@ -17,7 +17,9 @@
# define ELF_R_SYM(val) ELF64_R_SYM(val)
# define ELF_R_TYPE(val) ELF64_R_TYPE(val)
# define ELF_ST_TYPE(val) ELF64_ST_TYPE(val)
-#define XEN_NOTE_SIZE 120
+
+#define XEN_NOTE_SIZE 120
+#define XENPVH_NOTE_SIZE 24
#ifndef GRUB_MKIMAGEXX
#include "grub-mkimagexx.c"
diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
index a483c674c..3009a3755 100644
--- a/util/grub-mkimagexx.c
+++ b/util/grub-mkimagexx.c
@@ -48,6 +48,8 @@
#include <grub/util/install.h>
#include <grub/util/mkimage.h>
+#include <xen/elfnote.h>
+
#pragma GCC diagnostic ignored "-Wcast-align"
#define GRUB_MKIMAGEXX
@@ -227,12 +229,12 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
phnum++;
footer_size += sizeof (struct grub_ieee1275_note);
}
- if (image_target->id == IMAGE_XEN)
+ if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XENPVH)
{
phnum++;
shnum++;
string_size += sizeof (".xen");
- footer_size += XEN_NOTE_SIZE;
+ footer_size += (image_target->id == IMAGE_XEN) ? XEN_NOTE_SIZE :
XENPVH_NOTE_SIZE;
}
header_size = ALIGN_UP (sizeof (*ehdr) + phnum * sizeof (*phdr)
+ shnum * sizeof (*shdr) + string_size,
layout->align);
@@ -341,7 +343,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (sizeof (PACKAGE_NAME));
- note_ptr->n_type = grub_host_to_target32 (6);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_GUEST_OS);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -352,7 +354,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (sizeof ("generic"));
- note_ptr->n_type = grub_host_to_target32 (8);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_LOADER);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -363,7 +365,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (sizeof ("xen-3.0"));
- note_ptr->n_type = grub_host_to_target32 (5);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_XEN_VERSION);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -374,7 +376,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof);
- note_ptr->n_type = grub_host_to_target32 (1);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_ENTRY);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -385,7 +387,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof);
- note_ptr->n_type = grub_host_to_target32 (3);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_VIRT_BASE);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -398,7 +400,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
note_ptr = (Elf_Nhdr *) ptr;
note_ptr->n_namesz = grub_host_to_target32 (sizeof
(GRUB_XEN_NOTE_NAME));
note_ptr->n_descsz = grub_host_to_target32 (sizeof ("yes,bimodal"));
- note_ptr->n_type = grub_host_to_target32 (9);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_PAE_MODE);
ptr += sizeof (Elf_Nhdr);
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
@@ -419,6 +421,39 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
phdr->p_offset = grub_host_to_target32 (header_size + program_size);
}
+ if (image_target->id == IMAGE_XENPVH)
+ {
+ char *note_start = (elf_img + program_size + header_size);
+ Elf_Nhdr *note_ptr;
+ char *ptr = (char *) note_start;
+
+ grub_util_info ("adding XEN NOTE segment");
+
+ /* Phys32 Entry. */
+ note_ptr = (Elf_Nhdr *) ptr;
+ note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
+ note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof);
+ note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_PHYS32_ENTRY);
+ ptr += sizeof (Elf_Nhdr);
+ memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
+ ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
+ memset (ptr, 0, image_target->voidp_sizeof);
+ *(grub_uint32_t *) ptr = GRUB_KERNEL_I386_XENPVH_LINK_ADDR;
+ ptr += image_target->voidp_sizeof;
+
+ assert (XENPVH_NOTE_SIZE == (ptr - note_start));
+
+ phdr++;
+ phdr->p_type = grub_host_to_target32 (PT_NOTE);
+ phdr->p_flags = grub_host_to_target32 (PF_R);
+ phdr->p_align = grub_host_to_target32 (image_target->voidp_sizeof);
+ phdr->p_vaddr = 0;
+ phdr->p_paddr = 0;
+ phdr->p_filesz = grub_host_to_target32 (XENPVH_NOTE_SIZE);
+ phdr->p_memsz = 0;
+ phdr->p_offset = grub_host_to_target32 (header_size + program_size);
+ }
+
if (note)
{
int note_size = sizeof (struct grub_ieee1275_note);
@@ -494,7 +529,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
shdr->sh_entsize = grub_host_to_target32 (0);
shdr++;
- if (image_target->id == IMAGE_XEN)
+ if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XENPVH)
{
memcpy (ptr, ".xen", sizeof (".xen"));
shdr->sh_name = grub_host_to_target32 (ptr - str_start);
@@ -502,7 +537,10 @@ SUFFIX (grub_mkimage_generate_elf) (const struct
grub_install_image_target_desc
shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS);
shdr->sh_addr = grub_host_to_target_addr (target_addr +
layout->kernel_size);
shdr->sh_offset = grub_host_to_target_addr (program_size + header_size);
- shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE);
+ if (image_target->id == IMAGE_XEN)
+ shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE);
+ else
+ shdr->sh_size = grub_host_to_target32 (XENPVH_NOTE_SIZE);
shdr->sh_link = grub_host_to_target32 (0);
shdr->sh_info = grub_host_to_target32 (0);
shdr->sh_addralign = grub_host_to_target32 (image_target->voidp_sizeof);
diff --git a/util/mkimage.c b/util/mkimage.c
index e22d82afa..5e071c074 100644
--- a/util/mkimage.c
+++ b/util/mkimage.c
@@ -132,6 +132,24 @@ static const struct grub_install_image_target_desc
image_targets[] =
.link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR,
.default_compression = GRUB_COMPRESSION_LZMA
},
+ {
+ .dirname = "i386-xenpvh",
+ .names = { "i386-xenpvh", NULL },
+ .voidp_sizeof = 4,
+ .bigendian = 0,
+ .id = IMAGE_XENPVH,
+ .flags = PLATFORM_FLAGS_NONE,
+ .total_module_size = TARGET_NO_FIELD,
+ .decompressor_compressed_size = TARGET_NO_FIELD,
+ .decompressor_uncompressed_size = TARGET_NO_FIELD,
+ .decompressor_uncompressed_addr = TARGET_NO_FIELD,
+ .elf_target = EM_386,
+ .section_align = 1,
+ .vaddr_offset = 0,
+ .link_addr = GRUB_KERNEL_I386_XENPVH_LINK_ADDR,
+ .mod_align = GRUB_KERNEL_I386_XENPVH_MOD_ALIGN,
+ .link_align = 4
+ },
{
.dirname = "i386-pc",
.names = { "i386-pc-pxe", NULL },
@@ -860,7 +878,8 @@ grub_install_generate_image (const char *dir, const char
*prefix,
else
kernel_img = grub_mkimage_load_image64 (kernel_path, total_module_size,
&layout, image_target);
- if (image_target->id == IMAGE_XEN && layout.align < 4096)
+ if ((image_target->id == IMAGE_XEN || image_target->id == IMAGE_XENPVH) &&
+ layout.align < 4096)
layout.align = 4096;
if ((image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS)
@@ -1103,6 +1122,7 @@ grub_install_generate_image (const char *dir, const char
*prefix,
case IMAGE_MIPS_ARC:
case IMAGE_QEMU_MIPS_FLASH:
case IMAGE_XEN:
+ case IMAGE_XENPVH:
break;
case IMAGE_SPARC64_AOUT:
case IMAGE_SPARC64_RAW:
@@ -1679,6 +1699,7 @@ grub_install_generate_image (const char *dir, const char
*prefix,
case IMAGE_LOONGSON_ELF:
case IMAGE_PPC:
case IMAGE_XEN:
+ case IMAGE_XENPVH:
case IMAGE_COREBOOT:
case IMAGE_I386_IEEE1275:
{
--
2.16.4
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, (continued)
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Roger Pau Monné, 2018/10/19
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Roger Pau Monné, 2018/10/19
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Juergen Gross, 2018/10/19
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Roger Pau Monné, 2018/10/29
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Juergen Gross, 2018/10/29
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Roger Pau Monné, 2018/10/30
- Re: [Xen-devel] [PATCH v2 12/18] xen: setup Xen specific data for PVH, Juergen Gross, 2018/10/30
[PATCH v2 18/18] xenpvh: add support to configure, Juergen Gross, 2018/10/09
[PATCH v2 16/18] xenpvh: support building a standalone image,
Juergen Gross <=
[PATCH v2 17/18] xenpvh: support grub-install for xenpvh, Juergen Gross, 2018/10/09
[PATCH v2 01/18] xen: add some xen headers, Juergen Gross, 2018/10/09
Re: [Xen-devel] [PATCH v2 00/18] xen: add pvh guest support, Juergen Gross, 2018/10/10