From owner-freebsd-amd64@FreeBSD.ORG Mon Nov 24 11:10:20 2003 Return-Path: Delivered-To: freebsd-amd64@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1456516A4CE for ; Mon, 24 Nov 2003 11:10:20 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id C429043FE9 for ; Mon, 24 Nov 2003 11:10:17 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id hAOJAHFY062144 for ; Mon, 24 Nov 2003 11:10:17 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id hAOJAHZg062143; Mon, 24 Nov 2003 11:10:17 -0800 (PST) (envelope-from gnats) Resent-Date: Mon, 24 Nov 2003 11:10:17 -0800 (PST) Resent-Message-Id: <200311241910.hAOJAHZg062143@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-amd64@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, adriaan de groot Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5601216A4CE for ; Mon, 24 Nov 2003 11:09:07 -0800 (PST) Received: from pandora.cs.kun.nl (pandora.cs.kun.nl [131.174.33.4]) by mx1.FreeBSD.org (Postfix) with ESMTP id CEF4C43F93 for ; Mon, 24 Nov 2003 11:09:03 -0800 (PST) (envelope-from adridg@cs.kun.nl) Received: from localhost by pandora.cs.kun.nl id hAOJ8xd5013384 (8.12.10/3.58); Mon, 24 Nov 2003 20:09:01 +0100 (MET) Message-Id: <200311242008.55699.adridg@cs.kun.nl> Date: Mon, 24 Nov 2003 20:08:55 +0100 From: adriaan de groot To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: amd64/59650: sprintf() bus errors in non-main thread with %f X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: adriaan de groot List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Nov 2003 19:10:20 -0000 >Number: 59650 >Category: amd64 >Synopsis: sprintf() bus errors in non-main thread with %f >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-amd64 >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Nov 24 11:10:17 PST 2003 >Closed-Date: >Last-Modified: >Originator: adridg@cs.kun.nl >Release: FreeBSD 5.1-CURRENT amd64 >Organization: KDE-FreeBSD >Environment: System: FreeBSD beans.ebn.kun.nl 5.1-CURRENT FreeBSD 5.1-CURRENT #4: Wed Nov 19 14:11:35 CET 2003 root@beans.ebn.kun.nl:/mnt/sys/CURRENT/src/sys/amd64/compile/BEANS amd64 >Description: The ogg123 port bus errors on an amd64 machine. This is because sprintf() and fprintf() do "something weird" with %f arguments in threads that are not the main thread of control. >How-To-Repeat: This program demonstrates the problem: /* Demonstration program that shows that sprintf() doesn't work with double args from threads that aren't the main thread of control. */ #include #include #include void slipper(void *p) { fprintf(stderr,"[%lx] d=%d t=%d\n",(long)pthread_self(),3,time(NULL)); sleep(3); fprintf(stderr,"%f\n",22/7); fprintf(stderr,"%06.3f\n",0.002462390263402); } int main(int argc, char **argv) { pthread_t tid; slipper(NULL); pthread_create(&tid,NULL,slipper,NULL); sleep(6); slipper(NULL); return 0; } } Expected output is something like [lofi@lofi]:0:~ > ./threadtest [804c000] d=3 t=1069603991 0.000000 00.002 [804c400] d=3 t=1069603994 0.000000 00.002 [804c000] d=3 t=1069604000 0.000000 00.002 and on 4-STABLE i386, 5-CURRENT i386, and 5-CURRENT alpha, that is exactly what it does. On amd64, however, beans.ebn.kun.nl$./threadtest [504000] d=3 t=1069604372 0.000000 00.002 [504800] d=3 t=1069604375 0.000000 Bus error (core dumped) Note that the "plain" %f when printing a 0 value works, but that sprintf() bus errors in the second call. Replacing 22/7 by the constant 0.002462390263402 in the code causes a bus error in the first call to sprintf(). (gdb) bt #0 0x0000000200841189 in fprintf () from /lib/libc.so.5 #1 0x000000000040086f in slipper () #2 0x000000020063c670 in _thread_start () from /usr/lib/libc_r.so.5 Error accessing memory address 0x7fffffeff000: Bad address. Possibly relevant disassembly: 0x0000000200841181 : movaps %xmm2,0xffffffffffffffa1(%rax) 0x0000000200841185 : movaps %xmm1,0xffffffffffffff91(%rax) 0x0000000200841189 : movaps %xmm0,0xffffffffffffff81(%rax) 0x000000020084118d : mov %rsi,0xffffffffffffff40(%rbp) 0x0000000200841194 : movl $0x10,0xffffffffffffff10(%rbp) 0x000000020084119e : movl $0x30,0xffffffffffffff14(%rbp) (If it's gonna bus error, I'll suspect those odd constants in the three movaps instructions.) >Fix: >Release-Note: >Audit-Trail: >Unformatted: