1/* 2 * Copyright (C) 2004-2006 Atmel Corporation 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9#include <asm/sysreg.h> 10 11 .text 12 .global __switch_to 13 .type __switch_to, @function 14 15 /* Switch thread context from "prev" to "next", returning "last" 16 * r12 : prev 17 * r11 : &prev->thread + 1 18 * r10 : &next->thread 19 */ 20__switch_to: 21 stm --r11, r0,r1,r2,r3,r4,r5,r6,r7,sp,lr 22 mfsr r9, SYSREG_SR 23 st.w --r11, r9 24 ld.w r8, r10++ 25 /* 26 * schedule() may have been called from a mode with a different 27 * set of registers. Make sure we don't lose anything here. 28 */ 29 pushm r10,r12 30 mtsr SYSREG_SR, r8 31 frs /* flush the return stack */ 32 sub pc, -2 /* flush the pipeline */ 33 popm r10,r12 34 ldm r10++, r0,r1,r2,r3,r4,r5,r6,r7,sp,pc 35 .size __switch_to, . - __switch_to 36