aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/mips
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2018-02-05 18:10:28 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2018-02-05 18:10:28 +0000
commit0b2b653012091354fe26f1138f61f648ed2ac6e4 (patch)
tree2d717c516a41fbe674e0ccd72481e6f2d973eaef /lib/libc/mips
parent7dea788b91a06a2b9e250c40a797246f4cf36848 (diff)
downloadsrc-0b2b653012091354fe26f1138f61f648ed2ac6e4.tar.gz
src-0b2b653012091354fe26f1138f61f648ed2ac6e4.zip
Fix makecontext() on MIPS O32.
The GP register can be clobbered by the callback, so save it in S1 while invoking the callback function. While here, add a comment expounding on the treatment of GP for the various ABIs and the assumptions made. Reviewed by: jmallett (earlier version) Sponsored by: DARPA / AFRL Differential Revision: https://reviews.freebsd.org/D14179
Notes
Notes: svn path=/head/; revision=328893
Diffstat (limited to 'lib/libc/mips')
-rw-r--r--lib/libc/mips/gen/_ctx_start.S16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/libc/mips/gen/_ctx_start.S b/lib/libc/mips/gen/_ctx_start.S
index 5d754a9927d1..f1f5cdc32641 100644
--- a/lib/libc/mips/gen/_ctx_start.S
+++ b/lib/libc/mips/gen/_ctx_start.S
@@ -28,11 +28,25 @@
__FBSDID("$FreeBSD$");
/*
- * XXX gp?
+ * This requires makecontext() to setup a valid GP for locating
+ * _ctx_done rather than deriving GP from T9 on entry. Currently this
+ * uses the GP inherited from getcontext() assuming that getcontext()
+ * is in the same shared object as _ctx_done(). For N32 and N64, GP
+ * is caller-save so will be preserved across the call to the callback
+ * function. For O32, GP is callee-save, so save it in a different
+ * caller-save register (S1) while invoking the callback. This is
+ * done instead of the usual SETUP_GP/SAVE_GP to avoid disturbing the
+ * stack frame setup by makecontext() for the callback function.
*/
ENTRY(_ctx_start)
+#ifdef __mips_o32
+ move s1, gp
+#endif
jalr t9
+#ifdef __mips_o32
+ move gp, s1
+#endif
move a0, s0
PTR_LA t9, _ctx_done
jalr t9