Re: [PATCH] i386: fix stack alignment for signal handlers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Linus Torvalds wrote:

On Tue, 13 Sep 2005, Markus F.X.J. Oberhumer wrote:

It seems that the current signal code always sets up a stack frame so that
signal handlers are run with a somewhat mis-aligned stack, i.e. (esp % 8 == 4).

Actually, not really.

They get entered with the stack pointer aligned, at least in my tests.

	#include <stdio.h>
	#include <signal.h>
	#include <unistd.h>
	
	extern void handler(int);
	void *saved_esp;
	
	asm("handler: movl %esp,saved_esp; ret");
	
	int main(int argc, char **argv)
	{
	        signal(SIGALRM, handler);
	        alarm(1);
	        pause();
	        printf("%p\n", saved_esp);
	        return 0;
	}

always prints out an aligned address for me.

You seem to be expecting that the address be aligned "before the return address push", which is a totally different thing. Quite frankly, I don't know which one gcc prefers or whether there's an ABI specifying any preferences.

I'm pretty sure that on both amd64 and i386 the alignment has to be _before_ the address push from the call, though I cannot find any exact ABI specs at the moment. Experts please advise.

What do you get when running this slightly modified version of your test program? My patch would fix the alignment of Aligned16 here.

And for amd64, please also see arch/x86_64/kernel/signal.c where 8 is subtracted from the get_stack() result. Actually I wonder if other archs might be affected as well...

~Markus


#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <assert.h>

typedef struct { double x,y; } Aligned16 __attribute__((__aligned__(16)));

void *saved_esp;
void handler(int unused) {
        Aligned16 a;
        assert(__alignof(a) >= 16),
        saved_esp = (void *) &a;
}

int main()
{
        Aligned16 a;
        assert(__alignof(a) >= 16),
        printf("%p\n", &a);
        signal(SIGALRM, handler);
        alarm(1);
        pause();
        printf("%p\n", saved_esp);
        return 0;
}


--
Markus Oberhumer, <[email protected]>, http://www.oberhumer.com/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux