> 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

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);

Reply via email to