Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Nov 2011 07:45:05 GMT
From:      yamayan <yamayan@kbh.biglobe.ne.jp>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   amd64/162214: longjmp and siglongjmp, stack pointer is not aligned
Message-ID:  <201111010745.pA17j5K2047970@red.freebsd.org>
Resent-Message-ID: <201111010750.pA17oBrP050320@freefall.freebsd.org>

index | next in thread | raw e-mail


>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:


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201111010745.pA17j5K2047970>