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 */ 30ENTRY(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 411: ldr lr, [sp] 42 ldr sp, [sp, #4] 43 ret lr 44ENDPROC(call_with_stack) 45