Index: head/sys/i386/boot/biosboot/Makefile =================================================================== --- head/sys/i386/boot/biosboot/Makefile (revision 13529) +++ head/sys/i386/boot/biosboot/Makefile (revision 13530) @@ -1,78 +1,81 @@ -# $Id: Makefile,v 1.34 1996/01/05 19:28:55 ache Exp $ +# $Id: Makefile,v 1.35 1996/01/06 23:37:10 joerg Exp $ # PROG= boot # Order is very important on the SRCS line for this prog SRCS= start.S table.c boot2.S boot.c asm.S bios.S serial.S SRCS+= probe_keyboard.c io.c disk.c sys.c BINDIR= /usr/mdec BINMODE= 444 CFLAGS= -O2 \ - -DDO_BAD144 -DBOOTWAIT=${BOOTWAIT} -DCOMCONSOLE=0x3F8 + -DDO_BAD144 -DBOOTWAIT=${BOOTWAIT} -DTIMEOUT=${TIMEOUT} +CFLAGS+= -DCOMCONSOLE=0x3F8 CFLAGS+= -DBOOTSEG=${BOOTSEG} -DBOOTSTACK=${BOOTSTACK} CFLAGS+= -I${.CURDIR} -I${.CURDIR}/../.. # Force usage of serial console instead of keyboard probing. #CFLAGS+= -DFORCE_COMCONSOLE # Assume hd(*,a) instead of wd(*,a) if the boot seems to happen from # a hard disk. # This can be useful for people booting in a mixed IDE/SCSI environment. #CFLAGS+= -DBOOT_HD CLEANFILES+= boot.nohdr boot.strip boot1 boot2 sizetest DPADD= ${LIBC} LDFLAGS+= -N -T 0 -nostdlib LDADD= -lc #LINKS= ${BINDIR}/sdboot ${BINDIR}/wdboot\ # ${BINDIR}/sdboot ${BINDIR}/fdboot\ # ${BINDIR}/bootsd ${BINDIR}/bootwd\ # ${BINDIR}/bootsd ${BINDIR}/bootfd NOSHARED= YES NOMAN= STRIP= -# tunable timeout parameter, waiting for keypress, calibrated in mS +# tunable timeout parameter, waiting for keypress, calibrated in ms BOOTWAIT?= 5000 +# tunable timeout during string input, calibrated in ms +#TIMEOUT?= 30000 # Location that boot2 is loaded at BOOTSEG= 0x1000 # Offset in BOOTSEG for the top of the stack, keep this 16 byte aligned BOOTSTACK= 0xFFF0 boot.strip: boot cp -p boot boot.strip strip boot.strip size boot.strip boot.nohdr: boot.strip dd if=boot.strip of=boot.nohdr ibs=32 skip=1 obs=1024b ls -l boot.nohdr boot1: boot.nohdr dd if=boot.nohdr of=boot1 bs=512 count=1 boot2: boot.nohdr dd if=boot.nohdr of=boot2 bs=512 skip=1 @dd if=boot2 skip=14 of=sizetest 2> /dev/null @if [ -s sizetest ] ; then \ echo "*** Boot2 is too BIG ***" ; exit 2 ; \ fi all: boot1 boot2 install: ${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE}\ boot1 ${DESTDIR}${BINDIR}/boot1 ${INSTALL} ${COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE}\ boot2 ${DESTDIR}${BINDIR}/boot2 for i in sd fd wd od ; do \ ( cd ${DESTDIR}${BINDIR} ; \ rm -f boot$${i} $${i}boot ; \ ln -s boot1 $${i}boot ; \ ln -s boot2 boot$${i} ; ) \ done .include Index: head/sys/i386/boot/biosboot/io.c =================================================================== --- head/sys/i386/boot/biosboot/io.c (revision 13529) +++ head/sys/i386/boot/biosboot/io.c (revision 13530) @@ -1,226 +1,252 @@ /* * Mach Operating System * Copyright (c) 1992, 1991 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 * * any improvements or extensions that they make and grant Carnegie Mellon * the rights to redistribute these changes. * * from: Mach, Revision 2.2 92/04/04 11:35:57 rpd - * $Id: io.c,v 1.14 1995/05/30 07:58:33 rgrimes Exp $ + * $Id: io.c,v 1.15 1995/06/25 14:02:53 joerg Exp $ */ #include "boot.h" #include #include #define K_RDWR 0x60 /* keyboard data & cmds (read/write) */ #define K_STATUS 0x64 /* keyboard status */ #define K_CMD 0x64 /* keybd ctlr command (write-only) */ #define K_OBUF_FUL 0x01 /* output buffer full */ #define K_IBUF_FUL 0x02 /* input buffer full */ #define KC_CMD_WIN 0xd0 /* read output port */ #define KC_CMD_WOUT 0xd1 /* write output port */ #define KB_A20 0xdf /* enable A20, enable output buffer full interrupt enable data line enable clock line */ /* * Gate A20 for high memory */ void gateA20(void) { #ifdef IBM_L40 outb(0x92, 0x2); #else IBM_L40 while (inb(K_STATUS) & K_IBUF_FUL); while (inb(K_STATUS) & K_OBUF_FUL) (void)inb(K_RDWR); outb(K_CMD, KC_CMD_WOUT); while (inb(K_STATUS) & K_IBUF_FUL); outb(K_RDWR, KB_A20); while (inb(K_STATUS) & K_IBUF_FUL); #endif IBM_L40 } /* printf - only handles %d as decimal, %c as char, %s as string */ void printf(const char *format, ...) { int *dataptr = (int *)&format; char c; dataptr++; while ((c = *format++)) if (c != '%') putchar(c); else switch (c = *format++) { case 'd': { int num = *dataptr++; char buf[10], *ptr = buf; if (num<0) { num = -num; putchar('-'); } do *ptr++ = '0'+num%10; while (num /= 10); do putchar(*--ptr); while (ptr != buf); break; } case 'x': { unsigned int num = *dataptr++, dig; char buf[8], *ptr = buf; do *ptr++ = (dig=(num&0xf)) > 9? 'a' + dig - 10 : '0' + dig; while (num >>= 4); do putchar(*--ptr); while (ptr != buf); break; } case 'c': putchar((*dataptr++)&0xff); break; case 's': { char *ptr = (char *)*dataptr++; while ((c = *ptr++)) putchar(c); break; } } } void putchar(int c) { if (c == '\n') { if (loadflags & RB_SERIAL) serial_putc('\r'); else putc('\r'); } if (loadflags & RB_SERIAL) serial_putc(c); else putc(c); } int getchar(int in_buf) { int c; loop: if ((c = ((loadflags & RB_SERIAL) ? serial_getc() : getc())) == '\r') c = '\n'; if (c == '\b') { if (in_buf != 0) { putchar('\b'); putchar(' '); } else { goto loop; } } putchar(c); return(c); } /* * This routine uses an inb to an unused port, the time to execute that * inb is approximately 1.25uS. This value is pretty constant across * all CPU's and all buses, with the exception of some PCI implentations * that do not forward this I/O adress to the ISA bus as they know it * is not a valid ISA bus address, those machines execute this inb in * 60 nS :-(. * * XXX we need to use BIOS timer calls or something more reliable to * produce timeouts in the boot code. */ void delay1ms(void) { int i = 800; while (--i >= 0) (void)inb(0x84); } int gets(char *buf) { int i; +#if TIMEOUT+0 > 0 + int j; +#endif char *ptr=buf; +#if TIMEOUT+0 == 0 #if BOOTWAIT for (i = BOOTWAIT; i>0; delay1ms(),i--) #endif if ((loadflags & RB_SERIAL) ? serial_ischar() : ischar()) for (;;) switch(*ptr = getchar(ptr - buf) & 0xff) { case '\n': case '\r': *ptr = '\0'; return 1; case '\b': if (ptr > buf) ptr--; continue; default: ptr++; } +#else /* TIMEOUT */ +#if BOOTWAIT == 0 +# error "TIMEOUT without BOOTWAIT" +#endif + for (i = BOOTWAIT; i>0; delay1ms(),i--) + if ((loadflags & RB_SERIAL) ? serial_ischar() : ischar()) + for (j = TIMEOUT; j>0; delay1ms(),j--) + if ((loadflags & RB_SERIAL) ? + serial_ischar() : ischar()) + switch(*ptr = getchar(ptr - buf) & + 0xff) { + case '\n': + case '\r': + *ptr = '\0'; + return 1; + case '\b': + if (ptr > buf) ptr--; + continue; + default: + ptr++; + } +#endif /* !TIMEOUT */ return 0; } int strcmp(const char *s1, const char *s2) { while (*s1 == *s2) { if (!*s1++) return 0; s2++; } return 1; } void bcopy(const char *from, char *to, int len) { while (len-- > 0) *to++ = *from++; } /* To quote Ken: "You are not expected to understand this." :) */ void twiddle(void) { putchar((char)tw_chars); tw_chars = (tw_chars >> 8) | ((tw_chars & (unsigned long)0xFF) << 24); putchar('\b'); }