usr/src/uts/common/os/swapgeneric.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 789 b348f31ed315
child 2357 e285c4d5a91d
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/* ONC_PLUS EXTRACT START */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/* ONC_PLUS EXTRACT END */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * Configure root, swap and dump devices.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <sys/param.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <sys/sysmacros.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <sys/signal.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/proc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/user.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/conf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/buf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/vm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/reboot.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/file.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/vfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <sys/errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <sys/uio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <sys/open.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/mount.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#include <sys/kobj.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#include <sys/bootconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#include <sys/sysconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
#include <sys/modctl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#include <sys/autoconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#include <sys/debug.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#include <sys/fs/snode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
#include <fs/fs_subr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#include <sys/socket.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#include <net/if.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#include <sys/mkdev.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#include <sys/console.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#include <sys/conf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
#include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
#include <sys/hwconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#include <sys/dc_ki.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
#include <sys/promif.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
 * Local routines
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static int preload_module(struct sysparam *, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static struct vfssw *getfstype(char *, char *, size_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static int getphysdev(char *, char *, size_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static int load_bootpath_drivers(char *bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static int load_boot_driver(char *drv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static int load_boot_platform_modules(char *drv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static dev_info_t *path_to_devinfo(char *path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
static boolean_t netboot_over_ib(char *bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * Module linkage information for the kernel.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
static struct modlmisc modlmisc = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	&mod_miscops, "root and swap configuration %I%"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
static struct modlinkage modlinkage = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	MODREV_1, (void *)&modlmisc, NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	return (mod_install(&modlinkage));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	return (mod_remove(&modlinkage));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
_info(struct modinfo *modinfop)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	return (mod_info(&modlinkage, modinfop));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
 * Configure root file system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
rootconf(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	struct vfssw *vsw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	extern void pm_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	BMDPRINTF(("rootconf: fstype %s\n", rootfs.bo_fstype));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	BMDPRINTF(("rootconf: name %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	BMDPRINTF(("rootconf: flags 0x%x\n", rootfs.bo_flags));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	BMDPRINTF(("rootconf: obp_bootpath %s\n", obp_bootpath));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	 * Install cluster modules that were only loaded during
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	 * loadrootmodules().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	if (error = clboot_rootconf())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	if (root_is_svm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		(void) strncpy(rootfs.bo_name, obp_bootpath, BO_MAXOBJNAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		BMDPRINTF(("rootconf: svm: rootfs name %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		BMDPRINTF(("rootconf: svm: svm name %s\n", svm_bootpath));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	 * Run _init on the root filesystem (we already loaded it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	 * but we've been waiting until now to _init it) which will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	 * have the side-effect of running vsw_init() on this vfs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
	 * Because all the nfs filesystems are lumped into one
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	 * module we need to special case it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	if (strncmp(rootfs.bo_fstype, "nfs", 3) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		if (modload("fs", "nfs") == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
			cmn_err(CE_CONT, "Cannot initialize %s filesystem\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
			    rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
			return (ENXIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		if (modload("fs", rootfs.bo_fstype) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
			cmn_err(CE_CONT, "Cannot initialize %s filesystem\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
			    rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
			return (ENXIO);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	RLOCK_VFSSW();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	vsw = vfs_getvfsswbyname(rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	RUNLOCK_VFSSW();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	VFS_INIT(rootvfs, &vsw->vsw_vfsops, (caddr_t)0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	VFS_HOLD(rootvfs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	if (root_is_svm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		rootvfs->vfs_flag |= VFS_RDONLY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	 * This pm-releated call has to occur before root is mounted since we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	 * need to power up all devices.  It is placed after VFS_INIT() such
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	 * that opening a device via ddi_lyr_ interface just before root has
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	 * been mounted would work.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	pm_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	if (netboot) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		if ((error = strplumb()) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
			cmn_err(CE_CONT, "Cannot plumb network device\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
			return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	 * ufs_mountroot() ends up calling getrootdev()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	 * (below) which actually triggers the _init, identify,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	 * probe and attach of the drivers that make up root device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	 * bush; these are also quietly waiting in memory.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	BMDPRINTF(("rootconf: calling VFS_MOUNTROOT %s\n", rootfs.bo_fstype));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	error = VFS_MOUNTROOT(rootvfs, ROOT_INIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	vfs_unrefvfssw(vsw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	rootdev = rootvfs->vfs_dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		cmn_err(CE_CONT, "Cannot mount root on %s fstype %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		    rootfs.bo_name, rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		cmn_err(CE_CONT, "?root on %s fstype %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		    rootfs.bo_name, rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
 * Remount root on an SVM mirror root device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
 * Only supported on UFS filesystems at present
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
svm_rootconf(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	int	error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	extern int ufs_remountroot(struct vfs *vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	ASSERT(root_is_svm == 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	if (strcmp(rootfs.bo_fstype, "ufs") != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		cmn_err(CE_CONT, "Mounting root on %s with filesystem "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		    "type %s is not supported\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		    rootfs.bo_name, rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		return (EINVAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	(void) strncpy(rootfs.bo_name, svm_bootpath, BO_MAXOBJNAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	BMDPRINTF(("svm_rootconf: rootfs %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
	error = ufs_remountroot(rootvfs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
	if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		cmn_err(CE_CONT, "Cannot remount root on %s fstype %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
			rootfs.bo_name, rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		cmn_err(CE_CONT, "?root remounted on %s fstype %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
			rootfs.bo_name, rootfs.bo_fstype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
 * Under the assumption that our root file system is on a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
 * disk partition, get the dev_t of the partition in question.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
 * By now, boot has faithfully loaded all our modules into memory, and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
 * we've taken over resource management.  Before we go any further, we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
 * have to fire up the device drivers and stuff we need to mount the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
 * root filesystem.  That's what we do here.  Fingers crossed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
dev_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
getrootdev(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	dev_t	d;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	if ((d = ddi_pathname_to_dev_t(rootfs.bo_name)) == NODEV)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		cmn_err(CE_CONT, "Cannot assemble drivers for root %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		    rootfs.bo_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	return (d);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
 * If booted with ASKNAME, prompt on the console for a filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 * name and return it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
getfsname(char *askfor, char *name, size_t namelen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	if (boothowto & RB_ASKNAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		printf("%s name: ", askfor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		console_gets(name, namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
/*ARGSUSED1*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
preload_module(struct sysparam *sysp, void *p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	static char *wmesg = "forceload of %s failed";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	name = sysp->sys_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	BMDPRINTF(("preload_module: %s\n", name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	if (modloadonly(NULL, name) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		cmn_err(CE_WARN, wmesg, name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
/* ONC_PLUS EXTRACT START */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
 * We want to load all the modules needed to mount the root filesystem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
 * so that when we start the ball rolling in 'getrootdev', every module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
 * should already be in memory, just waiting to be init-ed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
loadrootmodules(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	struct vfssw	*vsw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	char		*this;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	char 		*name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	int		err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
/* ONC_PLUS EXTRACT END */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	int		i, proplen, dhcacklen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	extern char	*impl_module_list[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	extern char	*platform_module_list[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	/* Make sure that the PROM's devinfo tree has been created */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	ASSERT(ddi_root_node());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	BMDPRINTF(("loadrootmodules: fstype %s\n", rootfs.bo_fstype));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	BMDPRINTF(("loadrootmodules: name %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	BMDPRINTF(("loadrootmodules: flags 0x%x\n", rootfs.bo_flags));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	 * zzz We need to honor what's in rootfs if it's not null.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	 * non-null means use what's there.  This way we can
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	 * change rootfs with /etc/system AND with tunetool.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
	if (root_is_svm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		/* user replaced rootdev, record obp_bootpath */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		obp_bootpath[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		(void) getphysdev("root", obp_bootpath, BO_MAXOBJNAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
		BMDPRINTF(("loadrootmodules: obp_bootpath %s\n", obp_bootpath));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		 * Get the root fstype and root device path from boot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		rootfs.bo_fstype[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		rootfs.bo_name[0] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	 * This lookup will result in modloadonly-ing the root
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	 * filesystem module - it gets _init-ed in rootconf()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	if ((vsw = getfstype("root", rootfs.bo_fstype, BO_MAXFSNAME)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		return (ENXIO);	/* in case we have no file system types */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	(void) strcpy(rootfs.bo_fstype, vsw->vsw_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	vfs_unrefvfssw(vsw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	 * Load the favored drivers of the implementation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	 * e.g. 'sbus' and possibly 'zs' (even).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	 * Called whilst boot is still loaded (because boot does
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	 * the i/o for us), and DDI services are unavailable.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	BMDPRINTF(("loadrootmodules: impl_module_list\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	for (i = 0; (this = impl_module_list[i]) != NULL; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		if ((err = load_boot_driver(this)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
			cmn_err(CE_WARN, "Cannot load drv/%s", this);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
			return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
	 * Now load the platform modules (if any)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	BMDPRINTF(("loadrootmodules: platform_module_list\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	for (i = 0; (this = platform_module_list[i]) != NULL; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		if ((err = load_boot_platform_modules(this)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
			cmn_err(CE_WARN, "Cannot load drv/%s", this);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
loop:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	(void) getphysdev("root", rootfs.bo_name, BO_MAXOBJNAME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
	 * Given a physical pathname, load the correct set of driver
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	 * modules into memory, including all possible parents.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	 * NB: The code sets the variable 'name' for error reporting.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	BMDPRINTF(("loadrootmodules: rootfs %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	if (root_is_svm == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		BMDPRINTF(("loadrootmodules: rootfs %s\n", rootfs.bo_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		name = rootfs.bo_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		err = load_bootpath_drivers(rootfs.bo_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	 * Load driver modules in obp_bootpath, this is always
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	 * required for mountroot to succeed. obp_bootpath is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	 * is set if rootdev is set via /etc/system, which is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	 * the case if booting of a SVM/VxVM mirror.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	if ((err == 0) && obp_bootpath[0] != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		BMDPRINTF(("loadrootmodules: obp_bootpath %s\n", obp_bootpath));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		name = obp_bootpath;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		err = load_bootpath_drivers(obp_bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	if (err != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
		cmn_err(CE_CONT, "Cannot load drivers for %s\n", name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
	 * Check to see if the booter performed DHCP configuration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	 * ("bootp-response" boot property exists). If so, then before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	 * bootops disappears we need to save the value of this property
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	 * such that the userland dhcpagent can adopt the DHCP management
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	 * of our primary network interface. We leave room at the beginning of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	 * saved property to cache the interface name we used to boot the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	 * client. This context is necessary for the user land dhcpagent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	 * to do its job properly on a multi-homed system.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
	proplen = BOP_GETPROPLEN(bootops, "bootp-response");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	if (proplen > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		dhcacklen = proplen + IFNAMSIZ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		dhcack = kmem_zalloc(dhcacklen, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		if (BOP_GETPROP(bootops, "bootp-response",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
		    (uchar_t *)&dhcack[IFNAMSIZ]) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
			cmn_err(CE_WARN, "BOP_GETPROP of  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
			    "\"bootp-response\" failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
			kmem_free(dhcack, dhcacklen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
			dhcack = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		 * Fetch the "netdev-path" boot property (if it exists), and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		 * stash it for later use by sysinfo(SI_DHCP_CACHE, ...).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		proplen = BOP_GETPROPLEN(bootops, "netdev-path");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		if (proplen > 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
			netdev_path = kmem_zalloc(proplen, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
			if (BOP_GETPROP(bootops, "netdev-path",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
			    (uchar_t *)netdev_path) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
				cmn_err(CE_WARN, "BOP_GETPROP of  "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
				    "\"netdev-path\" failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
				kmem_free(netdev_path, proplen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
				goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	 * Preload (load-only, no init) all modules which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	 * were added to the /etc/system file with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	 * FORCELOAD keyword.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	BMDPRINTF(("loadrootmodules: preload_module\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	(void) mod_sysctl_type(MOD_FORCELOAD, preload_module, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
/* ONC_PLUS EXTRACT START */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	 * If we booted otw then load in the plumbing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	 * routine now while we still can. If we didn't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	 * boot otw then we will load strplumb in main().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	 * NFS is actually a set of modules, the core routines,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	 * a diskless helper module, rpcmod, and the tli interface.  Load
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	 * them now while we still can.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	 * Because we glomb all versions of nfs into a single module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	 * we check based on the initial string "nfs".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	 * XXX: A better test for this is to see if device_type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	 * XXX: from the PROM is "network".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	if (strncmp(rootfs.bo_fstype, "nfs", 3) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
		++netboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
		if ((err = modload("misc", "tlimod")) < 0)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
			cmn_err(CE_CONT, "Cannot load misc/tlimod\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
		if ((err = modload("strmod", "rpcmod")) < 0)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
			cmn_err(CE_CONT, "Cannot load strmod/rpcmod\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
		if ((err = modload("misc", "nfs_dlboot")) < 0)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
			cmn_err(CE_CONT, "Cannot load misc/nfs_dlboot\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		if ((err = modload("misc", "strplumb")) < 0)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
			cmn_err(CE_CONT, "Cannot load misc/strplumb\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
		if ((err = strplumb_load()) < 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	 * Preload modules needed for booting as a cluster.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	err = clboot_loadrootmodules();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	if (err != 0 && (boothowto & RB_ASKNAME))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		goto loop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	return (err);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
/* ONC_PLUS EXTRACT END */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
 * Get the name of the root or swap filesystem type, and return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
 * the corresponding entry in the vfs switch.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
 * If we're not asking the user, and we're trying to find the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
 * root filesystem type, we ask boot for the filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
 * type that it came from and use that.  Similarly, if we're
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
 * trying to find the swap filesystem, we try and derive it from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
 * the root filesystem type.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
 * If we are booting via NFS we currently have these options:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
 *	nfs -	dynamically choose NFS V2. V3, or V4 (default)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
 *	nfs2 -	force NFS V2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
 *	nfs3 -	force NFS V3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
 *	nfs4 -	force NFS V4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
 * Because we need to maintain backward compatibility with the naming
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
 * convention that the NFS V2 filesystem name is "nfs" (see vfs_conf.c)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
 * we need to map "nfs" => "nfsdyn" and "nfs2" => "nfs".  The dynamic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
 * nfs module will map the type back to either "nfs", "nfs3", or "nfs4".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 * This is only for root filesystems, all other uses such as cachefs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 * will expect that "nfs" == NFS V2.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
 * If the filesystem isn't already loaded, vfs_getvfssw() will load
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
 * it for us, but if (at the time we call it) modrootloaded is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
 * still not set, it won't run the filesystems _init routine (and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
 * implicitly it won't run the filesystems vsw_init() entry either).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 * We do that explicitly in rootconf().
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
static struct vfssw *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
getfstype(char *askfor, char *fsname, size_t fsnamelen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	struct vfssw *vsw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	static char defaultfs[BO_MAXFSNAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	int root = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	if (strcmp(askfor, "root") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
		(void) BOP_GETPROP(bootops, "fstype", defaultfs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
		root++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		(void) strcpy(defaultfs, "swapfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	if (boothowto & RB_ASKNAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		for (*fsname = '\0'; *fsname == '\0'; *fsname = '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
			printf("%s filesystem type [%s]: ", askfor, defaultfs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
			console_gets(fsname, fsnamelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			if (*fsname == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
				(void) strcpy(fsname, defaultfs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
			if (root) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
				if (strcmp(fsname, "nfs2") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
					(void) strcpy(fsname, "nfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
				else if (strcmp(fsname, "nfs") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
					(void) strcpy(fsname, "nfsdyn");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			if ((vsw = vfs_getvfssw(fsname)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
				return (vsw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			printf("Unknown filesystem type '%s'\n", fsname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	} else if (*fsname == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
		fsname = defaultfs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	if (*fsname == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	if (root) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		if (strcmp(fsname, "nfs2") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
			(void) strcpy(fsname, "nfs");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		else if (strcmp(fsname, "nfs") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
			(void) strcpy(fsname, "nfsdyn");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	return (vfs_getvfssw(fsname));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
 * Get a physical device name, and maybe load and attach
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
 * the driver.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
 * XXX	Need better checking of whether or not a device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
 *	actually exists if the user typed in a pathname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
 * XXX	Are we sure we want to expose users to this sort
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
 *	of physical namespace gobbledygook (now there's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
 *	a word to conjure with..)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
 * XXX	Note that on an OBP machine, we can easily ask the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
 *	prom and pretty-print some plausible set of bootable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
 *	devices.  We can also user the prom to verify any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
 *	such device.  Later tim.. later.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
getphysdev(char *askfor, char *name, size_t namelen)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	static char fmt[] = "Enter physical name of %s device\n[%s]: ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	dev_t dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	static char defaultpath[BO_MAXOBJNAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	 * Establish 'default' values - we get the root device from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	 * boot, and we infer the swap device is the same but with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	 * a 'b' on the end instead of an 'a'.  A first stab at
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	 * ease-of-use ..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	if (strcmp(askfor, "root") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		 * Look for the 1275 compliant name 'bootpath' first,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
		 * but make certain it has a non-NULL value as well.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		if ((BOP_GETPROP(bootops, "bootpath", defaultpath) == -1) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		    strlen(defaultpath) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			if (BOP_GETPROP(bootops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			    "boot-path", defaultpath) == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
				boothowto |= RB_ASKNAME | RB_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		(void) strcpy(defaultpath, rootfs.bo_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		defaultpath[strlen(defaultpath) - 1] = 'b';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
retry:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	if (boothowto & RB_ASKNAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
		printf(fmt, askfor, defaultpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
		console_gets(name, namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	if (*name == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
		(void) strcpy(name, defaultpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	if (strcmp(askfor, "swap") == 0)   {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		 * Try to load and install the swap device driver.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		dev = ddi_pathname_to_dev_t(name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		if (dev == (dev_t)-1)  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
			printf("Not a supported device for swap.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
			boothowto |= RB_ASKNAME | RB_VERBOSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
			goto retry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		 * Ensure that we're not trying to swap on the floppy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
		if (strncmp(ddi_major_to_name(getmajor(dev)), "fd", 2) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
			printf("Too dangerous to swap on the floppy\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
			if (boothowto & RB_ASKNAME)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
				goto retry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
 * Load a driver needed to boot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
load_boot_driver(char *drv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
	char	*drvname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	major_t	major;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	if ((major = ddi_name_to_major(drv)) == (major_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
		cmn_err(CE_CONT, "%s: no major number\n", drv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	 * resolve aliases
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	drvname = ddi_major_to_name(major);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	if (strcmp(drv, drvname) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		BMDPRINTF(("load_boot_driver: %s\n", drv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		BMDPRINTF(("load_boot_driver: %s -> %s\n", drv, drvname));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
#endif	/* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	if (modloadonly("drv", drvname) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
		cmn_err(CE_CONT, "%s: cannot load driver\n", drvname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
 * For a given instance, load that driver and its parents
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
load_parent_drivers(dev_info_t *dip)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
	int	rval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	char	*drv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	while (dip) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
		drv = ddi_get_name(dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
		if (load_boot_driver(drv) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
			rval = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
		dip = ddi_get_parent(dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
 * For a given path to a boot device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
 * load that driver and all its parents.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
load_bootpath_drivers(char *bootpath)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	dev_info_t *dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	if (bootpath == NULL || *bootpath == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	BMDPRINTF(("load_bootpath_drivers: %s\n", bootpath));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	dip = path_to_devinfo(bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
#if defined(__i386) || defined(__amd64)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	 * i386 does not provide stub nodes for all boot devices,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	 * but we should be able to find the node for the parent,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	 * and the leaf of the boot path should be the driver name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	 * which we go ahead and load here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	if (dip == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
		char	*pathcopy, *leaf, *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		int	len, rval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
		len = strlen(bootpath) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
		pathcopy = kmem_zalloc(len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
		(void) strcpy(pathcopy, bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
		 * Work backward to the last slash to build the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		 * full path of the parent of the boot device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
		for (p = pathcopy + len - 2; *p != '/'; p--)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
			;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
		*p++ = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
		 * Now isolate the driver name of the leaf device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
		for (leaf = p; *p && *p != '@'; p++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
			;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
		*p = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
		BMDPRINTF(("load_bootpath_drivers: parent=%s leaf=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
			pathcopy, leaf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
		dip = path_to_devinfo(pathcopy);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
		rval = load_boot_driver(leaf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		kmem_free(pathcopy, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
		if (rval == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	if (dip == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
		cmn_err(CE_WARN, "can't bind driver for boot path <%s>",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
			bootpath);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
	 * Load IP over IB driver when netbooting over IB.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	 * As per IB 1275 binding, IP over IB is represented as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
	 * service on the top of the HCA node. So, there is no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	 * PROM node and generic framework cannot pre-load
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	 * IP over IB driver based on the bootpath. The following
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	 * code preloads IP over IB driver when doing netboot over
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	 * InfiniBand.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	if (netboot_over_ib(bootpath) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	    modloadonly("drv", "ibd") == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
		cmn_err(CE_CONT, "ibd: cannot load platform driver\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
	return (load_parent_drivers(dip));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
 * Load drivers required for a platform
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
 * Since all hardware nodes should be available in the device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
 * tree, walk the per-driver list and load the parents of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
 * each node found. If not a hardware node, try to load it.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
 * Pseudo nexus is already loaded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
load_boot_platform_modules(char *drv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	major_t	major;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	dev_info_t *dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	char	*drvname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	int	rval = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	if ((major = ddi_name_to_major(drv)) == (major_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
		cmn_err(CE_CONT, "%s: no major number\n", drv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	 * resolve aliases
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
	drvname = ddi_major_to_name(major);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	if ((major = ddi_name_to_major(drvname)) == (major_t)-1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	if (strcmp(drv, drvname) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
		BMDPRINTF(("load_boot_platform_modules: %s\n", drv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
		BMDPRINTF(("load_boot_platform_modules: %s -> %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
			drv, drvname));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
#endif	/* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
	dip = devnamesp[major].dn_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
	if (dip == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		/* pseudo node, not-enumerated, needs to be loaded */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
		if (modloadonly("drv", drvname) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
			cmn_err(CE_CONT, "%s: cannot load platform driver\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
			    drvname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
			rval = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
		while (dip) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
			if (load_parent_drivers(dip) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
				rval = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
			dip = ddi_get_next(dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	return (rval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
 * i_find_node: Internal routine used by path_to_devinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
 * to locate a given nodeid in the device tree.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
struct i_path_findnode {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   880
	pnode_t nodeid;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
	dev_info_t *dip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
i_path_find_node(dev_info_t *dev, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	struct i_path_findnode *f = (struct i_path_findnode *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	if (ddi_get_nodeid(dev) == (int)f->nodeid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
		f->dip = dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
		return (DDI_WALK_TERMINATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	return (DDI_WALK_CONTINUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
 * Return the devinfo node to a boot device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
static dev_info_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
path_to_devinfo(char *path)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
	struct i_path_findnode fn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	extern dev_info_t *top_devinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	 * Get the nodeid of the given pathname, if such a mapping exists.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	fn.dip = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	fn.nodeid = prom_finddevice(path);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	if (fn.nodeid != OBP_BADNODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		 * Find the nodeid in our copy of the device tree and return
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		 * whatever name we used to bind this node to a driver.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		ddi_walk_devs(top_devinfo, i_path_find_node, (void *)(&fn));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
#ifdef	DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
	 * If we're bound to something other than the nodename,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
	 * note that in the message buffer and system log.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	if (fn.dip) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		char *p, *q;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
		p = ddi_binding_name(fn.dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
		q = ddi_node_name(fn.dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
		if (p && q && (strcmp(p, q) != 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
			BMDPRINTF(("path_to_devinfo: %s bound to %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
			    path, p));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
#endif	/* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
	return (fn.dip);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
 * This routine returns B_TRUE if the bootpath corresponds to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
 * IP over IB driver.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
 * The format of the bootpath for the IP over IB looks like
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
 * /pci@1f,700000/pci@1/ib@0:port=1,pkey=8001,protocol=ip
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
 * The minor node portion "port=1,pkey=8001,protocol=ip" represents
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
 * IP over IB driver.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
static boolean_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
netboot_over_ib(char *bootpath)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
	char		*temp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
	boolean_t	ret = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   955
	pnode_t		node = prom_finddevice(bootpath);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	int		len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	char		devicetype[OBP_MAXDRVNAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
	/* Is this IB node ? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
	len = prom_getproplen(node, OBP_DEVICETYPE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	if (len <= 1 || len >= OBP_MAXDRVNAME)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		return (B_FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	(void) prom_getprop(node, OBP_DEVICETYPE, (caddr_t)devicetype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	if (strncmp("ib", devicetype, 2) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
		/* Check for proper IP over IB string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		if ((temp = strstr(bootpath, ":port=")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
			if ((temp = strstr(temp, ",pkey=")) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
				if ((temp = strstr(temp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
				    ",protocol=ip")) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
					ret = B_TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
}