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

From: Markus F.X.J. Oberhumer
Date: Tue Sep 13 2005 - 18:25:16 EST


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, <markus@xxxxxxxxxxxxx>, http://www.oberhumer.com/
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/