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>
