Module Name: src
Committed By: tsutsui
Date: Sat Jan 11 08:08:23 UTC 2014
Modified Files:
src/sys/arch/luna68k/stand/boot: boot.c conf.c devopen.c init_main.c
parse.c samachdep.h
Log Message:
Add support to pass boothowto and bootdev info from bootloader to kernel.
Bootloader side changes:
- make boot command parse boothowto flags (-ads etc.)
- pass boothowto and bootdev info to the kernel via %d7 and %d6
as the old 4.4BSD/luna68k kernel expected
- remove unused and now unnecessary "howto" (how_to_boot) command
- export and tweak make_device() in devopen.c to prepare bootdev info
- remove unused and commented out get_boot_device()
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/luna68k/stand/boot/boot.c \
src/sys/arch/luna68k/stand/boot/devopen.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/luna68k/stand/boot/conf.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/luna68k/stand/boot/init_main.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/luna68k/stand/boot/parse.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/luna68k/stand/boot/samachdep.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/luna68k/stand/boot/boot.c
diff -u src/sys/arch/luna68k/stand/boot/boot.c:1.5 src/sys/arch/luna68k/stand/boot/boot.c:1.6
--- src/sys/arch/luna68k/stand/boot/boot.c:1.5 Fri Jan 10 11:12:03 2014
+++ src/sys/arch/luna68k/stand/boot/boot.c Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.5 2014/01/10 11:12:03 tsutsui Exp $ */
+/* $NetBSD: boot.c,v 1.6 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1992 OMRON Corporation.
@@ -76,6 +76,7 @@
*/
#include <sys/param.h>
+#include <sys/boot_flag.h>
#include <sys/reboot.h>
#include <sys/exec.h>
#include <luna68k/stand/boot/samachdep.h>
@@ -83,142 +84,68 @@
#include <luna68k/stand/boot/status.h>
#include <lib/libsa/loadfile.h>
-int howto;
-
-#if 0
-static int get_boot_device(const char *, int *, int *, int *);
-#endif
-
-struct exec header;
-
-char *how_to_info[] = {
- "RB_ASKNAME ask for file name to reboot from",
- "RB_SINGLE reboot to single user only",
- "RB_NOSYNC dont sync before reboot",
- "RB_HALT don't reboot, just halt",
- "RB_INITNAME name given for /etc/init (unused)",
- "RB_DFLTROOT use compiled-in rootdev",
- "RB_KDB give control to kernel debugger",
- "RB_RDONLY mount root fs read-only"
-};
-
-int
-how_to_boot(int argc, char *argv[])
-{
- int i, h = howto;
-
- if (argc < 2) {
- printf("howto: 0x%s\n\n", hexstr(howto, 2));
-
- if (h == 0) {
- printf("\t%s\n", "RB_AUTOBOOT flags for system auto-booting itself");
- } else {
- for (i = 0; i < 8; i++, h >>= 1) {
- if (h & 0x01) {
- printf("\t%s\n", how_to_info[i]);
- }
- }
- }
-
- printf("\n");
- }
- return ST_NORMAL;
-}
-
-#if 0
-int
-get_boot_device(const char *s, int *devp, int *unitp, int *partp)
-{
- const char *p = s;
- int unit, part;
-
- uint = 0;
- part = 0;
-
- while (*p != '(') {
- if (*p == '\0')
- goto error;
- p++;
- }
-
- p++;
- for (; *p != ',' && *p != ')') {
- if (*p == '\0')
- goto error;
- if (*p >= '0' && *p <= '9')
- unit = (unit * 10) + (*p - '0');
- }
-
- if (*p == ',')
- p++;
- for (; *p != ')'; p++) {
- if (*p == '\0')
- goto error;
- if (*p >= '0' && *p <= '9')
- part = (part * 10) + (*p - '0');
- }
-
- *devp = 0; /* XXX not yet */
- *unitp = unit;
- *partp = part;
-
- return 0;
-
-error:
- return -1;
-}
-#endif
-
int
boot(int argc, char *argv[])
{
- char *line;
-
- if (argc < 2)
+ char *line, *opts;
+ int i, howto;
+ char c;
+
+ line = NULL;
+ howto = 0;
+ for (i = 1; i < argc; i++) {
+ if (argv[i][0] == '-') {
+ opts = argv[i];
+ while ((c = *++opts) && c != '\0')
+ BOOT_FLAG(c, howto);
+ } else if (line == NULL)
+ line = argv[i];
+ }
+ if (line == NULL)
line = default_file;
- else
- line = argv[1];
- printf("Booting %s\n", line);
+ printf("Booting %s", line);
+ if (howto != 0)
+ printf(" (howto 0x%x)", howto);
+ printf("\n");
- return bootnetbsd(line);
+ return bootnetbsd(line, howto);
}
int
-bootnetbsd(char *line)
+bootnetbsd(char *line, int howto)
{
int io;
-#if 0
- int dev, unit, part;
-#endif
u_long marks[MARK_MAX];
- void (*entry)(void);
-
-#if 0
- if (get_boot_device(line, &dev, &unit, &part) != 0) {
- printf("Bad file name %s\n", line);
- return ST_ERROR;
- }
-#endif
/* Note marks[MARK_START] is passed as an load address offset */
memset(marks, 0, sizeof(marks));
io = loadfile(line, marks, LOAD_KERNEL);
if (io >= 0) {
+ int dev = 0, unit = 0, part = 0;
+ uint adpt, ctlr, id;
+ uint32_t bootdev;
+
+ make_device(line, &dev, &unit, &part, NULL);
+ adpt = dev2adpt[dev];
+ ctlr = CTLR(unit);
+ id = TARGET(unit);
+ bootdev = MAKEBOOTDEV(0, adpt, ctlr, id, part);
#ifdef DEBUG
printf("entry = 0x%lx\n", marks[MARK_ENTRY]);
printf("ssym = 0x%lx\n", marks[MARK_SYM]);
printf("esym = 0x%lx\n", marks[MARK_END]);
#endif
-
- /*
- * XXX TODO: fill bootinfo about symbols, boot device etc.
- */
-
- entry = (void *)marks[MARK_ENTRY];
-
- (*entry)();
+ __asm volatile (
+ "movl %0,%%d7;"
+ "movl %1,%%d6;"
+ "movl %2,%%a0;"
+ "jbsr %%a0@"
+ :
+ : "g" (howto), "g" (bootdev),
+ "g" ((void *)marks[MARK_ENTRY])
+ : "d6", "d7", "a0");
}
printf("Booting kernel failed. (%s)\n", strerror(errno));
Index: src/sys/arch/luna68k/stand/boot/devopen.c
diff -u src/sys/arch/luna68k/stand/boot/devopen.c:1.5 src/sys/arch/luna68k/stand/boot/devopen.c:1.6
--- src/sys/arch/luna68k/stand/boot/devopen.c:1.5 Fri Jan 10 11:12:03 2014
+++ src/sys/arch/luna68k/stand/boot/devopen.c Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: devopen.c,v 1.5 2014/01/10 11:12:03 tsutsui Exp $ */
+/* $NetBSD: devopen.c,v 1.6 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1992 OMRON Corporation.
@@ -76,8 +76,6 @@
#define MAXDEVNAME 16
-static int make_device(const char *, int *, int *, int *, char **);
-
int
devopen(struct open_file *f, const char *fname, char **file)
{
@@ -125,7 +123,7 @@ make_device(const char *str, int *devp,
{
const char *cp;
struct devsw *dp;
- int major, unit = 0, part = 0;
+ int dev, unit = 0, part = 0;
int i;
char devname[MAXDEVNAME + 1];
@@ -147,7 +145,7 @@ make_device(const char *str, int *devp,
if (dp->dv_name == NULL) {
return (-1);
}
- major = dp - devsw;
+ dev = dp - devsw;
/* get mixed controller and unit number */
for (; *cp != ',' && *cp != ')'; cp++) {
if (*cp == '\0')
@@ -178,17 +176,19 @@ make_device(const char *str, int *devp,
return (-1);
}
/* check out end of dev spec */
- *devp = major;
+ *devp = dev;
*unitp = unit;
*partp = part;
- cp++;
- if (*cp == '\0')
- *fname = "netbsd";
- else
- *fname = __UNCONST(cp); /* XXX */
+ if (fname != NULL) {
+ cp++;
+ if (*cp == '\0')
+ *fname = "netbsd";
+ else
+ *fname = __UNCONST(cp); /* XXX */
+ }
#ifdef DEBUG
- printf("%s: major = %d, unit = %d, part = %d, fname = %s\n",
- __func__, major, unit, part, *fname);
+ printf("%s: dev = %d, unit = %d, part = %d, fname = %s\n",
+ __func__, dev, unit, part, fname != NULL ? *fname : "");
#endif
return 0;
Index: src/sys/arch/luna68k/stand/boot/conf.c
diff -u src/sys/arch/luna68k/stand/boot/conf.c:1.3 src/sys/arch/luna68k/stand/boot/conf.c:1.4
--- src/sys/arch/luna68k/stand/boot/conf.c:1.3 Wed Jan 16 15:46:20 2013
+++ src/sys/arch/luna68k/stand/boot/conf.c Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: conf.c,v 1.3 2013/01/16 15:46:20 tsutsui Exp $ */
+/* $NetBSD: conf.c,v 1.4 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -43,6 +43,7 @@
#include <lib/libsa/nfs.h>
#include <lib/libsa/ufs.h>
+#include <machine/bootinfo.h>
#include <luna68k/stand/boot/samachdep.h>
#define xxstrategy \
@@ -80,6 +81,12 @@ struct devsw devsw[] = {
};
int ndevs = __arraycount(devsw);
+/* XXX: These indices must sync with the above devsw */
+const int dev2adpt[] = {
+ LUNA68K_BOOTADPT_SPC,
+ LUNA68K_BOOTADPT_LANCE,
+};
+
#ifdef SUPPORT_ETHERNET
extern struct netif_driver le_netif_driver;
struct netif_driver *netif_drivers[] = {
Index: src/sys/arch/luna68k/stand/boot/init_main.c
diff -u src/sys/arch/luna68k/stand/boot/init_main.c:1.9 src/sys/arch/luna68k/stand/boot/init_main.c:1.10
--- src/sys/arch/luna68k/stand/boot/init_main.c:1.9 Fri Jan 10 11:12:03 2014
+++ src/sys/arch/luna68k/stand/boot/init_main.c Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: init_main.c,v 1.9 2014/01/10 11:12:03 tsutsui Exp $ */
+/* $NetBSD: init_main.c,v 1.10 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1992 OMRON Corporation.
@@ -179,6 +179,7 @@ main(void)
int i, status = 0;
const char *machstr;
const char *bootdev;
+ uint32_t howto;
int unit, part;
int bdev, ctlr, id;
@@ -307,7 +308,7 @@ main(void)
c = awaitkey("%d seconds. ", boot_timeout, true);
if (c == '\r' || c == '\n' || c == 0) {
printf("auto-boot %s\n", default_file);
- bootnetbsd(default_file);
+ bootnetbsd(default_file, 0);
}
}
Index: src/sys/arch/luna68k/stand/boot/parse.c
diff -u src/sys/arch/luna68k/stand/boot/parse.c:1.4 src/sys/arch/luna68k/stand/boot/parse.c:1.5
--- src/sys/arch/luna68k/stand/boot/parse.c:1.4 Tue Jan 22 15:48:40 2013
+++ src/sys/arch/luna68k/stand/boot/parse.c Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.4 2013/01/22 15:48:40 tsutsui Exp $ */
+/* $NetBSD: parse.c,v 1.5 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1992 OMRON Corporation.
@@ -100,8 +100,9 @@ exit_program(int argc, char *argv[])
static const char helpmsg[] =
"commands are:\n"
- "boot [device(unit,part)filename]\n"
- " (ex. \"boot sd(0,0)netbsd\", \"boot le(0,0)netbsd.old\" etc.)\n"
+ "boot [device(unit,part)filename] [-ads]\n"
+ " (ex. \"boot sd(6,0)netbsd\", \"boot le()netbsd.old\" etc.)\n"
+ " Note unit number for SCSI device is (ctlr) * 10 + (id)."
"ls [device(unit, part)[path]]\n"
" (ex. \"ls sd(0,0)/bin\")\n"
"help\n"
@@ -139,7 +140,6 @@ struct command_entry entries[] = {
{ "fsrestore", fsrestore },
#endif
{ "help", cmd_help },
- { "howto", how_to_boot },
{ "ls", cmd_ls },
{ "screen", screen },
#ifdef notyet
Index: src/sys/arch/luna68k/stand/boot/samachdep.h
diff -u src/sys/arch/luna68k/stand/boot/samachdep.h:1.15 src/sys/arch/luna68k/stand/boot/samachdep.h:1.16
--- src/sys/arch/luna68k/stand/boot/samachdep.h:1.15 Fri Jan 10 11:12:03 2014
+++ src/sys/arch/luna68k/stand/boot/samachdep.h Sat Jan 11 08:08:23 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: samachdep.h,v 1.15 2014/01/10 11:12:03 tsutsui Exp $ */
+/* $NetBSD: samachdep.h,v 1.16 2014/01/11 08:08:23 tsutsui Exp $ */
/*
* Copyright (c) 1982, 1990, 1993
@@ -54,6 +54,7 @@ typedef struct label_t {
/* autoconf.c */
void configure(void);
void find_devs(void);
+extern const int dev2adpt[];
/* awaitkey.c */
char awaitkey(const char *, int, bool);
@@ -71,10 +72,8 @@ void bmdadjust(short, short);
void bmdclear(void);
/* boot.c */
-extern int howto;
-int how_to_boot(int, char **);
int boot(int, char **);
-int bootnetbsd(char *);
+int bootnetbsd(char *, int);
/* clock.c */
/* not yet */
@@ -84,6 +83,9 @@ void cninit(void);
int cngetc(void);
void cnputc(int);
+/* devopen.c */
+int make_device(const char *, int *, int *, int *, char **);
+
/* disklabel.c */
extern u_char lbl_buff[];
int disklabel(int, char **);