From owner-freebsd-bugs@FreeBSD.ORG Wed May 4 15:40:17 2005 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CF3C816A4CE for ; Wed, 4 May 2005 15:40:17 +0000 (GMT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7935943D60 for ; Wed, 4 May 2005 15:40:17 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.3/8.13.3) with ESMTP id j44Fe2TP023136 for ; Wed, 4 May 2005 15:40:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.3/8.13.1/Submit) id j44Fe2nj023135; Wed, 4 May 2005 15:40:02 GMT (envelope-from gnats) Resent-Date: Wed, 4 May 2005 15:40:02 GMT Resent-Message-Id: <200505041540.j44Fe2nj023135@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Marc Olzheim Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 890CC16A4CE for ; Wed, 4 May 2005 15:36:52 +0000 (GMT) Received: from office-install1.ilse.net (ipv6-router.ilse.nl [62.69.162.169]) by mx1.FreeBSD.org (Postfix) with ESMTP id 86BD743D60 for ; Wed, 4 May 2005 15:36:50 +0000 (GMT) (envelope-from marcolz@office-install1.ilse.net) Received: from office-install1.ilse.net (localhost [127.0.0.1]) j44FZsUi002382 for ; Wed, 4 May 2005 17:35:54 +0200 (CEST) (envelope-from marcolz@office-install1.ilse.net) Received: (from marcolz@localhost) by office-install1.ilse.net (8.13.1/8.13.1/Submit) id j44FZrwK002381; Wed, 4 May 2005 17:35:53 +0200 (CEST) (envelope-from marcolz) Message-Id: <200505041535.j44FZrwK002381@office-install1.ilse.net> Date: Wed, 4 May 2005 17:35:53 +0200 (CEST) From: Marc Olzheim To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/80617: floating point registers seem not to be saved after thread preemption. X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Marc Olzheim List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 May 2005 15:40:17 -0000 >Number: 80617 >Category: kern >Synopsis: floating point registers seem not to be saved after thread preemption. >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed May 04 15:40:02 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Marc Olzheim >Release: FreeBSD 6.0-CURRENT i386, FreeBSD 5.4-STABLE i386 >Organization: ilse media >Environment: System: FreeBSD office-install1.ilse.net 6.0-CURRENT FreeBSD 6.0-CURRENT #26: Wed May 4 01:52:58 CEST 2005 root@office-install1.ilse.net:/usr/obj/usr/src/sys/CRASH i386 >Description: Floating point exception take place where they shouldn't when running with KSE threads (-pthread). >How-To-Repeat: # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # fpu # fpu/Makefile # fpu/fpu5.c # echo c - fpu mkdir -p fpu > /dev/null 2>&1 echo x - fpu/Makefile sed 's/^X//' >fpu/Makefile << 'END-of-fpu/Makefile' Xall: fpu5 fpu5th X Xfpu5th: fpu5.c X cc -O3 -Wall -W -Werror -g -Wcast-qual -DWITH_THR -fstrict-aliasing -pthread fpu5.c -o fpu5th -lm X Xfpu5: fpu5.c X cc -O3 -Wall -W -Werror -g -Wcast-qual -fstrict-aliasing fpu5.c -o fpu5 -lm X Xclean: X rm -f fpu5 fpu5th fpu5th.core core END-of-fpu/Makefile echo x - fpu/fpu5.c sed 's/^X//' >fpu/fpu5.c << 'END-of-fpu/fpu5.c' X/* Blame it in Marc Olzheim (Zlo) */ X X#ifdef WITH_THR X#include X#endif /* WITH_THR */ X X#include X#include X#include X#include X#include X#include X Xvoid * Xcalc_thread(void *arg) X{ X long i; X unsigned char c; X X i = (long)arg + 1; X X for (;;) X { X i = (i + 1) % 736; X if (i > 0) X { X /* ln(2.0) =~ 0.69 */ X if (logf((float)1.0 + (float)i) < (float)0.65) X { X /* Never happens */ X printf("\n\n\n\ni: %ld\n\n\n\n", i); X fflush(NULL); X } X X /* Then why does _this_ go wrong ? */ X c = floorf((float)(1.0 / logf((float)1.0 + (float)i))); X X if (c > 1) /* Never true, just to use c. */ X printf("\r%hhu", c); X } X } X X /* NOTREACHED */ X return NULL; X} X Xint Xmain(int argc, char *argv[]) X{ X#ifdef WITH_THR X pthread_t thread; X#endif /* WITH_THR */ X X if (1 != argc) X { X fprintf(stderr, "Usage: %s\n", argv[0]); X return(EX_USAGE); X } X X#ifdef WITH_THR X if (pthread_create(&thread , NULL, calc_thread, (void *)1L)) X err(1, "pthread_create()"); X#else /* ! WITH_THR */ X (void)calc_thread((void *)1L); X#endif /* ! WITH_THR */ X X for (;;) X sleep(60); X X return(EX_OK); X} END-of-fpu/fpu5.c exit Just compare the th version with the non-th version. The th version will crash. This happens on 6-CURRENT and on 5.4-STABLE and I've only been able to reproduce it on i386, not on amd64. I don't have other test machines atm. 5.3-RELEASE seems unaffected. >Fix: >Release-Note: >Audit-Trail: >Unformatted: