Linux Audio

Check our new training course

Loading...
v6.13.7
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2/*
 3 * arch/arm/lib/call_with_stack.S
 4 *
 5 * Copyright (C) 2011 ARM Ltd.
 6 * Written by Will Deacon <will.deacon@arm.com>
 
 
 
 
 
 
 
 
 
 
 
 
 
 7 */
 8
 9#include <linux/linkage.h>
10#include <asm/assembler.h>
11#include <asm/unwind.h>
12
13/*
14 * void call_with_stack(void (*fn)(void *), void *arg, void *sp)
15 *
16 * Change the stack to that pointed at by sp, then invoke fn(arg) with
17 * the new stack.
18 *
19 * The sequence below follows the APCS frame convention for frame pointer
20 * unwinding, and implements the unwinder annotations needed by the EABI
21 * unwinder.
22 */
23
24ENTRY(call_with_stack)
25#if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
26	mov	ip, sp
27	push	{fp, ip, lr, pc}
28	sub	fp, ip, #4
29#else
30UNWIND( .fnstart		)
31UNWIND( .save	{fpreg, lr}	)
32	push	{fpreg, lr}
33UNWIND( .setfp	fpreg, sp	)
34	mov	fpreg, sp
35#endif
36	mov	sp, r2
37	mov	r2, r0
38	mov	r0, r1
39
40	bl_r	r2
 
41
42#if defined(CONFIG_UNWINDER_FRAME_POINTER) && defined(CONFIG_CC_IS_GCC)
43	ldmdb	fp, {fp, sp, pc}
44#else
45	mov	sp, fpreg
46	pop	{fpreg, pc}
47UNWIND( .fnend			)
48#endif
49	.globl call_with_stack_end
50call_with_stack_end:
51ENDPROC(call_with_stack)
v3.15
 
 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	mov	pc, r2
40
411:	ldr	lr, [sp]
42	ldr	sp, [sp, #4]
43	mov	pc, lr
 
 
 
 
 
 
44ENDPROC(call_with_stack)