Date: Wed, 26 Nov 2003 05:30:23 -0800 (PST) From: Adriaan de Groot <adridg@cs.kun.nl> To: freebsd-amd64@FreeBSD.org Subject: Re: amd64/59650: passing float parameters in non-main threads bus errors Message-ID: <200311261330.hAQDUNbg061786@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR amd64/59650; it has been noted by GNATS. From: Adriaan de Groot <adridg@cs.kun.nl> To: freebsd-gnats-submit@FreeBSD.org Cc: Subject: Re: amd64/59650: passing float parameters in non-main threads bus errors Date: Wed, 26 Nov 2003 14:23:10 +0100 Some further debugging shows that it's not even sprintf() of va_start() specific, but just passing float / double arguments to a varargs function in a non-main thread of control triggers bus errors already: /* ** Demonstration program that float parameters to ** varargs functions in non-main threads of ** control on amd64 does not work properly. */ #include <stdio.h> #include <pthread.h> #include <stdarg.h> /* ** This is a varargs function to which we will attempt to pass ** a float value in the ... . */ int PrintF(int fd, const char *fmt, int i, ...) { int ret = 2; fprintf(stderr,"[%lx]B %d\n",(long)pthread_self(),fd); return ret; } /* ** Demonstration function. Expected output is something like ** ** [504000]B 0 ** [504000]B 1 ** [504000]B 2 ** [504000]B 3 ** ** From the 4 calls to PrintF(). This bus errors in the third ** call when not in the main thread of control. */ void *threadfunc(void *p) { PrintF(0,"hello",0,0); PrintF(1,"hello",0,6); PrintF(2,"hello",1,0.00028376223); /* arg4 is a float */ PrintF(3,"hello",0.00028376223,6); /* arg3 converts to int here */ return p; } int main(int argc, char **argv) { pthread_t tid; threadfunc(NULL); pthread_create(&tid,NULL,threadfunc,NULL); sleep(4); threadfunc(NULL); return 0; } Now, either I'm doing something totally moronic with threads (and the ogg123 port is too) or the argument passing is seriously broken. I might be compiling it wrong, though: beans.ebn.kun.nl$gcc -o threadtest -g v.c -lc_r && ./threadtest [504000]B 0 [504000]B 1 [504000]B 2 [504000]B 3 [504800]B 0 [504800]B 1 Bus error (core dumped) The machine has been updated in -CURRENT since the original bug report: FreeBSD beans.ebn.kun.nl 5.2-BETA FreeBSD 5.2-BETA #2: Sun Nov 23 19:48:43 CET 2003 root@beans.ebn.kun.nl:/usr/obj/mnt/sys/CURRENT/src/sys/BEANS amd64 -- pub 1024D/FEA2A3FE 2002-06-18 Adriaan de Groot <groot@kde.org> If the door is ajar, can we fill it with door-jamb?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200311261330.hAQDUNbg061786>