mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-18 02:24:18 +00:00
90 lines
1.7 KiB
ArmAsm
90 lines
1.7 KiB
ArmAsm
/*
|
|
* Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <arch.h>
|
|
#include <asm_macros.S>
|
|
#include "rcar_def.h"
|
|
|
|
.global rcar_pwrc_switch_stack
|
|
.global rcar_pwrc_save_generic_timer
|
|
.global rcar_pwrc_restore_generic_timer
|
|
|
|
#define OFFSET_SP_X9_X10 (0x00)
|
|
#define OFFSET_CNTFID0 (0x10)
|
|
#define OFFSET_CNTPCT_EL0 (0x18)
|
|
#define OFFSET_TIMER_COUNT (0x20)
|
|
|
|
/*
|
|
* x0 : jump address,
|
|
* x1 : stack address,
|
|
* x2 : arg,
|
|
* x3 : stack address (temporary)
|
|
*/
|
|
func rcar_pwrc_switch_stack
|
|
|
|
/* lr to stack */
|
|
stp x29, x30, [sp,#-16]
|
|
|
|
/* change stack pointer */
|
|
mov x3, sp
|
|
mov sp, x1
|
|
|
|
/* save stack pointer */
|
|
sub sp, sp, #16
|
|
stp x0, x3, [sp]
|
|
|
|
/* data synchronization barrier */
|
|
dsb sy
|
|
|
|
/* jump to code */
|
|
mov x1, x0
|
|
mov x0, x2
|
|
blr x1
|
|
|
|
/* load stack pointer */
|
|
ldp x0, x2, [sp,#0]
|
|
|
|
/* change stack pointer */
|
|
mov sp, x2
|
|
|
|
/* return */
|
|
ldp x29, x30, [sp,#-16]
|
|
ret
|
|
endfunc rcar_pwrc_switch_stack
|
|
|
|
/* x0 : stack pointer base address */
|
|
func rcar_pwrc_save_generic_timer
|
|
|
|
stp x9, x10, [x0, #OFFSET_SP_X9_X10]
|
|
|
|
/* save CNTFID0 and cntpct_el0 */
|
|
mov_imm x10, (RCAR_CNTC_BASE + CNTFID_OFF)
|
|
ldr x9, [x10]
|
|
mrs x10, cntpct_el0
|
|
stp x9, x10, [x0, #OFFSET_CNTFID0]
|
|
|
|
ldp x9, x10, [x0, #OFFSET_SP_X9_X10]
|
|
|
|
ret
|
|
endfunc rcar_pwrc_save_generic_timer
|
|
|
|
/* x0 : Stack pointer base address */
|
|
func rcar_pwrc_restore_generic_timer
|
|
|
|
stp x9, x10, [x0, #OFFSET_SP_X9_X10]
|
|
|
|
/* restore CNTFID0 and cntpct_el0 */
|
|
ldr x10, [x0, #OFFSET_CNTFID0]
|
|
mov_imm x9, (RCAR_CNTC_BASE + CNTFID_OFF)
|
|
str x10, [x9]
|
|
ldp x9, x10, [x0, #OFFSET_CNTPCT_EL0]
|
|
add x9, x9, x10
|
|
str x9, [x0, #OFFSET_TIMER_COUNT]
|
|
|
|
ldp x9, x10, [x0, #OFFSET_SP_X9_X10]
|
|
|
|
ret
|
|
endfunc rcar_pwrc_restore_generic_timer
|