floats in pthreads

Peter Wemm peter at wemm.org
Wed Dec 3 01:12:57 PST 2003


Adriaan de Groot wrote:
> Thanks to Peter's patch to libc_r, both my test program and ogg123 are
> working properly now. This makes PR 59650 fixed, if someone feels like
> closing it.

Now, if you're feeling game, please try this too.

First, edit /etc/libmap.conf to be like this:
libc_r.so.5             libkse.so.1
libc_r.so               libkse.so

Then check if ogg123 etc work.  They should blow up or hang.  Its actually
in a SIGBUS loop.  I found that ctrl-\ kills it easily.

Then try this patch:
http://people.freebsd.org/~peter/amd64_kse.diff

Index: libc/amd64/gen/makecontext.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/amd64/gen/makecontext.c,v
retrieving revision 1.1
diff -u -r1.1 makecontext.c
--- libc/amd64/gen/makecontext.c        19 Jul 2003 04:41:08 -0000      1.1
+++ libc/amd64/gen/makecontext.c        3 Dec 2003 08:45:22 -0000
@@ -70,8 +70,12 @@
        /* Allocate space for a maximum of 6 arguments on the stack. */
        args = sp - 6;

-       /* Account for arguments on stack and align to 16 bytes. */
-       sp -= 8;
+       /*
+        * Account for arguments on stack and do the funky C entry alignment.
+        * This means that we need an 8-byte-odd alignment since the ABI expects
+        * the return address to be pushed, thus breaking the 16 byte alignment.
+        */
+       sp -= 7;

        /* Add the arguments: */
        va_start(ap, argc);
Index: libpthread/arch/amd64/amd64/enter_uts.S
===================================================================
RCS file: /home/ncvs/src/lib/libpthread/arch/amd64/amd64/enter_uts.S,v
retrieving revision 1.3
diff -u -r1.3 enter_uts.S
--- libpthread/arch/amd64/amd64/enter_uts.S     2 Aug 2003 22:39:10 -0000       1.3
+++ libpthread/arch/amd64/amd64/enter_uts.S     3 Dec 2003 08:59:00 -0000
@@ -35,7 +35,7 @@
 ENTRY(_amd64_enter_uts)
        addq    %rcx, %rdx      /* get stack base */
        andq    $~0xf, %rdx     /* align to 16 bytes */
+       subq    $8,%rdx         /* simulate "call" */
        movq    %rdx, %rsp      /* switch to UTS stack */
        movq    %rdx, %rbp      /* set frame */
-       pushq   %rsi
-       ret
+       jmpq    *%rsi

You'll need to rebuild src/lib/libc *and* src/lib/libpthread.  This fixes
ogg123 for me when using libkse.

I get a segfault when I ^C ogg123 when using the oss output driver.  If
I use '-d raw' or '-d arts', it exits cleanly.  The same happens with libc_r,
but I think thats a bug in the application and/or the libao sound driver
plugins, not the system thread libraries.

The pushq/ret -> jmp *%rsi is cosmetic (and a little bit of CYA insurance),
not a part of the bug fix.

Note that I have not found a place to take care of the 128 byte stack
red-zone yet, and I'm not sure if I even need to yet or not.  I suspect I
do.

Anyway, please let me know success/failure if anybody tries this.

Cheers,
-Peter
--
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5



More information about the freebsd-amd64 mailing list