void switch_to_skas(void *prev, void *next) { struct task_struct *from, *to; from = prev; to = next; /* XXX need to check runqueues[cpu].idle */ if(current->pid == 0) switch_timers(0); switch_threads(&from->thread.mode.skas.switch_buf, to->thread.mode.skas.switch_buf); arch_switch_to_skas(current->thread.prev_sched, current); if(current->pid == 0) switch_timers(1); }
/* Called magically, see new_thread_handler above */ void fork_handler(void) { force_flush_all(); if(current->thread.prev_sched == NULL) panic("blech"); schedule_tail(current->thread.prev_sched); /* XXX: if interrupt_end() calls schedule, this call to * arch_switch_to_skas isn't needed. We could want to apply this to * improve performance. -bb */ arch_switch_to_skas(current->thread.prev_sched, current); current->thread.prev_sched = NULL; /* Handle any immediate reschedules or signals */ interrupt_end(); userspace(¤t->thread.regs.regs); }