diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c index a67d9d0a8..71416459c 100644 --- a/grub-core/loader/i386/multiboot_mbi.c +++ b/grub-core/loader/i386/multiboot_mbi.c @@ -450,7 +450,7 @@ retrieve_video_parameters (struct multiboot_info *mbi, } grub_err_t -grub_multiboot_make_mbi (grub_uint32_t *target) +grub_multiboot_make_mbi (grub_uint32_t *target, grub_uint32_t *size) { struct multiboot_info *mbi; struct multiboot_mod_list *modlist; @@ -618,6 +618,8 @@ grub_multiboot_make_mbi (grub_uint32_t *target) return err; #endif + *size = (char *) ptrorig - (char *) mbi; + return GRUB_ERR_NONE; } @@ -754,3 +756,10 @@ grub_multiboot_set_bootdev (void) | ((part & 0xff) << 8) | 0xff; bootdev_set = 1; } + +void grub_multiboot_setup_slr_table ( + grub_uint32_t mbi_target __attribute__ ((unused)), + grub_uint32_t mbi_size __attribute__ ((unused))) +{ + /* Secure launch is not supported by Multiboot1. */ +} diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c index 47fa6faa6..a3994065f 100644 --- a/grub-core/loader/multiboot.c +++ b/grub-core/loader/multiboot.c @@ -162,8 +162,35 @@ efi_boot (struct grub_relocator *rel __attribute__ ((unused)), #endif #if defined (__i386__) || defined (__x86_64__) +static grub_err_t +grub_multiboot_init_slparams (struct grub_slaunch_params *slparams) +{ + grub_err_t err; + grub_relocator_chunk_t ch; + + err = grub_relocator_alloc_chunk_align (GRUB_MULTIBOOT (relocator), &ch, + 0x1000000, + 0xffffffff - GRUB_PAGE_SIZE, + GRUB_PAGE_SIZE, GRUB_PAGE_SIZE, + GRUB_RELOCATOR_PREFERENCE_NONE, 1); + if (err) + return grub_error (err, N_("Cannot allocate memory for SLR table")); + + slparams->slr_table_base = get_physical_target_address (ch); + slparams->slr_table_size = GRUB_PAGE_SIZE; + slparams->slr_table_mem = get_virtual_current_address (ch); + + grub_memset (slparams->slr_table_mem, 0, slparams->slr_table_size); + + grub_dprintf ("multiboot_loader", "slr_table_base = %lx, slr_table_size = %x\n", + (unsigned long) slparams->slr_table_base, + (unsigned) slparams->slr_table_size); + return GRUB_ERR_NONE; +} + static void -normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state) +normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state, + grub_uint32_t mbi_size) { grub_err_t err; struct grub_slaunch_params *slparams = grub_slaunch_params(); @@ -171,14 +198,22 @@ normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state) if (state.edi == SLP_INTEL_TXT) { - err = grub_txt_boot_prepare (slparams); + err = grub_multiboot_init_slparams (slparams); + if (err != GRUB_ERR_NONE) + { + grub_printf ("Initializing slaunch parameters failed"); + return; + } + err = grub_txt_boot_prepare (slparams); if (err != GRUB_ERR_NONE) { grub_printf ("TXT boot preparation failed"); return; } + GRUB_MULTIBOOT (setup_slr_table) (state.MULTIBOOT_MBI_REGISTER, mbi_size); + grub_slaunch_finish_slr_table (); /* Configure relocator GETSEC[SENTER] call. */ @@ -192,7 +227,8 @@ normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state) } #else static void -normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state) +normal_boot (struct grub_relocator *rel, struct grub_relocator32_state state, + grub_uint32_t mbi_size __attribute__ ((unused))) { grub_relocator32_boot (rel, state); } @@ -202,6 +238,7 @@ static grub_err_t grub_multiboot_boot (void) { grub_err_t err; + grub_uint32_t mbi_size; #ifdef GRUB_USE_MULTIBOOT2 struct grub_relocator32_state state = MULTIBOOT2_INITIAL_STATE; @@ -210,13 +247,13 @@ grub_multiboot_boot (void) #endif state.MULTIBOOT_ENTRY_REGISTER = GRUB_MULTIBOOT (payload_eip); - err = GRUB_MULTIBOOT (make_mbi) (&state.MULTIBOOT_MBI_REGISTER); + err = GRUB_MULTIBOOT (make_mbi) (&state.MULTIBOOT_MBI_REGISTER, &mbi_size); if (err) return err; if (grub_efi_is_finished) - normal_boot (GRUB_MULTIBOOT (relocator), state); + normal_boot (GRUB_MULTIBOOT (relocator), state, mbi_size); else efi_boot (GRUB_MULTIBOOT (relocator), state.MULTIBOOT_MBI_REGISTER); diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c index eb617083f..910abf3ae 100644 --- a/grub-core/loader/multiboot_mbi2.c +++ b/grub-core/loader/multiboot_mbi2.c @@ -39,6 +39,7 @@ #include #include #include +#include #if defined (GRUB_MACHINE_EFI) #include @@ -734,8 +735,33 @@ retrieve_video_parameters (grub_properly_aligned_t **ptrorig) return GRUB_ERR_NONE; } +void +grub_multiboot2_setup_slr_table (grub_uint32_t mbi_target, + grub_uint32_t mbi_size) +{ + unsigned i; + struct module *mod; + + grub_slaunch_add_slrt_policy_entry (18, + GRUB_SLR_ET_MULTIBOOT_INFO, + /*flags=*/0, + mbi_target, + mbi_size, + "Measured MB2 information"); + + for (i = 0, mod = modules; i < modcnt; i++, mod = mod->next) + { + grub_slaunch_add_slrt_policy_entry (17, + GRUB_SLR_ET_MULTIBOOT_MODULE, + /*flags=*/0, + mod->start, + mod->size, + "Measured MB2 module"); + } +} + grub_err_t -grub_multiboot2_make_mbi (grub_uint32_t *target) +grub_multiboot2_make_mbi (grub_uint32_t *target, grub_uint32_t *size) { grub_properly_aligned_t *ptrorig; grub_properly_aligned_t *mbistart; @@ -755,6 +781,7 @@ grub_multiboot2_make_mbi (grub_uint32_t *target) return err; ptrorig = get_virtual_current_address (ch); + #if defined (__i386__) || defined (__x86_64__) struct grub_slaunch_params *slparams = grub_slaunch_params(); @@ -1041,7 +1068,9 @@ grub_multiboot2_make_mbi (grub_uint32_t *target) / sizeof (grub_properly_aligned_t); } - ((grub_uint32_t *) mbistart)[0] = (char *) ptrorig - (char *) mbistart; + *size = (char *) ptrorig - (char *) mbistart; + + ((grub_uint32_t *) mbistart)[0] = *size; ((grub_uint32_t *) mbistart)[1] = 0; return GRUB_ERR_NONE; diff --git a/include/grub/multiboot.h b/include/grub/multiboot.h index bd0a9873e..66df591eb 100644 --- a/include/grub/multiboot.h +++ b/include/grub/multiboot.h @@ -41,7 +41,7 @@ void grub_multiboot (int argc, char *argv[]); void grub_module (int argc, char *argv[]); void grub_multiboot_set_accepts_video (int val); -grub_err_t grub_multiboot_make_mbi (grub_uint32_t *target); +grub_err_t grub_multiboot_make_mbi (grub_uint32_t *target, grub_uint32_t *size); void grub_multiboot_free_mbi (void); grub_err_t grub_multiboot_init_mbi (int argc, char *argv[]); grub_err_t grub_multiboot_add_module (grub_addr_t start, grub_size_t size, @@ -50,6 +50,8 @@ void grub_multiboot_set_bootdev (void); void grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize, unsigned shndx, void *data); +void grub_multiboot_setup_slr_table (grub_uint32_t mbi_target, + grub_uint32_t size); grub_uint32_t grub_multiboot_get_mmap_count (void); grub_err_t grub_multiboot_set_video_mode (void); diff --git a/include/grub/multiboot2.h b/include/grub/multiboot2.h index 502d34ef1..ca451621a 100644 --- a/include/grub/multiboot2.h +++ b/include/grub/multiboot2.h @@ -33,7 +33,8 @@ void grub_multiboot2 (int argc, char *argv[]); void grub_module2 (int argc, char *argv[]); void grub_multiboot2_set_accepts_video (int val); -grub_err_t grub_multiboot2_make_mbi (grub_uint32_t *target); +grub_err_t grub_multiboot2_make_mbi (grub_uint32_t *target, + grub_uint32_t *size); void grub_multiboot2_free_mbi (void); grub_err_t grub_multiboot2_init_mbi (int argc, char *argv[]); grub_err_t grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, @@ -42,6 +43,8 @@ void grub_multiboot2_set_bootdev (void); void grub_multiboot2_add_elfsyms (grub_size_t num, grub_size_t entsize, unsigned shndx, void *data); +void grub_multiboot2_setup_slr_table (grub_uint32_t mbi_target, + grub_uint32_t mbi_size); grub_uint32_t grub_multiboot2_get_mmap_count (void); grub_err_t grub_multiboot2_set_video_mode (void); diff --git a/include/grub/slr_table.h b/include/grub/slr_table.h index 9e9f90ad6..5fe2b0ce4 100644 --- a/include/grub/slr_table.h +++ b/include/grub/slr_table.h @@ -65,15 +65,17 @@ #define GRUB_SLR_ENTRY_END 0xffff /* Entity Types */ -#define GRUB_SLR_ET_UNSPECIFIED 0x0000 -#define GRUB_SLR_ET_SLRT 0x0001 -#define GRUB_SLR_ET_BOOT_PARAMS 0x0002 -#define GRUB_SLR_ET_SETUP_DATA 0x0003 -#define GRUB_SLR_ET_CMDLINE 0x0004 -#define GRUB_SLR_ET_UEFI_MEMMAP 0x0005 -#define GRUB_SLR_ET_RAMDISK 0x0006 -#define GRUB_SLR_ET_TXT_OS2MLE 0x0010 -#define GRUB_SLR_ET_UNUSED 0xffff +#define GRUB_SLR_ET_UNSPECIFIED 0x0000 +#define GRUB_SLR_ET_SLRT 0x0001 +#define GRUB_SLR_ET_BOOT_PARAMS 0x0002 +#define GRUB_SLR_ET_SETUP_DATA 0x0003 +#define GRUB_SLR_ET_CMDLINE 0x0004 +#define GRUB_SLR_ET_UEFI_MEMMAP 0x0005 +#define GRUB_SLR_ET_RAMDISK 0x0006 +#define GRUB_SLR_ET_MULTIBOOT_INFO 0x0007 +#define GRUB_SLR_ET_MULTIBOOT_MODULE 0x0008 +#define GRUB_SLR_ET_TXT_OS2MLE 0x0010 +#define GRUB_SLR_ET_UNUSED 0xffff /* * Primary SLR Table Header