Date: Fri, 15 Mar 2002 14:00:27 +0100 From: Thomas Quinot <thomas@cuivre.fr.eu.org> To: Pierre Beyssac <pb@fasterix.frmug.org> Cc: Ruslan Ermilov <ru@FreeBSD.org>, cvs-all@freebsd.org Subject: Re: cvs commit: src/sys/boot/i386/boot2 boot2.c src/sbin/reboot boot_i386.8 Message-ID: <20020315140027.A60859@melusine.cuivre.fr.eu.org> In-Reply-To: <20020315015833.A447@fasterix.frmug.org>; from pb@fasterix.frmug.org on Fri, Mar 15, 2002 at 01:58:33AM %2B0100 References: <200203131103.g2DB3aD93661@freefall.freebsd.org> <20020315015833.A447@fasterix.frmug.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Le 2002-03-15, Pierre Beyssac écrivait : > BTW, I am currently testing a set of patches to boot2 written by > Thomas Quinot after we discussed the matter, adding a '-n' option > to boot2 to ignore keypresses (and doing some code cleanup at the > same time). Actually there are two separate patches: one is only de-obfuscation of some parts of boot2.c, with strictly no functional changes. The second adds a -n option to prevent any user interference in the boot process. I have already tested both changes here on a -current box; it would be nice if others could review these changes. Here are the diffs: Index: sys/boot/i386/boot2/boot2.c =================================================================== RCS file: /home/ncvs/src/sys/boot/i386/boot2/boot2.c,v retrieving revision 1.37 diff -u -r1.37 boot2.c --- sys/boot/i386/boot2/boot2.c 13 Mar 2002 11:03:36 -0000 1.37 +++ sys/boot/i386/boot2/boot2.c 15 Mar 2002 12:46:54 -0000 @@ -37,6 +37,11 @@ #include "boot2.h" #include "lib.h" +#define IO_KEYBOARD 1 +#define IO_SERIAL 2 + +#define SECOND 18 /* Circa that many ticks in a second. */ + #define RBX_ASKNAME 0x0 /* -a */ #define RBX_SINGLE 0x1 /* -s */ #define RBX_DFLTROOT 0x5 /* -r */ @@ -136,7 +141,7 @@ static struct bootinfo bootinfo; static int ls; static uint32_t fs_off; -static uint8_t ioctrl = 0x1; +static uint8_t ioctrl = IO_KEYBOARD; void exit(int); static void load(const char *); @@ -279,34 +284,39 @@ bootinfo.bi_memsizes_valid++; for (i = 0; i < N_BIOS_GEOM; i++) bootinfo.bi_bios_geom[i] = drvinfo(i); - autoboot = 2; + + /* Process configuration file */ + + autoboot = 1; readfile(PATH_CONFIG, cmd, sizeof(cmd)); if (*cmd) { printf("%s: %s", PATH_CONFIG, cmd); if (parse(cmd)) autoboot = 0; - *cmd = 0; } - if (autoboot && !*kname) { - if (autoboot == 2) { - memcpy(kname, PATH_BOOT3, sizeof(PATH_BOOT3)); - if (!keyhit(0x37)) { - load(kname); - autoboot = 1; - } - } - if (autoboot == 1) + + /* Try to exec stage 3 boot loader. If interrupted by a keypress, * + * or in case of failure, try to load a kernel directly instaed. */ + + if (autoboot) { + memcpy(kname, PATH_BOOT3, sizeof(PATH_BOOT3)); + if (!keyhit(3 * SECOND)) { + load(kname); memcpy(kname, PATH_KERNEL, sizeof(PATH_KERNEL)); + } } + + /* Present the user with the boot2 prompt. */ + for (;;) { printf(" \n>> FreeBSD/i386 BOOT\n" "Default: %u:%s(%u,%c)%s\n" "boot: ", dsk.drive & DRV_MASK, dev_nm[dsk.type], dsk.unit, 'a' + dsk.part, kname); - if (ioctrl & 0x2) + if (ioctrl & IO_SERIAL) sio_flush(); - if (!autoboot || keyhit(0x5a)) + if (!autoboot || keyhit(5 * SECOND)) getstr(cmd, sizeof(cmd)); else putchar('\n'); @@ -445,9 +455,9 @@ opts |= 1 << RBX_DUAL | 1 << RBX_SERIAL; opts &= ~(1 << RBX_PROBEKBD); } - ioctrl = opts & 1 << RBX_DUAL ? 0x3 : - opts & 1 << RBX_SERIAL ? 0x2 : 0x1; - if (ioctrl & 0x2) + ioctrl = opts & 1 << RBX_DUAL ? (IO_SERIAL | IO_KEYBOARD) : + opts & 1 << RBX_SERIAL ? IO_SERIAL : IO_KEYBOARD; + if (ioctrl & IO_SERIAL) sio_init(); } else { for (q = arg--; *q && *q != '('; q++); @@ -790,9 +800,9 @@ static int xputc(int c) { - if (ioctrl & 0x1) + if (ioctrl & IO_KEYBOARD) putc(c); - if (ioctrl & 0x2) + if (ioctrl & IO_SERIAL) sio_putc(c); return c; } @@ -801,9 +811,9 @@ xgetc(int fn) { for (;;) { - if (ioctrl & 0x1 && getc(1)) + if (ioctrl & IO_KEYBOARD && getc(1)) return fn ? 1 : getc(0); - if (ioctrl & 0x2 && sio_ischar()) + if (ioctrl & IO_SERIAL && sio_ischar()) return fn ? 1 : sio_getc(); if (fn) return 0; The second patch adds option '-n', which can be used in /boot.config: --- sys/boot/i386/boot2/boot2.c.orig Fri Mar 15 00:49:06 2002 +++ sys/boot/i386/boot2/boot2.c.optn Fri Mar 15 13:45:23 2002 @@ -55,2 +55,3 @@ #define RBX_PROBEKBD 0x1e /* -P */ +#define RBX_NOINTR 0x1f /* -n */ @@ -63,3 +64,3 @@ #define ARGS 0x900 -#define NOPT 13 +#define NOPT 14 #define NDEV 5 @@ -105,3 +106,3 @@ -static const char optstr[NOPT] = "DhaCcdgmPprsv"; +static const char optstr[NOPT] = "DhaCcdgmnPprsv"; static const unsigned char flags[NOPT] = { @@ -115,2 +116,3 @@ RBX_MUTE, + RBX_NOINTR, RBX_PROBEKBD, @@ -780,2 +782,4 @@ + if (opts & 1 << RBX_NOINTR) + return 0; t0 = 0; @@ -805,2 +809,4 @@ { + if (opts & 1 << RBX_NOINTR) + return 0; for (;;) { Thomas. -- Thomas.Quinot@Cuivre.FR.EU.ORG To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020315140027.A60859>