Module Name: src Committed By: skrll Date: Fri Jan 19 09:09:04 UTC 2024
Modified Files: src/sys/arch/evbarm/fdt: fdt_machdep.c src/sys/dev/fdt: fdt_boot.c fdt_boot.h Log Message: Make fdt_cpu_rootconf available for other machines/platforms. To generate a diff of this commit: cvs rdiff -u -r1.106 -r1.107 src/sys/arch/evbarm/fdt/fdt_machdep.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/fdt/fdt_boot.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/fdt/fdt_boot.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbarm/fdt/fdt_machdep.c diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.106 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.107 --- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.106 Fri Aug 4 09:06:33 2023 +++ src/sys/arch/evbarm/fdt/fdt_machdep.c Fri Jan 19 09:09:04 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_machdep.c,v 1.106 2023/08/04 09:06:33 mrg Exp $ */ +/* $NetBSD: fdt_machdep.c,v 1.107 2024/01/19 09:09:04 skrll Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.106 2023/08/04 09:06:33 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.107 2024/01/19 09:09:04 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_bootconfig.h" @@ -127,7 +127,6 @@ extern char KERNEL_BASE_phys[]; static void fdt_device_register(device_t, void *); static void fdt_device_register_post_config(device_t, void *); -static void fdt_cpu_rootconf(void); static void fdt_reset(void); static void fdt_powerdown(void); @@ -467,115 +466,6 @@ delay(u_int us) plat->fp_delay(us); } - -static void -fdt_detect_root_device(device_t dev) -{ - int error, len; - - const int chosen = OF_finddevice("/chosen"); - if (chosen < 0) - return; - - if (of_hasprop(chosen, "netbsd,mbr") && - of_hasprop(chosen, "netbsd,partition")) { - struct mbr_sector mbr; - uint8_t buf[DEV_BSIZE]; - uint8_t hash[16]; - const uint8_t *rhash; - struct vnode *vp; - MD5_CTX md5ctx; - size_t resid; - u_int part; - - /* - * The bootloader has passed in a partition index and MD5 hash - * of the MBR sector. Read the MBR of this device, calculate the - * hash, and compare it with the value passed in. - */ - rhash = fdtbus_get_prop(chosen, "netbsd,mbr", &len); - if (rhash == NULL || len != 16) - return; - of_getprop_uint32(chosen, "netbsd,partition", &part); - if (part >= MAXPARTITIONS) - return; - - vp = opendisk(dev); - if (!vp) - return; - error = vn_rdwr(UIO_READ, vp, buf, sizeof(buf), 0, UIO_SYSSPACE, - IO_NODELOCKED, NOCRED, &resid, NULL); - VOP_CLOSE(vp, FREAD, NOCRED); - vput(vp); - - if (error != 0) - return; - - memcpy(&mbr, buf, sizeof(mbr)); - MD5Init(&md5ctx); - MD5Update(&md5ctx, (void *)&mbr, sizeof(mbr)); - MD5Final(hash, &md5ctx); - - if (memcmp(rhash, hash, 16) == 0) { - booted_device = dev; - booted_partition = part; - } - - return; - } - - if (of_hasprop(chosen, "netbsd,gpt-guid")) { - const struct uuid *guid = - fdtbus_get_prop(chosen, "netbsd,gpt-guid", &len); - - if (guid == NULL || len != 16) - return; - - char guidstr[UUID_STR_LEN]; - uuid_snprintf(guidstr, sizeof(guidstr), guid); - - device_t dv = dkwedge_find_by_wname(guidstr); - if (dv != NULL) - booted_device = dv; - - return; - } - - if (of_hasprop(chosen, "netbsd,gpt-label")) { - const char *label = fdtbus_get_string(chosen, "netbsd,gpt-label"); - if (label == NULL || *label == '\0') - return; - - device_t dv = dkwedge_find_by_wname(label); - if (dv != NULL) - booted_device = dv; - - return; - } - - if (of_hasprop(chosen, "netbsd,booted-mac-address")) { - const uint8_t *macaddr = - fdtbus_get_prop(chosen, "netbsd,booted-mac-address", &len); - struct ifnet *ifp; - - if (macaddr == NULL || len != 6) - return; - - int s = pserialize_read_enter(); - IFNET_READER_FOREACH(ifp) { - if (memcmp(macaddr, CLLADDR(ifp->if_sadl), len) == 0) { - device_t dv = device_find_by_xname(ifp->if_xname); - if (dv != NULL) - booted_device = dv; - break; - } - } - pserialize_read_exit(s); - - return; - } -} - static void fdt_device_register(device_t self, void *aux) { @@ -617,27 +507,6 @@ fdt_device_register_post_config(device_t } static void -fdt_cpu_rootconf(void) -{ - device_t dev; - deviter_t di; - - if (booted_device != NULL) - return; - - for (dev = deviter_first(&di, 0); dev; dev = deviter_next(&di)) { - if (device_class(dev) != DV_DISK) - continue; - - fdt_detect_root_device(dev); - - if (booted_device != NULL) - break; - } - deviter_release(&di); -} - -static void fdt_reset(void) { const struct fdt_platform *plat = fdt_platform_find(); Index: src/sys/dev/fdt/fdt_boot.c diff -u src/sys/dev/fdt/fdt_boot.c:1.4 src/sys/dev/fdt/fdt_boot.c:1.5 --- src/sys/dev/fdt/fdt_boot.c:1.4 Tue Jul 11 05:57:44 2023 +++ src/sys/dev/fdt/fdt_boot.c Fri Jan 19 09:09:04 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_boot.c,v 1.4 2023/07/11 05:57:44 skrll Exp $ */ +/* $NetBSD: fdt_boot.c,v 1.5 2024/01/19 09:09:04 skrll Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fdt_boot.c,v 1.4 2023/07/11 05:57:44 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fdt_boot.c,v 1.5 2024/01/19 09:09:04 skrll Exp $"); #include "opt_efi.h" #include "opt_md.h" @@ -393,3 +393,132 @@ fdt_update_stdout_path(void *fdt, const fdt_setprop(fdt, chosen_off, "stdout-path", buf, stdout_path_len + 1); } + +static void +fdt_detect_root_device(device_t dev) +{ + int error, len; + + const int chosen = OF_finddevice("/chosen"); + if (chosen < 0) + return; + + if (of_hasprop(chosen, "netbsd,mbr") && + of_hasprop(chosen, "netbsd,partition")) { + struct mbr_sector mbr; + uint8_t buf[DEV_BSIZE]; + uint8_t hash[16]; + const uint8_t *rhash; + struct vnode *vp; + MD5_CTX md5ctx; + size_t resid; + u_int part; + + /* + * The bootloader has passed in a partition index and MD5 hash + * of the MBR sector. Read the MBR of this device, calculate the + * hash, and compare it with the value passed in. + */ + rhash = fdtbus_get_prop(chosen, "netbsd,mbr", &len); + if (rhash == NULL || len != 16) + return; + of_getprop_uint32(chosen, "netbsd,partition", &part); + if (part >= MAXPARTITIONS) + return; + + vp = opendisk(dev); + if (!vp) + return; + error = vn_rdwr(UIO_READ, vp, buf, sizeof(buf), 0, UIO_SYSSPACE, + IO_NODELOCKED, NOCRED, &resid, NULL); + VOP_CLOSE(vp, FREAD, NOCRED); + vput(vp); + + if (error != 0) + return; + + memcpy(&mbr, buf, sizeof(mbr)); + MD5Init(&md5ctx); + MD5Update(&md5ctx, (void *)&mbr, sizeof(mbr)); + MD5Final(hash, &md5ctx); + + if (memcmp(rhash, hash, 16) == 0) { + booted_device = dev; + booted_partition = part; + } + + return; + } + + if (of_hasprop(chosen, "netbsd,gpt-guid")) { + const struct uuid *guid = + fdtbus_get_prop(chosen, "netbsd,gpt-guid", &len); + + if (guid == NULL || len != 16) + return; + + char guidstr[UUID_STR_LEN]; + uuid_snprintf(guidstr, sizeof(guidstr), guid); + + device_t dv = dkwedge_find_by_wname(guidstr); + if (dv != NULL) + booted_device = dv; + + return; + } + + if (of_hasprop(chosen, "netbsd,gpt-label")) { + const char *label = fdtbus_get_string(chosen, "netbsd,gpt-label"); + if (label == NULL || *label == '\0') + return; + + device_t dv = dkwedge_find_by_wname(label); + if (dv != NULL) + booted_device = dv; + + return; + } + + if (of_hasprop(chosen, "netbsd,booted-mac-address")) { + const uint8_t *macaddr = + fdtbus_get_prop(chosen, "netbsd,booted-mac-address", &len); + struct ifnet *ifp; + + if (macaddr == NULL || len != 6) + return; + + int s = pserialize_read_enter(); + IFNET_READER_FOREACH(ifp) { + if (memcmp(macaddr, CLLADDR(ifp->if_sadl), len) == 0) { + device_t dv = device_find_by_xname(ifp->if_xname); + if (dv != NULL) + booted_device = dv; + break; + } + } + pserialize_read_exit(s); + + return; + } +} + +void +fdt_cpu_rootconf(void) +{ + device_t dev; + deviter_t di; + + if (booted_device != NULL) + return; + + for (dev = deviter_first(&di, 0); dev; dev = deviter_next(&di)) { + if (device_class(dev) != DV_DISK) + continue; + + fdt_detect_root_device(dev); + + if (booted_device != NULL) + break; + } + deviter_release(&di); +} Index: src/sys/dev/fdt/fdt_boot.h diff -u src/sys/dev/fdt/fdt_boot.h:1.3 src/sys/dev/fdt/fdt_boot.h:1.4 --- src/sys/dev/fdt/fdt_boot.h:1.3 Mon Jul 10 07:01:48 2023 +++ src/sys/dev/fdt/fdt_boot.h Fri Jan 19 09:09:04 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: fdt_boot.h,v 1.3 2023/07/10 07:01:48 rin Exp $ */ +/* $NetBSD: fdt_boot.h,v 1.4 2024/01/19 09:09:04 skrll Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -49,6 +49,7 @@ void fdt_reserve_rndseed(void); void fdt_probe_efirng(void); void fdt_setup_efirng(void); void fdt_reserve_efirng(void); +void fdt_cpu_rootconf(void); void fdt_update_stdout_path(void *, const char *);