On Fri, Sep 13, 2024 at 04:57:58PM +0530, Sudhakar Kuppusamy wrote: > In order to store the SBAT data, we create a new ELF note. The string > "Secure-Boot-Advanced-Targeting", > zero-padded to 4 byte alignment, shall be entered in the name field. The > string "sbat"'s ASCII values, > 0x41536967, should be entered in the type field. > > Signed-off-by: Sudhakar Kuppusamy <sudha...@linux.ibm.com> > Co-authored-by: Daniel Axtens <d...@axtens.net>
s/Co-authored-by/Signed-off-by/ ... and AIUI Daniel's SOB should be first... > --- > include/grub/util/mkimage.h | 4 +-- > util/grub-mkimagexx.c | 51 +++++++++++++++++++++++++++++++++++-- > util/mkimage.c | 5 ++-- > 3 files changed, 54 insertions(+), 6 deletions(-) > > diff --git a/include/grub/util/mkimage.h b/include/grub/util/mkimage.h > index 3819a6744..9d74f82c5 100644 > --- a/include/grub/util/mkimage.h > +++ b/include/grub/util/mkimage.h > @@ -51,12 +51,12 @@ grub_mkimage_load_image64 (const char *kernel_path, > const struct grub_install_image_target_desc > *image_target); > void > grub_mkimage_generate_elf32 (const struct grub_install_image_target_desc > *image_target, > - int note, char **core_img, size_t *core_size, > + int note, char *sbat, char **core_img, size_t > *core_size, > Elf32_Addr target_addr, > struct grub_mkimage_layout *layout); > void > grub_mkimage_generate_elf64 (const struct grub_install_image_target_desc > *image_target, > - int note, char **core_img, size_t *core_size, > + int note, char *sbat, char **core_img, size_t > *core_size, > Elf64_Addr target_addr, > struct grub_mkimage_layout *layout); > > diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c > index e50b29533..99f6ab05e 100644 > --- a/util/grub-mkimagexx.c > +++ b/util/grub-mkimagexx.c > @@ -107,6 +107,14 @@ struct section_metadata > const char *strtab; > }; > > +#define GRUB_SBAT_NOTE_NAME "Secure-Boot-Advanced-Targeting" Why cannot be it in line with PE section name, i.e. ".sbat"? > +#define GRUB_SBAT_NOTE_TYPE 0x73626174 /* "sbat" */ I think SBAT would be more appropriate here... > +struct grub_sbat_note { > + Elf32_Nhdr header; > + char name[ALIGN_UP(sizeof(GRUB_SBAT_NOTE_NAME), 4)]; > +}; > + > static int > is_relocatable (const struct grub_install_image_target_desc *image_target) > { > @@ -208,7 +216,7 @@ grub_arm_reloc_jump24 (grub_uint32_t *target, Elf32_Addr > sym_addr) > > void > SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc *image_target, > - int note, char **core_img, size_t > *core_size, > + int note, char *sbat, char **core_img, > size_t *core_size, > Elf_Addr target_addr, > struct grub_mkimage_layout *layout) > { > @@ -217,10 +225,17 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > Elf_Ehdr *ehdr; > Elf_Phdr *phdr; > Elf_Shdr *shdr; > - int header_size, footer_size = 0; > + int header_size, footer_size = 0, footer_offset = 0; > int phnum = 1; > int shnum = 4; > int string_size = sizeof (".text") + sizeof ("mods") + 1; > + char *footer; > + > + if (sbat) > + { > + phnum++; > + footer_size += ALIGN_UP (sizeof (struct grub_sbat_note) + > layout->sbat_size, 4); > + } > > if (image_target->id != IMAGE_LOONGSON_ELF) > phnum += 2; > @@ -248,6 +263,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > ehdr = (void *) elf_img; > phdr = (void *) (elf_img + sizeof (*ehdr)); > shdr = (void *) (elf_img + sizeof (*ehdr) + phnum * sizeof (*phdr)); > + footer = elf_img + program_size + header_size; > memcpy (ehdr->e_ident, ELFMAG, SELFMAG); > ehdr->e_ident[EI_CLASS] = ELFCLASSXX; > if (!image_target->bigendian) > @@ -420,6 +436,8 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > phdr->p_filesz = grub_host_to_target32 (XEN_NOTE_SIZE); > phdr->p_memsz = 0; > phdr->p_offset = grub_host_to_target32 (header_size + program_size); > + footer = ptr; > + footer_offset = XEN_NOTE_SIZE; > } > > if (image_target->id == IMAGE_XEN_PVH) > @@ -453,6 +471,8 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > 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); > + footer = ptr; > + footer_offset = XEN_PVH_NOTE_SIZE; > } > > if (note) > @@ -483,6 +503,33 @@ SUFFIX (grub_mkimage_generate_elf) (const struct > grub_install_image_target_desc > phdr->p_filesz = grub_host_to_target32 (note_size); > phdr->p_memsz = 0; > phdr->p_offset = grub_host_to_target32 (header_size + program_size); > + footer = (elf_img + program_size + header_size + note_size); > + footer_offset += note_size; > + } > + > + if (sbat) > + { > + int note_size = ALIGN_UP(sizeof (struct grub_sbat_note) + > layout->sbat_size, 4); Missing space before "(". I can see similar mistakes in other places. Please fix them too. > + struct grub_sbat_note *note_ptr = (struct grub_sbat_note *)footer; Missing space after ")". And same as above, casts formatting are broken in other places too. > + > + note_ptr->header.n_namesz = grub_host_to_target32 (sizeof > (GRUB_SBAT_NOTE_NAME)); > + note_ptr->header.n_descsz = grub_host_to_target32 > (ALIGN_UP(layout->sbat_size, 4)); > + note_ptr->header.n_type = grub_host_to_target32 (GRUB_SBAT_NOTE_TYPE); > + memcpy (note_ptr->name, GRUB_SBAT_NOTE_NAME, sizeof > (GRUB_SBAT_NOTE_NAME)); > + memcpy ((char *)(note_ptr + 1), sbat, layout->sbat_size); > + > + 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 (note_size); > + phdr->p_memsz = 0; > + phdr->p_offset = grub_host_to_target32 (header_size + program_size + > footer_offset); > + > + footer += note_size; > + footer_offset += note_size; You can drop these two lines. Daniel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel