@@ -107,6 +107,14 @@ struct section_metadata
107
107
const char * strtab ;
108
108
};
109
109
110
+ #define GRUB_SBAT_NOTE_NAME ".sbat"
111
+ #define GRUB_SBAT_NOTE_TYPE 0x53424154 /* "SBAT" */
112
+
113
+ struct grub_sbat_note {
114
+ Elf32_Nhdr header ;
115
+ char name [ALIGN_UP (sizeof (GRUB_SBAT_NOTE_NAME ), 4 )];
116
+ };
117
+
110
118
static int
111
119
is_relocatable (const struct grub_install_image_target_desc * image_target )
112
120
{
@@ -208,7 +216,7 @@ grub_arm_reloc_jump24 (grub_uint32_t *target, Elf32_Addr sym_addr)
208
216
209
217
void
210
218
SUFFIX (grub_mkimage_generate_elf ) (const struct grub_install_image_target_desc * image_target ,
211
- int note , char * * core_img , size_t * core_size ,
219
+ int note , char * sbat , char * * core_img , size_t * core_size ,
212
220
Elf_Addr target_addr ,
213
221
struct grub_mkimage_layout * layout )
214
222
{
@@ -217,10 +225,17 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
217
225
Elf_Ehdr * ehdr ;
218
226
Elf_Phdr * phdr ;
219
227
Elf_Shdr * shdr ;
220
- int header_size , footer_size = 0 ;
228
+ int header_size , footer_size = 0 , footer_offset = 0 ;
221
229
int phnum = 1 ;
222
230
int shnum = 4 ;
223
231
int string_size = sizeof (".text" ) + sizeof ("mods" ) + 1 ;
232
+ char * footer ;
233
+
234
+ if (sbat )
235
+ {
236
+ phnum ++ ;
237
+ footer_size += ALIGN_UP (sizeof (struct grub_sbat_note ) + layout -> sbat_size , 4 );
238
+ }
224
239
225
240
if (image_target -> id != IMAGE_LOONGSON_ELF )
226
241
phnum += 2 ;
@@ -248,6 +263,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
248
263
ehdr = (void * ) elf_img ;
249
264
phdr = (void * ) (elf_img + sizeof (* ehdr ));
250
265
shdr = (void * ) (elf_img + sizeof (* ehdr ) + phnum * sizeof (* phdr ));
266
+ footer = elf_img + program_size + header_size ;
251
267
memcpy (ehdr -> e_ident , ELFMAG , SELFMAG );
252
268
ehdr -> e_ident [EI_CLASS ] = ELFCLASSXX ;
253
269
if (!image_target -> bigendian )
@@ -420,6 +436,8 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
420
436
phdr -> p_filesz = grub_host_to_target32 (XEN_NOTE_SIZE );
421
437
phdr -> p_memsz = 0 ;
422
438
phdr -> p_offset = grub_host_to_target32 (header_size + program_size );
439
+ footer = ptr ;
440
+ footer_offset = XEN_NOTE_SIZE ;
423
441
}
424
442
425
443
if (image_target -> id == IMAGE_XEN_PVH )
@@ -453,6 +471,8 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
453
471
phdr -> p_filesz = grub_host_to_target32 (XEN_PVH_NOTE_SIZE );
454
472
phdr -> p_memsz = 0 ;
455
473
phdr -> p_offset = grub_host_to_target32 (header_size + program_size );
474
+ footer = ptr ;
475
+ footer_offset = XEN_PVH_NOTE_SIZE ;
456
476
}
457
477
458
478
if (note )
@@ -483,6 +503,30 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc
483
503
phdr -> p_filesz = grub_host_to_target32 (note_size );
484
504
phdr -> p_memsz = 0 ;
485
505
phdr -> p_offset = grub_host_to_target32 (header_size + program_size );
506
+ footer = (elf_img + program_size + header_size + note_size );
507
+ footer_offset += note_size ;
508
+ }
509
+
510
+ if (sbat )
511
+ {
512
+ int note_size = ALIGN_UP (sizeof (struct grub_sbat_note ) + layout -> sbat_size , 4 );
513
+ struct grub_sbat_note * note_ptr = (struct grub_sbat_note * ) footer ;
514
+
515
+ note_ptr -> header .n_namesz = grub_host_to_target32 (sizeof (GRUB_SBAT_NOTE_NAME ));
516
+ note_ptr -> header .n_descsz = grub_host_to_target32 (ALIGN_UP (layout -> sbat_size , 4 ));
517
+ note_ptr -> header .n_type = grub_host_to_target32 (GRUB_SBAT_NOTE_TYPE );
518
+ memcpy (note_ptr -> name , GRUB_SBAT_NOTE_NAME , sizeof (GRUB_SBAT_NOTE_NAME ));
519
+ memcpy ((char * )(note_ptr + 1 ), sbat , layout -> sbat_size );
520
+
521
+ phdr ++ ;
522
+ phdr -> p_type = grub_host_to_target32 (PT_NOTE );
523
+ phdr -> p_flags = grub_host_to_target32 (PF_R );
524
+ phdr -> p_align = grub_host_to_target32 (image_target -> voidp_sizeof );
525
+ phdr -> p_vaddr = 0 ;
526
+ phdr -> p_paddr = 0 ;
527
+ phdr -> p_filesz = grub_host_to_target32 (note_size );
528
+ phdr -> p_memsz = 0 ;
529
+ phdr -> p_offset = grub_host_to_target32 (header_size + program_size + footer_offset );
486
530
}
487
531
488
532
{
0 commit comments