about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChung-Lin Tang <cltang@codesourcery.com>2016-04-25 00:08:17 -0700
committerChung-Lin Tang <cltang@codesourcery.com>2016-04-25 00:08:17 -0700
commita5507dfa60a8b92ba52dadabea88e2b5d91da655 (patch)
tree5f9746c61ccbc2a2b62d4d4767fcb5524d65b924
parentd454fd21f4366fc529f83fdcd8a1113c5b49853e (diff)
downloadglibc-a5507dfa60a8b92ba52dadabea88e2b5d91da655.tar.gz
glibc-a5507dfa60a8b92ba52dadabea88e2b5d91da655.tar.xz
glibc-a5507dfa60a8b92ba52dadabea88e2b5d91da655.zip
Fix stdlib/tst-makecontext regression for Nios II
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/unix/sysv/linux/nios2/setcontext.S12
2 files changed, 17 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 6563baf8e7..b8b87eab72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-25  Chung-Lin Tang  <cltang@codesourcery.com>
+
+	* sysdeps/unix/sysv/linux/nios2/setcontext.S (__startcontext):
+	Add nop before __startcontext, add explaining comments.
+
 2016-04-25  Samuel thibault  <samuel.thibault@ens-lyon.org>
 
 	RFC2292 macros were obsoleted by RFC3542, and should not be exposed
diff --git a/sysdeps/unix/sysv/linux/nios2/setcontext.S b/sysdeps/unix/sysv/linux/nios2/setcontext.S
index f10e8ffc0f..177aa4b3cc 100644
--- a/sysdeps/unix/sysv/linux/nios2/setcontext.S
+++ b/sysdeps/unix/sysv/linux/nios2/setcontext.S
@@ -85,6 +85,18 @@ ENTRY(__setcontext)
 PSEUDO_END (__setcontext)
 weak_alias (__setcontext, setcontext)
 
+	/* We add an NOP here to separate between __setcontext/__startcontext.
+	   The wanted behavior that happens is: when unwinding from a function
+	   called inside a makecontext() context, FDE lookup will use
+	   '&__startcontext - 1', then returns NULL for no FDE found,
+	   and immediately ends the unwind, in a normal fashion.
+
+	   If this NOP word does not exist, FDE lookup just repeatedly finds
+	   __setcontext's FDE in an infinite loop, due to the convention of
+	   using 'address - 1' for FDE lookup. Modifiying/deleting the below
+	   __startcontext's FDE has no help on this.  */
+	nop
+
 ENTRY(__startcontext)
 	mov	r4, r16
 	bne	r4, zero, __setcontext