@@ -334,6 +334,79 @@ void efi_apply_loadoptions_quirk(const void **load_options, u32 *load_options_si
334
334
* load_options_size = load_option_unpacked .optional_data_size ;
335
335
}
336
336
337
+ enum efistub_event {
338
+ EFISTUB_EVT_INITRD ,
339
+ EFISTUB_EVT_COUNT ,
340
+ };
341
+
342
+ #define STR_WITH_SIZE (s ) sizeof(s), s
343
+
344
+ static const struct {
345
+ u32 pcr_index ;
346
+ u32 event_id ;
347
+ u32 event_data_len ;
348
+ u8 event_data [52 ];
349
+ } events [] = {
350
+ [EFISTUB_EVT_INITRD ] = {
351
+ 9 ,
352
+ INITRD_EVENT_TAG_ID ,
353
+ STR_WITH_SIZE ("Linux initrd" )
354
+ },
355
+ };
356
+
357
+ static efi_status_t efi_measure_tagged_event (unsigned long load_addr ,
358
+ unsigned long load_size ,
359
+ enum efistub_event event )
360
+ {
361
+ efi_guid_t tcg2_guid = EFI_TCG2_PROTOCOL_GUID ;
362
+ efi_tcg2_protocol_t * tcg2 = NULL ;
363
+ efi_status_t status ;
364
+
365
+ efi_bs_call (locate_protocol , & tcg2_guid , NULL , (void * * )& tcg2 );
366
+ if (tcg2 ) {
367
+ struct efi_measured_event {
368
+ efi_tcg2_event_t event_data ;
369
+ efi_tcg2_tagged_event_t tagged_event ;
370
+ u8 tagged_event_data [];
371
+ } * evt ;
372
+ int size = sizeof (* evt ) + events [event ].event_data_len ;
373
+
374
+ status = efi_bs_call (allocate_pool , EFI_LOADER_DATA , size ,
375
+ (void * * )& evt );
376
+ if (status != EFI_SUCCESS )
377
+ goto fail ;
378
+
379
+ evt -> event_data = (struct efi_tcg2_event ){
380
+ .event_size = size ,
381
+ .event_header .header_size = sizeof (evt -> event_data .event_header ),
382
+ .event_header .header_version = EFI_TCG2_EVENT_HEADER_VERSION ,
383
+ .event_header .pcr_index = events [event ].pcr_index ,
384
+ .event_header .event_type = EV_EVENT_TAG ,
385
+ };
386
+
387
+ evt -> tagged_event = (struct efi_tcg2_tagged_event ){
388
+ .tagged_event_id = events [event ].event_id ,
389
+ .tagged_event_data_size = events [event ].event_data_len ,
390
+ };
391
+
392
+ memcpy (evt -> tagged_event_data , events [event ].event_data ,
393
+ events [event ].event_data_len );
394
+
395
+ status = efi_call_proto (tcg2 , hash_log_extend_event , 0 ,
396
+ load_addr , load_size , & evt -> event_data );
397
+ efi_bs_call (free_pool , evt );
398
+
399
+ if (status != EFI_SUCCESS )
400
+ goto fail ;
401
+ return EFI_SUCCESS ;
402
+ }
403
+
404
+ return EFI_UNSUPPORTED ;
405
+ fail :
406
+ efi_warn ("Failed to measure data for event %d: 0x%lx\n" , event , status );
407
+ return status ;
408
+ }
409
+
337
410
/*
338
411
* Convert the unicode UEFI command line to ASCII to pass to kernel.
339
412
* Size of memory allocated return in *cmd_line_len.
@@ -607,47 +680,6 @@ efi_status_t efi_load_initrd_cmdline(efi_loaded_image_t *image,
607
680
& initrd -> base , & initrd -> size );
608
681
}
609
682
610
- static const struct {
611
- efi_tcg2_event_t event_data ;
612
- efi_tcg2_tagged_event_t tagged_event ;
613
- u8 tagged_event_data [];
614
- } initrd_tcg2_event = {
615
- {
616
- sizeof (initrd_tcg2_event ) + sizeof ("Linux initrd" ),
617
- {
618
- sizeof (initrd_tcg2_event .event_data .event_header ),
619
- EFI_TCG2_EVENT_HEADER_VERSION ,
620
- 9 ,
621
- EV_EVENT_TAG ,
622
- },
623
- },
624
- {
625
- INITRD_EVENT_TAG_ID ,
626
- sizeof ("Linux initrd" ),
627
- },
628
- { "Linux initrd" },
629
- };
630
-
631
- static void efi_measure_initrd (unsigned long load_addr , unsigned long load_size )
632
- {
633
- efi_guid_t tcg2_guid = EFI_TCG2_PROTOCOL_GUID ;
634
- efi_tcg2_protocol_t * tcg2 = NULL ;
635
- efi_status_t status ;
636
-
637
- efi_bs_call (locate_protocol , & tcg2_guid , NULL , (void * * )& tcg2 );
638
- if (tcg2 ) {
639
- status = efi_call_proto (tcg2 , hash_log_extend_event ,
640
- 0 , load_addr , load_size ,
641
- & initrd_tcg2_event .event_data );
642
- if (status != EFI_SUCCESS )
643
- efi_warn ("Failed to measure initrd data: 0x%lx\n" ,
644
- status );
645
- else
646
- efi_info ("Measured initrd data into PCR %d\n" ,
647
- initrd_tcg2_event .event_data .event_header .pcr_index );
648
- }
649
- }
650
-
651
683
/**
652
684
* efi_load_initrd() - Load initial RAM disk
653
685
* @image: EFI loaded image protocol
@@ -671,8 +703,10 @@ efi_status_t efi_load_initrd(efi_loaded_image_t *image,
671
703
status = efi_load_initrd_dev_path (& initrd , hard_limit );
672
704
if (status == EFI_SUCCESS ) {
673
705
efi_info ("Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path\n" );
674
- if (initrd .size > 0 )
675
- efi_measure_initrd (initrd .base , initrd .size );
706
+ if (initrd .size > 0 &&
707
+ efi_measure_tagged_event (initrd .base , initrd .size ,
708
+ EFISTUB_EVT_INITRD ) == EFI_SUCCESS )
709
+ efi_info ("Measured initrd data into PCR 9\n" );
676
710
} else if (status == EFI_NOT_FOUND ) {
677
711
status = efi_load_initrd_cmdline (image , & initrd , soft_limit ,
678
712
hard_limit );
0 commit comments