Subject: Re: Rebooting trouble?
To: Charles M. Hannum <mycroft@ai.mit.edu>
From: Andreas Gustafsson <gson@araneus.pp.fi>
List: port-i386
Date: 07/05/1995 10:38:31
"Charles M. Hannum" <mycroft@ai.mit.edu> asked:
> As of what date, and does it actually print `rebooting...'?

I'm also having trouble with rebooting, on one particular machine
only.  The machine is a 486DX2/66 with a no-name Taiwanese motherboard
using an UMC chipset.  It may be relevant that this motherboard has a
place for an i8042 chip, but there is no such chip (or even socket)
installed, just 40 plated-through holes.  And before you ask: yes, the
keyboard works despite this (mostly; it does hang occasionally).

The kernel is compiled from -current sources of around June 4, 1995
and it _does_ print "rebooting...".

I tried adding debugging printfs to cpu_reset() (see below).  All the
messages up to and including "cpu_reset: unmap" are printed on the
console and then the machine just hangs.  The final message
"cpu_reset: looping" is never printed.
-- 
Andreas Gustafsson, gson@araneus.pp.fi

================================ Cut here ================================

void
cpu_reset()
{
	struct region_descriptor region;

	printf("cpu_reset: KBC\n");
	/* Toggle the hardware reset line on the keyboard controller. */
	outb(KBCMDP, KBC_PULSE0);
	delay(200);

	printf("cpu_reset: KBC\n");
	outb(KBCMDP, KBC_PULSE0);
	delay(200);

	printf("cpu_reset: IDT\n");
	/*
	 * Try to cause a triple fault and watchdog reset by setting the
	 * IDT to point to nothing.
	 */
	region.rd_limit = 0;
	region.rd_base = 0;
	lidt(&region);

	printf("cpu_reset: unmap\n");
	/*
	 * Try to cause a triple fault and watchdog reset by unmapping the
	 * entire address space.
	 */
	bzero((caddr_t)PTD, NBPG);
	pmap_update(); 

	printf("cpu_reset: looping\n");
	
	for (;;);
}