[PATCH] Mark unwind info for signal trampolines in vDSOs
authorJakub Jelinek <jakub@redhat.com>
Fri, 31 Mar 2006 10:30:28 +0000 (02:30 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 31 Mar 2006 20:18:52 +0000 (12:18 -0800)
Mark unwind info for signal trampolines using the new S augmentation flag
introduced in: http://gcc.gnu.org/PR26208.

GCC 4.2 (or patched earlier GCC) will be able to special case unwinding
through frames right above signal trampolines.  As the augmentations start
with z flag and S is at the very end of the augmentation string, older GCCs
will just skip the S flag as unknown (that's why an augmentation flag was
chosen over say a new CFA opcode).

Signed-off-by: Jakub Jelinek <jakub@redhat.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/i386/kernel/vsyscall-sigreturn.S
arch/powerpc/kernel/vdso32/sigtramp.S
arch/powerpc/kernel/vdso64/sigtramp.S
arch/x86_64/ia32/vsyscall-sigreturn.S

index fadb5bc3c37431cfda60e19d7f4e477e0126958a..a92262f4165993fbd76266ccdc798bb7c7d60355 100644 (file)
@@ -44,7 +44,7 @@ __kernel_rt_sigreturn:
 .LSTARTCIEDLSI1:
        .long 0                 /* CIE ID */
        .byte 1                 /* Version number */
-       .string "zR           /* NUL-terminated augmentation string */
+       .string "zRS"           /* NUL-terminated augmentation string */
        .uleb128 1              /* Code alignment factor */
        .sleb128 -4             /* Data alignment factor */
        .byte 8                 /* Return address register column */
index e04642781917b2be3742388e6cbc1c608e8fb842..0c6a37b29dde0eab7eecb80ef0a3ebf6aac3440b 100644 (file)
@@ -261,7 +261,7 @@ V_FUNCTION_END(__kernel_sigtramp_rt32)
 .Lcie_start:
        .long 0                 /* CIE ID */
        .byte 1                 /* Version number */
-       .string "zR           /* NUL-terminated augmentation string */
+       .string "zRS"           /* NUL-terminated augmentation string */
        .uleb128 4              /* Code alignment factor */
        .sleb128 -4             /* Data alignment factor */
        .byte 67                /* Return address register column, ap */
index 31b604ab56deaaeaeda826ffdd625903fc7636ac..7479edb101b8c704452af982349b44da49bbf164 100644 (file)
@@ -263,7 +263,7 @@ V_FUNCTION_END(__kernel_sigtramp_rt64)
 .Lcie_start:
        .long 0                 /* CIE ID */
        .byte 1                 /* Version number */
-       .string "zR           /* NUL-terminated augmentation string */
+       .string "zRS"           /* NUL-terminated augmentation string */
        .uleb128 4              /* Code alignment factor */
        .sleb128 -8             /* Data alignment factor */
        .byte 67                /* Return address register column, ap */
index d90321fe9bba1ffb9d23c24fef81b924a766efe0..1384367cdbe1f9d53097dd162b659b25e28dcf96 100644 (file)
@@ -32,9 +32,28 @@ __kernel_rt_sigreturn:
        .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
 
        .section .eh_frame,"a",@progbits
+.LSTARTFRAMES:
+        .long .LENDCIES-.LSTARTCIES
+.LSTARTCIES:
+       .long 0                 /* CIE ID */
+       .byte 1                 /* Version number */
+       .string "zRS"           /* NUL-terminated augmentation string */
+       .uleb128 1              /* Code alignment factor */
+       .sleb128 -4             /* Data alignment factor */
+       .byte 8                 /* Return address register column */
+       .uleb128 1              /* Augmentation value length */
+       .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
+       .byte 0x0c              /* DW_CFA_def_cfa */
+       .uleb128 4
+       .uleb128 4
+       .byte 0x88              /* DW_CFA_offset, column 0x8 */
+       .uleb128 1
+       .align 4
+.LENDCIES:
+
        .long .LENDFDE2-.LSTARTFDE2     /* Length FDE */
 .LSTARTFDE2:
-       .long .LSTARTFDE2-.LSTARTFRAME  /* CIE pointer */
+       .long .LSTARTFDE2-.LSTARTFRAMES /* CIE pointer */
        /* HACK: The dwarf2 unwind routines will subtract 1 from the
           return address to get an address in the middle of the
           presumed call instruction.  Since we didn't get here via
@@ -97,7 +116,7 @@ __kernel_rt_sigreturn:
 
        .long .LENDFDE3-.LSTARTFDE3     /* Length FDE */
 .LSTARTFDE3:
-       .long .LSTARTFDE3-.LSTARTFRAME  /* CIE pointer */
+       .long .LSTARTFDE3-.LSTARTFRAMES /* CIE pointer */
        /* HACK: See above wrt unwind library assumptions.  */
        .long .LSTART_rt_sigreturn-1-.  /* PC-relative start address */
        .long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1