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