Skip to content

Commit 78899c4

Browse files
jgross1Daniel Kiper
authored and
Daniel Kiper
committed
xen_pvh: Support building a standalone image
Support mkimage for xen_pvh. Signed-off-by: Juergen Gross <[email protected]> Reviewed-by: Daniel Kiper <[email protected]> Tested-by: Hans van Kranenburg <[email protected]>
1 parent 9bce252 commit 78899c4

File tree

5 files changed

+70
-8
lines changed

5 files changed

+70
-8
lines changed

include/grub/util/mkimage.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ struct grub_install_image_target_desc
7171
IMAGE_I386_IEEE1275,
7272
IMAGE_LOONGSON_ELF, IMAGE_QEMU, IMAGE_PPC, IMAGE_YEELOONG_FLASH,
7373
IMAGE_FULOONG2F_FLASH, IMAGE_I386_PC_PXE, IMAGE_MIPS_ARC,
74-
IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO
74+
IMAGE_QEMU_MIPS_FLASH, IMAGE_UBOOT, IMAGE_XEN, IMAGE_I386_PC_ELTORITO,
75+
IMAGE_XEN_PVH
7576
} id;
7677
enum
7778
{

util/grub-mkimage32.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
# define ELF_R_SYM(val) ELF32_R_SYM(val)
1818
# define ELF_R_TYPE(val) ELF32_R_TYPE(val)
1919
# define ELF_ST_TYPE(val) ELF32_ST_TYPE(val)
20-
#define XEN_NOTE_SIZE 132
20+
21+
#define XEN_NOTE_SIZE 132
22+
#define XEN_PVH_NOTE_SIZE 20
2123

2224
#ifndef GRUB_MKIMAGEXX
2325
#include "grub-mkimagexx.c"

util/grub-mkimage64.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
# define ELF_R_SYM(val) ELF64_R_SYM(val)
1818
# define ELF_R_TYPE(val) ELF64_R_TYPE(val)
1919
# define ELF_ST_TYPE(val) ELF64_ST_TYPE(val)
20-
#define XEN_NOTE_SIZE 120
20+
21+
#define XEN_NOTE_SIZE 120
22+
#define XEN_PVH_NOTE_SIZE 24
2123

2224
#ifndef GRUB_MKIMAGEXX
2325
#include "grub-mkimagexx.c"

util/grub-mkimagexx.c

+40-4
Original file line numberDiff line numberDiff line change
@@ -229,12 +229,12 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
229229
phnum++;
230230
footer_size += sizeof (struct grub_ieee1275_note);
231231
}
232-
if (image_target->id == IMAGE_XEN)
232+
if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH)
233233
{
234234
phnum++;
235235
shnum++;
236236
string_size += sizeof (".xen");
237-
footer_size += XEN_NOTE_SIZE;
237+
footer_size += (image_target->id == IMAGE_XEN) ? XEN_NOTE_SIZE : XEN_PVH_NOTE_SIZE;
238238
}
239239
header_size = ALIGN_UP (sizeof (*ehdr) + phnum * sizeof (*phdr)
240240
+ shnum * sizeof (*shdr) + string_size, layout->align);
@@ -421,6 +421,39 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
421421
phdr->p_offset = grub_host_to_target32 (header_size + program_size);
422422
}
423423

