NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/40488: Unable to reboot Dell PE 2970
On Jan 26, 11:08pm, ad%netbsd.org@localhost (Andrew Doran) wrote:
-- Subject: Re: kern/40488: Unable to reboot Dell PE 2970
| On Mon, Jan 26, 2009 at 11:05:04PM +0000, Andrew Doran wrote:
| > The following reply was made to PR kern/40488; it has been noted by GNATS.
| >
| > From: Andrew Doran <ad%netbsd.org@localhost>
| > To: gnats-bugs%NetBSD.org@localhost
| > Cc: port-i386%netbsd.org@localhost, port-amd64%netbsd.org@localhost
| > Subject: Re: kern/40488: Unable to reboot Dell PE 2970
| > Date: Mon, 26 Jan 2009 23:03:16 +0000
| >
| > On Mon, Jan 26, 2009 at 10:45:00PM +0000, mbowie%buzmo.com@localhost wrote:
| >
| > > Running a fresh install of either 4.0.1 or 5.0_BETA (from 20090125) on a
Dell PowerEdge 2970 (BIOS 3.0.3). Issuing a reboot or "shutdown -r now"
results in the machine hanging indefinitely after unmounting the local
filesystems. A test installation of FreeBSD on the same system reboots
successfully. Testing with both ACPI and ACPI / SMP disabled yields the same
results. There are no ACPI tunables in the BIOS.
| >
| > We could try port 0x92 and the PCI reset vector before the triple fault.
| > Anyone interested in taking a look?
|
| FreeBSD at seems to try the port 92 method but not the PCI method.
|
| http://fxr.watson.org/fxr/source/i386/i386/vm_machdep.c#L652
|
And here's a patch that does that...
christos
Index: machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v
retrieving revision 1.654
diff -u -u -r1.654 machdep.c
--- machdep.c 15 Dec 2008 22:20:52 -0000 1.654
+++ machdep.c 26 Jan 2009 23:16:29 -0000
@@ -1680,6 +1680,35 @@
delay(100000);
/*
+ * Attempt to force a reset via the Reset Control register at
+ * I/O port 0xcf9. Bit 2 forces a system reset when it
+ * transitions from 0 to 1. Bit 1 selects the type of reset
+ * to attempt: 0 selects a "soft" reset, and 1 selects a
+ * "hard" reset. We try a "hard" reset. The first write sets
+ * bit 1 to select a "hard" reset and clears bit 2. The
+ * second write forces a 0 -> 1 transition in bit 2 to trigger
+ * a reset.
+ */
+ outb(0xcf9, 0x2);
+ outb(0xcf9, 0x6);
+ DELAY(500000); /* wait 0.5 sec to see if that did it */
+
+ /*
+ * Attempt to force a reset via the Fast A20 and Init register
+ * at I/O port 0x92. Bit 1 serves as an alternate A20 gate.
+ * Bit 0 asserts INIT# when set to 1. We are careful to only
+ * preserve bit 1 while setting bit 0. We also must clear bit
+ * 0 before setting it if it isn't already clear.
+ */
+ b = inb(0x92);
+ if (b != 0xff) {
+ if ((b & 0x1) != 0)
+ outb(0x92, b & 0xfe);
+ outb(0x92, b | 0x1);
+ DELAY(500000); /* wait 0.5 sec to see if that did it */
+ }
+
+ /*
* Try to cause a triple fault and watchdog reset by making the IDT
* invalid and causing a fault.
*/
Home |
Main Index |
Thread Index |
Old Index