36 lines
		
	
	
	
		
			914 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			36 lines
		
	
	
	
		
			914 B
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * 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
							 |