xref: /OK3568_Linux_fs/kernel/arch/arm/lib/call_with_stack.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * arch/arm/lib/call_with_stack.S
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2011 ARM Ltd.
6*4882a593Smuzhiyun * Written by Will Deacon <will.deacon@arm.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#include <linux/linkage.h>
10*4882a593Smuzhiyun#include <asm/assembler.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun/*
13*4882a593Smuzhiyun * void call_with_stack(void (*fn)(void *), void *arg, void *sp)
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * Change the stack to that pointed at by sp, then invoke fn(arg) with
16*4882a593Smuzhiyun * the new stack.
17*4882a593Smuzhiyun */
18*4882a593SmuzhiyunENTRY(call_with_stack)
19*4882a593Smuzhiyun	str	sp, [r2, #-4]!
20*4882a593Smuzhiyun	str	lr, [r2, #-4]!
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun	mov	sp, r2
23*4882a593Smuzhiyun	mov	r2, r0
24*4882a593Smuzhiyun	mov	r0, r1
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	badr	lr, 1f
27*4882a593Smuzhiyun	ret	r2
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun1:	ldr	lr, [sp]
30*4882a593Smuzhiyun	ldr	sp, [sp, #4]
31*4882a593Smuzhiyun	ret	lr
32*4882a593SmuzhiyunENDPROC(call_with_stack)
33