Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/stand/efiboot Pass a hash of the MBR and the booted part...



details:   https://anonhg.NetBSD.org/src/rev/701c61c6e696
branches:  trunk
changeset: 835224:701c61c6e696
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Mon Aug 27 09:51:32 2018 +0000

description:
Pass a hash of the MBR and the booted partition to the kernel.

diffstat:

 sys/stand/efiboot/efiblock.c |  27 ++++++++++++++++++++++++---
 sys/stand/efiboot/efiblock.h |   4 +++-
 sys/stand/efiboot/efifdt.c   |  31 +++++++++++++++++++++++++++++--
 sys/stand/efiboot/exec.c     |   5 ++---
 4 files changed, 58 insertions(+), 9 deletions(-)

diffs (183 lines):

diff -r 7efe4d8e4b67 -r 701c61c6e696 sys/stand/efiboot/efiblock.c
--- a/sys/stand/efiboot/efiblock.c      Mon Aug 27 08:53:19 2018 +0000
+++ b/sys/stand/efiboot/efiblock.c      Mon Aug 27 09:51:32 2018 +0000
@@ -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 <nonaka%netbsd.org@localhost>
@@ -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 @@
        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 @@
                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 @@
                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 @@
        }
 }
 
+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 @@
 
        *file = path;
 
+       efi_block_booted = bpart;
+
        return 0;
 }
 
diff -r 7efe4d8e4b67 -r 701c61c6e696 sys/stand/efiboot/efiblock.h
--- a/sys/stand/efiboot/efiblock.h      Mon Aug 27 08:53:19 2018 +0000
+++ b/sys/stand/efiboot/efiblock.h      Mon Aug 27 09:51:32 2018 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -59,12 +59,14 @@
        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 *);
diff -r 7efe4d8e4b67 -r 701c61c6e696 sys/stand/efiboot/efifdt.c
--- a/sys/stand/efiboot/efifdt.c        Mon Aug 27 08:53:19 2018 +0000
+++ b/sys/stand/efiboot/efifdt.c        Mon Aug 27 09:51:32 2018 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -28,6 +28,7 @@
 
 #include "efiboot.h"
 #include "efifdt.h"
+#include "efiblock.h"
 
 #include <libfdt.h>
 
@@ -38,6 +39,7 @@
 #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 @@
 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);
 }
diff -r 7efe4d8e4b67 -r 701c61c6e696 sys/stand/efiboot/exec.c
--- a/sys/stand/efiboot/exec.c  Mon Aug 27 08:53:19 2018 +0000
+++ b/sys/stand/efiboot/exec.c  Mon Aug 27 09:51:32 2018 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -74,8 +74,7 @@
        close(fd);
 
        if (efi_fdt_size() > 0) {
-               if (args && *args)
-                       efi_fdt_bootargs(args);
+               efi_fdt_bootargs(args);
                efi_fdt_memory_map();   
        }
 



Home | Main Index | Thread Index | Old Index