about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWill Newton <will.newton@linaro.org>2014-05-19 14:38:30 +0100
committerWill Newton <will.newton@linaro.org>2014-05-20 13:48:23 +0100
commita60339aaff82beadea6f580e587d64052cb5e3b8 (patch)
treee56bf2998936414815daef3ed7f5ab5861a6254b
parent7d05a8168b45c0580e1f9a79c2dd26c8f0d31fca (diff)
downloadglibc-a60339aaff82beadea6f580e587d64052cb5e3b8.tar.gz
glibc-a60339aaff82beadea6f580e587d64052cb5e3b8.tar.xz
glibc-a60339aaff82beadea6f580e587d64052cb5e3b8.zip
AArch64: Fix handling of nocancel syscall failures
The current code for nocancel syscalls does not do a comparison of
the system call return value. This leads to code being generated
where the b.cs follows the svc instruction directly without setting
the flags on which the branch depends.

ChangeLog:

2014-05-20  Will Newton  <will.newton@linaro.org>

	* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
	Test the return value of the system call in the nocancel case.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h1
2 files changed, 6 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 8c2fd9752e..fc75ff2d1c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
 2014-05-20  Will Newton  <will.newton@linaro.org>
+
+	* sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h (PSEUDO):
+	Test the return value of the system call in the nocancel case.
+
+2014-05-20  Will Newton  <will.newton@linaro.org>
 	    Yvan Roux  <yvan.roux@linaro.org>
 
 	* sysdeps/unix/sysv/linux/aarch64/sys/user.h: Remove unused
diff --git a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
index f6903b5dd8..0e9bef3afc 100644
--- a/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/aarch64/nptl/sysdep-cancel.h
@@ -32,6 +32,7 @@
   __##syscall_name##_nocancel:						\
     cfi_startproc;							\
     DO_CALL (syscall_name, args);					\
+    cmn x0, 4095;							\
     PSEUDO_RET;								\
     cfi_endproc;							\
     .size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;	\