424+
if (image_target->id == IMAGE_XEN_PVH)
425+
{
426+
char *note_start = (elf_img + program_size + header_size);
427+
Elf_Nhdr *note_ptr;
428+
char *ptr = (char *) note_start;
429+
430+
grub_util_info ("adding XEN NOTE segment");
431+
432+
/* Phys32 Entry. */
433+
note_ptr = (Elf_Nhdr *) ptr;
434+
note_ptr->n_namesz = grub_host_to_target32 (sizeof (GRUB_XEN_NOTE_NAME));
435+
note_ptr->n_descsz = grub_host_to_target32 (image_target->voidp_sizeof);
436+
note_ptr->n_type = grub_host_to_target32 (XEN_ELFNOTE_PHYS32_ENTRY);
437+
ptr += sizeof (Elf_Nhdr);
438+
memcpy (ptr, GRUB_XEN_NOTE_NAME, sizeof (GRUB_XEN_NOTE_NAME));
439+
ptr += ALIGN_UP (sizeof (GRUB_XEN_NOTE_NAME), 4);
440+
memset (ptr, 0, image_target->voidp_sizeof);
441+
*(grub_uint32_t *) ptr = GRUB_KERNEL_I386_XEN_PVH_LINK_ADDR;
442+
ptr += image_target->voidp_sizeof;
443+
444+
assert (XEN_PVH_NOTE_SIZE == (ptr - note_start));
445+
446+
phdr++;
447+
phdr->p_type = grub_host_to_target32 (PT_NOTE);
448+
phdr->p_flags = grub_host_to_target32 (PF_R);
449+
phdr->p_align = grub_host_to_target32 (image_target->voidp_sizeof);
450+
phdr->p_vaddr = 0;
451+
phdr->p_paddr = 0;
452+
phdr->p_filesz = grub_host_to_target32 (XEN_PVH_NOTE_SIZE);
453+
phdr->p_memsz = 0;
454+
phdr->p_offset = grub_host_to_target32 (header_size + program_size);
455+
}
456+
424457
if (note)
425458
{
426459
int note_size = sizeof (struct grub_ieee1275_note);
@@ -496,15 +529,18 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
496529
shdr->sh_entsize = grub_host_to_target32 (0);
497530
shdr++;
498531

499-
if (image_target->id == IMAGE_XEN)
532+
if (image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH)
500533
{
501534
memcpy (ptr, ".xen", sizeof (".xen"));
502535
shdr->sh_name = grub_host_to_target32 (ptr - str_start);
503536
ptr += sizeof (".xen");
504537
shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS);
505538
shdr->sh_addr = grub_host_to_target_addr (target_addr + layout->kernel_size);
506539
shdr->sh_offset = grub_host_to_target_addr (program_size + header_size);
507-
shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE);
540+
if (image_target->id == IMAGE_XEN)
541+
shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE);
542+
else
543+
shdr->sh_size = grub_host_to_target32 (XEN_PVH_NOTE_SIZE);
508544
shdr->sh_link = grub_host_to_target32 (0);
509545
shdr->sh_info = grub_host_to_target32 (0);
510546
shdr->sh_addralign = grub_host_to_target32 (image_target->voidp_sizeof);

util/mkimage.c

+22-1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,24 @@ static const struct grub_install_image_target_desc image_targets[] =
132132
.link_addr = GRUB_KERNEL_I386_PC_LINK_ADDR,
133133
.default_compression = GRUB_COMPRESSION_LZMA
134134
},
135+
{
136+
.dirname = "i386-xen_pvh",
137+
.names = { "i386-xen_pvh", NULL },
138+
.voidp_sizeof = 4,
139+
.bigendian = 0,
140+
.id = IMAGE_XEN_PVH,
141+
.flags = PLATFORM_FLAGS_NONE,
142+
.total_module_size = TARGET_NO_FIELD,
143+
.decompressor_compressed_size = TARGET_NO_FIELD,
144+
.decompressor_uncompressed_size = TARGET_NO_FIELD,
145+
.decompressor_uncompressed_addr = TARGET_NO_FIELD,
146+
.elf_target = EM_386,
147+
.section_align = 1,
148+
.vaddr_offset = 0,
149+
.link_addr = GRUB_KERNEL_I386_XEN_PVH_LINK_ADDR,
150+
.mod_align = GRUB_KERNEL_I386_XEN_PVH_MOD_ALIGN,
151+
.link_align = 4
152+
},
135153
{
136154
.dirname = "i386-pc",
137155
.names = { "i386-pc-pxe", NULL },
@@ -860,7 +878,8 @@ grub_install_generate_image (const char *dir, const char *prefix,
860878
else
861879
kernel_img = grub_mkimage_load_image64 (kernel_path, total_module_size,
862880
&layout, image_target);
863-
if (image_target->id == IMAGE_XEN && layout.align < 4096)
881+
if ((image_target->id == IMAGE_XEN || image_target->id == IMAGE_XEN_PVH) &&
882+
layout.align < 4096)
864883
layout.align = 4096;
865884

866885
if ((image_target->flags & PLATFORM_FLAGS_DECOMPRESSORS)
@@ -1103,6 +1122,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
11031122
case IMAGE_MIPS_ARC:
11041123
case IMAGE_QEMU_MIPS_FLASH:
11051124
case IMAGE_XEN:
1125+
case IMAGE_XEN_PVH:
11061126
break;
11071127
case IMAGE_SPARC64_AOUT:
11081128
case IMAGE_SPARC64_RAW:
@@ -1679,6 +1699,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
16791699
case IMAGE_LOONGSON_ELF:
16801700
case IMAGE_PPC:
16811701
case IMAGE_XEN:
1702+
case IMAGE_XEN_PVH:
16821703
case IMAGE_COREBOOT:
16831704
case IMAGE_I386_IEEE1275:
16841705
{

0 commit comments

Comments
 (0)