|
@@ -21,12 +21,22 @@
|
|
* `next' and `prev' should be struct task_struct, but it isn't always defined
|
|
* `next' and `prev' should be struct task_struct, but it isn't always defined
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+#if defined(CONFIG_FRAME_POINTER) || \
|
|
|
|
+ !defined(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER)
|
|
|
|
+#define M32R_PUSH_FP " push fp\n"
|
|
|
|
+#define M32R_POP_FP " pop fp\n"
|
|
|
|
+#else
|
|
|
|
+#define M32R_PUSH_FP ""
|
|
|
|
+#define M32R_POP_FP ""
|
|
|
|
+#endif
|
|
|
|
+
|
|
#define switch_to(prev, next, last) do { \
|
|
#define switch_to(prev, next, last) do { \
|
|
__asm__ __volatile__ ( \
|
|
__asm__ __volatile__ ( \
|
|
" seth lr, #high(1f) \n" \
|
|
" seth lr, #high(1f) \n" \
|
|
" or3 lr, lr, #low(1f) \n" \
|
|
" or3 lr, lr, #low(1f) \n" \
|
|
" st lr, @%4 ; store old LR \n" \
|
|
" st lr, @%4 ; store old LR \n" \
|
|
" ld lr, @%5 ; load new LR \n" \
|
|
" ld lr, @%5 ; load new LR \n" \
|
|
|
|
+ M32R_PUSH_FP \
|
|
" st sp, @%2 ; store old SP \n" \
|
|
" st sp, @%2 ; store old SP \n" \
|
|
" ld sp, @%3 ; load new SP \n" \
|
|
" ld sp, @%3 ; load new SP \n" \
|
|
" push %1 ; store `prev' on new stack \n" \
|
|
" push %1 ; store `prev' on new stack \n" \
|
|
@@ -34,6 +44,7 @@
|
|
" .fillinsn \n" \
|
|
" .fillinsn \n" \
|
|
"1: \n" \
|
|
"1: \n" \
|
|
" pop %0 ; restore `__last' from new stack \n" \
|
|
" pop %0 ; restore `__last' from new stack \n" \
|
|
|
|
+ M32R_POP_FP \
|
|
: "=r" (last) \
|
|
: "=r" (last) \
|
|
: "0" (prev), \
|
|
: "0" (prev), \
|
|
"r" (&(prev->thread.sp)), "r" (&(next->thread.sp)), \
|
|
"r" (&(prev->thread.sp)), "r" (&(next->thread.sp)), \
|