aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 6563baf..b8b87ea 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 f10e8ff..177aa4b 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