19ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta/*
29ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
39ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
49ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Redistribution and use in source and binary forms, with or without
59ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * modification, are permitted provided that the following conditions are met:
69ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
79ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Redistributions of source code must retain the above copyright notice, this
89ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * list of conditions and the following disclaimer.
99ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
109ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Redistributions in binary form must reproduce the above copyright notice,
119ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * this list of conditions and the following disclaimer in the documentation
129ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * and/or other materials provided with the distribution.
139ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
149ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Neither the name of ARM nor the names of its contributors may be used
159ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * to endorse or promote products derived from this software without specific
169ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * prior written permission.
179ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
189ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
199ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
209ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
219ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
229ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
239ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
249ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
259ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
269ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
279ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
289ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * POSSIBILITY OF SUCH DAMAGE.
299ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta */
309ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
3197043ac98e13a726dbf8b3b41654dca759e3da2cDan Handley#include <arch.h>
320a30cf54af7bb1f77b405062b1d5b44e809d0290Andrew Thoelke#include <asm_macros.S>
3397043ac98e13a726dbf8b3b41654dca759e3da2cDan Handley#include <context.h>
349ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
359ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta/* -----------------------------------------------------
369ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * The following function strictly follows the AArch64
379ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * PCS to use x9-x17 (temporary caller-saved registers)
389ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * to save EL1 system register context. It assumes that
399ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * 'x0' is pointing to a 'el1_sys_regs' structure where
409ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * the register context will be saved.
419ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * -----------------------------------------------------
429ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta */
439ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	.global el1_sysregs_context_save
440a30cf54af7bb1f77b405062b1d5b44e809d0290Andrew Thoelkefunc el1_sysregs_context_save
459ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
469ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x9, spsr_el1
479ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x10, elr_el1
489ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x9, x10, [x0, #CTX_SPSR_EL1]
499ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
509ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x11, spsr_abt
519ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x12, spsr_und
529ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x11, x12, [x0, #CTX_SPSR_ABT]
539ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
549ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x13, spsr_irq
559ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x14, spsr_fiq
569ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x13, x14, [x0, #CTX_SPSR_IRQ]
579ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
589ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x15, sctlr_el1
599ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x16, actlr_el1
609ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x15, x16, [x0, #CTX_SCTLR_EL1]
619ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
629ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x17, cpacr_el1
639ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x9, csselr_el1
649ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x17, x9, [x0, #CTX_CPACR_EL1]
659ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
669ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x10, sp_el1
679ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x11, esr_el1
689ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x10, x11, [x0, #CTX_SP_EL1]
699ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
709ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x12, ttbr0_el1
719ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x13, ttbr1_el1
729ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x12, x13, [x0, #CTX_TTBR0_EL1]
739ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
749ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x14, mair_el1
759ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x15, amair_el1
769ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x14, x15, [x0, #CTX_MAIR_EL1]
779ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
789ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x16, tcr_el1
799ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x17, tpidr_el1
809ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x16, x17, [x0, #CTX_TCR_EL1]
819ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
829ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x9, tpidr_el0
839ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x10, tpidrro_el0
849ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x9, x10, [x0, #CTX_TPIDR_EL0]
859ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
869ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x11, dacr32_el2
879ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x12, ifsr32_el2
889ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x11, x12, [x0, #CTX_DACR32_EL2]
899ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
909ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x13, par_el1
919ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x14, far_el1
929ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x13, x14, [x0, #CTX_PAR_EL1]
939ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
949ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x15, afsr0_el1
959ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x16, afsr1_el1
969ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x15, x16, [x0, #CTX_AFSR0_EL1]
979ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
989ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x17, contextidr_el1
999ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x9, vbar_el1
1009ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x17, x9, [x0, #CTX_CONTEXTIDR_EL1]
1019ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1022da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	/* Save NS timer registers if the build has instructed so */
1032da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan#if NS_TIMER_SWITCH
1049ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x10, cntp_ctl_el0
1059ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x11, cntp_cval_el0
1069ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x10, x11, [x0, #CTX_CNTP_CTL_EL0]
1079ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1089ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x12, cntv_ctl_el0
1099ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x13, cntv_cval_el0
1109ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	x12, x13, [x0, #CTX_CNTV_CTL_EL0]
1119ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1129ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x14, cntkctl_el1
1132da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	str	x14, [x0, #CTX_CNTKCTL_EL1]
1142da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan#endif
1152da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan
1169ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x15, fpexc32_el2
1172da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	str	x15, [x0, #CTX_FP_FPEXC32_EL2]
1189ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1199ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ret
1209ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1219ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta/* -----------------------------------------------------
1229ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * The following function strictly follows the AArch64
1239ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * PCS to use x9-x17 (temporary caller-saved registers)
1249ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * to restore EL1 system register context.  It assumes
1259ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * that 'x0' is pointing to a 'el1_sys_regs' structure
1269ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * from where the register context will be restored
1279ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * -----------------------------------------------------
1289ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta */
1299ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	.global el1_sysregs_context_restore
1300a30cf54af7bb1f77b405062b1d5b44e809d0290Andrew Thoelkefunc el1_sysregs_context_restore
1319ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1329ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x9, x10, [x0, #CTX_SPSR_EL1]
1339ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	spsr_el1, x9
1349ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	elr_el1, x10
1359ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1369ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x11, x12, [x0, #CTX_SPSR_ABT]
1379ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	spsr_abt, x11
1389ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	spsr_und, x12
1399ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1409ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x13, x14, [x0, #CTX_SPSR_IRQ]
1419ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	spsr_irq, x13
1429ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	spsr_fiq, x14
1439ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1449ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x15, x16, [x0, #CTX_SCTLR_EL1]
1459ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	sctlr_el1, x15
1469ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	actlr_el1, x16
1479ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1489ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x17, x9, [x0, #CTX_CPACR_EL1]
1499ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cpacr_el1, x17
1509ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	csselr_el1, x9
1519ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1529ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x10, x11, [x0, #CTX_SP_EL1]
1539ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	sp_el1, x10
1549ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	esr_el1, x11
1559ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1569ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x12, x13, [x0, #CTX_TTBR0_EL1]
1579ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	ttbr0_el1, x12
1589ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	ttbr1_el1, x13
1599ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1609ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x14, x15, [x0, #CTX_MAIR_EL1]
1619ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	mair_el1, x14
1629ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	amair_el1, x15
1639ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1649ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x16, x17, [x0, #CTX_TCR_EL1]
1659ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	tcr_el1, x16
1669ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	tpidr_el1, x17
1679ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1689ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x9, x10, [x0, #CTX_TPIDR_EL0]
1699ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	tpidr_el0, x9
1709ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	tpidrro_el0, x10
1719ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1729ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x11, x12, [x0, #CTX_DACR32_EL2]
1739ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	dacr32_el2, x11
1749ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	ifsr32_el2, x12
1759ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1769ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x13, x14, [x0, #CTX_PAR_EL1]
1779ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	par_el1, x13
1789ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	far_el1, x14
1799ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1809ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x15, x16, [x0, #CTX_AFSR0_EL1]
1819ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	afsr0_el1, x15
1829ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	afsr1_el1, x16
1839ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1849ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x17, x9, [x0, #CTX_CONTEXTIDR_EL1]
1859ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	contextidr_el1, x17
1869ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	vbar_el1, x9
1879ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1882da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	/* Restore NS timer registers if the build has instructed so */
1892da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan#if NS_TIMER_SWITCH
1909ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x10, x11, [x0, #CTX_CNTP_CTL_EL0]
1919ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cntp_ctl_el0, x10
1929ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cntp_cval_el0, x11
1939ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1949ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	x12, x13, [x0, #CTX_CNTV_CTL_EL0]
1959ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cntv_ctl_el0, x12
1969ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cntv_cval_el0, x13
1979ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
1982da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	ldr	x14, [x0, #CTX_CNTKCTL_EL1]
1999ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	cntkctl_el1, x14
2002da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan#endif
2012da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan
2022da8d8bfc0877b9c723514133554dfee4c0638f1Jeenu Viswambharan	ldr	x15, [x0, #CTX_FP_FPEXC32_EL2]
2039ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	fpexc32_el2, x15
2049ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2059ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	/* No explict ISB required here as ERET covers it */
2069ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2079ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ret
2089ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2099ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta/* -----------------------------------------------------
21044804252881c11668e0af9b7803a0667922c93ebSandrine Bailleux * The following function follows the aapcs_64 strictly
2119ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * to use x9-x17 (temporary caller-saved registers
2129ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * according to AArch64 PCS) to save floating point
2139ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * register context. It assumes that 'x0' is pointing to
2149ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * a 'fp_regs' structure where the register context will
2159ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * be saved.
2169ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
2179ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Access to VFP registers will trap if CPTR_EL3.TFP is
2189ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * set.  However currently we don't use VFP registers
2199ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * nor set traps in Trusted Firmware, and assume it's
2209ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * cleared
2219ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
2229ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * TODO: Revisit when VFP is used in secure world
2239ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * -----------------------------------------------------
2249ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta */
2250f21c547fe7693d9759616dbdc747fe3cca79a70Juan Castillo#if CTX_INCLUDE_FPREGS
2269ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	.global fpregs_context_save
2270a30cf54af7bb1f77b405062b1d5b44e809d0290Andrew Thoelkefunc fpregs_context_save
2289ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q0, q1, [x0, #CTX_FP_Q0]
2299ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q2, q3, [x0, #CTX_FP_Q2]
2309ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q4, q5, [x0, #CTX_FP_Q4]
2319ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q6, q7, [x0, #CTX_FP_Q6]
2329ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q8, q9, [x0, #CTX_FP_Q8]
2339ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q10, q11, [x0, #CTX_FP_Q10]
2349ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q12, q13, [x0, #CTX_FP_Q12]
2359ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q14, q15, [x0, #CTX_FP_Q14]
2369ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q16, q17, [x0, #CTX_FP_Q16]
2379ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q18, q19, [x0, #CTX_FP_Q18]
2389ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q20, q21, [x0, #CTX_FP_Q20]
2399ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q22, q23, [x0, #CTX_FP_Q22]
2409ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q24, q25, [x0, #CTX_FP_Q24]
2419ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q26, q27, [x0, #CTX_FP_Q26]
2429ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q28, q29, [x0, #CTX_FP_Q28]
2439ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	stp	q30, q31, [x0, #CTX_FP_Q30]
2449ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2459ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x9, fpsr
2469ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	str	x9, [x0, #CTX_FP_FPSR]
2479ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2489ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	mrs	x10, fpcr
2499ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	str	x10, [x0, #CTX_FP_FPCR]
2509ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2519ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ret
2529ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2539ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta/* -----------------------------------------------------
2549ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * The following function follows the aapcs_64 strictly
2559ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * to use x9-x17 (temporary caller-saved registers
2569ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * according to AArch64 PCS) to restore floating point
2579ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * register context. It assumes that 'x0' is pointing to
2589ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * a 'fp_regs' structure from where the register context
2599ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * will be restored.
2609ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
2619ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * Access to VFP registers will trap if CPTR_EL3.TFP is
2629ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * set.  However currently we don't use VFP registers
2639ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * nor set traps in Trusted Firmware, and assume it's
2649ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * cleared
2659ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta *
2669ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * TODO: Revisit when VFP is used in secure world
2679ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta * -----------------------------------------------------
2689ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta */
2699ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	.global fpregs_context_restore
2700a30cf54af7bb1f77b405062b1d5b44e809d0290Andrew Thoelkefunc fpregs_context_restore
2719ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q0, q1, [x0, #CTX_FP_Q0]
2729ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q2, q3, [x0, #CTX_FP_Q2]
2739ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q4, q5, [x0, #CTX_FP_Q4]
2749ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q6, q7, [x0, #CTX_FP_Q6]
2759ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q8, q9, [x0, #CTX_FP_Q8]
2769ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q10, q11, [x0, #CTX_FP_Q10]
2779ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q12, q13, [x0, #CTX_FP_Q12]
2789ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q14, q15, [x0, #CTX_FP_Q14]
2799ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q16, q17, [x0, #CTX_FP_Q16]
2809ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q18, q19, [x0, #CTX_FP_Q18]
2819ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q20, q21, [x0, #CTX_FP_Q20]
2829ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q22, q23, [x0, #CTX_FP_Q22]
2839ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q24, q25, [x0, #CTX_FP_Q24]
2849ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q26, q27, [x0, #CTX_FP_Q26]
2859ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q28, q29, [x0, #CTX_FP_Q28]
2869ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldp	q30, q31, [x0, #CTX_FP_Q30]
2879ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2889ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ldr	x9, [x0, #CTX_FP_FPSR]
2899ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	fpsr, x9
2909ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2919ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	str	x10, [x0, #CTX_FP_FPCR]
2929ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	msr	fpcr, x10
2939ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
2949ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	/*
2959ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	 * No explict ISB required here as ERET to
2969ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	 * swtich to secure EL1 or non-secure world
2979ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	 * covers it
2989ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	 */
2999ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta
3009ac63c59c4b6de7e48a6702ad799dc961a4fd6deAchin Gupta	ret
3010f21c547fe7693d9759616dbdc747fe3cca79a70Juan Castillo#endif /* CTX_INCLUDE_FPREGS */
302