Parse bootflags and attempt to find the root device from the boot command line

This commit is contained in:
wdk 2000-08-16 21:54:43 +00:00
parent bf69eb6def
commit 4cad781e16
3 changed files with 104 additions and 12 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.h,v 1.2 2000/08/15 04:56:45 wdk Exp $ */
/* $NetBSD: autoconf.h,v 1.3 2000/08/16 21:54:43 wdk Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@ -27,6 +27,9 @@
* rights to redistribute these changes.
*/
#ifndef _MIPSCO_AUTOCONF_H_
#define _MIPSCO_AUTOCONF_H_
/*
* Machine-dependent structures of autoconfiguration
*/
@ -47,3 +50,6 @@ struct confargs {
#define cf_addr cf_loc[0]
int badaddr __P((void *, u_int));
void makebootdev __P((char *));
#endif /* !_MIPSCO_AUTOCONF_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.c,v 1.2 2000/08/15 04:56:46 wdk Exp $ */
/* $NetBSD: autoconf.c,v 1.3 2000/08/16 21:54:44 wdk Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@ -65,6 +65,7 @@
#include <machine/cpu.h>
#include <machine/mainboard.h>
#include <machine/autoconf.h>
/*
* The following several variables are related to
@ -113,7 +114,9 @@ cpu_rootconf()
setroot(booted_device, booted_partition);
}
dev_t bootdev = 0; /* should be dev_t, but not until 32 bits */
dev_t bootdev = NULL;
char boot_class;
int boot_id, boot_lun, boot_part;
/*
* Attempt to find the device from which we were booted.
@ -123,6 +126,16 @@ findroot(devpp, partp)
struct device **devpp;
int *partp;
{
struct device *dv;
for (dv = TAILQ_FIRST(&alldevs); dv; dv = TAILQ_NEXT(dv, dv_list)) {
if (dv->dv_class == boot_class && dv->dv_unit == boot_id) {
*devpp = dv;
*partp = boot_part;
return;
}
}
/*
* Default to "not found".
*/
@ -131,3 +144,28 @@ findroot(devpp, partp)
return;
}
void
makebootdev(cp)
char *cp;
{
boot_class = -1;
boot_id = boot_lun = boot_part = 0;
if (strlen(cp) < 6)
return;
if (strncmp(cp, "dk", 2) == 0 && cp[4] == '(') { /* Disk */
cp += 5;
if (*cp >= '0' && *cp <= '9')
boot_lun = *cp++ - '0';
if (*cp == ',')
cp += 1;
if (*cp >= '0' && *cp <= '9')
boot_id = *cp++ - '0';
if (*cp == ',')
cp += 1;
if (*cp >= '0' && *cp <= '9')
boot_part = *cp - '0';
boot_class = DV_DISK;
return;
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.2 2000/08/15 04:56:46 wdk Exp $ */
/* $NetBSD: machdep.c,v 1.3 2000/08/16 21:54:44 wdk Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@ -43,7 +43,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.2 2000/08/15 04:56:46 wdk Exp $");
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.3 2000/08/16 21:54:44 wdk Exp $");
/* from: Utah Hdr: machdep.c 1.63 91/04/24 */
@ -86,6 +86,7 @@ __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.2 2000/08/15 04:56:46 wdk Exp $");
#include <machine/intr.h>
#include <machine/mainboard.h>
#include <machine/sysconf.h>
#include <machine/autoconf.h>
#include <dev/clock_subr.h>
#include <dev/cons.h>
@ -207,7 +208,7 @@ mach_init(argc, argv, envp)
caddr_t kernend, v;
vsize_t size;
char *cp;
extern u_long bootdev;
int i;
extern char edata[], end[];
/* clear the BSS segment */
@ -219,8 +220,7 @@ mach_init(argc, argv, envp)
*/
uvm_setpagesize();
boothowto = RB_SINGLE;
bootdev = 0;
consinit();
/*
* The MIPS Rc3230 series machine have a really ugly memory
@ -273,16 +273,64 @@ mach_init(argc, argv, envp)
*/
mips_vector_init();
/* Look at argv[0] and compute bootdev */
makebootdev(argv[0]);
/*
* Look at arguments passed to us and compute boothowto.
*/
boothowto = RB_SINGLE;
for (i = 1; i < argc; i++) {
for (cp = argv[i]; *cp; cp++) {
switch (*cp) {
case 'a': /* autoboot */
case 'A':
boothowto &= ~RB_SINGLE;
break;
#if defined(KGDB) || defined(DDB)
case 'd': /* break into the kernel debugger ASAP */
case 'D':
boothowto |= RB_KDB;
break;
#endif
case 'm': /* mini root present in memory */
case 'M':
boothowto |= RB_MINIROOT;
break;
case 'n': /* ask for names */
boothowto |= RB_ASKNAME;
break;
case 'N': /* don't ask for names */
boothowto &= ~RB_ASKNAME;
break;
case 's': /* single-user (default) */
case 'S':
boothowto |= RB_SINGLE;
break;
case '-': /* Ignore superfluous '-' */
break;
default:
printf("bootflag '%c' not recognised", *cp);
}
}
}
#ifdef DDB
/*
* Initialize machine-dependent DDB commands, in case of early panic.
*/
db_machine_init();
#endif
boothowto &= ~RB_ASKNAME; /* for lack of cn_getc */
#ifdef KADB
boothowto |= RB_KDB;
if (boothowto & RB_KDB)
Debugger();
#endif
#ifdef MFS