Author: adconrad
Date: 2014-04-10 18:40:56 +0000 (Thu, 10 Apr 2014)
New Revision: 6014

Added:
   glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-align.diff
   
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
   
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-tst-setcontext.diff
Modified:
   glibc-package/branches/eglibc-2.19/debian/changelog
Log:
* debian/patches/arm64/submitted-align.diff: Right pthread_self alignment.
* debian/patches/arm64/submitted-setcontext.diff: Bring in patch from Will
  Newton of Linaro to reimplement setcontext without rt_sigreturn syscall.
* debian/patches/arm64/submitted-tst-setcontext.diff: Apply test for same.

Modified: glibc-package/branches/eglibc-2.19/debian/changelog
===================================================================
--- glibc-package/branches/eglibc-2.19/debian/changelog 2014-04-09 22:16:20 UTC 
(rev 6013)
+++ glibc-package/branches/eglibc-2.19/debian/changelog 2014-04-10 18:40:56 UTC 
(rev 6014)
@@ -48,6 +48,10 @@
     to fix several bugs and add optimisations on POWER7 and POWER8 machines.
   * debian/patches/any/local-no-malloc-backtrace.diff: Change M_CHECK_ACTION
     to abort if the first bit is set (ie: MALLOC_CHECK_=1), like the second.
+  * debian/patches/arm64/submitted-align.diff: Right pthread_self alignment.
+  * debian/patches/arm64/submitted-setcontext.diff: Bring in patch from Will
+    Newton of Linaro to reimplement setcontext without rt_sigreturn syscall.
+  * debian/patches/arm64/submitted-tst-setcontext.diff: Apply test for same.
 
   [ Aurelien Jarno ]
   * debian/debhelper.in/libc.preinst: remove check for sparc32 kernel, the

Added: 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-align.diff
===================================================================
--- 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-align.diff    
                            (rev 0)
+++ 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-align.diff    
    2014-04-10 18:40:56 UTC (rev 6014)
@@ -0,0 +1,24 @@
+https://sourceware.org/bugzilla/show_bug.cgi?id=16796#c1
+
+Index: eglibc-2.19/ports/sysdeps/aarch64/nptl/tls.h
+===================================================================
+--- eglibc-2.19.orig/ports/sysdeps/aarch64/nptl/tls.h  2014-01-03 
17:51:28.000000000 +0000
++++ eglibc-2.19/ports/sysdeps/aarch64/nptl/tls.h       2150-05-10 
02:22:49.085789000 +0000
+@@ -62,7 +62,7 @@
+ # define TLS_INIT_TCB_SIZE    sizeof (tcbhead_t)
+ 
+ /* Alignment requirements for the initial TCB.  */
+-# define TLS_INIT_TCB_ALIGN   __alignof__ (tcbhead_t)
++# define TLS_INIT_TCB_ALIGN   __alignof__ (struct pthread)
+ 
+ /* This is the size of the TCB.  */
+ # define TLS_TCB_SIZE         sizeof (tcbhead_t)
+@@ -71,7 +71,7 @@
+ # define TLS_PRE_TCB_SIZE     sizeof (struct pthread)
+ 
+ /* Alignment requirements for the TCB.  */
+-# define TLS_TCB_ALIGN                __alignof__ (tcbhead_t)
++# define TLS_TCB_ALIGN                __alignof__ (struct pthread)
+ 
+ /* Install the dtv pointer.  The pointer passed is to the element with
+    index -1 which contain the length.  */

Added: 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
===================================================================
--- 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
                           (rev 0)
+++ 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
   2014-04-10 18:40:56 UTC (rev 6014)
