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