Module Name: src Committed By: mlelstv Date: Sun Jun 10 17:05:19 UTC 2012
Modified Files: src/sys/arch/sparc64/sparc64: autoconf.c src/sys/arch/x86/x86: x86_autoconf.c src/sys/arch/xen/x86: autoconf.c src/sys/dev/dkwedge: dk.c src/sys/kern: init_main.c kern_subr.c src/sys/sys: device.h disk.h Log Message: Make detection of root on wedges (dk(4)) machine independent. Remove MD code for x86, xen, sparc64. To generate a diff of this commit: cvs rdiff -u -r1.186 -r1.187 src/sys/arch/sparc64/sparc64/autoconf.c cvs rdiff -u -r1.62 -r1.63 src/sys/arch/x86/x86/x86_autoconf.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/xen/x86/autoconf.c cvs rdiff -u -r1.63 -r1.64 src/sys/dev/dkwedge/dk.c cvs rdiff -u -r1.442 -r1.443 src/sys/kern/init_main.c cvs rdiff -u -r1.212 -r1.213 src/sys/kern/kern_subr.c cvs rdiff -u -r1.140 -r1.141 src/sys/sys/device.h cvs rdiff -u -r1.56 -r1.57 src/sys/sys/disk.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/sparc64/sparc64/autoconf.c diff -u src/sys/arch/sparc64/sparc64/autoconf.c:1.186 src/sys/arch/sparc64/sparc64/autoconf.c:1.187 --- src/sys/arch/sparc64/sparc64/autoconf.c:1.186 Mon May 28 19:24:30 2012 +++ src/sys/arch/sparc64/sparc64/autoconf.c Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.186 2012/05/28 19:24:30 martin Exp $ */ +/* $NetBSD: autoconf.c,v 1.187 2012/06/10 17:05:18 mlelstv Exp $ */ /* * Copyright (c) 1996 @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.186 2012/05/28 19:24:30 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.187 2012/06/10 17:05:18 mlelstv Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -508,10 +508,7 @@ cpu_rootconf(void) return; } - if (config_handle_wedges(booted_device, booted_partition) == 0) - setroot(booted_wedge, 0); - else - setroot(booted_device, booted_partition); + setroot(booted_device, booted_partition); } char * Index: src/sys/arch/x86/x86/x86_autoconf.c diff -u src/sys/arch/x86/x86/x86_autoconf.c:1.62 src/sys/arch/x86/x86/x86_autoconf.c:1.63 --- src/sys/arch/x86/x86/x86_autoconf.c:1.62 Tue Oct 18 23:43:36 2011 +++ src/sys/arch/x86/x86/x86_autoconf.c Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: x86_autoconf.c,v 1.62 2011/10/18 23:43:36 dyoung Exp $ */ +/* $NetBSD: x86_autoconf.c,v 1.63 2012/06/10 17:05:18 mlelstv Exp $ */ /*- * Copyright (c) 1990 The Regents of the University of California. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: x86_autoconf.c,v 1.62 2011/10/18 23:43:36 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: x86_autoconf.c,v 1.63 2012/06/10 17:05:18 mlelstv Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -64,15 +64,6 @@ __KERNEL_RCSID(0, "$NetBSD: x86_autoconf struct disklist *x86_alldisks; int x86_ndisks; -static void -handle_wedges(device_t dv, int par) -{ - if (config_handle_wedges(dv, par) == 0) - return; - booted_device = dv; - booted_partition = par; -} - static int is_valid_disk(device_t dv) { @@ -344,7 +335,9 @@ findroot(void) if (strncmp(cd->cf_name, biv->devname, len) == 0 && biv->devname[len] - '0' == device_unit(dv)) { - handle_wedges(dv, biv->devname[len + 1] - 'a'); + booted_device = dv; + booted_partition = biv->devname[len + 1] - 'a'; + booted_nblks = 0; break; } } @@ -388,11 +381,14 @@ findroot(void) device_xname(dv)); continue; } - dkwedge_set_bootwedge(dv, biw->startblk, biw->nblks); + booted_device = dv; + booted_partition = 0; + booted_nblks = biw->nblks; + booted_startblk = biw->startblk; } deviter_release(&di); - if (booted_wedge) + if (booted_nblks) return; } @@ -445,7 +441,9 @@ findroot(void) device_xname(dv)); continue; } - handle_wedges(dv, bid->partition); + booted_device = dv; + booted_partition = bid->partition; + booted_nblks = 0; } deviter_release(&di); @@ -477,6 +475,7 @@ findroot(void) device_is_a(dv, "cd")) { booted_device = dv; booted_partition = 0; + booted_nblks = 0; break; } } @@ -492,16 +491,9 @@ cpu_rootconf(void) findroot(); matchbiosdisks(); - if (booted_wedge) { - KASSERT(booted_device != NULL); - aprint_normal("boot device: %s (%s)\n", - device_xname(booted_wedge), device_xname(booted_device)); - setroot(booted_wedge, 0); - } else { - aprint_normal("boot device: %s\n", - booted_device ? device_xname(booted_device) : "<unknown>"); - setroot(booted_device, booted_partition); - } + aprint_normal("boot device: %s\n", + booted_device ? device_xname(booted_device) : "<unknown>"); + setroot(booted_device, booted_partition); } void Index: src/sys/arch/xen/x86/autoconf.c diff -u src/sys/arch/xen/x86/autoconf.c:1.13 src/sys/arch/xen/x86/autoconf.c:1.14 --- src/sys/arch/xen/x86/autoconf.c:1.13 Fri Nov 27 03:23:15 2009 +++ src/sys/arch/xen/x86/autoconf.c Sun Jun 10 17:05:19 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: autoconf.c,v 1.13 2009/11/27 03:23:15 rmind Exp $ */ +/* $NetBSD: autoconf.c,v 1.14 2012/06/10 17:05:19 mlelstv Exp $ */ /* NetBSD: autoconf.c,v 1.75 2003/12/30 12:33:22 pk Exp */ /*- @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.13 2009/11/27 03:23:15 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.14 2012/06/10 17:05:19 mlelstv Exp $"); #include "opt_xen.h" #include "opt_compat_oldboot.h" @@ -88,7 +88,6 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v static void findroot(void); static int is_valid_disk(device_t); -static void handle_wedges(device_t, int); struct disklist *x86_alldisks; int x86_ndisks; @@ -155,16 +154,9 @@ cpu_rootconf(void) { findroot(); - if (booted_wedge) { - KASSERT(booted_device != NULL); - printf("boot device: %s (%s)\n", - device_xname(booted_wedge), device_xname(booted_device)); - setroot(booted_wedge, 0); - } else { - printf("boot device: %s\n", - booted_device ? device_xname(booted_device) : "<unknown>"); - setroot(booted_device, booted_partition); - } + printf("boot device: %s\n", + booted_device ? device_xname(booted_device) : "<unknown>"); + setroot(booted_device, booted_partition); } @@ -199,7 +191,7 @@ findroot(void) continue; if (is_disk && xcp.xcp_bootdev[0] == 0) { - handle_wedges(dv, 0); + booted_device = dv; break; } @@ -354,15 +346,6 @@ found: booted_device = dev; } -static void -handle_wedges(device_t dv, int par) -{ - if (config_handle_wedges(dv, par) == 0) - return; - booted_device = dv; - booted_partition = par; -} - static int is_valid_disk(device_t dv) { Index: src/sys/dev/dkwedge/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.63 src/sys/dev/dkwedge/dk.c:1.64 --- src/sys/dev/dkwedge/dk.c:1.63 Fri Apr 27 18:15:55 2012 +++ src/sys/dev/dkwedge/dk.c Sun Jun 10 17:05:19 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.63 2012/04/27 18:15:55 drochner Exp $ */ +/* $NetBSD: dk.c,v 1.64 2012/06/10 17:05:19 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.63 2012/04/27 18:15:55 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.64 2012/06/10 17:05:19 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -748,44 +748,6 @@ dkwedge_print_wnames(void) } /* - * dkwedge_set_bootwedge - * - * Set the booted_wedge global based on the specified parent name - * and offset/length. - */ -void -dkwedge_set_bootwedge(device_t parent, daddr_t startblk, uint64_t nblks) -{ - struct dkwedge_softc *sc; - int i; - - rw_enter(&dkwedges_lock, RW_WRITER); - for (i = 0; i < ndkwedges; i++) { - if ((sc = dkwedges[i]) == NULL) - continue; - if (strcmp(sc->sc_parent->dk_name, device_xname(parent)) == 0 && - sc->sc_offset == startblk && - sc->sc_size == nblks) { - if (booted_wedge) { - printf("WARNING: double match for boot wedge " - "(%s, %s)\n", - device_xname(booted_wedge), - device_xname(sc->sc_dev)); - continue; - } - booted_device = parent; - booted_wedge = sc->sc_dev; - booted_partition = 0; - } - } - /* - * XXX What if we don't find one? Should we create a special - * XXX root wedge? - */ - rw_exit(&dkwedges_lock); -} - -/* * We need a dummy object to stuff into the dkwedge discovery method link * set to ensure that there is always at least one object in the set. */ @@ -1466,65 +1428,38 @@ out: * config glue */ -int -config_handle_wedges(struct device *dv, int par) +/* + * dkwedge_find_partition + * + * Find wedge corresponding to the specified parent name + * and offset/length. + */ +device_t +dkwedge_find_partition(device_t parent, daddr_t startblk, uint64_t nblks) { - struct dkwedge_list wl; - struct dkwedge_info *wi; - struct vnode *vn; - char diskname[16]; - int i, error; - - if ((vn = opendisk(dv)) == NULL) - return -1; - - wl.dkwl_bufsize = sizeof(*wi) * 16; - wl.dkwl_buf = wi = malloc(wl.dkwl_bufsize, M_TEMP, M_WAITOK); - - error = VOP_IOCTL(vn, DIOCLWEDGES, &wl, FREAD, NOCRED); - VOP_CLOSE(vn, FREAD, NOCRED); - vput(vn); - if (error) { -#ifdef DEBUG_WEDGE - printf("%s: List wedges returned %d\n", - device_xname(dv), error); -#endif - free(wi, M_TEMP); - return -1; - } - -#ifdef DEBUG_WEDGE - printf("%s: Returned %u(%u) wedges\n", device_xname(dv), - wl.dkwl_nwedges, wl.dkwl_ncopied); -#endif - snprintf(diskname, sizeof(diskname), "%s%c", device_xname(dv), - par + 'a'); - - for (i = 0; i < wl.dkwl_ncopied; i++) { -#ifdef DEBUG_WEDGE - printf("%s: Looking for %s in %s\n", - device_xname(dv), diskname, wi[i].dkw_wname); -#endif - if (strcmp(wi[i].dkw_wname, diskname) == 0) - break; - } + struct dkwedge_softc *sc; + int i; + device_t wedge = NULL; - if (i == wl.dkwl_ncopied) { -#ifdef DEBUG_WEDGE - printf("%s: Cannot find wedge with parent %s\n", - device_xname(dv), diskname); -#endif - free(wi, M_TEMP); - return -1; + rw_enter(&dkwedges_lock, RW_READER); + for (i = 0; i < ndkwedges; i++) { + if ((sc = dkwedges[i]) == NULL) + continue; + if (strcmp(sc->sc_parent->dk_name, device_xname(parent)) == 0 && + sc->sc_offset == startblk && + sc->sc_size == nblks) { + if (wedge) { + printf("WARNING: double match for boot wedge " + "(%s, %s)\n", + device_xname(wedge), + device_xname(sc->sc_dev)); + continue; + } + wedge = sc->sc_dev; + } } + rw_exit(&dkwedges_lock); -#ifdef DEBUG_WEDGE - printf("%s: Setting boot wedge %s (%s) at %llu %llu\n", - device_xname(dv), wi[i].dkw_devname, wi[i].dkw_wname, - (unsigned long long)wi[i].dkw_offset, - (unsigned long long)wi[i].dkw_size); -#endif - dkwedge_set_bootwedge(dv, wi[i].dkw_offset, wi[i].dkw_size); - free(wi, M_TEMP); - return 0; + return wedge; } + Index: src/sys/kern/init_main.c diff -u src/sys/kern/init_main.c:1.442 src/sys/kern/init_main.c:1.443 --- src/sys/kern/init_main.c:1.442 Sun Feb 19 21:06:47 2012 +++ src/sys/kern/init_main.c Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: init_main.c,v 1.442 2012/02/19 21:06:47 rmind Exp $ */ +/* $NetBSD: init_main.c,v 1.443 2012/06/10 17:05:18 mlelstv Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.442 2012/02/19 21:06:47 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.443 2012/06/10 17:05:18 mlelstv Exp $"); #include "opt_ddb.h" #include "opt_ipsec.h" @@ -259,6 +259,7 @@ int start_init_exec; /* semaphore for s cprng_strong_t *kern_cprng; +static void rootconf(void); static void check_console(struct lwp *l); static void start_init(void *); static void configure(void); @@ -633,7 +634,7 @@ main(void) * Now that autoconfiguration has completed, we can determine * the root and dump devices. */ - cpu_rootconf(); + rootconf(); cpu_dumpconf(); /* Mount the root file system. */ @@ -820,6 +821,74 @@ configure3(void) } static void +rootconf_handle_wedges(void) +{ + struct partinfo dpart; + struct partition *p; + struct vnode *vp; + daddr_t startblk; + uint64_t nblks; + device_t dev; + int error; + + if (booted_nblks) { + /* + * bootloader passed geometry + */ + dev = booted_device; + startblk = booted_startblk; + nblks = booted_nblks; + + /* + * keep booted_device and booted_partition + * in case the kernel doesn't identify a wedge + */ + } else { + /* + * bootloader passed partition number + * + * We cannot ask the partition device directly when it is + * covered by a wedge. Instead we look up the geometry in + * the disklabel. + */ + vp = opendisk(booted_device); + error = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD, NOCRED); + VOP_CLOSE(vp, FREAD, NOCRED); + vput(vp); + if (error) + return; + + KASSERT(booted_partition >= 0 + && booted_partition < MAXPARTITIONS); + + p = &dpart.disklab->d_partitions[booted_partition]; + + dev = booted_device; + startblk = p->p_offset; + nblks = p->p_size; + } + + dev = dkwedge_find_partition(dev, startblk, nblks); + if (dev != NULL) { + booted_device = dev; + booted_partition = 0; + } +} + +static void +rootconf(void) +{ + cpu_rootconf(); + + if (booted_device == NULL) + return; + + rootconf_handle_wedges(); + + setroot(booted_device, booted_partition); +} + +static void check_console(struct lwp *l) { struct vnode *vp; Index: src/sys/kern/kern_subr.c diff -u src/sys/kern/kern_subr.c:1.212 src/sys/kern/kern_subr.c:1.213 --- src/sys/kern/kern_subr.c:1.212 Mon Sep 19 23:54:29 2011 +++ src/sys/kern/kern_subr.c Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_subr.c,v 1.212 2011/09/19 23:54:29 christos Exp $ */ +/* $NetBSD: kern_subr.c,v 1.213 2012/06/10 17:05:18 mlelstv Exp $ */ /*- * Copyright (c) 1997, 1998, 1999, 2002, 2007, 2008 The NetBSD Foundation, Inc. @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.212 2011/09/19 23:54:29 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.213 2012/06/10 17:05:18 mlelstv Exp $"); #include "opt_ddb.h" #include "opt_md.h" @@ -158,12 +158,12 @@ int md_is_root = 0; #endif /* - * The device and wedge that we booted from. If booted_wedge is NULL, - * the we might consult booted_partition. + * The device and partition that we booted from. */ device_t booted_device; -device_t booted_wedge; int booted_partition; +daddr_t booted_startblk; +uint64_t booted_nblks; /* * Use partition letters if it's a disk class but not a wedge. Index: src/sys/sys/device.h diff -u src/sys/sys/device.h:1.140 src/sys/sys/device.h:1.141 --- src/sys/sys/device.h:1.140 Sun Nov 13 22:05:58 2011 +++ src/sys/sys/device.h Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: device.h,v 1.140 2011/11/13 22:05:58 christos Exp $ */ +/* $NetBSD: device.h,v 1.141 2012/06/10 17:05:18 mlelstv Exp $ */ /* * Copyright (c) 1996, 2000 Christopher G. Demetriou @@ -423,14 +423,14 @@ struct pdevinit { extern struct cfdriverlist allcfdrivers;/* list of all cfdrivers */ extern struct cftablelist allcftables; /* list of all cfdata tables */ extern device_t booted_device; /* the device we booted from */ -extern device_t booted_wedge; /* the wedge on that device */ -extern int booted_partition; /* or the partition on that device */ +extern int booted_partition; /* the partition on that device */ +extern daddr_t booted_startblk; /* or the start of a wedge */ +extern uint64_t booted_nblks; /* and the size of that wedge */ struct vnode *opendisk(struct device *); int getdisksize(struct vnode *, uint64_t *, unsigned *); struct dkwedge_info; int getdiskinfo(struct vnode *, struct dkwedge_info *); -int config_handle_wedges(struct device *, int); void config_init(void); int config_init_component(struct cfdriver *const*, Index: src/sys/sys/disk.h diff -u src/sys/sys/disk.h:1.56 src/sys/sys/disk.h:1.57 --- src/sys/sys/disk.h:1.56 Mon Jan 16 18:47:58 2012 +++ src/sys/sys/disk.h Sun Jun 10 17:05:18 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: disk.h,v 1.56 2012/01/16 18:47:58 christos Exp $ */ +/* $NetBSD: disk.h,v 1.57 2012/06/10 17:05:18 mlelstv Exp $ */ /*- * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc. @@ -530,10 +530,10 @@ int dkwedge_del(struct dkwedge_info *); void dkwedge_delall(struct disk *); int dkwedge_list(struct disk *, struct dkwedge_list *, struct lwp *); void dkwedge_discover(struct disk *); -void dkwedge_set_bootwedge(device_t, daddr_t, uint64_t); int dkwedge_read(struct disk *, struct vnode *, daddr_t, void *, size_t); device_t dkwedge_find_by_wname(const char *); void dkwedge_print_wnames(void); +device_t dkwedge_find_partition(device_t, daddr_t, uint64_t); #endif #endif /* _SYS_DISK_H_ */