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: