struct task_struct *__sched _switch_to(struct task_struct *prev, struct task_struct *next) { /* DMA state is already saved; save off other arch state. */ save_arch_state(&prev->thread); #if CHIP_HAS_TILE_DMA() /* * Restore DMA in new task if desired. * Note that it is only safe to restart here since interrupts * are disabled, so we can't take any DMATLB miss or access * interrupts before we have finished switching stacks. */ if (next->thread.tile_dma_state.enabled) { restore_tile_dma_state(&next->thread); grant_dma_mpls(); } else { restrict_dma_mpls(); } #endif /* Restore other arch state. */ restore_arch_state(&next->thread); #if CHIP_HAS_SN_PROC() /* * Restart static network processor in the new process * if it was running before. */ if (next->thread.sn_proc_running) { int snctl = __insn_mfspr(SPR_SNCTL); __insn_mtspr(SPR_SNCTL, snctl & ~SPR_SNCTL__FRZPROC_MASK); } #endif #ifdef CONFIG_HARDWALL /* Enable or disable access to the network registers appropriately. */ if (prev->thread.hardwall != NULL) { if (next->thread.hardwall == NULL) restrict_network_mpls(); } else if (next->thread.hardwall != NULL) { grant_network_mpls(); } #endif /* * Switch kernel SP, PC, and callee-saved registers. * In the context of the new task, return the old task pointer * (i.e. the task that actually called __switch_to). * Pass the value to use for SYSTEM_SAVE_K_0 when we reset our sp. */ return __switch_to(prev, next, next_current_ksp0(next)); }
static void switch_to(struct task_struct *prev, struct task_struct *next) { struct thread_info *prev_thread = task_thread_info(prev); struct thread_info *next_thread = task_thread_info(next); printk(PR_SS_PROC, PR_LVL_DBG5, "%s, prev_thread = %x, next_thread = %x\n", __func__, prev_thread, next_thread); __switch_to(prev,task_thread_info(prev), task_thread_info(next)); }