Implement set_mcontext() and get_mcontext(). Just as for sendsig() and
sigreturn(), we cheat and assume the preserved registers are still on-chip and unmodified. This is actually the case, but more by accident than by design. We need to use unwinding eventually or explicitly compile the kernel in a way that the compiler steers clear from using the preserved registers completely.
This commit is contained in:
parent
b6a42c898a
commit
c01da18e22
@ -1008,17 +1008,27 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap)
|
||||
#endif
|
||||
|
||||
int
|
||||
get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
|
||||
get_mcontext(struct thread *td, mcontext_t *mc, int clear_ret)
|
||||
{
|
||||
struct trapframe *tf;
|
||||
|
||||
return (ENOSYS);
|
||||
tf = td->td_frame;
|
||||
mc->mc_special = tf->tf_special;
|
||||
save_callee_saved(&mc->mc_preserved);
|
||||
save_callee_saved_fp(&mc->mc_preserved_fp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
set_mcontext(struct thread *td, const mcontext_t *mcp)
|
||||
set_mcontext(struct thread *td, const mcontext_t *mc)
|
||||
{
|
||||
struct trapframe *tf;
|
||||
|
||||
return (ENOSYS);
|
||||
tf = td->td_frame;
|
||||
tf->tf_special = mc->mc_special;
|
||||
restore_callee_saved(&mc->mc_preserved);
|
||||
restore_callee_saved_fp(&mc->mc_preserved_fp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user