Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 May 2003 14:56:40 -0400
From:      Jung-uk Kim <jkim@niksun.com>
To:        freebsd-hackers@freebsd.org
Cc:        imp@freebsd.org
Subject:   boot2 keyboard probing problem (with patch)
Message-ID:  <200305091456.40582.jkim@niksun.com>

next in thread | raw e-mail | index | archive | help

--Boundary-00=_on/u+u2s27PdMap
Content-Type: text/plain;
  charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Recently I tried '-P' option in /boot.config for my desktop. boot2 
always said 'Keyboard: yes' even if I don't have a keyboard attached. 
I realized the keyboard probing is somewhat broken for many others, 
e. g., IBM x335. boot(8) says:

	Due to space constraints, the keyboard probe initiated by the -P 
option is simply a test that the BIOS has detected an ``extended'' 
keyboard.  If an ``XT/AT'' keyboard (with no F11 and F12 keys, etc.) 
is attached, the probe will fail.

When I read src/sys/boot/i386/boot2/boot2.c, I found

            if (opts & 1 << RBX_PROBEKBD) {
                i = *(uint8_t *)PTOV(0x496) & 0x10;
                printf("Keyboard: %s\n", i ? "yes" : "no");
                if (!i)
                    opts |= 1 << RBX_DUAL | 1 << RBX_SERIAL;
                opts &= ~(1 << RBX_PROBEKBD);
            }

This confirmed what the manpage said. The problem is 0x496 is set by 
BIOS but recent BIOSes don't seem to set the flag after actual 
probing (or they don't care?). I tried to resurrect KEYBOARD_PROBE 
option (src/sys/boot/i386/libi386/vidconsole.c) but it didn't work at 
all. Then I started writing my own and used some code from 
keyboard_init() for Bochs BIOS, which is written by Adam Sulmicki 
<adam@cfar.umd.edu>.

http://www.eax.com/patches/BOCHS/bochs-bios-keyboard-2.1-diff

My patch is simple: send echo command (0xee) to keyboard controller 
and read it back from keyboard. If keyboard controller doesn't get an 
echo back for some tries, it fails probing.

BTW, I send 0 to port 0x80 (POST return value) to delay because I 
couldn't find better way. A side effect is POST code will be reset 
even if your BIOS reported a problem. However, if you got this far, 
it shouldn't be a critical problem. ;-) Is there any better way to 
delay? KEYBOARD_PROBE used port 0x84 but it was more tasteless 
because we cannot know what it might be used for. (In fact, Compaq 
used it for POST diagnostic.)

This patch worked on my two desktops and an IBM 1U server. AT and PS/2 
keyboards should work. I think it would work with KVM, too. The patch 
is against 4-STABLE but it could be okay with 5-CURRENT if there is 
enough space left in boot2. ;-)

Please try this patch and let me know if you find any issues or have 
suggestions.

Thanks,

Jung-uk Kim
--Boundary-00=_on/u+u2s27PdMap--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305091456.40582.jkim>