boot2 keyboard probing problem (with patch)
Jung-uk Kim
jkim at niksun.com
Fri May 9 11:57:09 PDT 2003
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 at 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
More information about the freebsd-hackers
mailing list