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
This commit is contained in:
parent
7dea788b91
commit
0b2b653012
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user