r6015 - glibc-package/branches/eglibc-2.19/debian/patches/arm64
Author: adconrad
Date: 2014-04-12 07:45:41 +0000 (Sat, 12 Apr 2014)
New Revision: 6015
Modified:
glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
Log:
Replace arm64 setcontext patch with new version from Will
Modified: glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff
===================================================================
--- glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff 2014-04-10 18:40:56 UTC (rev 6014)
+++ glibc-package/branches/eglibc-2.19/debian/patches/arm64/submitted-setcontext.diff 2014-04-12 07:45:41 UTC (rev 6015)
@@ -1,13 +1,20 @@
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(-)
+2014-04-01 Will Newton <will.newton@linaro.org>
+ [BZ #16629]
+ * sysdeps/unix/sysv/linux/aarch64/setcontext.S (__setcontext):
+ Re-implement to restore registers in user code and avoid
+ rt_sigreturn system call.
+---
+ sysdeps/unix/sysv/linux/aarch64/setcontext.S | 147 +++++++++++++++++----------
+ 2 files changed, 95 insertions(+), 58 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 @@
+@@ -22,68 +22,105 @@
#include "ucontext_i.h"
#include "ucontext-internal.h"
@@ -15,17 +22,11 @@
+/* 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
- ...
@@ -43,10 +44,15 @@
- /* Allocate space for the sigcontext. */
- mov w3, #((RT_SIGFRAME_SIZE + SP_ALIGN_SIZE) & SP_ALIGN_MASK)
- sub sp, sp, x3
--
++ Restores the machine context in UCP and thereby resumes execution
++ in that context.
+
- /* Compute the base address of the ucontext structure. */
- add x1, sp, #RT_SIGFRAME_UCONTEXT
--
++ 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. */
+
- /* Only ucontext is required in the frame, *copy* it in. */
-
-#if UCONTEXT_SIZE % 16
@@ -59,16 +65,18 @@
- stp x3, x4, [x1], #16
- sub x2, x2, 1
- cbnz x2, 0b
-+ENTRY(__setcontext)
-+ /* Save a copy of UCP. */
-+ mov x9, x0
++ .text
- /* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe. */
- mov x8, SYS_ify (rt_sigreturn)
++ENTRY (__setcontext)
++ /* Save a copy of UCP. */
++ mov x9, x0
++
+ /* Set the signal mask with
+ rt_sigprocmask (SIG_SETMASK, mask, NULL, _NSIG/8). */
+ mov x0, #SIG_SETMASK
-+ ldr x1, [x9, UCONTEXT_SIGMASK]
++ add x1, x9, #UCONTEXT_SIGMASK
+ mov x2, #0
+ mov x3, #_NSIG8
+ mov x8, SYS_ify (rt_sigprocmask)
@@ -83,35 +91,36 @@
- cfi_adjust_cfa_offset (16)
- cfi_restore (x29)
- cfi_restore (x30)
+- b C_SYMBOL_NAME(__syscall_error)
+-
+ cbz x0, 1f
- b C_SYMBOL_NAME(__syscall_error)
--
++ 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_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)
++ 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]
@@ -158,3 +167,13 @@
PSEUDO_END (__setcontext)
weak_alias (__setcontext, setcontext)
+-ENTRY(__startcontext)
++ENTRY (__startcontext)
+ mov x0, x19
+ cbnz x0, __setcontext
+-1: b HIDDEN_JUMPTARGET(_exit)
+-END(__startcontext)
++1: b HIDDEN_JUMPTARGET (_exit)
++END (__startcontext)
+--
+1.8.1.4
Reply to: