reBoot code: can we detect if there is an AT keyboard
controller?
John Baldwin
jhb at freebsd.org
Wed Nov 14 12:38:09 PST 2007
On Wednesday 14 November 2007 02:53:01 pm Billy Newsom wrote:
> AFAIK, the FreeBSD kernel still relies on a 90s codebase for rebooting... It uses the
> keyboard controller reset method to do a warm reboot.
>
> I have had trouble with this method over the years... a Pentium Pro and more recently
> a Mac Pro with no keyboard controller. I have speculated that Mac laptops and blade
> servers would also lack the KBC. If Intel continues their progress of dropping
> deprecated hardware, the KBC could disappear in the next 3 to 5 years.
>
> So could there be some intelligent software code to check the presence of this
> device, and if not present, use the alternate reboot? The ACPI reboot sequence, for
> example, works for FreeBSD 6.2 and later, on my Mac Pro quad Xeon, amd64.
>
> Unfortunately, although the kernel detects the presence of a KBC during boot, it
> doesn't seem that this information gets stored as a global variable for later use. (I
> made this assertion a few times at freebsd-stable.) It seems like the logical course
> is to only reboot the keyboard controller if such a thing exists!!
>
> Looking back at my notes and my previous research, it appears that the code is around
> where you can find the cpu_reset code near...
>
> /* "good night, sweet prince .... <THUNK!>" */
>
> Setting hw.acpi.handle_reboot=1 must bypass that. Could we force the use of this
> tunable when it's obvious that the KBC is missing?
Actually, I recently updated the reboot code to try several other sequences
besides just the keyboard controller such as flipping reset bits in I/O
ports 0xcf9 and 0x92. Also, when I did the update I also fixed a bug in
the triple-fault last-effort that had caused it to not actually cause a
triple-fault. As a result, you might be able to reboot just fine now on
newer stable w/o the tunable if you have this commit:
revision 1.259.2.6
date: 2007/04/30 17:45:44; author: jhb; state: Exp; lines: +40 -6
MFC: Various fixes to cpu_reset_real()
- Try to use the reset control register (I/O port 0xcf9) and the fast a20
and init register (I/O port 0x92) if the keyboard reset fails.
- Fix the triple fault to actually work when PGE is enabled.
--
John Baldwin
More information about the freebsd-arch
mailing list