We run our NanoBSD images on Soekris and ALIX hardware. In some cases we need all available serial ports for other hardware like GPS, and modems. The boards have no video, so with all serial ports unavailable as a console no other console is available. The problem is that FreeBSD does not handle well the case where there is no console at all: 1) http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/102515 fsck_ufs crashes (6.1-STABLE). Because of the unitialised console libc somehow gets corrupted and crashes fsck_ufs. This problem can be circumvented by replacing 'fsck -p' with 'fsck < /dev/null > /dev/null'. 2) In 8.3-RELEASE init exits prematurely because it cannot open /dev/console for reading and writing in setctty(). Removing the calls to _exit(1) in that function makes the boot complete. I haven't checked whether the fsck_ufs problem still appears as our builds run with a patched rc.d script. As far as I can see this is still a problem in CURRENT. My attempt at resolving this was to create a null terminal in dev/null/null.c, see the patch below, but that did not work as expected. After booting the system with a modified init the response to 'echo > /dev/console' was 'Device not configured'. I've added another CN_* priority to make sure a null console does not take precedence over for example gdb console. Any pointers as to who/how to resolve this issue? Any reason why the null console approach does not work? Nick Hibma nick_at_van-laarhoven.org GTD: Time management for chaotic people. Index: /usr/src/sys/sys/cons.h =================================================================== --- /usr/src/sys/sys/cons.h (revision 242660) +++ /usr/src/sys/sys/cons.h (working copy) _at__at_ -69,10 +69,11 _at__at_ /* values for cn_pri - reflect our policy for console selection */ #define CN_DEAD 0 /* device doesn't exist */ -#define CN_LOW 1 /* device is a last restort only */ -#define CN_NORMAL 2 /* device exists but is nothing special */ -#define CN_INTERNAL 3 /* "internal" bit-mapped display */ -#define CN_REMOTE 4 /* serial interface with remote bit set */ +#define CN_NULL 1 /* no console at all */ +#define CN_LOW 2 /* device is a last restort only */ +#define CN_NORMAL 3 /* device exists but is nothing special */ +#define CN_INTERNAL 4 /* "internal" bit-mapped display */ +#define CN_REMOTE 5 /* serial interface with remote bit set */ /* Values for cn_flags. */ #define CN_FLAG_NODEBUG 0x00000001 /* Not supported with debugger. */ Index: /usr/src/sys/dev/null/null.c =================================================================== --- /usr/src/sys/dev/null/null.c (revision 242660) +++ /usr/src/sys/dev/null/null.c (working copy) _at__at_ -41,6 +41,9 _at__at_ #include <sys/bus.h> #include <sys/filio.h> +#include <sys/cons.h> +#include <sys/consio.h> + #include <machine/bus.h> /* For use with destroy_dev(9). */ _at__at_ -173,3 +176,45 _at__at_ DEV_MODULE(null, null_modevent, NULL); MODULE_VERSION(null, 1); + +static cn_probe_t null_cnprobe; +static cn_init_t null_cninit; +static cn_term_t null_cnterm; +static cn_getc_t null_cngetc; +static cn_putc_t null_cnputc; + +CONSOLE_DRIVER(null); + +static void +null_cnprobe(struct consdev *cp) +{ + sprintf(cp->cn_name, "null"); + cp->cn_pri = CN_NULL; +} + +static void +null_cninit(struct consdev *cp) +{ +} + + +static void +null_cnputc(struct consdev *cp, int c) +{ + (void) cp; + + (void) c; +} + +static int +null_cngetc(struct consdev * cp) +{ + (void) cp; + + return -1; +} + +static void +null_cnterm(struct consdev * cp) +{ +}Received on Mon Feb 18 2013 - 18:30:20 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:35 UTC