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);
 }

Reply via email to