/* test signal stack alignment (sigframe) * * a small user-space demo program to show that the signal stack * is currently mis-aligned on i386-linux * * Markus F.X.J. Oberhumer */ #include #include #include void sighandler(int); void test(void); volatile unsigned long sp = 0; /* assembler prologue code that stores the stack pointer into 'sp' * and then jumps to the real function */ #if defined(__i386__) asm( ".text\n" "sighandler:\n" "lea 4(%esp), %eax\n" "mov %eax, (sp)\n" "jmp do_sighandler\n" "test:\n" "lea 4(%esp), %eax\n" "mov %eax, (sp)\n" "jmp do_test\n" ".globl main\n" "main:\n" "lea 4(%esp), %eax\n" "mov %eax, (sp)\n" "jmp do_main\n" ); #elif defined(__x86_64__) asm( ".text\n" "sighandler:\n" "lea 8(%rsp), %rax\n" "mov %rax, sp(%rip)\n" "jmp do_sighandler\n" "test:\n" "lea 8(%rsp), %rax\n" "mov %rax, sp(%rip)\n" "jmp do_test\n" ".globl main\n" "main:\n" "lea 8(%rsp), %rax\n" "mov %rax, sp(%rip)\n" "jmp do_main\n" ); #else #error "arch not supported - please insert your code here" #endif void do_sighandler(void) { printf("in sighandler: sp = 0x%lx\n", sp); } void do_test(void) { printf("in test : sp = 0x%lx\n", sp); signal(SIGUSR1, sighandler); raise(SIGUSR1); } int do_main(void) { printf("in main : sp = 0x%lx\n", sp); test(); printf("All done.\n"); return 0; } /* vim:set ts=4 et: */