summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/machdep.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index 9f6ef66..e17a02c 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -1085,7 +1085,13 @@ get_mcontext(struct thread *td, mcontext_t *mc, int flags)
mc->mc_flags |= _MC_FLAGS_ASYNC_CONTEXT;
mc->mc_scratch = tf->tf_scratch;
mc->mc_scratch_fp = tf->tf_scratch_fp;
- /* XXX High FP */
+ /*
+ * XXX If the thread never used the high FP registers, we
+ * probably shouldn't waste time saving them.
+ */
+ ia64_highfp_save(td);
+ mc->mc_flags |= _MC_FLAGS_HIGHFP_VALID;
+ mc->mc_high_fp = td->td_pcb->pcb_high_fp;
}
save_callee_saved(&mc->mc_preserved);
save_callee_saved_fp(&mc->mc_preserved_fp);
@@ -1126,7 +1132,8 @@ set_mcontext(struct thread *td, const mcontext_t *mc)
KASSERT(tf->tf_scratch.gr15 == SYS_sigreturn, ("foo"));
tf->tf_scratch = mc->mc_scratch;
tf->tf_scratch_fp = mc->mc_scratch_fp;
- /* XXX High FP */
+ if (mc->mc_flags & _MC_FLAGS_HIGHFP_VALID)
+ td->td_pcb->pcb_high_fp = mc->mc_high_fp;
} else {
KASSERT((tf->tf_flags & FRAME_SYSCALL) != 0, ("foo"));
if ((mc->mc_flags & _MC_FLAGS_SCRATCH_VALID) == 0) {
OpenPOWER on IntegriCloud