xen_pvh: Support building a standalone image
Support mkimage for xen_pvh. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> Tested-by: Hans van Kranenburg <hans@knorrie.org>
This commit is contained in:
parent
9bce25213a
commit
78899c42d7
5 changed files with 70 additions and 8 deletions
|
@ -229,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_XEN_PVH)
|
||||
{
|
||||
phnum++;
|
||||
shnum++;
|
||||
string_size += sizeof (".xen");
|
||||
footer_size += XEN_NOTE_SIZE;
|
||||
footer_size += (image_target->id == IMAGE_XEN) ? XEN_NOTE_SIZE : XEN_PVH_NOTE_SIZE;
|
||||
}
|
||||
header_size = ALIGN_UP (sizeof (*ehdr) + phnum * sizeof (*phdr)
|
||||
+ shnum * sizeof (*shdr) + string_size, layout->align);
|
||||
|
@ -421,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_XEN_PVH)
|
||||
{
|
||||
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_XEN_PVH_LINK_ADDR;
|
||||
ptr += image_target->voidp_sizeof;
|
||||
|
||||
assert (XEN_PVH_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 (XEN_PVH_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);
|
||||
|
@ -496,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_XEN_PVH)
|
||||
{
|
||||
memcpy (ptr, ".xen", sizeof (".xen"));
|
||||
shdr->sh_name = grub_host_to_target32 (ptr - str_start);
|
||||
|
@ -504,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 (XEN_PVH_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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue