Date: Mon, 29 Oct 2001 13:10:01 -0800 (PST) From: Tor.Egge@fast.no To: freebsd-bugs@FreeBSD.org Subject: Re: Re[4]: 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: <200110292110.f9TLA1473533@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: Re[4]: 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 22:08:46 +0100 > cpu_reset_proxy: Grabbed mp lock for BSP > cpu_reset_proxy: Stopped CPU 1 > #==========================================================================< > > Long wait.. At least, the output is no longer intermingled. Interrupts should probably be left disabled on CPU#1. If that doesn't help then it's time to implement a proper shutdown according to Appendix B.5 of the MP spec. - Tor Egge 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 20:27:03 -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(); + printf("cpu_reset_proxy: Grabbed mp lock for BSP\n"); 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,7 +481,7 @@ cpu_reset_real(); /* XXX: Bogus ? */ } cpu_reset_proxy_active = 4; - __asm __volatile("sti" : : : "memory"); + wbinvd(); 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?200110292110.f9TLA1473533>