void xnarch_switch_to(struct xnthread *out, struct xnthread *in)
{
struct xnarchtcb *out_tcb =&out->tcb, *in_tcb =&in->tcb;
struct mm_struct *prev_mm, *next_mm;
struct task_struct *next;
next = in_tcb->core.host_task;
prev_mm = out_tcb->core.active_mm;
next_mm = in_tcb->core.mm;
//首先,检查是否为内核线程还是用户进程if (next_mm ==NULL) {
//kernel thread,copy mm from previous process.
in_tcb->core.active_mm = prev_mm;
enter_lazy_tlb(prev_mm, next);
} else {
ipipe_switch_mm_head(prev_mm, next_mm, next);
/*
* We might be switching back to the root thread,
* which we preempted earlier, shortly after "current"
* dropped its mm context in the do_exit() path
* (next->mm == NULL). In that particular case, the
* kernel expects a lazy TLB state for leaving the mm.
*/if (next->mm ==NULL)
enter_lazy_tlb(prev_mm, next);
}
__asm_thread_s.witch(out_tcb->core.tip, in_tcb->core.tip);
}