Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Oct 2001 20:00:02 -0800 (PST)
From:      Tor.Egge@fast.no
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: i386/31535: Can't reboot system: Tyan Thunder K7+ Dual AMD Athlon 1.2 MP / FreeBSD 4.4 STABLE or 4.3 RELEASE
Message-ID:  <200110290400.f9T402Z61541@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/31535; it has been noted by GNATS.

From: Tor.Egge@fast.no
To: ilin@rinet.ru
Cc: freebsd-gnats-submit@FreeBSD.org
Subject: Re: i386/31535: Can't reboot system: Tyan Thunder K7+ Dual AMD Athlon 1.2 MP / FreeBSD 4.4 STABLE or 4.3 RELEASE
Date: Mon, 29 Oct 2001 04:51:11 +0100

 The shutdown routine uses memory based syncronization to let the BSP
 perform the real reset.  Your problem looks like a livelock, which can
 be avoided by flushing the cache after setting the variable used for
 syncronization.
 
 Index: sys/i386/i386/vm_machdep.c
 ===================================================================
 RCS file: /home/ncvs/src/sys/i386/i386/vm_machdep.c,v
 retrieving revision 1.132.2.5
 diff -u -r1.132.2.5 vm_machdep.c
 --- sys/i386/i386/vm_machdep.c	22 Sep 2001 09:21:48 -0000	1.132.2.5
 +++ sys/i386/i386/vm_machdep.c	29 Oct 2001 03:41:00 -0000
 @@ -406,12 +415,14 @@
  	u_int saved_mp_lock;
  
  	cpu_reset_proxy_active = 1;
 +	wbinvd();
  	while (cpu_reset_proxy_active == 1)
  		;	 /* Wait for other cpu to disable interupts */
  	saved_mp_lock = mp_lock;
  	mp_lock = 1;
  	printf("cpu_reset_proxy: Grabbed mp lock for BSP\n");
  	cpu_reset_proxy_active = 3;
 +	wbinvd();
  	while (cpu_reset_proxy_active == 3)
  		;	/* Wait for other cpu to enable interrupts */
  	stop_cpus((1<<cpu_reset_proxyid));
 @@ -454,6 +465,7 @@
  			started_cpus = (1<<0);		/* Restart CPU #0 */
  
  			cnt = 0;
 +			wbinvd();
  			while (cpu_reset_proxy_active == 0 && cnt < 10000000)
  				cnt++;	/* Wait for BSP to announce restart */
  			if (cpu_reset_proxy_active == 0)
 @@ -461,6 +473,7 @@
  			__asm __volatile("cli" : : : "memory");
  			cpu_reset_proxy_active = 2;
  			cnt = 0;
 +			wbinvd();
  			while (cpu_reset_proxy_active == 2 && cnt < 10000000)
  				cnt++;	/* Do nothing */
  			if (cpu_reset_proxy_active == 2) {
 @@ -468,6 +481,7 @@
  				cpu_reset_real();	/* XXX: Bogus ? */
  			}
  			cpu_reset_proxy_active = 4;
 +			wbinvd();
  			__asm __volatile("sti" : : : "memory");
  			while (1);
  			/* NOTREACHED */

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




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