/* * Copyright (C) 2004-2006 Atmel Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <asm/sysreg.h> .text .global __switch_to .type __switch_to, @function /* Switch thread context from "prev" to "next", returning "last" * r12 : prev * r11 : &prev->thread + 1 * r10 : &next->thread */ __switch_to: stm --r11, r0,r1,r2,r3,r4,r5,r6,r7,sp,lr mfsr r9, SYSREG_SR st.w --r11, r9 ld.w r8, r10++ /* * schedule() may have been called from a mode with a different * set of registers. Make sure we don't lose anything here. */ pushm r10,r12 mtsr SYSREG_SR, r8 frs /* flush the return stack */ sub pc, -2 /* flush the pipeline */ popm r10,r12 ldm r10++, r0,r1,r2,r3,r4,r5,r6,r7,sp,pc .size __switch_to, . - __switch_to