Module Name: src Committed By: tsutsui Date: Mon Jan 21 11:58:12 UTC 2013
Modified Files: src/sys/arch/luna68k/stand/boot: Makefile bmc.c boot.c init_main.c locore.S parse.c prf.c samachdep.h sio.c version Added Files: src/sys/arch/luna68k/stand/boot: awaitkey.c Log Message: Add support for "await key" to abort autoboot and get boot menu. Also add command help. Bump version. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/arch/luna68k/stand/boot/Makefile \ src/sys/arch/luna68k/stand/boot/locore.S \ src/sys/arch/luna68k/stand/boot/samachdep.h cvs rdiff -u -r0 -r1.1 src/sys/arch/luna68k/stand/boot/awaitkey.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/luna68k/stand/boot/bmc.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/luna68k/stand/boot/boot.c \ src/sys/arch/luna68k/stand/boot/prf.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/luna68k/stand/boot/init_main.c \ src/sys/arch/luna68k/stand/boot/version cvs rdiff -u -r1.2 -r1.3 src/sys/arch/luna68k/stand/boot/parse.c \ src/sys/arch/luna68k/stand/boot/sio.c 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/Makefile diff -u src/sys/arch/luna68k/stand/boot/Makefile:1.7 src/sys/arch/luna68k/stand/boot/Makefile:1.8 --- src/sys/arch/luna68k/stand/boot/Makefile:1.7 Sun Jan 20 02:35:13 2013 +++ src/sys/arch/luna68k/stand/boot/Makefile Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.7 2013/01/20 02:35:13 tsutsui Exp $ +# $NetBSD: Makefile,v 1.8 2013/01/21 11:58:12 tsutsui Exp $ # @(#)Makefile 8.2 (Berkeley) 8/15/93 NOMAN= # defined @@ -39,7 +39,7 @@ SRCS+= conf.c SRCS+= machdep.c SRCS+= getline.c parse.c SRCS+= boot.c -SRCS+= cons.c prf.c +SRCS+= cons.c prf.c awaitkey.c SRCS+= romcons.c SRCS+= sio.c SRCS+= bmc.c bmd.c screen.c font.c kbd.c Index: src/sys/arch/luna68k/stand/boot/locore.S diff -u src/sys/arch/luna68k/stand/boot/locore.S:1.7 src/sys/arch/luna68k/stand/boot/locore.S:1.8 --- src/sys/arch/luna68k/stand/boot/locore.S:1.7 Sun Jan 20 03:40:55 2013 +++ src/sys/arch/luna68k/stand/boot/locore.S Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.S,v 1.7 2013/01/20 03:40:55 tsutsui Exp $ */ +/* $NetBSD: locore.S,v 1.8 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -535,9 +535,13 @@ ENTRY_NOPROFILE(lev5intr) moveml %sp@+,#0x0303 | restore scratch regs addql #2,%sp | pop pad word jra _ASM_LABEL(rei) | all done + ENTRY_NOPROFILE(hardclock) + addql #1,_C_LABEL(tick) rts +BSS(tick,4) + ENTRY_NOPROFILE(lev6intr) clrw %sp@- moveml #0xC0C0,%sp@- Index: src/sys/arch/luna68k/stand/boot/samachdep.h diff -u src/sys/arch/luna68k/stand/boot/samachdep.h:1.7 src/sys/arch/luna68k/stand/boot/samachdep.h:1.8 --- src/sys/arch/luna68k/stand/boot/samachdep.h:1.7 Sun Jan 20 14:03:40 2013 +++ src/sys/arch/luna68k/stand/boot/samachdep.h Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: samachdep.h,v 1.7 2013/01/20 14:03:40 tsutsui Exp $ */ +/* $NetBSD: samachdep.h,v 1.8 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1982, 1990, 1993 @@ -54,10 +54,12 @@ typedef struct label_t { } label_t; /* autoconf.c */ -extern int cpuspeed; void configure(void); void find_devs(void); +/* awaitkey.c */ +char awaitkey(const char *, int, bool); + /* bmc.c */ void bmccnprobe(struct consdev *); void bmccninit(struct consdev *); @@ -110,6 +112,8 @@ int getline(char *, char *); int leinit(void *); /* init_main.c */ +extern int cpuspeed; +extern int hz; extern int nplane; extern int machtype; @@ -130,6 +134,7 @@ int lance_intr(void); extern u_int bootdev; extern int dipsw1, dipsw2; extern int cputype; +extern volatile uint32_t tick; int setjmp(label_t *); int splhigh(void); void splx(int); @@ -153,9 +158,7 @@ void regdump(int *, int); char *hexstr(int, int); /* prf.c */ -#if 0 int tgetchar(void); -#endif /* parse.c */ int check_args(int, char **); Index: src/sys/arch/luna68k/stand/boot/bmc.c diff -u src/sys/arch/luna68k/stand/boot/bmc.c:1.3 src/sys/arch/luna68k/stand/boot/bmc.c:1.4 --- src/sys/arch/luna68k/stand/boot/bmc.c:1.3 Sun Jan 20 14:03:40 2013 +++ src/sys/arch/luna68k/stand/boot/bmc.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: bmc.c,v 1.3 2013/01/20 14:03:40 tsutsui Exp $ */ +/* $NetBSD: bmc.c,v 1.4 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -116,9 +116,8 @@ bmccngetc(dev_t dev) int c; int unit = 1; - while (RBUF_EMPTY(unit)) { - DELAY(10); - } + if (RBUF_EMPTY(unit)) + return 0; POP_RBUF(unit, c); Index: src/sys/arch/luna68k/stand/boot/boot.c diff -u src/sys/arch/luna68k/stand/boot/boot.c:1.1 src/sys/arch/luna68k/stand/boot/boot.c:1.2 --- src/sys/arch/luna68k/stand/boot/boot.c:1.1 Sat Jan 5 17:44:24 2013 +++ src/sys/arch/luna68k/stand/boot/boot.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.1 2013/01/05 17:44:24 tsutsui Exp $ */ +/* $NetBSD: boot.c,v 1.2 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -207,6 +207,7 @@ bootnetbsd(char *line) (*entry)(); } + printf("Booting kernel failed. (%s)\n", strerror(errno)); return ST_ERROR; } Index: src/sys/arch/luna68k/stand/boot/prf.c diff -u src/sys/arch/luna68k/stand/boot/prf.c:1.1 src/sys/arch/luna68k/stand/boot/prf.c:1.2 --- src/sys/arch/luna68k/stand/boot/prf.c:1.1 Sat Jan 5 17:44:24 2013 +++ src/sys/arch/luna68k/stand/boot/prf.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: prf.c,v 1.1 2013/01/05 17:44:24 tsutsui Exp $ */ +/* $NetBSD: prf.c,v 1.2 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -50,14 +50,13 @@ getchar(void) return c; } -#if 0 int tgetchar(void) { int c; - if ((c = cnscan()) == -1) - return -1; + if ((c = cngetc()) == 0) + return 0; if (c == '\r') c = '\n'; @@ -67,7 +66,6 @@ tgetchar(void) } return c; } -#endif void putchar(int c) Index: src/sys/arch/luna68k/stand/boot/init_main.c diff -u src/sys/arch/luna68k/stand/boot/init_main.c:1.4 src/sys/arch/luna68k/stand/boot/init_main.c:1.5 --- src/sys/arch/luna68k/stand/boot/init_main.c:1.4 Sun Jan 20 13:35:43 2013 +++ src/sys/arch/luna68k/stand/boot/init_main.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: init_main.c,v 1.4 2013/01/20 13:35:43 tsutsui Exp $ */ +/* $NetBSD: init_main.c,v 1.5 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -85,6 +85,7 @@ static int get_plane_numbers(void); static int reorder_dipsw(int); int cpuspeed; /* for DELAY() macro */ +int hz = 60; int machtype; #define VERS_LOCAL "Phase-31" @@ -106,6 +107,9 @@ char buffer[BUFFSIZE]; int argc; char *argv[MAXARGS]; +#define BOOT_TIMEOUT 10 +int boot_timeout = BOOT_TIMEOUT; + char prompt[16] = "boot> "; void @@ -121,10 +125,12 @@ main(void) machtype = LUNA_I; machstr = "LUNA-I"; cpuspeed = MHZ_25; + hz = 60; } else { machtype = LUNA_II; machstr = "LUNA-II"; cpuspeed = MHZ_25 * 2; /* XXX */ + hz = 100; } nplane = get_plane_numbers(); @@ -162,14 +168,24 @@ main(void) howto = reorder_dipsw(dipsw2); if ((howto & 0xFE) == 0) { - printf("auto-boot %s\n", default_file); - bootnetbsd(default_file); + char c; + + printf("Press return to boot now," + " any other key for boot menu\n"); + printf("booting %s - starting in ", default_file); + c = awaitkey("%d seconds. ", boot_timeout, true); + if (c == '\r' || c == '\n' || c == 0) { + printf("auto-boot %s\n", default_file); + bootnetbsd(default_file); + } } /* * Main Loop */ + printf("type \"help\" for help.\n"); + do { memset(buffer, 0, BUFFSIZE); if (getline(prompt, buffer) > 0) { Index: src/sys/arch/luna68k/stand/boot/version diff -u src/sys/arch/luna68k/stand/boot/version:1.4 src/sys/arch/luna68k/stand/boot/version:1.5 --- src/sys/arch/luna68k/stand/boot/version:1.4 Wed Jan 16 15:46:20 2013 +++ src/sys/arch/luna68k/stand/boot/version Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -$NetBSD: version,v 1.4 2013/01/16 15:46:20 tsutsui Exp $ +$NetBSD: version,v 1.5 2013/01/21 11:58:12 tsutsui Exp $ NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this file is important - make sure the entries are appended on end, last item @@ -8,3 +8,4 @@ is taken as the current. 1.1: Add netboot support. 1.2: Add support for secondary SPC SCSI on LUNA-II. 1.3: Add UFS2 support. +1.4: Add support for "awaiting key" to abort autoboot and get boot menu. Index: src/sys/arch/luna68k/stand/boot/parse.c diff -u src/sys/arch/luna68k/stand/boot/parse.c:1.2 src/sys/arch/luna68k/stand/boot/parse.c:1.3 --- src/sys/arch/luna68k/stand/boot/parse.c:1.2 Wed Jan 16 15:15:01 2013 +++ src/sys/arch/luna68k/stand/boot/parse.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.2 2013/01/16 15:15:01 tsutsui Exp $ */ +/* $NetBSD: parse.c,v 1.3 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -79,6 +79,8 @@ #include <luna68k/stand/boot/samachdep.h> #include <luna68k/stand/boot/status.h> +static int cmd_help(int, char *[]); + int check_args(int argc, char *argv[]) { @@ -96,6 +98,31 @@ exit_program(int argc, char *argv[]) return(ST_EXIT); } +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" + "ls [device(unit, part)[path]]\n" + " (ex. \"ls sd(0,0)/bin\")\n" + "help\n" + "exit\n" +#if 0 /* debug commands */ + "checkargs\n" + "disklabel\n" + "howto\n" + "screen\n" + "scsi\n" +#endif +; + +static int +cmd_help(int argc, char *argv[]) +{ + + printf(helpmsg); + return ST_NORMAL; +} + struct command_entry { char *name; int (*func)(int, char **); @@ -111,6 +138,7 @@ struct command_entry entries[] = { { "fsdump", fsdump }, { "fsrestore", fsrestore }, #endif + { "help", cmd_help }, { "howto", how_to_boot }, { "ls", cmd_ls }, { "screen", screen }, Index: src/sys/arch/luna68k/stand/boot/sio.c diff -u src/sys/arch/luna68k/stand/boot/sio.c:1.2 src/sys/arch/luna68k/stand/boot/sio.c:1.3 --- src/sys/arch/luna68k/stand/boot/sio.c:1.2 Sat Jan 12 07:04:57 2013 +++ src/sys/arch/luna68k/stand/boot/sio.c Mon Jan 21 11:58:12 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: sio.c,v 1.2 2013/01/12 07:04:57 tsutsui Exp $ */ +/* $NetBSD: sio.c,v 1.3 2013/01/21 11:58:12 tsutsui Exp $ */ /* * Copyright (c) 1992 OMRON Corporation. @@ -167,9 +167,8 @@ siocngetc(dev_t dev) { int c, unit = siounit(dev); - while (RBUF_EMPTY(unit)) { - DELAY(10); - } + if (RBUF_EMPTY(unit)) + return 0; POP_RBUF(unit, c); Added files: Index: src/sys/arch/luna68k/stand/boot/awaitkey.c diff -u /dev/null src/sys/arch/luna68k/stand/boot/awaitkey.c:1.1 --- /dev/null Mon Jan 21 11:58:13 2013 +++ src/sys/arch/luna68k/stand/boot/awaitkey.c Mon Jan 21 11:58:12 2013 @@ -0,0 +1,86 @@ +/* $NetBSD: awaitkey.c,v 1.1 2013/01/21 11:58:12 tsutsui Exp $ */ + +/*- + * Copyright (c) 2013 Izumi Tsutsui. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <lib/libkern/libkern.h> +#include <luna68k/stand/boot/samachdep.h> + +static void print_countdown(const char *, int); + +#define FMTLEN 40 + +static void +print_countdown(const char *pfmt, int n) +{ + int len, i; + char fmtbuf[FMTLEN]; + + len = snprintf(fmtbuf, FMTLEN, pfmt, n); + printf("%s", fmtbuf); + for (i = 0; i < len; i++) + putchar('\b'); +} + +/* + * awaitkey(const char *pfmt, int timeout, bool tell) + * + * Wait timeout seconds until any input from stdin. + * print countdown message using "pfmt" if tell is true. + * Requires tgetchar(), which returns 0 if there is no input. + */ +char +awaitkey(const char *pfmt, int timeout, bool tell) +{ + uint32_t otick; + char c = 0; + + if (timeout <= 0) + goto out; + + if (tell) + print_countdown(pfmt, timeout); + + otick = tick; + + for (;;) { + c = tgetchar(); + if (c != 0) + break; + if (tick - otick >= hz) { + otick = tick; + if (--timeout == 0) + break; + if (tell) + print_countdown(pfmt, timeout); + } + } + + out: + if (tell) { + printf(pfmt, 0); + printf("\n"); + } + return c; +}