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