arrfab / rpms / glibc

Forked from rpms/glibc 4 years ago
Clone

Blame SOURCES/glibc-ppc64le-35.patch

147e83
# commit 5162e7dd96efcd9b45c1dc1471a964d45278b1e1
147e83
# Author: Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
147e83
# Date:   Wed Dec 4 06:41:52 2013 -0600
147e83
# 
147e83
#     PowerPC64: Fix incorrect CFI in *context routines
147e83
#     
147e83
#     The context established by "makecontext" has a link register pointing
147e83
#     back to an error path within the makecontext routine.  This is currently
147e83
#     covered by the CFI FDE for makecontext itself, which is simply wrong
147e83
#     for the stack frame *inside* the context.  When trying to unwind (e.g.
147e83
#     doing a backtrace) in a routine inside a context created by makecontext,
147e83
#     this can lead to uninitialized stack slots being accessed, causing the
147e83
#     unwinder to crash in the worst case.
147e83
#     
147e83
#     Similarly, during parts of the "setcontext" routine, when the stack
147e83
#     pointer has already been switched to point to the new context, the
147e83
#     address range is still covered by the CFI FDE for setcontext.  When
147e83
#     trying to unwind in that situation (e.g. backtrace from an async
147e83
#     signal handler for profiling), it is again possible that the unwinder
147e83
#     crashes.
147e83
#     
147e83
#     Theses are all problems in existing code, but the changes in stack
147e83
#     frame layout appear to make the "worst case" much more likely in
147e83
#     the ELFv2 ABI context.  This causes regressions e.g. in the libgo
147e83
#     testsuite on ELFv2.
147e83
#     
147e83
#     This patch fixes this by ending the makecontext/setcontext FDEs
147e83
#     before those problematic parts of the assembler, similar to what
147e83
#     is already done on other platforms.   This fixes the libgo
147e83
#     regression on ELFv2.
147e83
# 
147e83
diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
147e83
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S	2014-05-29 13:16:16.000000000 -0500
147e83
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S	2014-05-29 13:16:17.000000000 -0500
147e83
@@ -129,6 +129,10 @@
147e83
      the cpu link stack used to predict blr return addresses.  */
147e83
   bcl	20,31,L(gotexitcodeaddr);
147e83
 
147e83
+  /* End FDE now, because while executing on the context's stack
147e83
+     the unwind info would be wrong otherwise.  */
147e83
+  cfi_endproc
147e83
+
147e83
 	/* This is the helper code which gets called if a function which
147e83
 	   is registered with 'makecontext' returns.  In this case we
147e83
 	   have to install the context listed in the uc_link element of
147e83
@@ -157,6 +161,11 @@
147e83
 #endif
147e83
 	b    L(do_exit)
147e83
 
147e83
+  /* Re-establish FDE for the rest of the actual makecontext routine.  */
147e83
+  cfi_startproc
147e83
+  cfi_offset (lr, FRAME_LR_SAVE)
147e83
+  cfi_adjust_cfa_offset (128)
147e83
+
147e83
   /* The address of the exit code is in the link register.  Store the lr
147e83
      in the ucontext as LNK so the target function will return to our
147e83
      exit code.  */
147e83
diff -urN glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S
147e83
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S	2014-05-29 13:16:16.000000000 -0500
147e83
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S	2014-05-29 13:16:17.000000000 -0500
147e83
@@ -129,6 +129,10 @@
147e83
   lfd  fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
147e83
   lfd  fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
147e83
 
147e83
+  /* End FDE now, because the unwind info would be wrong while
147e83
+     we're reloading registers to switch to the new context.  */
147e83
+  cfi_endproc
147e83
+
147e83
   ld   r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
147e83
   ld   r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
147e83
   mtlr r0
147e83
@@ -177,6 +181,11 @@
147e83
   ld   r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
147e83
   bctr
147e83
 
147e83
+  /* Re-establish FDE for the rest of the actual setcontext routine.  */
147e83
+  cfi_startproc
147e83
+  cfi_offset (lr, FRAME_LR_SAVE)
147e83
+  cfi_adjust_cfa_offset (128)
147e83
+
147e83
 L(nv_error_exit):
147e83
   ld   r0,128+FRAME_LR_SAVE(r1)
147e83
   addi r1,r1,128
147e83
@@ -403,6 +412,10 @@
147e83
   lfd  fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31)
147e83
   lfd  fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31)
147e83
 
147e83
+  /* End FDE now, because the unwind info would be wrong while
147e83
+     we're reloading registers to switch to the new context.  */
147e83
+  cfi_endproc
147e83
+
147e83
   ld   r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31)
147e83
   ld   r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31)
147e83
   mtlr r0
147e83
@@ -451,6 +464,11 @@
147e83
   ld   r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31)
147e83
   bctr
147e83
 
147e83
+  /* Re-establish FDE for the rest of the actual setcontext routine.  */
147e83
+  cfi_startproc
147e83
+  cfi_offset (lr, FRAME_LR_SAVE)
147e83
+  cfi_adjust_cfa_offset (128)
147e83
+
147e83
 L(error_exit):
147e83
   ld   r0,128+FRAME_LR_SAVE(r1)
147e83
   addi r1,r1,128