From owner-freebsd-hackers@FreeBSD.ORG Fri Jan 14 16:52:21 2011 Return-Path: Delivered-To: freebsd-hackers@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 09FA610656A3 for ; Fri, 14 Jan 2011 16:52:21 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (bsdimp.com [199.45.160.85]) by mx1.freebsd.org (Postfix) with ESMTP id 9C8718FC0C for ; Fri, 14 Jan 2011 16:52:20 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by harmony.bsdimp.com (8.14.3/8.14.1) with ESMTP id p0EGgtt1000178; Fri, 14 Jan 2011 09:42:55 -0700 (MST) (envelope-from imp@bsdimp.com) Message-ID: <4D307D0F.7000008@bsdimp.com> Date: Fri, 14 Jan 2011 09:42:55 -0700 From: Warner Losh User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.12) Gecko/20101029 Thunderbird/3.1.6 MIME-Version: 1.0 To: Kostik Belousov References: <20110113202848.GI2518@deviant.kiev.zoral.com.ua> <4D2F8BFE.9070607@bsdimp.com> <20110114082840.GM2518@deviant.kiev.zoral.com.ua> In-Reply-To: <20110114082840.GM2518@deviant.kiev.zoral.com.ua> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-hackers@FreeBSD.org Subject: Re: What does the FreeBSD/i386 ABI say about stack alignment? X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Jan 2011 16:52:21 -0000 On 01/14/2011 01:28, Kostik Belousov wrote: > On Thu, Jan 13, 2011 at 04:34:22PM -0700, Warner Losh wrote: >> On 01/13/2011 13:28, Kostik Belousov wrote: >>> On Thu, Jan 13, 2011 at 12:19:00PM -0500, Ryan Stone wrote: >>>> I've been trying to get an application compiled with gcc 4.5.1 running >>>> on FreeBSD 8.1, but it's been crashing during startup with a SIGBUS. >>>> It turns out that the problem is that gcc is issuing SSE >>>> instructions(in my case, a movdqa) that assume that the stack will be >>>> aligned to a 16-byte boundary. It seems that Linux/i386 guarantees >>>> this, and I worry that gcc has extended this assumption to all i386 >>>> architectures. I'm assuming that FreeBSD doesn't make any such >>>> promises based on the fact that I'm getting crashes. >>>> >>>> There does seem to be a flag (-mstackrealign) that you can set to >>>> force gcc to align the stack to what it wants, but that pessimizes the >>>> generated code a bit. Some googling would seem to indicate that >>>> -mpreferred-stack-boundary won't always handle this problem correctly. >>>> >>>> Any ideas? My inclination, at least for our local source tree here at >>>> $WORK, would be to accommodate gcc and guarantee the stack alignment >>>> that it wants rather than pessimize our application. It seems we have >>>> an old local patch/hack in our FreeBSD 6.1 tree(apparently based on >>>> this: >>>> http://www.freebsd.org/cgi/getmsg.cgi?fetch=438552+0+/usr/local/www/db/text/2000/freebsd-current/20000507.freebsd-current). >>>> I believe that this patch is the reason why we haven't seen the >>>> problem when running on 6.1, but the patch doesn't seem to work >>>> anymore on 8.1. >>> Look at lib/csu/i386-elf/crt1_s.S, we align stack on startup. >>> My understanding is that the requirement is (%esp& 0xf) == 0 just before >>> the call to the function. And we are off by 4 (this is my fault). >>> >>> Please give this a try. >>> >>> diff --git a/lib/csu/i386-elf/crt1_s.S b/lib/csu/i386-elf/crt1_s.S >>> index d7ed0a2..17ac0e3 100644 >>> --- a/lib/csu/i386-elf/crt1_s.S >>> +++ b/lib/csu/i386-elf/crt1_s.S >>> @@ -42,6 +42,7 @@ _start: >>> .cfi_def_cfa_register %ebp >>> andl $0xfffffff0,%esp # align stack >>> leal 8(%ebp),%eax >>> + subl $4,%esp >>> pushl %eax # argv >>> pushl 4(%ebp) # argc >>> pushl %edx # rtld cleanup >> I'm seeing weird core dumps for ssh and friends on i386 on stable/8 from >> a few days ago. Could that be related? > Few days ago ? It was in the tree for probably one year. > I very much doubt it, but cannot say anything until you show the backtrace. > > Our in-tree gcc masks this by typically doing stack realignment on the > entry into the main(). I tend to think you are right... The backtrace doesn't have an aligned instruction to worry about. I'll rebuild to make sure it is all sane... Warner