ARM: convert all "mov.* pc, reg" to "bx reg" for ARMv6+
[sfrench/cifs-2.6.git] / arch / arm / lib / call_with_stack.S
1 /*
2  * arch/arm/lib/call_with_stack.S
3  *
4  * Copyright (C) 2011 ARM Ltd.
5  * Written by Will Deacon <will.deacon@arm.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  */
20
21 #include <linux/linkage.h>
22 #include <asm/assembler.h>
23
24 /*
25  * void call_with_stack(void (*fn)(void *), void *arg, void *sp)
26  *
27  * Change the stack to that pointed at by sp, then invoke fn(arg) with
28  * the new stack.
29  */
30 ENTRY(call_with_stack)
31         str     sp, [r2, #-4]!
32         str     lr, [r2, #-4]!
33
34         mov     sp, r2
35         mov     r2, r0
36         mov     r0, r1
37
38         adr     lr, BSYM(1f)
39         ret     r2
40
41 1:      ldr     lr, [sp]
42         ldr     sp, [sp, #4]
43         ret     lr
44 ENDPROC(call_with_stack)