u-boot/arch/arm/mach-rockchip/save_boot_param.S
Philipp Tomsich 36979c7e56 rockchip: back-to-bootrom: add 'back-to-bootrom' support for AArch64
The back-to-bootrom support for Rockchip is equivalent to an
(assembly) implementation of setjmp/longjmp (i.e. it saves the
stack-pointer, link-register and callee-saved registers). Up until
now, this had only been implemented for AArch32 (i.e. ARMv7 or older),
which puts the new ARMv8 devices (which boot in AArch64 mode) at a
slight disadvantage.

To allow use of the 'back-to-bootrom' feature on new devices (e.g. the
RK3368), this commit adds an implementation for AArch64.

Signed-off-by: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
2017-08-13 17:12:19 +02:00

70 lines
1.3 KiB
ArmAsm

/*
* (C) Copyright 2016 Rockchip Electronics Co., Ltd
* (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <linux/linkage.h>
#if defined(CONFIG_ARM64)
.globl SAVE_SP_ADDR
SAVE_SP_ADDR:
.quad 0
ENTRY(save_boot_params)
sub sp, sp, #0x60
stp x29, x30, [sp, #0x50]
stp x27, x28, [sp, #0x40]
stp x25, x26, [sp, #0x30]
stp x23, x24, [sp, #0x20]
stp x21, x22, [sp, #0x10]
stp x19, x20, [sp, #0]
ldr x8, =SAVE_SP_ADDR
mov x9, sp
str x9, [x8]
b save_boot_params_ret /* back to my caller */
ENDPROC(save_boot_params)
.globl _back_to_bootrom_s
ENTRY(_back_to_bootrom_s)
ldr x0, =SAVE_SP_ADDR
ldr x0, [x0]
mov sp, x0
ldp x29, x30, [sp, #0x50]
ldp x27, x28, [sp, #0x40]
ldp x25, x26, [sp, #0x30]
ldp x23, x24, [sp, #0x20]
ldp x21, x22, [sp, #0x10]
ldp x19, x20, [sp]
add sp, sp, #0x60
mov x0, xzr
ret
ENDPROC(_back_to_bootrom_s)
#else
.globl SAVE_SP_ADDR
SAVE_SP_ADDR:
.word 0
/*
* void save_boot_params
*
* Save sp, lr, r1~r12
*/
ENTRY(save_boot_params)
push {r1-r12, lr}
ldr r0, =SAVE_SP_ADDR
str sp, [r0]
b save_boot_params_ret @ back to my caller
ENDPROC(save_boot_params)
.globl _back_to_bootrom_s
ENTRY(_back_to_bootrom_s)
ldr r0, =SAVE_SP_ADDR
ldr sp, [r0]
mov r0, #0
pop {r1-r12, pc}
ENDPROC(_back_to_bootrom_s)
#endif