Date: Mon, 8 Jul 2002 21:19:20 +0300 (EEST) From: unicorn@forest.od.ua To: FreeBSD-gnats-submit@FreeBSD.org Subject: i386/40354: crash, whith floating ops in kernel mode Message-ID: <200207081819.g68IJKKD021203@Rainbow.Deep.Forest>
next in thread | raw e-mail | index | archive | help
>Number: 40354 >Category: i386 >Synopsis: crash, whith floating ops in kernel mode >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Mon Jul 08 11:30:01 PDT 2002 >Closed-Date: >Last-Modified: >Originator: unicorn >Release: FreeBSD 5.0-CURRENT i386 >Organization: >Environment: System: FreeBSD Rainbow.Deep.Forest 5.0-CURRENT FreeBSD 5.0-CURRENT #10: Sun Jun 23 22:13:00 EEST 2002 root@Rainbow.Deep.Forest:/www/src/sys/i386/compile/RAINBOW i386 >Description: npx dna handler tries to modify curpcb even if it does not exist (yet). it couses page fault in kernel mode. >How-To-Repeat: do some floating point operations before the first process created. >Fix: Index: npx.c =================================================================== RCS file: /mnt/ncvs/src/sys/i386/isa/npx.c,v retrieving revision 1.129 diff -u -r1.129 npx.c --- npx.c 27 Mar 2002 05:39:20 -0000 1.129 +++ npx.c 8 Jul 2002 18:08:06 -0000 @@ -826,21 +826,27 @@ */ PCPU_SET(fpcurthread, curthread); - exstat = GET_FPU_EXSW_PTR(PCPU_GET(curpcb)); - *exstat = 0; - /* - * The following frstor may cause an IRQ13 when the state being - * restored has a pending error. The error will appear to have been - * triggered by the current (npx) user instruction even when that - * instruction is a no-wait instruction that should not trigger an - * error (e.g., fnclex). On at least one 486 system all of the - * no-wait instructions are broken the same as frstor, so our - * treatment does not amplify the breakage. On at least one - * 386/Cyrix 387 system, fnclex works correctly while frstor and - * 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); + if(PCPU_GET(curpcb) == NULL) + printf("npxdna: Oops! No curpcb!\n"); + else { + exstat = GET_FPU_EXSW_PTR(PCPU_GET(curpcb)); + *exstat = 0; + + /* + * The following frstor may cause an IRQ13 when the state being + * restored has a pending error. The error will appear to have been + * triggered by the current (npx) user instruction even when that + * instruction is a no-wait instruction that should not trigger an + * error (e.g., fnclex). On at least one 486 system all of the + * no-wait instructions are broken the same as frstor, so our + * treatment does not amplify the breakage. On at least one + * 386/Cyrix 387 system, fnclex works correctly while frstor and + * 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); + } + intr_restore(s); return (1); >Release-Note: >Audit-Trail: >Unformatted: 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?200207081819.g68IJKKD021203>