Subject: port-i386/1762: time to enter kernel/options in boot depends on machine speed
To: None <gnats-bugs@gnats.netbsd.org>
From: Perry E. Metzger <perry@piermont.com>
List: netbsd-bugs
Date: 11/13/1995 21:13:56
>Number:         1762
>Category:       port-i386
>Synopsis:       time to enter kernel/options in boot depends on machine speed
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    gnats-admin (GNATS administrator)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Nov 13 21:20:01 1995
>Last-Modified:
>Originator:     Perry E. Metzger
>Organization:
Perry Metzger		perry@piermont.com
--
>Release:        NetBSD 1.1_ALPHA
>Environment:
	
System: NetBSD jekyll.piermont.com 1.1_ALPHA NetBSD 1.1_ALPHA (JEKYLL) #29: Sun Nov 12 15:13:29 EST 1995 root@jekyll.piermont.com:/usr/src/sys/arch/i386/compile/JEKYLL i386


>Description:
	The boot block code in port-i386 handles giving the user a few
        moments to type in a kernel name and/or kernel boot options by
        looping fast 240000 times through an input poll routine, stopping
        the looping if a character is hit and exiting and starting the
        boot process if no characer is hit. This is not a nice way to
        set a time out given that processors are becoming faster and
        faster -- within about a year, it will be impossible for users
        to hit a character fast enough without being very well
        prepared for the eventuality. It is already a bit too fast for
        comfort on a 133Mhz Pentium. This is only low priority because
        there is time before faster machines appear, but it actually
        will become Very Annoying Indeed when faster processors show up
        next year.
        The code that does this is gets (gets? what a weird gets()!)
        in /usr/src/sys/arch/i386/boot/io.c -- it calls an ischar()
        routine from bios.S in the same directory, conveniently coded
        in assembler to assure that it runs as fast as possible :-)
>How-To-Repeat:
	Try booting a set of different speed Intel boxes.
>Fix:
	Simply increasing the size of the loop would be antisocial --
        many users of older machines would be adversely effected by
        this. The Right Thing is to write a little routine in
        assembler that returns a count from the the 8253/8254
        programmable interval timer and exits the loop in io.c:gets()
        not when 240000 iterations have passed but when a certain
        number of ticks in the timer chip have passed. Alternatively,
        function 0x86 of BIOS interrupt 0x15, which allows you to
        delay for a specified amount of time, could be used to
        introduce fixed 50ms delays between ischar() requests. I
        actually recommend this latter course, since the code for it
        is very simple (about fifteen lines of assembler I would
        guess) although it does mean that superhumans might notice a
        20th of a second delay between hitting the first keystroke and
        seeing an echo (who cares, but in theory its The Wrong Thing).
	None of this is hard to do at all, but as with lots of
        random trivia, I haven't actually done it.
>Audit-Trail:
>Unformatted: