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