Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions grub-core/loader/i386/linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ static grub_efi_uintn_t efi_mmap_size;
#else
static const grub_size_t efi_mmap_size = 0;
#endif
static grub_err_t (*grub_slaunch_func) (struct grub_slaunch_params*) = NULL;
static grub_err_t (*grub_slaunch_func) (struct grub_slaunch_params*, grub_uint64_t *) = NULL;
static struct grub_slaunch_params slparams;

/* FIXME */
Expand All @@ -100,7 +100,7 @@ static struct idt_descriptor idt_desc =
#endif

void
grub_linux_slaunch_set (grub_err_t (*sfunc) (struct grub_slaunch_params*))
grub_linux_slaunch_set (grub_err_t (*sfunc) (struct grub_slaunch_params*, grub_uint64_t *))
{
grub_slaunch_func = sfunc;
}
Expand Down Expand Up @@ -632,7 +632,7 @@ grub_linux_boot (void)
slparams.real_mode_target = ctx.real_mode_target;
slparams.prot_mode_target = prot_mode_target;
slparams.relocator = relocator;
return grub_slaunch_func (&slparams);
return grub_slaunch_func (&slparams, &ctx.params->setup_data);
}

/* FIXME. */
Expand Down
68 changes: 56 additions & 12 deletions grub-core/loader/i386/slaunch_skinit.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ get_drtm_acpi_table (void)
/* Tags with no particular class */
#define LZ_TAG_NO_CLASS 0x00
#define LZ_TAG_END 0x00
#define LZ_TAG_UNAWARE_OS 0x01
#define LZ_TAG_SETUP_INDIRECT 0x01
#define LZ_TAG_TAGS_SIZE 0x0F /* Always first */

/* Tags specifying kernel type */
Expand Down Expand Up @@ -171,6 +171,27 @@ struct lz_tag_hash {
grub_uint8_t digest[];
} __attribute__ (( packed ));

/* extensible setup indirect data node */
struct setup_indirect {
grub_uint32_t type;
grub_uint32_t reserved; /* Reserved, must be set to zero. */
grub_uint64_t len;
grub_uint64_t addr;
} __attribute__ (( packed ));

/* extensible setup data list node */
struct setup_data {
grub_uint64_t next;
grub_uint32_t type;
grub_uint32_t len;
struct setup_indirect indirect;
} __attribute__ (( packed ));

struct lz_tag_setup_indirect {
struct lz_tag_hdr hdr;
struct setup_data data;
} __attribute__ (( packed ));

static inline struct lz_tag_tags_size *get_bootloader_data_addr (
struct grub_slaunch_module *mod)
{
Expand All @@ -184,18 +205,20 @@ static inline void *next_tag(struct lz_tag_tags_size *tags)
}

