Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Jun 2005 20:23:19 -0400
From:      Ed Maste <emaste@phaedrus.sandvine.ca>
To:        freebsd-i386@freebsd.org
Subject:   Hanging on reboot / alternative cpu_reset mechanism
Message-ID:  <20050616002319.GB39516@sandvine.com>

next in thread | raw e-mail | index | archive | help
On some of the motherboards we use I've run into a hang on reboot.  I've
noticed messages describing similar symptoms on this list, but am not sure
if there's any relationship.

It seems cpu_reset_real tries to use the keyboard controller to perform a
system reset using outb(0x64, 0xFE) and then falls back to (vm_machdep.c):

        /* Force a shutdown by unmapping entire address space. */
        bzero((caddr_t)PTD, NBPTD);

        /* "good night, sweet prince .... <THUNK!>" */
        invltlb();
        /* NOTREACHED */
        while(1);

The systems I've experienced the hang on (SuperMicro X6DHR) have the 
keyboard controller implemented in a Winbond W83627.  I'm guessing that 
this controller somehow gets confused and doesn't accept the reset command.
Then the system just hangs after the bzero(PTD) or ends up in in the
double fault handler.

I found two other reset methods from various web resources: bit 0 in 
register 0x92, and forcing a triple fault.  I've confirmed that both
methods work for me.

Register 0x92 seems to have been introduced with the PS/2 ages ago.
It's implemented in the Winbond controller; I imagine it's available 
with most chipsets.  I think it might be used in QNX but I'm not sure
about other OSes.

The triple fault can be invoked with something like
static long no_idt[2];
        __asm __volatile("lidt %0" : "=m" (no_idt));
        __asm __volatile("int3");

Both NetBSD and OpenBSD try the keyboard controller reset followed by
the triple fault (implemented slightly differently).  Is this something
worth switching to?  How is the current bzero() code supposed to ensure
a reboot?

--
Ed Maste, Sandvine Incorporated



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