@@ -0,0 +1,160 @@
+https://sourceware.org/ml/libc-alpha/2014-04/msg00006.html
+
+ sysdeps/unix/sysv/linux/aarch64/setcontext.S | 139 +++++++++++++++++----------
+ 1 file changed, 88 insertions(+), 51 deletions(-)
+
+Index: eglibc-2.19/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S
+===================================================================
+--- eglibc-2.19.orig/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S        
2150-05-09 09:36:21.925789000 +0000
++++ eglibc-2.19/ports/sysdeps/unix/sysv/linux/aarch64/setcontext.S     
2150-05-09 09:36:48.235789000 +0000
+@@ -22,63 +22,100 @@
+ #include "ucontext_i.h"
+ #include "ucontext-internal.h"
+ 
+-/* int setcontext (const ucontext_t *ucp) */
++/*  int __setcontext (const ucontext_t *ucp)
+ 
+-      .text
++  Restores the machine context in UCP and thereby resumes execution
++  in that context.
+ 
+-ENTRY(__setcontext)
++  This implementation is intended to be used for *synchronous* context
++  switches only.  Therefore, it does not have to restore anything
++  other than the PRESERVED state.  */
+ 
+-      /* Create a signal frame on the stack:
++      .text
+ 
+-              fp
+-              lr
+-              ...
+-         sp-> rt_sigframe
+-       */
+-
+-      stp     x29, x30, [sp, -16]!
+-      cfi_adjust_cfa_offset (16)
+-      cfi_rel_offset (x29, 0)
+-      cfi_rel_offset (x30, 8)
+-
+-        mov     x29, sp
+-      cfi_def_cfa_register (x29)
+-
+-      /* Allocate space for the sigcontext.  */
+-      mov     w3, #((RT_SIGFRAME_SIZE + SP_ALIGN_SIZE) & SP_ALIGN_MASK)
+-      sub     sp, sp, x3
+-
+-      /* Compute the base address of the ucontext structure.  */
+-      add     x1, sp, #RT_SIGFRAME_UCONTEXT
+-
+-      /* Only ucontext is required in the frame, *copy* it in.  */
+-
+-#if UCONTEXT_SIZE % 16
+-#error The implementation of setcontext.S assumes sizeof(ucontext_t) % 16 == 0
+-#endif
+-
+-      mov     x2, #UCONTEXT_SIZE / 16
+-0:
+-      ldp     x3, x4, [x0], #16
+-      stp     x3, x4, [x1], #16
+-      sub     x2, x2, 1
+-      cbnz    x2, 0b
++ENTRY(__setcontext)
++      /* Save a copy of UCP.  */
++      mov     x9, x0
+ 
+-      /* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe.  */
+-      mov     x8, SYS_ify (rt_sigreturn)
++      /* Set the signal mask with
++         rt_sigprocmask (SIG_SETMASK, mask, NULL, _NSIG/8).  */
++      mov     x0, #SIG_SETMASK
++      ldr     x1, [x9, UCONTEXT_SIGMASK]
++      mov     x2, #0
++      mov     x3, #_NSIG8
++      mov     x8, SYS_ify (rt_sigprocmask)
+       svc     0
+-
+-      /* Ooops we failed.  Recover the stack */
+-
+-      mov     sp, x29
+-      cfi_def_cfa_register (sp)
+-
+-        ldp     x29, x30, [sp], 16
+-      cfi_adjust_cfa_offset (16)
+-      cfi_restore (x29)
+-      cfi_restore (x30)
++      cbz     x0, 1f
+       b       C_SYMBOL_NAME(__syscall_error)
+-
++1:
++      /* Restore the general purpose registers.  */
++      mov     x0, x9
++      cfi_def_cfa(x0, 0)
++      cfi_offset(x18, oX0 + 18 * SZREG)
++      cfi_offset(x19, oX0 + 19 * SZREG)
++      cfi_offset(x20, oX0 + 20 * SZREG)
++      cfi_offset(x21, oX0 + 21 * SZREG)
++      cfi_offset(x22, oX0 + 22 * SZREG)
++      cfi_offset(x23, oX0 + 23 * SZREG)
++      cfi_offset(x24, oX0 + 24 * SZREG)
++      cfi_offset(x25, oX0 + 25 * SZREG)
++      cfi_offset(x26, oX0 + 26 * SZREG)
++      cfi_offset(x27, oX0 + 27 * SZREG)
++      cfi_offset(x28, oX0 + 28 * SZREG)
++      cfi_offset(x29, oX0 + 29 * SZREG)
++      cfi_offset(x30, oX0 + 30 * SZREG)
++
++      cfi_offset( d8, oV0 + 8 * SZVREG)
++      cfi_offset( d9, oV0 + 9 * SZVREG)
++      cfi_offset(d10, oV0 + 10 * SZVREG)
++      cfi_offset(d11, oV0 + 11 * SZVREG)
++      cfi_offset(d12, oV0 + 12 * SZVREG)
++      cfi_offset(d13, oV0 + 13 * SZVREG)
++      cfi_offset(d14, oV0 + 14 * SZVREG)
++      cfi_offset(d15, oV0 + 15 * SZVREG)
++      ldp     x18, x19, [x0, oX0 + 18 * SZREG]
++      ldp     x20, x21, [x0, oX0 + 20 * SZREG]
++      ldp     x22, x23, [x0, oX0 + 22 * SZREG]
++      ldp     x24, x25, [x0, oX0 + 24 * SZREG]
++      ldp     x26, x27, [x0, oX0 + 26 * SZREG]
++      ldp     x28, x29, [x0, oX0 + 28 * SZREG]
++      ldr     x30,      [x0, oX0 + 30 * SZREG]
++      ldr     x2, [x0, oSP]
++      mov     sp, x2
++
++      /* Check for FP SIMD context.  */
++      add     x2, x0, #oEXTENSION
++
++      mov     w3, #(FPSIMD_MAGIC & 0xffff)
++      movk    w3, #(FPSIMD_MAGIC >> 16), lsl #16
++      ldr     w1, [x2, #oHEAD + oMAGIC]
++      cmp     w1, w3
++      b.ne    2f
++
++      /* Restore the FP SIMD context.  */
++      add     x3, x2, #oV0 + 8 * SZVREG
++      ldp      d8,  d9, [x3], #2 * SZVREG
++      ldp     d10, d11, [x3], #2 * SZVREG
++      ldp     d12, d13, [x3], #2 * SZVREG
++      ldp     d14, d15, [x3], #2 * SZVREG
++
++      add     x3, x2, oFPSR
++
++      ldr     w4, [x3]
++      msr     fpsr, x4
++
++      ldr     w4, [x3, oFPCR - oFPSR]
++      msr     fpcr, x4
++
++2:
++      ldr     x16, [x0, oPC]
++      /* Restore arg registers.  */
++      ldp     x2, x3, [x0, oX0 + 2 * SZREG]
++      ldp     x4, x5, [x0, oX0 + 4 * SZREG]
++      ldp     x6, x7, [x0, oX0 + 6 * SZREG]
++      ldp     x0, x1, [x0, oX0 + 0 * SZREG]
++      /* Jump to the new pc value.  */
++      br      x16
+ PSEUDO_END (__setcontext)
+ weak_alias (__setcontext, setcontext)
+ 

Added: 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-tst-setcontext.diff
===================================================================
--- 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-tst-setcontext.diff
                               (rev 0)
+++ 
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-tst-setcontext.diff
       2014-04-10 18:40:56 UTC (rev 6014)
@@ -0,0 +1,55 @@
+https://sourceware.org/ml/libc-alpha/2014-04/msg00008.html
+
+Index: eglibc-2.19/stdlib/tst-setcontext.c
+===================================================================
+--- eglibc-2.19.orig/stdlib/tst-setcontext.c   2014-01-03 17:51:28.000000000 
+0000
++++ eglibc-2.19/stdlib/tst-setcontext.c        2150-05-10 06:54:54.405789000 
+0000
+@@ -16,6 +16,7 @@
+    <http://www.gnu.org/licenses/>.  */
+ 
+ #include <errno.h>
++#include <signal.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+@@ -144,6 +145,9 @@
+   atexit (check_called);
+ 
+   char st1[32768];
++  stack_t stack_before, stack_after;
++
++  sigaltstack(NULL, &stack_before);
+ 
+   puts ("making contexts");
+   if (getcontext (&ctx[1]) != 0)
+@@ -207,6 +211,8 @@
+   puts ("back at main program");
+   back_in_main = 1;
+ 
++  sigaltstack(NULL, &stack_after);
++
+   if (was_in_f1 == 0)
+     {
+       puts ("didn't reach f1");
+@@ -218,6 +224,21 @@
+       exit (1);
+     }
+ 
++  /* Check sigaltstack state is not clobbered as in BZ #16629.  */
++  if (stack_before.ss_sp != stack_after.ss_sp)
++    {
++      printf ("stack ss_sp mismatch: %p %p\n",
++            stack_before.ss_sp, stack_after.ss_sp);
++      exit (1);
++    }
++
++  if (stack_before.ss_size != stack_after.ss_size)
++    {
++      printf ("stack ss_size mismatch: %zd %zd\n",
++            stack_before.ss_size, stack_after.ss_size);
++      exit (1);
++    }
++
+   puts ("test succeeded");
+   return 0;
+ }


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: https://lists.debian.org/[email protected]

Reply via email to