Module Name: src Committed By: jmcneill Date: Mon Aug 27 09:51:32 UTC 2018
Modified Files: src/sys/stand/efiboot: efiblock.c efiblock.h efifdt.c exec.c Log Message: Pass a hash of the MBR and the booted partition to the kernel. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/stand/efiboot/efiblock.c \ src/sys/stand/efiboot/efiblock.h src/sys/stand/efiboot/exec.c cvs rdiff -u -r1.2 -r1.3 src/sys/stand/efiboot/efifdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/stand/efiboot/efiblock.c diff -u src/sys/stand/efiboot/efiblock.c:1.1 src/sys/stand/efiboot/efiblock.c:1.2 --- src/sys/stand/efiboot/efiblock.c:1.1 Sun Aug 26 21:28:18 2018 +++ src/sys/stand/efiboot/efiblock.c Mon Aug 27 09:51:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.c,v 1.1 2018/08/26 21:28:18 jmcneill Exp $ */ +/* $NetBSD: efiblock.c,v 1.2 2018/08/27 09:51:32 jmcneill Exp $ */ /*- * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org> @@ -30,12 +30,14 @@ #define FSTYPENAMES #include <sys/param.h> +#include <sys/md5.h> #include "efiboot.h" #include "efiblock.h" static EFI_HANDLE *efi_block; static UINTN efi_nblock; +static struct efi_block_part *efi_block_booted = NULL; static TAILQ_HEAD(, efi_block_dev) efi_block_devs = TAILQ_HEAD_INITIALIZER(efi_block_devs); @@ -85,8 +87,18 @@ efi_block_parse(const char *fname, struc return ENOENT; } +static void +efi_block_generate_hash_mbr(struct efi_block_part *bpart, struct mbr_sector *mbr) +{ + MD5_CTX md5ctx; + + MD5Init(&md5ctx); + MD5Update(&md5ctx, (void *)mbr, sizeof(*mbr)); + MD5Final(bpart->hash, &md5ctx); +} + static int -efi_block_find_partitions_disklabel(struct efi_block_dev *bdev, uint32_t start, uint32_t size) +efi_block_find_partitions_disklabel(struct efi_block_dev *bdev, struct mbr_sector *mbr, uint32_t start, uint32_t size) { struct efi_block_part *bpart; struct disklabel d; @@ -133,6 +145,7 @@ efi_block_find_partitions_disklabel(stru bpart->type = EFI_BLOCK_PART_DISKLABEL; bpart->disklabel.secsize = le32toh(d.d_secsize); bpart->disklabel.part = *p; + efi_block_generate_hash_mbr(bpart, mbr); TAILQ_INSERT_TAIL(&bdev->partitions, bpart, entries); } @@ -171,7 +184,7 @@ efi_block_find_partitions_mbr(struct efi if (le32toh(mbr_part->mbrp_size) == 0) continue; if (mbr_part->mbrp_type == MBR_PTYPE_NETBSD) { - efi_block_find_partitions_disklabel(bdev, le32toh(mbr_part->mbrp_start), le32toh(mbr_part->mbrp_size)); + efi_block_find_partitions_disklabel(bdev, &mbr, le32toh(mbr_part->mbrp_start), le32toh(mbr_part->mbrp_size)); break; } } @@ -278,6 +291,12 @@ efi_block_show(void) } } +struct efi_block_part * +efi_block_boot_part(void) +{ + return efi_block_booted; +} + int efi_block_open(struct open_file *f, ...) { @@ -309,6 +328,8 @@ efi_block_open(struct open_file *f, ...) *file = path; + efi_block_booted = bpart; + return 0; } Index: src/sys/stand/efiboot/efiblock.h diff -u src/sys/stand/efiboot/efiblock.h:1.1 src/sys/stand/efiboot/efiblock.h:1.2 --- src/sys/stand/efiboot/efiblock.h:1.1 Sun Aug 26 21:28:18 2018 +++ src/sys/stand/efiboot/efiblock.h Mon Aug 27 09:51:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efiblock.h,v 1.1 2018/08/26 21:28:18 jmcneill Exp $ */ +/* $NetBSD: efiblock.h,v 1.2 2018/08/27 09:51:32 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -59,12 +59,14 @@ struct efi_block_part { union { struct efi_block_part_disklabel disklabel; }; + uint8_t hash[16]; TAILQ_ENTRY(efi_block_part) entries; }; void efi_block_probe(void); void efi_block_show(void); +struct efi_block_part *efi_block_boot_part(void); int efi_block_open(struct open_file *, ...); int efi_block_close(struct open_file *); Index: src/sys/stand/efiboot/exec.c diff -u src/sys/stand/efiboot/exec.c:1.1 src/sys/stand/efiboot/exec.c:1.2 --- src/sys/stand/efiboot/exec.c:1.1 Fri Aug 24 02:01:06 2018 +++ src/sys/stand/efiboot/exec.c Mon Aug 27 09:51:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: exec.c,v 1.1 2018/08/24 02:01:06 jmcneill Exp $ */ +/* $NetBSD: exec.c,v 1.2 2018/08/27 09:51:32 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -74,8 +74,7 @@ exec_netbsd(const char *fname, const cha close(fd); if (efi_fdt_size() > 0) { - if (args && *args) - efi_fdt_bootargs(args); + efi_fdt_bootargs(args); efi_fdt_memory_map(); } Index: src/sys/stand/efiboot/efifdt.c diff -u src/sys/stand/efiboot/efifdt.c:1.2 src/sys/stand/efiboot/efifdt.c:1.3 --- src/sys/stand/efiboot/efifdt.c:1.2 Fri Aug 24 23:20:41 2018 +++ src/sys/stand/efiboot/efifdt.c Mon Aug 27 09:51:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efifdt.c,v 1.2 2018/08/24 23:20:41 jmcneill Exp $ */ +/* $NetBSD: efifdt.c,v 1.3 2018/08/27 09:51:32 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -28,6 +28,7 @@ #include "efiboot.h" #include "efifdt.h" +#include "efiblock.h" #include <libfdt.h> @@ -38,6 +39,7 @@ static EFI_GUID FdtTableGuid = FDT_TABLE #define FDT_MEMORY_NODE_PATH "/memory" #define FDT_MEMORY_NODE_NAME "memory" #define FDT_CHOSEN_NODE_PATH "/chosen" +#define FDT_CHOSEN_NODE_NAME "chosen" #define FDT_MEMORY_USABLE(_md) \ ((_md)->Type == EfiLoaderCode || (_md)->Type == EfiLoaderData || \ @@ -140,5 +142,30 @@ efi_fdt_memory_map(void) void efi_fdt_bootargs(const char *bootargs) { - fdt_setprop_string(fdt_data, fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH), "bootargs", bootargs); + struct efi_block_part *bpart = efi_block_boot_part(); + int chosen; + + chosen = fdt_path_offset(fdt_data, FDT_CHOSEN_NODE_PATH); + if (chosen < 0) + chosen = fdt_add_subnode(fdt_data, fdt_path_offset(fdt_data, "/"), FDT_CHOSEN_NODE_NAME); + if (chosen < 0) + panic("FDT: Failed to craete " FDT_CHOSEN_NODE_PATH " node"); + + if (*bootargs) + fdt_setprop_string(fdt_data, chosen, "bootargs", bootargs); + + if (bpart) { + switch (bpart->type) { + case EFI_BLOCK_PART_DISKLABEL: + fdt_setprop(fdt_data, chosen, "netbsd,mbr", + bpart->hash, sizeof(bpart->hash)); + fdt_setprop_u32(fdt_data, chosen, "netbsd,partition", + bpart->index); + break; + default: + break; + } + } + + fdt_pack(fdt_data); }