Change the way boot strings are handled and the way the root device

is determined.  This allows multiple internal disks in a raq2 to work.
This commit is contained in:
cyber 2001-06-17 00:11:40 +00:00
parent 38527630e2
commit 662f93aeeb
2 changed files with 121 additions and 53 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.c,v 1.7 2000/06/06 18:00:13 soren Exp $ */
/* $NetBSD: autoconf.c,v 1.8 2001/06/17 00:11:40 cyber Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang. All rights reserved.
@ -33,10 +33,13 @@
#include <machine/cpu.h>
struct device *booted_device;
int booted_partition;
extern char bootstring[];
extern int netboot;
extern int bootunit;
extern int bootpart;
static void findroot(void);
struct device *booted_device;
int booted_partition = 0;
int cpuspeed = 100; /* Until we know more precisely. */
@ -54,46 +57,38 @@ cpu_configure()
void
cpu_rootconf()
{
findroot();
printf("boot device: %s\n",
booted_device ? booted_device->dv_xname : "<unknown>");
setroot(booted_device, booted_partition);
}
extern char bootstring[];
extern int netboot;
static void
findroot(void)
{
struct device *dv;
if (booted_device)
return;
if ((booted_device == NULL) && netboot == 0)
for (dv = alldevs.tqh_first; dv != NULL;
dv = dv->dv_list.tqe_next)
if (dv->dv_class == DV_DISK &&
!strcmp(dv->dv_cfdata->cf_driver->cd_name, "wd"))
booted_device = dv;
/*
* XXX Match up MBR boot specification with BSD disklabel for root?
*/
booted_partition = 0;
return;
}
static int hd_iterate = -1;
void
device_register(dev, aux)
struct device *dev;
void *aux;
{
if (booted_device)
return;
if ((booted_device == NULL) && (netboot == 1))
if (dev->dv_class == DV_IFNET)
booted_device = dev;
if ((booted_device == NULL) && (netboot == 0)) {
if (dev->dv_class == DV_DISK &&
!strcmp(dev->dv_cfdata->cf_driver->cd_name, "wd")) {
hd_iterate++;
if (hd_iterate == bootunit) {
booted_device = dev;
}
}
/*
* XXX Match up MBR boot specification with BSD disklabel for root?
*/
booted_partition = 0;
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.32 2001/06/02 18:09:11 chs Exp $ */
/* $NetBSD: machdep.c,v 1.33 2001/06/17 00:11:41 cyber Exp $ */
/*
* Copyright (c) 2000 Soren S. Jorvang. All rights reserved.
@ -75,6 +75,7 @@
#include <dev/cons.h>
/* For sysctl. */
char machine[] = MACHINE;
char machine_arch[] = MACHINE_ARCH;
@ -93,11 +94,19 @@ int physmem; /* Total physical memory */
char bootstring[512]; /* Boot command */
int netboot; /* Are we netbooting? */
char * nfsroot_bstr = NULL;
char * root_bstr = NULL;
int bootunit = -1;
int bootpart = -1;
phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX];
int mem_cluster_cnt;
void configure(void);
void mach_init(unsigned int);
void decode_bootstring(void);
static char * strtok_light(char *, const char);
/*
* safepri is a safe priority for sleep to set for a spin-wait during
@ -108,6 +117,8 @@ int safepri = MIPS1_PSL_LOWIPL;
extern caddr_t esym;
extern struct user *proc0paddr;
/*
* Do all the stuff that locore normally does before calling main().
*/
@ -119,7 +130,6 @@ mach_init(memsize)
u_long first, last;
vsize_t size;
extern char edata[], end[];
int i;
/*
* Clear the BSS segment.
@ -163,26 +173,7 @@ mach_init(memsize)
memset((char *)(memsize - 512), 0, 512);
bootstring[511] = '\0';
for (i = 0; i < 512; i++) {
switch (bootstring[i]) {
case '\0':
break;
case ' ':
continue;
case '-':
while (bootstring[i] != ' ' && bootstring[i] != '\0') {
BOOT_FLAG(bootstring[i], boothowto);
i++;
}
}
if (memcmp("single", bootstring + i, 5) == 0)
boothowto |= RB_SINGLE;
if (memcmp("nfsroot=", bootstring + i, 8) == 0)
netboot = 1;
/*
* XXX Select root device from 'root=/dev/hd[abcd][1234]' too.
*/
}
decode_bootstring();
#ifdef DDB
if (boothowto & RB_KDB)
@ -529,3 +520,85 @@ cpu_intr(status, cause, pc, ipending)
softclock(NULL);
}
}
void
decode_bootstring(void)
{
char * work;
char * equ;
int i;
/* break apart bootstring on ' ' boundries and itterate*/
work = strtok_light(bootstring, ' ');
while (work != '\0') {
/* if starts with '-', we got options, walk its decode */
if (work[0] == '-') {
i = 1;
while (work[i] != ' ' && work[i] != '\0') {
BOOT_FLAG(work[i], boothowto);
i++;
}
} else
/* if it has a '=' its an assignment, switch and set */
if ((equ = strchr(work,'=')) != '\0') {
if(0 == memcmp("nfsroot=", work, 8)) {
nfsroot_bstr = (equ +1);
} else
if(0 == memcmp("root=", work, 5)) {
root_bstr = (equ +1);
}
} else
/* else it a single value, switch and process */
if (memcmp("single", work, 5) == 0) {
boothowto |= RB_SINGLE;
} else
if (memcmp("ro", work, 2) == 0) {
/* this is also inserted by the firmware */
}
/* grab next token */
work = strtok_light(NULL, ' ');
}
if (root_bstr != NULL) {
/* this should be of the form "/dev/hda1" */
/* [abcd][1234] drive partition linux probe order */
if ((memcmp("/dev/hd",root_bstr,7) == 0) &&
(strlen(root_bstr) == 9) ){
bootunit = root_bstr[7] - 'a';
bootpart = root_bstr[8] - '1';
}
}
}
static char *
strtok_light(str, sep)
char * str;
const char sep;
{
static char * proc;
char * head;
char * work;
if (str != NULL)
proc = str;
if (proc == NULL) /* end of string return NULL */
return proc;
head = proc;
work = strchr (proc, sep);
if (work == NULL) { /* we hit the end */
proc = work;
} else {
proc = (work +1 );
*work = '\0';
}
return head;
}