>Number:         162214
>Category:       amd64
>Synopsis:       longjmp and siglongjmp, stack pointer is not aligned
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    freebsd-amd64
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Nov 01 07:50:11 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     yamayan
>Release:        10.0-CURRENT
>Organization:
>Environment:
FreeBSD yamayan 10.0-CURRENT FreeBSD 10.0-CURRENT #1 r226954M: Mon Oct 31 
10:10:55 JST 2011     root@yamayan:/usr/obj/usr/src/sys/YAMAYAN  amd64

>Description:
/usr/src/lib/libc/amd64/gen/
At longjmp(setjmp.S) and siglongjmp(sigsetjmp.S),
stack pointer is not 16-byte alignment,
so to call sigprocmask makes BusError.

in /usr/src/lib/libthr/thread/thr_sig.c,
compile with clang -march=native @ corei7,
movaps is used at sigprocmask.

It is not problem.
unaligned stack pointer is problem.
>How-To-Repeat:
build and install lib/libthr with clang -march=corei7
(-march=native @ corei7 CPU)

for example, build /usr/ports/lang/perl5.14.
miniperl stops with BusError.

check corefile.
>Fix:
patch my patch.
Adjust stack pointer alignment.

Patch attached with submission follows:

Index: setjmp.S
===================================================================
--- setjmp.S    (revision 226979)
+++ setjmp.S    (working copy)
@@ -81,7 +81,9 @@
        movq    $3,%rdi                 /* SIG_SETMASK     */
        leaq    72(%rdx),%rsi           /* (sigset_t*)set  */
        movq    $0,%rdx                 /* (sigset_t*)oset */
+       subq    $0x8,%rsp       /* adjust alignment */
        call    PIC_PLT(CNAME(_sigprocmask))
+       addq    $0x8,%rsp
        popq    %rsi
        popq    %rdi                    /* jmpbuf */
        movq    %rdi,%rdx
Index: sigsetjmp.S
===================================================================
--- sigsetjmp.S (revision 226979)
+++ sigsetjmp.S (working copy)
@@ -90,7 +90,9 @@
        movq    $3,%rdi                 /* SIG_SETMASK     */
        leaq    72(%rdx),%rsi           /* (sigset_t*)set  */
        movq    $0,%rdx                 /* (sigset_t*)oset */
+       subq    $0x8,%rsp       /* adjust alignment */
        call    PIC_PLT(CNAME(_sigprocmask))
+       addq    $0x8,%rsp
        popq    %rsi
        popq    %rdi                    /* jmpbuf */
 2:     movq    %rdi,%rdx


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-amd64
To unsubscribe, send any mail to "[email protected]"

Reply via email to