xref: /rk3399_ARM-atf/drivers/renesas/common/pwrc/call_sram.S (revision 65d227c3a20c80bb70f796e5839dc96014f0f9cf)
1*c40739a6SBiju Das/*
2*c40739a6SBiju Das * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
3*c40739a6SBiju Das *
4*c40739a6SBiju Das * SPDX-License-Identifier: BSD-3-Clause
5*c40739a6SBiju Das */
6*c40739a6SBiju Das
7*c40739a6SBiju Das#include <arch.h>
8*c40739a6SBiju Das#include <asm_macros.S>
9*c40739a6SBiju Das
10*c40739a6SBiju Das.global rcar_pwrc_switch_stack
11*c40739a6SBiju Das
12*c40739a6SBiju Das/*
13*c40739a6SBiju Das * x0 : jump address,
14*c40739a6SBiju Das * x1 : stack address,
15*c40739a6SBiju Das * x2 : arg,
16*c40739a6SBiju Das * x3 : stack address (temporary)
17*c40739a6SBiju Das */
18*c40739a6SBiju Dasfunc rcar_pwrc_switch_stack
19*c40739a6SBiju Das
20*c40739a6SBiju Das	/* lr to stack */
21*c40739a6SBiju Das	stp	x29, x30, [sp,#-16]
22*c40739a6SBiju Das
23*c40739a6SBiju Das	/* change stack pointer */
24*c40739a6SBiju Das	mov	x3, sp
25*c40739a6SBiju Das	mov	sp, x1
26*c40739a6SBiju Das
27*c40739a6SBiju Das	/* save stack pointer */
28*c40739a6SBiju Das	sub	sp, sp, #16
29*c40739a6SBiju Das	stp	x0, x3, [sp]
30*c40739a6SBiju Das
31*c40739a6SBiju Das	/* data synchronization barrier */
32*c40739a6SBiju Das	dsb	sy
33*c40739a6SBiju Das
34*c40739a6SBiju Das	/* jump to code */
35*c40739a6SBiju Das	mov	x1, x0
36*c40739a6SBiju Das	mov	x0, x2
37*c40739a6SBiju Das	blr	x1
38*c40739a6SBiju Das
39*c40739a6SBiju Das	/* load stack pointer */
40*c40739a6SBiju Das	ldp 	x0, x2, [sp,#0]
41*c40739a6SBiju Das
42*c40739a6SBiju Das	/* change stack pointer */
43*c40739a6SBiju Das	mov	sp, x2
44*c40739a6SBiju Das
45*c40739a6SBiju Das	/* return */
46*c40739a6SBiju Das	ldp	x29, x30, [sp,#-16]
47*c40739a6SBiju Das	ret
48*c40739a6SBiju Dasendfunc rcar_pwrc_switch_stack
49