Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/pmax/pmax The way to determine booted root device w...
details: https://anonhg.NetBSD.org/src/rev/51f44c749859
branches: trunk
changeset: 482681:51f44c749859
user: nisimura <nisimura%NetBSD.org@localhost>
date: Sat Feb 19 04:16:18 2000 +0000
description:
The way to determine booted root device was simplified largely.
diffstat:
sys/arch/pmax/pmax/autoconf.c | 203 ++++++++++++------------------------------
1 files changed, 58 insertions(+), 145 deletions(-)
diffs (247 lines):
diff -r 823d63565ffa -r 51f44c749859 sys/arch/pmax/pmax/autoconf.c
--- a/sys/arch/pmax/pmax/autoconf.c Sat Feb 19 04:00:59 2000 +0000
+++ b/sys/arch/pmax/pmax/autoconf.c Sat Feb 19 04:16:18 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.46 2000/01/14 13:45:23 simonb Exp $ */
+/* $NetBSD: autoconf.c,v 1.47 2000/02/19 04:16:18 nisimura Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -43,19 +43,10 @@
*/
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.46 2000/01/14 13:45:23 simonb Exp $");
-
-/*
- * Setup the system to run on the current machine.
- *
- * Configure() is called at boot time. Available
- * devices are determined (from possibilities mentioned in ioconf.c),
- * and the drivers are initialized.
- */
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.47 2000/02/19 04:16:18 nisimura Exp $");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/dkstat.h>
#include <sys/conf.h>
#include <sys/reboot.h>
#include <sys/device.h>
@@ -66,18 +57,14 @@
#include <pmax/dev/device.h>
-
struct intrhand intrtab[MAX_INTR_COOKIES];
-
-static void findroot __P((struct device **, int *));
+struct device *booted_device;
+int booted_slot, booted_unit, booted_partition;
+char *booted_protocol;
/*
- * Determine mass storage and memory configuration for a machine.
- * Print cpu type, and then iterate over an array of devices
- * found on the baseboard or in turbochannel option slots.
- * Once devices are configured, enable interrupts, and probe
- * for attached scsi devices.
- */
+ * Configure all devices on system
+ */
void
cpu_configure()
{
@@ -92,141 +79,67 @@
/* Configuration is finished, turn on interrupts. */
_splnone(); /* enable all source forcing SOFT_INTs cleared */
- /*
- * Probe SCSI bus using old-style pmax configuration table.
- * We do not yet have machine-independent SCSI support or polled
- * SCSI.
- */
printf("Beginning old-style SCSI device autoconfiguration\n");
configure_scsi();
}
+/*
+ * Look at the string 'cp' and decode the boot device. Boot names
+ * can be something like 'rz(0,0,0)vmunix' or '5/rz0/vmunix'.
+ */
+void
+makebootdev(cp)
+ char *cp;
+{
+ booted_device = NULL;
+ booted_slot = booted_unit = -1;
+ booted_partition = 0;
+ booted_protocol = NULL;
+
+ if (cp[0] == 'r' && cp[1] == 'z' && cp[2] == '(') {
+ if (cp[3] >= '0' && cp[3] <= '9' && cp[4] == ','
+ && cp[5] >= '0' && cp[5] <= '9' && cp[6] == ','
+ && cp[7] >= '0' && cp[7] <= '9' && cp[8] == ')')
+ return;
+ booted_slot = cp[3] - '0';
+ booted_unit = cp[5] - '0';
+ booted_partition = cp[7] - '0';
+ booted_protocol = "SCSI";
+ }
+ if (cp[0] >= '0' && cp[0] <= '9' && cp[1] == '/') {
+ booted_slot = cp[0] - '0';
+ booted_unit = booted_partition = 0;
+ if (cp[2] == 'r' && cp[3] == 'z'
+ && cp[4] >= '0' && cp[4] <= '9') {
+ booted_protocol = "SCSI";
+ booted_unit = cp[4] - '0';
+ }
+ else if (strncmp(cp+2, "tftp", 4) == 0)
+ booted_protocol = "BOOTP";
+ else if (strncmp(cp+2, "mop", 3) == 0)
+ booted_protocol = "MOP";
+ }
+}
+
void
cpu_rootconf()
{
- struct device *booted_device;
- int booted_partition;
+ struct device *dv;
+ char name[4];
- findroot(&booted_device, &booted_partition);
-
+ /*
+ * N.B., below works for rz drive on primary SCSI controller.
+ */
+ booted_device = NULL;
+ snprintf(name, sizeof(name), "rz%d", booted_unit);
+ for (dv = TAILQ_FIRST(&alldevs); dv; dv = TAILQ_NEXT(dv, dv_list)) {
+ if (dv->dv_class == DV_DISK && !strcmp(dv->dv_xname, name)) {
+ booted_device = dv;
+ break;
+ }
+ }
printf("boot device: %s\n",
booted_device ? booted_device->dv_xname : "<unknown>");
setroot(booted_device, booted_partition);
}
-
-u_long bootdev = 0; /* should be dev_t, but not until 32 bits */
-
-/*
- * Attempt to find the device from which we were booted.
- */
-static void
-findroot(devpp, partp)
- struct device **devpp;
- int *partp;
-{
- int i, majdev, unit, part, controller;
- struct pmax_scsi_device *dp;
- const char *bootdv_name;
-
- /*
- * Default to "not found".
- */
- *devpp = NULL;
- *partp = 0;
- bootdv_name = NULL;
-
- if ((bootdev & B_MAGICMASK) != B_DEVMAGIC)
- return;
-
- majdev = B_TYPE(bootdev);
- for (i = 0; dev_name2blk[i].d_name != NULL; i++) {
- if (majdev == dev_name2blk[i].d_maj) {
- bootdv_name = dev_name2blk[i].d_name;
- break;
- }
- }
-
- if (bootdv_name == NULL) {
-#if defined(DEBUG)
- printf("findroot(): no name2blk for boot device %d\n", majdev);
-#endif
- return;
- }
-
- controller = B_CONTROLLER(bootdev);
- part = B_PARTITION(bootdev);
- unit = B_UNIT(bootdev);
-
- for (dp = scsi_dinit; dp->sd_driver != NULL; dp++) {
- if (dp->sd_alive && dp->sd_drive == unit &&
- dp->sd_ctlr == controller &&
- dp->sd_driver->d_name[0] == bootdv_name[0] &&
- dp->sd_driver->d_name[1] == bootdv_name[1]) {
- *devpp = dp->sd_devp;
- *partp = part;
- return;
- }
- }
-#if defined(DEBUG)
- printf("findroot(): no driver for boot device %s\n", bootdv_name);
-#endif
-}
-
-/*
- * Look at the string 'cp' and decode the boot device.
- * Boot names can be something like 'rz(0,0,0)vmunix' or '5/rz0/vmunix'.
- */
-void
-makebootdev(cp)
- char *cp;
-{
- int majdev, unit, part, ctrl;
-
- if (*cp >= '0' && *cp <= '9') {
- /* XXX should be able to specify controller */
- if (cp[1] != '/' || cp[4] < '0' || cp[4] > '9')
- goto defdev;
- unit = cp[4] - '0';
- if (cp[5] >= 'a' && cp[5] <= 'h')
- part = cp[5] - 'a';
- else
- part = 0;
- cp += 2;
- for (majdev = 0; dev_name2blk[majdev].d_name != NULL;
- majdev++) {
- if (cp[0] == dev_name2blk[majdev].d_name[0] &&
- cp[1] == dev_name2blk[majdev].d_name[1]) {
- bootdev = MAKEBOOTDEV(
- dev_name2blk[majdev].d_maj, 0, 0,
- unit, part);
- return;
- }
- }
- goto defdev;
- }
- for (majdev = 0; dev_name2blk[majdev].d_name != NULL; majdev++)
- if (cp[0] == dev_name2blk[majdev].d_name[0] &&
- cp[1] == dev_name2blk[majdev].d_name[1] &&
- cp[2] == '(')
- goto fndmaj;
-defdev:
- bootdev = B_DEVMAGIC;
- return;
-
-fndmaj:
- majdev = dev_name2blk[majdev].d_maj;
- for (ctrl = 0, cp += 3; *cp >= '0' && *cp <= '9'; )
- ctrl = ctrl * 10 + *cp++ - '0';
- if (*cp == ',')
- cp++;
- for (unit = 0; *cp >= '0' && *cp <= '9'; )
- unit = unit * 10 + *cp++ - '0';
- if (*cp == ',')
- cp++;
- for (part = 0; *cp >= '0' && *cp <= '9'; )
- part = part * 10 + *cp++ - '0';
- if (*cp != ')')
- goto defdev;
- bootdev = MAKEBOOTDEV(majdev, 0, ctrl, unit, part);
-}
Home |
Main Index |
Thread Index |
Old Index