Skip to content

Commit

Permalink
multiboot2: Switch to using SLRT interface
Browse files Browse the repository at this point in the history
Signed-off-by: Sergii Dmytruk <[email protected]>
  • Loading branch information
SergiiDmytruk committed Nov 21, 2023
1 parent d77df30 commit 94c7f4f
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 19 deletions.
11 changes: 10 additions & 1 deletion grub-core/loader/i386/multiboot_mbi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -618,6 +618,8 @@ grub_multiboot_make_mbi (grub_uint32_t *target)
return err;
#endif

*size = (char *) ptrorig - (char *) mbi;

return GRUB_ERR_NONE;
}

Expand Down Expand Up @@ -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. */
}
47 changes: 42 additions & 5 deletions grub-core/loader/multiboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,23 +162,58 @@ 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();
state.edi = grub_slaunch_platform_type ();

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. */
Expand All @@ -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);
}
Expand All @@ -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;
Expand All @@ -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);

Expand Down
33 changes: 31 additions & 2 deletions grub-core/loader/multiboot_mbi2.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include <grub/i386/memory.h>
#include <grub/i386/slaunch.h>
#include <grub/i386/txt.h>
#include <grub/slr_table.h>

#if defined (GRUB_MACHINE_EFI)
#include <grub/efi/efi.h>
Expand Down Expand Up @@ -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;
Expand All @@ -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();

Expand Down Expand Up @@ -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;
Expand Down
4 changes: 3 additions & 1 deletion include/grub/multiboot.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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);
Expand Down
5 changes: 4 additions & 1 deletion include/grub/multiboot2.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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);
Expand Down
20 changes: 11 additions & 9 deletions include/grub/slr_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 94c7f4f

Please sign in to comment.