grub_err_t
grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams)
grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams,
grub_uint64_t *old_setup_data)
{
if (grub_slaunch_get_modules()) {
grub_uint64_t phys_base = grub_slaunch_get_modules()->target;
struct lz_tag_tags_size *tags = get_bootloader_data_addr(grub_slaunch_get_modules());
grub_uint32_t *apic = (grub_uint32_t *)0xfee00300ULL;
struct drtm_t *drtm = get_drtm_acpi_table();

grub_dprintf ("slaunch", "real_mode_target: 0x%x\r\n",
grub_printf ("real_mode_target: 0x%x\r\n",
slparams->real_mode_target);
grub_dprintf ("slaunch", "prot_mode_target: 0x%x\r\n",
grub_printf ("prot_mode_target: 0x%x\r\n",
slparams->prot_mode_target);
grub_dprintf ("slaunch", "params: %p\r\n", slparams->params);
grub_printf ("params: %p\r\n", slparams->params);

/* Tags header */
tags->hdr.type = LZ_TAG_TAGS_SIZE;
Expand All @@ -204,7 +227,7 @@ grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams)

/* Hashes of LZ */
{
grub_uint8_t buff[GRUB_MD_SHA256->contextsize]; /* SHA1 ctx is smaller */
grub_uint8_t buff[64]; /* SHA1 ctx is smaller */
struct lz_tag_hash *h = next_tag(tags);
h->hdr.type = LZ_TAG_LZ_HASH;
h->hdr.len = sizeof(struct lz_tag_hash) + GRUB_MD_SHA256->mdlen;
Expand Down Expand Up @@ -244,24 +267,45 @@ grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams)
tags->size += e->hdr.len;
}

if (1) {
grub_printf("%s:%d\n", __func__, __LINE__);
struct lz_tag_setup_indirect *i = next_tag(tags);
i->hdr.type = LZ_TAG_SETUP_INDIRECT;
i->hdr.len = sizeof(struct lz_tag_setup_indirect);
grub_printf("%s:%d\n", __func__, __LINE__);
i->data.next = *old_setup_data;
grub_printf("%s:%d\n", __func__, __LINE__);
i->data.type = (1 << 31);
i->data.len = sizeof(struct setup_indirect);
i->data.indirect.type = (1 << 31) | 7;
i->data.indirect.addr = phys_base;
i->data.indirect.len = 0x10000;
grub_printf("%s:%d\n", __func__, __LINE__);
tags->size += i->hdr.len;
grub_printf("%s:%d\n", __func__, __LINE__);
*old_setup_data = (grub_uint64_t) phys_base + ((grub_addr_t)&i->data - (grub_addr_t)grub_slaunch_get_modules()->addr);
grub_printf("%s:%d\n", __func__, __LINE__);
}


/* Mark end of tags */
struct lz_tag_hdr *end = next_tag(tags);
end->type = LZ_TAG_END;
end->len = sizeof(struct lz_tag_hdr);
tags->size += end->len;

grub_dprintf ("slaunch", "broadcasting INIT\r\n");
grub_printf ("broadcasting INIT\r\n");
*apic = 0x000c0500; // INIT, all excluding self

grub_dprintf ("slaunch", "grub_tis_init\r\n");
grub_printf ("grub_tis_init\r\n");
grub_tis_init();
grub_dprintf ("slaunch", "grub_tis_request_locality\r\n");
grub_printf ("grub_tis_request_locality\r\n");
grub_tis_request_locality(0xff); // relinquish all localities

grub_dprintf("slaunch", "Invoke SKINIT\r\n");
grub_printf("Invoke SKINIT\r\n");
return grub_relocator_skinit_boot (slparams->relocator, grub_slaunch_get_modules()->target, 0);
} else {
grub_dprintf("slaunch", "Secure Loader module not loaded, run slaunch_module\r\n");
grub_printf("Secure Loader module not loaded, run slaunch_module\r\n");
}
return GRUB_ERR_NONE;
}
Expand All @@ -280,7 +324,7 @@ grub_slaunch_mb2_boot (struct grub_relocator *rel, struct grub_relocator32_state

/* Hashes of LZ */
{
grub_uint8_t buff[GRUB_MD_SHA256->contextsize]; /* SHA1 ctx is smaller */
grub_uint8_t buff[64]; /* SHA1 ctx is smaller */
struct lz_tag_hash *h = next_tag(tags);
h->hdr.type = LZ_TAG_LZ_HASH;
h->hdr.len = sizeof(struct lz_tag_hash) + GRUB_MD_SHA256->mdlen;
Expand Down
3 changes: 2 additions & 1 deletion grub-core/loader/i386/slaunch_txt.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@
#include <grub/slaunch.h>

grub_err_t
grub_slaunch_boot_txt (struct grub_slaunch_params *slparams)
grub_slaunch_boot_txt (struct grub_slaunch_params *slparams, grub_uint64_t *unused)
{
slparams = slparams;
unused = unused;

return GRUB_ERR_NONE;
}
6 changes: 3 additions & 3 deletions include/grub/slaunch.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,10 @@ struct grub_slaunch_module

struct grub_slaunch_module *grub_slaunch_get_modules (void);

grub_err_t grub_slaunch_boot_txt (struct grub_slaunch_params *slparams);
grub_err_t grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams);
grub_err_t grub_slaunch_boot_txt (struct grub_slaunch_params *slparams, grub_uint64_t *unused);
grub_err_t grub_slaunch_boot_skinit (struct grub_slaunch_params *slparams, grub_uint64_t *old_setup_data);
grub_err_t grub_slaunch_mb2_boot (struct grub_relocator *rel, struct grub_relocator32_state state);

void grub_linux_slaunch_set (grub_err_t (*sfunc) (struct grub_slaunch_params*));
void grub_linux_slaunch_set (grub_err_t (*sfunc) (struct grub_slaunch_params*, grub_uint64_t *));

#endif