[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r6014 - in glibc-package/branches/eglibc-2.19/debian: . patches/arm64



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;
+ }


Reply to: