• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2001  Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto
7  * Copyright (C) 2004, 2006  Hirokazu Takata <takata at linux-m32r.org>
8  */
9 #ifndef _ASM_M32R_SWITCH_TO_H
10 #define _ASM_M32R_SWITCH_TO_H
11 
12 /*
13  * switch_to(prev, next) should switch from task `prev' to `next'
14  * `prev' will never be the same as `next'.
15  *
16  * `next' and `prev' should be struct task_struct, but it isn't always defined
17  */
18 
19 #if defined(CONFIG_FRAME_POINTER) || \
20 	!defined(CONFIG_SCHED_OMIT_FRAME_POINTER)
21 #define M32R_PUSH_FP "	push fp\n"
22 #define M32R_POP_FP  "	pop  fp\n"
23 #else
24 #define M32R_PUSH_FP ""
25 #define M32R_POP_FP  ""
26 #endif
27 
28 #define switch_to(prev, next, last)  do { \
29 	__asm__ __volatile__ ( \
30 		"	seth	lr, #high(1f)				\n" \
31 		"	or3	lr, lr, #low(1f)			\n" \
32 		"	st	lr, @%4  ; store old LR			\n" \
33 		"	ld	lr, @%5  ; load new LR			\n" \
34 			M32R_PUSH_FP \
35 		"	st	sp, @%2  ; store old SP			\n" \
36 		"	ld	sp, @%3  ; load new SP			\n" \
37 		"	push	%1  ; store `prev' on new stack		\n" \
38 		"	jmp	lr					\n" \
39 		"	.fillinsn					\n" \
40 		"1:							\n" \
41 		"	pop	%0  ; restore `__last' from new stack	\n" \
42 			M32R_POP_FP \
43 		: "=r" (last) \
44 		: "0" (prev), \
45 		  "r" (&(prev->thread.sp)), "r" (&(next->thread.sp)), \
46 		  "r" (&(prev->thread.lr)), "r" (&(next->thread.lr)) \
47 		: "memory", "lr" \
48 	); \
49 } while(0)
50 
51 #endif /* _ASM_M32R_SWITCH_TO_H */
52