@@ -229,12 +229,12 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
229
229
phnum ++ ;
230
230
footer_size += sizeof (struct grub_ieee1275_note );
231
231
}
232
- if (image_target -> id == IMAGE_XEN )
232
+ if (image_target -> id == IMAGE_XEN || image_target -> id == IMAGE_XEN_PVH )
233
233
{
234
234
phnum ++ ;
235
235
shnum ++ ;
236
236
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 ;
238
238
}
239
239
header_size = ALIGN_UP (sizeof (* ehdr ) + phnum * sizeof (* phdr )
240
240
+ shnum * sizeof (* shdr ) + string_size , layout -> align );
@@ -421,6 +421,39 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
421
421
phdr -> p_offset = grub_host_to_target32 (header_size + program_size );
422
422
}
423
423
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
+
424
457
if (note )
425
458
{
426
459
int note_size = sizeof (struct grub_ieee1275_note );
@@ -496,15 +529,18 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
496
529
shdr -> sh_entsize = grub_host_to_target32 (0 );
497
530
shdr ++ ;
498
531
499
- if (image_target -> id == IMAGE_XEN )
532
+ if (image_target -> id == IMAGE_XEN || image_target -> id == IMAGE_XEN_PVH )
500
533
{
501
534
memcpy (ptr , ".xen" , sizeof (".xen" ));
502
535
shdr -> sh_name = grub_host_to_target32 (ptr - str_start );
503
536
ptr += sizeof (".xen" );
504
537
shdr -> sh_type = grub_host_to_target32 (SHT_PROGBITS );
505
538
shdr -> sh_addr = grub_host_to_target_addr (target_addr + layout -> kernel_size );
506
539
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 );
508
544
shdr -> sh_link = grub_host_to_target32 (0 );
509
545
shdr -> sh_info = grub_host_to_target32 (0 );
510
546
shdr -> sh_addralign = grub_host_to_target32 (image_target -> voidp_sizeof );
0 commit comments