Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Jan 2011 16:34:22 -0700
From:      Warner Losh <imp@bsdimp.com>
To:        freebsd-hackers@FreeBSD.org
Subject:   Re: What does the FreeBSD/i386 ABI say about stack alignment?
Message-ID:  <4D2F8BFE.9070607@bsdimp.com>
In-Reply-To: <20110113202848.GI2518@deviant.kiev.zoral.com.ua>
References:  <AANLkTikrsHUO3M%2Bfvo0kO%2B3dPq8OHu5L2zBf3fa3jL2x@mail.gmail.com> <20110113202848.GI2518@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
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?

Warner




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