If only a device name is specified with no kernel name, try to load a
kernel from a default list of names. This list is netbsd, netbsd.bak, netbsd.old, onetbsd and gennetbsd - all without and with a .gz extension.
This commit is contained in:
parent
ab3de4de0e
commit
71c3fc3251
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: boot.c,v 1.5 1999/04/11 04:25:47 simonb Exp $ */
|
||||
/* $NetBSD: boot.c,v 1.6 1999/04/12 05:19:25 simonb Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -91,27 +91,46 @@
|
||||
|
||||
extern char bootprog_name[], bootprog_rev[], bootprog_date[], bootprog_maker[];
|
||||
|
||||
char *kernelnames[] = {
|
||||
"netbsd", "netbsd.gz",
|
||||
"netbsd.bak", "netbsd.bak.gz",
|
||||
"netbsd.old", "netbsd.old.gz",
|
||||
"onetbsd", "onetbsd.gz",
|
||||
"gennetbsd", "gennetbsd.gz",
|
||||
#ifdef notyet
|
||||
"netbsd.el", "netbsd.el.gz",
|
||||
#endif /*notyet*/
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
static int devonly __P((char *));
|
||||
int main __P((int, char **));
|
||||
|
||||
/*
|
||||
* This gets arguments from the PROM, calls other routines to open
|
||||
* and load the program to boot, and then transfers execution to that
|
||||
* new program.
|
||||
* Argv[0] should be something like "rz(0,0,0)vmunix" on a DECstation 3100.
|
||||
* Argv[0,1] should be something like "boot 5/rz0/vmunix" on a DECstation 5000.
|
||||
* The argument "-a" means vmunix should do an automatic reboot.
|
||||
* This gets arguments from the first stage boot lader, calls PROM routines
|
||||
* to open and load the program to boot, and then transfers execution to
|
||||
* that new program.
|
||||
*
|
||||
* Argv[0] should be something like "rz(0,0,0)netbsd" on a DECstation 3100.
|
||||
* Argv[0,1] should be something like "boot 5/rz0/netbsd" on a DECstation 5000.
|
||||
* The argument "-a" means netbsd should do an automatic reboot.
|
||||
*/
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
char *cp;
|
||||
int entry;
|
||||
char *name, **namep, *dev;
|
||||
char bootname[PATH_MAX], bootpath[PATH_MAX];
|
||||
int entry, win;
|
||||
u_long marks[MARK_MAX];
|
||||
struct btinfo_symtab bi_syms;
|
||||
struct btinfo_bootpath bi_bpath;
|
||||
|
||||
printf(">> %s, Revision %s\n", bootprog_name, bootprog_rev);
|
||||
printf(">> (%s, %s)\n", bootprog_maker, bootprog_date);
|
||||
|
||||
/* initialise bootinfo structure early */
|
||||
bi_init(BOOTINFO_ADDR);
|
||||
|
||||
@ -120,18 +139,38 @@ main(argc, argv)
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
cp = *argv;
|
||||
printf(">> %s, Revision %s\n", bootprog_name, bootprog_rev);
|
||||
printf(">> (%s, %s)\n", bootprog_maker, bootprog_date);
|
||||
name = argv[0];
|
||||
printf("Boot: %s\n", name);
|
||||
|
||||
printf("Boot: %s\n", cp);
|
||||
strncpy(bi_bpath.bootpath, cp, BTINFO_BOOTPATH_LEN);
|
||||
bi_add(&bi_bpath, BTINFO_BOOTPATH, sizeof(bi_bpath));
|
||||
/* NOTE: devonly() can modify name[]. */
|
||||
strcpy(bootname, argv[0]);
|
||||
if (devonly(bootname)) {
|
||||
dev = bootname;
|
||||
name = NULL;
|
||||
}
|
||||
|
||||
marks[MARK_START] = 0;
|
||||
if (loadfile(cp, marks, LOAD_ALL) == -1)
|
||||
if (name != NULL)
|
||||
win = (loadfile(name, marks, LOAD_ALL) != -1);
|
||||
else {
|
||||
win = 0;
|
||||
for (namep = kernelnames, win = 0; *namep != NULL && !win;
|
||||
namep++) {
|
||||
name = *namep;
|
||||
strcpy(bootpath, dev);
|
||||
strcat(bootpath, name);
|
||||
printf("Loading: %s\n", bootpath);
|
||||
win = (loadfile(bootpath, marks, LOAD_ALL) != -1);
|
||||
if (win)
|
||||
name = bootpath;
|
||||
}
|
||||
}
|
||||
if (!win)
|
||||
goto fail;
|
||||
|
||||
strncpy(bi_bpath.bootpath, name, BTINFO_BOOTPATH_LEN);
|
||||
bi_add(&bi_bpath, BTINFO_BOOTPATH, sizeof(bi_bpath));
|
||||
|
||||
entry = marks[MARK_ENTRY];
|
||||
bi_syms.nsym = marks[MARK_NSYM];
|
||||
bi_syms.ssym = marks[MARK_SYM];
|
||||
@ -145,8 +184,47 @@ main(argc, argv)
|
||||
else
|
||||
startprog(entry, entry, argc, argv, DEC_PROM_MAGIC,
|
||||
callv, BOOTINFO_MAGIC, BOOTINFO_ADDR);
|
||||
(void)printf("KERNEL RETURNED!\n");
|
||||
|
||||
fail:
|
||||
(void)printf("Boot failed! Halting...\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Check whether or not fname is a device name only or a full
|
||||
* bootpath including the kernel name. This code to do this
|
||||
* is copied from loadfile() in the first stage bootblocks.
|
||||
*
|
||||
* NOTE: fname will be modified if it's of the form N/rzY
|
||||
* without a trailing slash.
|
||||
*/
|
||||
static
|
||||
int
|
||||
devonly(fname)
|
||||
char *fname;
|
||||
{
|
||||
char c;
|
||||
|
||||
while ((c = *fname++) != '\0') {
|
||||
if (c == ')')
|
||||
break;
|
||||
if (c != '/')
|
||||
continue;
|
||||
while ((c = *fname++) != '\0')
|
||||
if (c == '/')
|
||||
break;
|
||||
/*
|
||||
* Make "N/rzY" with no trailing '/' valid by adding
|
||||
* the extra '/' before appending 'boot' to the path.
|
||||
*/
|
||||
if (c != '/') {
|
||||
fname--;
|
||||
*fname++ = '/';
|
||||
*fname = '\0';
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (*fname == '\0');
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user