Date: Sun, 15 Jul 2001 18:27:52 +0200 From: Tor.Egge@fast.no To: juriy@aviaport.ru Cc: freebsd-current@FreeBSD.ORG, peter@FreeBSD.ORG Subject: Re: kernel with SSE is unstable Message-ID: <200107151627.SAA01763@midten.fast.no> In-Reply-To: Your message of "Sun, 15 Jul 2001 01:01:47 %2B0400" References: <20010715010147.A892@aviaport.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
> In my system kernel(WITH SSE) falls when I use commands netstat and swapinfo.
> kernel without SSE works fine.
I got a very similar panic when trying an UP kernel with SSE enabled.
mi_switch() sets curproc->p_oncpu to NOCPU before calling
cpu_switch(). cpu_switch() might call npxsave() which calls fpusave
with NOCPU as the 'oncpu' argument.
A suggested patch is enclosed.
- Tor Egge
[-- Attachment #2 --]
Index: sys/i386/isa/npx.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/isa/npx.c,v
retrieving revision 1.104
diff -u -r1.104 npx.c
--- sys/i386/isa/npx.c 2001/07/12 12:21:53 1.104
+++ sys/i386/isa/npx.c 2001/07/15 16:23:02
@@ -160,8 +160,8 @@
#endif
static int npx_probe __P((device_t dev));
static int npx_probe1 __P((device_t dev));
-static void fpusave __P((union savefpu *, u_char));
-static void fpurstor __P((union savefpu *, u_char));
+static void fpusave __P((union savefpu *));
+static void fpurstor __P((union savefpu *));
#ifdef I586_CPU_XXX
static long timezero __P((const char *funcname,
void (*func)(void *buf, size_t len)));
@@ -579,7 +579,7 @@
stop_emulating();
fldcw(&control);
if (PCPU_GET(curpcb) != NULL)
- fpusave(&PCPU_GET(curpcb)->pcb_save, curproc->p_oncpu);
+ fpusave(&PCPU_GET(curpcb)->pcb_save);
start_emulating();
critical_exit(savecrit);
}
@@ -881,7 +881,7 @@
* fnsave are broken, so our treatment breaks fnclex if it is the
* first FPU instruction after a context switch.
*/
- fpurstor(&PCPU_GET(curpcb)->pcb_save, curproc->p_oncpu);
+ fpurstor(&PCPU_GET(curpcb)->pcb_save);
critical_exit(s);
return (1);
@@ -916,18 +916,18 @@
{
stop_emulating();
- fpusave(addr, curproc->p_oncpu);
+ fpusave(addr);
start_emulating();
PCPU_SET(npxproc, NULL);
}
static void
-fpusave(addr, oncpu)
+fpusave(addr)
union savefpu *addr;
- u_char oncpu;
{
static struct savexmm svxmm[MAXCPU];
+ u_char oncpu = PCPU_GET(cpuid);
if (!cpu_fxsr)
fnsave(addr);
@@ -938,11 +938,11 @@
}
static void
-fpurstor(addr, oncpu)
+fpurstor(addr)
union savefpu *addr;
- u_char oncpu;
{
static struct savexmm svxmm[MAXCPU];
+ u_char oncpu = PCPU_GET(cpuid);
if (!cpu_fxsr)
frstor(addr);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107151627.SAA01763>
