1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park#include <arch.h> 8*54fd6939SJiyong Park#include <asm_macros.S> 9*54fd6939SJiyong Park#include <assert_macros.S> 10*54fd6939SJiyong Park#include <context.h> 11*54fd6939SJiyong Park#include <el3_common_macros.S> 12*54fd6939SJiyong Park 13*54fd6939SJiyong Park#if CTX_INCLUDE_EL2_REGS 14*54fd6939SJiyong Park .global el2_sysregs_context_save 15*54fd6939SJiyong Park .global el2_sysregs_context_restore 16*54fd6939SJiyong Park#endif 17*54fd6939SJiyong Park 18*54fd6939SJiyong Park .global el1_sysregs_context_save 19*54fd6939SJiyong Park .global el1_sysregs_context_restore 20*54fd6939SJiyong Park#if CTX_INCLUDE_FPREGS 21*54fd6939SJiyong Park .global fpregs_context_save 22*54fd6939SJiyong Park .global fpregs_context_restore 23*54fd6939SJiyong Park#endif 24*54fd6939SJiyong Park .global save_gp_pmcr_pauth_regs 25*54fd6939SJiyong Park .global restore_gp_pmcr_pauth_regs 26*54fd6939SJiyong Park .global save_and_update_ptw_el1_sys_regs 27*54fd6939SJiyong Park .global el3_exit 28*54fd6939SJiyong Park 29*54fd6939SJiyong Park#if CTX_INCLUDE_EL2_REGS 30*54fd6939SJiyong Park 31*54fd6939SJiyong Park/* ----------------------------------------------------- 32*54fd6939SJiyong Park * The following function strictly follows the AArch64 33*54fd6939SJiyong Park * PCS to use x9-x16 (temporary caller-saved registers) 34*54fd6939SJiyong Park * to save EL2 system register context. It assumes that 35*54fd6939SJiyong Park * 'x0' is pointing to a 'el2_sys_regs' structure where 36*54fd6939SJiyong Park * the register context will be saved. 37*54fd6939SJiyong Park * 38*54fd6939SJiyong Park * The following registers are not added. 39*54fd6939SJiyong Park * AMEVCNTVOFF0<n>_EL2 40*54fd6939SJiyong Park * AMEVCNTVOFF1<n>_EL2 41*54fd6939SJiyong Park * ICH_AP0R<n>_EL2 42*54fd6939SJiyong Park * ICH_AP1R<n>_EL2 43*54fd6939SJiyong Park * ICH_LR<n>_EL2 44*54fd6939SJiyong Park * ----------------------------------------------------- 45*54fd6939SJiyong Park */ 46*54fd6939SJiyong Parkfunc el2_sysregs_context_save 47*54fd6939SJiyong Park mrs x9, actlr_el2 48*54fd6939SJiyong Park mrs x10, afsr0_el2 49*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_ACTLR_EL2] 50*54fd6939SJiyong Park 51*54fd6939SJiyong Park mrs x11, afsr1_el2 52*54fd6939SJiyong Park mrs x12, amair_el2 53*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_AFSR1_EL2] 54*54fd6939SJiyong Park 55*54fd6939SJiyong Park mrs x13, cnthctl_el2 56*54fd6939SJiyong Park mrs x14, cntvoff_el2 57*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_CNTHCTL_EL2] 58*54fd6939SJiyong Park 59*54fd6939SJiyong Park mrs x15, cptr_el2 60*54fd6939SJiyong Park str x15, [x0, #CTX_CPTR_EL2] 61*54fd6939SJiyong Park 62*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 63*54fd6939SJiyong Park mrs x16, dbgvcr32_el2 64*54fd6939SJiyong Park str x16, [x0, #CTX_DBGVCR32_EL2] 65*54fd6939SJiyong Park#endif 66*54fd6939SJiyong Park 67*54fd6939SJiyong Park mrs x9, elr_el2 68*54fd6939SJiyong Park mrs x10, esr_el2 69*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_ELR_EL2] 70*54fd6939SJiyong Park 71*54fd6939SJiyong Park mrs x11, far_el2 72*54fd6939SJiyong Park mrs x12, hacr_el2 73*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_FAR_EL2] 74*54fd6939SJiyong Park 75*54fd6939SJiyong Park mrs x13, hcr_el2 76*54fd6939SJiyong Park mrs x14, hpfar_el2 77*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_HCR_EL2] 78*54fd6939SJiyong Park 79*54fd6939SJiyong Park mrs x15, hstr_el2 80*54fd6939SJiyong Park mrs x16, ICC_SRE_EL2 81*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_HSTR_EL2] 82*54fd6939SJiyong Park 83*54fd6939SJiyong Park mrs x9, ICH_HCR_EL2 84*54fd6939SJiyong Park mrs x10, ICH_VMCR_EL2 85*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_ICH_HCR_EL2] 86*54fd6939SJiyong Park 87*54fd6939SJiyong Park mrs x11, mair_el2 88*54fd6939SJiyong Park mrs x12, mdcr_el2 89*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_MAIR_EL2] 90*54fd6939SJiyong Park 91*54fd6939SJiyong Park#if ENABLE_SPE_FOR_LOWER_ELS 92*54fd6939SJiyong Park mrs x13, PMSCR_EL2 93*54fd6939SJiyong Park str x13, [x0, #CTX_PMSCR_EL2] 94*54fd6939SJiyong Park#endif 95*54fd6939SJiyong Park mrs x14, sctlr_el2 96*54fd6939SJiyong Park str x14, [x0, #CTX_SCTLR_EL2] 97*54fd6939SJiyong Park 98*54fd6939SJiyong Park mrs x15, spsr_el2 99*54fd6939SJiyong Park mrs x16, sp_el2 100*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_SPSR_EL2] 101*54fd6939SJiyong Park 102*54fd6939SJiyong Park mrs x9, tcr_el2 103*54fd6939SJiyong Park mrs x10, tpidr_el2 104*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_TCR_EL2] 105*54fd6939SJiyong Park 106*54fd6939SJiyong Park mrs x11, ttbr0_el2 107*54fd6939SJiyong Park mrs x12, vbar_el2 108*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_TTBR0_EL2] 109*54fd6939SJiyong Park 110*54fd6939SJiyong Park mrs x13, vmpidr_el2 111*54fd6939SJiyong Park mrs x14, vpidr_el2 112*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_VMPIDR_EL2] 113*54fd6939SJiyong Park 114*54fd6939SJiyong Park mrs x15, vtcr_el2 115*54fd6939SJiyong Park mrs x16, vttbr_el2 116*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_VTCR_EL2] 117*54fd6939SJiyong Park 118*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS 119*54fd6939SJiyong Park mrs x9, TFSR_EL2 120*54fd6939SJiyong Park str x9, [x0, #CTX_TFSR_EL2] 121*54fd6939SJiyong Park#endif 122*54fd6939SJiyong Park 123*54fd6939SJiyong Park#if ENABLE_MPAM_FOR_LOWER_ELS 124*54fd6939SJiyong Park mrs x10, MPAM2_EL2 125*54fd6939SJiyong Park str x10, [x0, #CTX_MPAM2_EL2] 126*54fd6939SJiyong Park 127*54fd6939SJiyong Park mrs x11, MPAMHCR_EL2 128*54fd6939SJiyong Park mrs x12, MPAMVPM0_EL2 129*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_MPAMHCR_EL2] 130*54fd6939SJiyong Park 131*54fd6939SJiyong Park mrs x13, MPAMVPM1_EL2 132*54fd6939SJiyong Park mrs x14, MPAMVPM2_EL2 133*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_MPAMVPM1_EL2] 134*54fd6939SJiyong Park 135*54fd6939SJiyong Park mrs x15, MPAMVPM3_EL2 136*54fd6939SJiyong Park mrs x16, MPAMVPM4_EL2 137*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_MPAMVPM3_EL2] 138*54fd6939SJiyong Park 139*54fd6939SJiyong Park mrs x9, MPAMVPM5_EL2 140*54fd6939SJiyong Park mrs x10, MPAMVPM6_EL2 141*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_MPAMVPM5_EL2] 142*54fd6939SJiyong Park 143*54fd6939SJiyong Park mrs x11, MPAMVPM7_EL2 144*54fd6939SJiyong Park mrs x12, MPAMVPMV_EL2 145*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_MPAMVPM7_EL2] 146*54fd6939SJiyong Park#endif 147*54fd6939SJiyong Park 148*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 6) 149*54fd6939SJiyong Park mrs x13, HAFGRTR_EL2 150*54fd6939SJiyong Park mrs x14, HDFGRTR_EL2 151*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_HAFGRTR_EL2] 152*54fd6939SJiyong Park 153*54fd6939SJiyong Park mrs x15, HDFGWTR_EL2 154*54fd6939SJiyong Park mrs x16, HFGITR_EL2 155*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_HDFGWTR_EL2] 156*54fd6939SJiyong Park 157*54fd6939SJiyong Park mrs x9, HFGRTR_EL2 158*54fd6939SJiyong Park mrs x10, HFGWTR_EL2 159*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_HFGRTR_EL2] 160*54fd6939SJiyong Park 161*54fd6939SJiyong Park mrs x11, CNTPOFF_EL2 162*54fd6939SJiyong Park str x11, [x0, #CTX_CNTPOFF_EL2] 163*54fd6939SJiyong Park#endif 164*54fd6939SJiyong Park 165*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 4) 166*54fd6939SJiyong Park mrs x12, contextidr_el2 167*54fd6939SJiyong Park str x12, [x0, #CTX_CONTEXTIDR_EL2] 168*54fd6939SJiyong Park 169*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 170*54fd6939SJiyong Park mrs x13, sder32_el2 171*54fd6939SJiyong Park str x13, [x0, #CTX_SDER32_EL2] 172*54fd6939SJiyong Park#endif 173*54fd6939SJiyong Park mrs x14, ttbr1_el2 174*54fd6939SJiyong Park mrs x15, vdisr_el2 175*54fd6939SJiyong Park stp x14, x15, [x0, #CTX_TTBR1_EL2] 176*54fd6939SJiyong Park 177*54fd6939SJiyong Park#if CTX_INCLUDE_NEVE_REGS 178*54fd6939SJiyong Park mrs x16, vncr_el2 179*54fd6939SJiyong Park str x16, [x0, #CTX_VNCR_EL2] 180*54fd6939SJiyong Park#endif 181*54fd6939SJiyong Park 182*54fd6939SJiyong Park mrs x9, vsesr_el2 183*54fd6939SJiyong Park mrs x10, vstcr_el2 184*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_VSESR_EL2] 185*54fd6939SJiyong Park 186*54fd6939SJiyong Park mrs x11, vsttbr_el2 187*54fd6939SJiyong Park mrs x12, TRFCR_EL2 188*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_VSTTBR_EL2] 189*54fd6939SJiyong Park#endif 190*54fd6939SJiyong Park 191*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 5) 192*54fd6939SJiyong Park mrs x13, scxtnum_el2 193*54fd6939SJiyong Park str x13, [x0, #CTX_SCXTNUM_EL2] 194*54fd6939SJiyong Park#endif 195*54fd6939SJiyong Park 196*54fd6939SJiyong Park#if ENABLE_FEAT_HCX 197*54fd6939SJiyong Park mrs x14, hcrx_el2 198*54fd6939SJiyong Park str x14, [x0, #CTX_HCRX_EL2] 199*54fd6939SJiyong Park#endif 200*54fd6939SJiyong Park 201*54fd6939SJiyong Park ret 202*54fd6939SJiyong Parkendfunc el2_sysregs_context_save 203*54fd6939SJiyong Park 204*54fd6939SJiyong Park 205*54fd6939SJiyong Park/* ----------------------------------------------------- 206*54fd6939SJiyong Park * The following function strictly follows the AArch64 207*54fd6939SJiyong Park * PCS to use x9-x16 (temporary caller-saved registers) 208*54fd6939SJiyong Park * to restore EL2 system register context. It assumes 209*54fd6939SJiyong Park * that 'x0' is pointing to a 'el2_sys_regs' structure 210*54fd6939SJiyong Park * from where the register context will be restored 211*54fd6939SJiyong Park 212*54fd6939SJiyong Park * The following registers are not restored 213*54fd6939SJiyong Park * AMEVCNTVOFF0<n>_EL2 214*54fd6939SJiyong Park * AMEVCNTVOFF1<n>_EL2 215*54fd6939SJiyong Park * ICH_AP0R<n>_EL2 216*54fd6939SJiyong Park * ICH_AP1R<n>_EL2 217*54fd6939SJiyong Park * ICH_LR<n>_EL2 218*54fd6939SJiyong Park * ----------------------------------------------------- 219*54fd6939SJiyong Park */ 220*54fd6939SJiyong Parkfunc el2_sysregs_context_restore 221*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_ACTLR_EL2] 222*54fd6939SJiyong Park msr actlr_el2, x9 223*54fd6939SJiyong Park msr afsr0_el2, x10 224*54fd6939SJiyong Park 225*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_AFSR1_EL2] 226*54fd6939SJiyong Park msr afsr1_el2, x11 227*54fd6939SJiyong Park msr amair_el2, x12 228*54fd6939SJiyong Park 229*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_CNTHCTL_EL2] 230*54fd6939SJiyong Park msr cnthctl_el2, x13 231*54fd6939SJiyong Park msr cntvoff_el2, x14 232*54fd6939SJiyong Park 233*54fd6939SJiyong Park ldr x15, [x0, #CTX_CPTR_EL2] 234*54fd6939SJiyong Park msr cptr_el2, x15 235*54fd6939SJiyong Park 236*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 237*54fd6939SJiyong Park ldr x16, [x0, #CTX_DBGVCR32_EL2] 238*54fd6939SJiyong Park msr dbgvcr32_el2, x16 239*54fd6939SJiyong Park#endif 240*54fd6939SJiyong Park 241*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_ELR_EL2] 242*54fd6939SJiyong Park msr elr_el2, x9 243*54fd6939SJiyong Park msr esr_el2, x10 244*54fd6939SJiyong Park 245*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_FAR_EL2] 246*54fd6939SJiyong Park msr far_el2, x11 247*54fd6939SJiyong Park msr hacr_el2, x12 248*54fd6939SJiyong Park 249*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_HCR_EL2] 250*54fd6939SJiyong Park msr hcr_el2, x13 251*54fd6939SJiyong Park msr hpfar_el2, x14 252*54fd6939SJiyong Park 253*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_HSTR_EL2] 254*54fd6939SJiyong Park msr hstr_el2, x15 255*54fd6939SJiyong Park msr ICC_SRE_EL2, x16 256*54fd6939SJiyong Park 257*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_ICH_HCR_EL2] 258*54fd6939SJiyong Park msr ICH_HCR_EL2, x9 259*54fd6939SJiyong Park msr ICH_VMCR_EL2, x10 260*54fd6939SJiyong Park 261*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_MAIR_EL2] 262*54fd6939SJiyong Park msr mair_el2, x11 263*54fd6939SJiyong Park msr mdcr_el2, x12 264*54fd6939SJiyong Park 265*54fd6939SJiyong Park#if ENABLE_SPE_FOR_LOWER_ELS 266*54fd6939SJiyong Park ldr x13, [x0, #CTX_PMSCR_EL2] 267*54fd6939SJiyong Park msr PMSCR_EL2, x13 268*54fd6939SJiyong Park#endif 269*54fd6939SJiyong Park ldr x14, [x0, #CTX_SCTLR_EL2] 270*54fd6939SJiyong Park msr sctlr_el2, x14 271*54fd6939SJiyong Park 272*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_SPSR_EL2] 273*54fd6939SJiyong Park msr spsr_el2, x15 274*54fd6939SJiyong Park msr sp_el2, x16 275*54fd6939SJiyong Park 276*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_TCR_EL2] 277*54fd6939SJiyong Park msr tcr_el2, x9 278*54fd6939SJiyong Park msr tpidr_el2, x10 279*54fd6939SJiyong Park 280*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_TTBR0_EL2] 281*54fd6939SJiyong Park msr ttbr0_el2, x11 282*54fd6939SJiyong Park msr vbar_el2, x12 283*54fd6939SJiyong Park 284*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_VMPIDR_EL2] 285*54fd6939SJiyong Park msr vmpidr_el2, x13 286*54fd6939SJiyong Park msr vpidr_el2, x14 287*54fd6939SJiyong Park 288*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_VTCR_EL2] 289*54fd6939SJiyong Park msr vtcr_el2, x15 290*54fd6939SJiyong Park msr vttbr_el2, x16 291*54fd6939SJiyong Park 292*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS 293*54fd6939SJiyong Park ldr x9, [x0, #CTX_TFSR_EL2] 294*54fd6939SJiyong Park msr TFSR_EL2, x9 295*54fd6939SJiyong Park#endif 296*54fd6939SJiyong Park 297*54fd6939SJiyong Park#if ENABLE_MPAM_FOR_LOWER_ELS 298*54fd6939SJiyong Park ldr x10, [x0, #CTX_MPAM2_EL2] 299*54fd6939SJiyong Park msr MPAM2_EL2, x10 300*54fd6939SJiyong Park 301*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_MPAMHCR_EL2] 302*54fd6939SJiyong Park msr MPAMHCR_EL2, x11 303*54fd6939SJiyong Park msr MPAMVPM0_EL2, x12 304*54fd6939SJiyong Park 305*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_MPAMVPM1_EL2] 306*54fd6939SJiyong Park msr MPAMVPM1_EL2, x13 307*54fd6939SJiyong Park msr MPAMVPM2_EL2, x14 308*54fd6939SJiyong Park 309*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_MPAMVPM3_EL2] 310*54fd6939SJiyong Park msr MPAMVPM3_EL2, x15 311*54fd6939SJiyong Park msr MPAMVPM4_EL2, x16 312*54fd6939SJiyong Park 313*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_MPAMVPM5_EL2] 314*54fd6939SJiyong Park msr MPAMVPM5_EL2, x9 315*54fd6939SJiyong Park msr MPAMVPM6_EL2, x10 316*54fd6939SJiyong Park 317*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_MPAMVPM7_EL2] 318*54fd6939SJiyong Park msr MPAMVPM7_EL2, x11 319*54fd6939SJiyong Park msr MPAMVPMV_EL2, x12 320*54fd6939SJiyong Park#endif 321*54fd6939SJiyong Park 322*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 6) 323*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_HAFGRTR_EL2] 324*54fd6939SJiyong Park msr HAFGRTR_EL2, x13 325*54fd6939SJiyong Park msr HDFGRTR_EL2, x14 326*54fd6939SJiyong Park 327*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_HDFGWTR_EL2] 328*54fd6939SJiyong Park msr HDFGWTR_EL2, x15 329*54fd6939SJiyong Park msr HFGITR_EL2, x16 330*54fd6939SJiyong Park 331*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_HFGRTR_EL2] 332*54fd6939SJiyong Park msr HFGRTR_EL2, x9 333*54fd6939SJiyong Park msr HFGWTR_EL2, x10 334*54fd6939SJiyong Park 335*54fd6939SJiyong Park ldr x11, [x0, #CTX_CNTPOFF_EL2] 336*54fd6939SJiyong Park msr CNTPOFF_EL2, x11 337*54fd6939SJiyong Park#endif 338*54fd6939SJiyong Park 339*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 4) 340*54fd6939SJiyong Park ldr x12, [x0, #CTX_CONTEXTIDR_EL2] 341*54fd6939SJiyong Park msr contextidr_el2, x12 342*54fd6939SJiyong Park 343*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 344*54fd6939SJiyong Park ldr x13, [x0, #CTX_SDER32_EL2] 345*54fd6939SJiyong Park msr sder32_el2, x13 346*54fd6939SJiyong Park#endif 347*54fd6939SJiyong Park ldp x14, x15, [x0, #CTX_TTBR1_EL2] 348*54fd6939SJiyong Park msr ttbr1_el2, x14 349*54fd6939SJiyong Park msr vdisr_el2, x15 350*54fd6939SJiyong Park 351*54fd6939SJiyong Park#if CTX_INCLUDE_NEVE_REGS 352*54fd6939SJiyong Park ldr x16, [x0, #CTX_VNCR_EL2] 353*54fd6939SJiyong Park msr vncr_el2, x16 354*54fd6939SJiyong Park#endif 355*54fd6939SJiyong Park 356*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_VSESR_EL2] 357*54fd6939SJiyong Park msr vsesr_el2, x9 358*54fd6939SJiyong Park msr vstcr_el2, x10 359*54fd6939SJiyong Park 360*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_VSTTBR_EL2] 361*54fd6939SJiyong Park msr vsttbr_el2, x11 362*54fd6939SJiyong Park msr TRFCR_EL2, x12 363*54fd6939SJiyong Park#endif 364*54fd6939SJiyong Park 365*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 5) 366*54fd6939SJiyong Park ldr x13, [x0, #CTX_SCXTNUM_EL2] 367*54fd6939SJiyong Park msr scxtnum_el2, x13 368*54fd6939SJiyong Park#endif 369*54fd6939SJiyong Park 370*54fd6939SJiyong Park#if ENABLE_FEAT_HCX 371*54fd6939SJiyong Park ldr x14, [x0, #CTX_HCRX_EL2] 372*54fd6939SJiyong Park msr hcrx_el2, x14 373*54fd6939SJiyong Park#endif 374*54fd6939SJiyong Park 375*54fd6939SJiyong Park ret 376*54fd6939SJiyong Parkendfunc el2_sysregs_context_restore 377*54fd6939SJiyong Park 378*54fd6939SJiyong Park#endif /* CTX_INCLUDE_EL2_REGS */ 379*54fd6939SJiyong Park 380*54fd6939SJiyong Park/* ------------------------------------------------------------------ 381*54fd6939SJiyong Park * The following function strictly follows the AArch64 PCS to use 382*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers) to save EL1 system 383*54fd6939SJiyong Park * register context. It assumes that 'x0' is pointing to a 384*54fd6939SJiyong Park * 'el1_sys_regs' structure where the register context will be saved. 385*54fd6939SJiyong Park * ------------------------------------------------------------------ 386*54fd6939SJiyong Park */ 387*54fd6939SJiyong Parkfunc el1_sysregs_context_save 388*54fd6939SJiyong Park 389*54fd6939SJiyong Park mrs x9, spsr_el1 390*54fd6939SJiyong Park mrs x10, elr_el1 391*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_SPSR_EL1] 392*54fd6939SJiyong Park 393*54fd6939SJiyong Park#if !ERRATA_SPECULATIVE_AT 394*54fd6939SJiyong Park mrs x15, sctlr_el1 395*54fd6939SJiyong Park mrs x16, tcr_el1 396*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_SCTLR_EL1] 397*54fd6939SJiyong Park#endif 398*54fd6939SJiyong Park 399*54fd6939SJiyong Park mrs x17, cpacr_el1 400*54fd6939SJiyong Park mrs x9, csselr_el1 401*54fd6939SJiyong Park stp x17, x9, [x0, #CTX_CPACR_EL1] 402*54fd6939SJiyong Park 403*54fd6939SJiyong Park mrs x10, sp_el1 404*54fd6939SJiyong Park mrs x11, esr_el1 405*54fd6939SJiyong Park stp x10, x11, [x0, #CTX_SP_EL1] 406*54fd6939SJiyong Park 407*54fd6939SJiyong Park mrs x12, ttbr0_el1 408*54fd6939SJiyong Park mrs x13, ttbr1_el1 409*54fd6939SJiyong Park stp x12, x13, [x0, #CTX_TTBR0_EL1] 410*54fd6939SJiyong Park 411*54fd6939SJiyong Park mrs x14, mair_el1 412*54fd6939SJiyong Park mrs x15, amair_el1 413*54fd6939SJiyong Park stp x14, x15, [x0, #CTX_MAIR_EL1] 414*54fd6939SJiyong Park 415*54fd6939SJiyong Park mrs x16, actlr_el1 416*54fd6939SJiyong Park mrs x17, tpidr_el1 417*54fd6939SJiyong Park stp x16, x17, [x0, #CTX_ACTLR_EL1] 418*54fd6939SJiyong Park 419*54fd6939SJiyong Park mrs x9, tpidr_el0 420*54fd6939SJiyong Park mrs x10, tpidrro_el0 421*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_TPIDR_EL0] 422*54fd6939SJiyong Park 423*54fd6939SJiyong Park mrs x13, par_el1 424*54fd6939SJiyong Park mrs x14, far_el1 425*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_PAR_EL1] 426*54fd6939SJiyong Park 427*54fd6939SJiyong Park mrs x15, afsr0_el1 428*54fd6939SJiyong Park mrs x16, afsr1_el1 429*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_AFSR0_EL1] 430*54fd6939SJiyong Park 431*54fd6939SJiyong Park mrs x17, contextidr_el1 432*54fd6939SJiyong Park mrs x9, vbar_el1 433*54fd6939SJiyong Park stp x17, x9, [x0, #CTX_CONTEXTIDR_EL1] 434*54fd6939SJiyong Park 435*54fd6939SJiyong Park /* Save AArch32 system registers if the build has instructed so */ 436*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 437*54fd6939SJiyong Park mrs x11, spsr_abt 438*54fd6939SJiyong Park mrs x12, spsr_und 439*54fd6939SJiyong Park stp x11, x12, [x0, #CTX_SPSR_ABT] 440*54fd6939SJiyong Park 441*54fd6939SJiyong Park mrs x13, spsr_irq 442*54fd6939SJiyong Park mrs x14, spsr_fiq 443*54fd6939SJiyong Park stp x13, x14, [x0, #CTX_SPSR_IRQ] 444*54fd6939SJiyong Park 445*54fd6939SJiyong Park mrs x15, dacr32_el2 446*54fd6939SJiyong Park mrs x16, ifsr32_el2 447*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_DACR32_EL2] 448*54fd6939SJiyong Park#endif 449*54fd6939SJiyong Park 450*54fd6939SJiyong Park /* Save NS timer registers if the build has instructed so */ 451*54fd6939SJiyong Park#if NS_TIMER_SWITCH 452*54fd6939SJiyong Park mrs x10, cntp_ctl_el0 453*54fd6939SJiyong Park mrs x11, cntp_cval_el0 454*54fd6939SJiyong Park stp x10, x11, [x0, #CTX_CNTP_CTL_EL0] 455*54fd6939SJiyong Park 456*54fd6939SJiyong Park mrs x12, cntv_ctl_el0 457*54fd6939SJiyong Park mrs x13, cntv_cval_el0 458*54fd6939SJiyong Park stp x12, x13, [x0, #CTX_CNTV_CTL_EL0] 459*54fd6939SJiyong Park 460*54fd6939SJiyong Park mrs x14, cntkctl_el1 461*54fd6939SJiyong Park str x14, [x0, #CTX_CNTKCTL_EL1] 462*54fd6939SJiyong Park#endif 463*54fd6939SJiyong Park 464*54fd6939SJiyong Park /* Save MTE system registers if the build has instructed so */ 465*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS 466*54fd6939SJiyong Park mrs x15, TFSRE0_EL1 467*54fd6939SJiyong Park mrs x16, TFSR_EL1 468*54fd6939SJiyong Park stp x15, x16, [x0, #CTX_TFSRE0_EL1] 469*54fd6939SJiyong Park 470*54fd6939SJiyong Park mrs x9, RGSR_EL1 471*54fd6939SJiyong Park mrs x10, GCR_EL1 472*54fd6939SJiyong Park stp x9, x10, [x0, #CTX_RGSR_EL1] 473*54fd6939SJiyong Park#endif 474*54fd6939SJiyong Park 475*54fd6939SJiyong Park ret 476*54fd6939SJiyong Parkendfunc el1_sysregs_context_save 477*54fd6939SJiyong Park 478*54fd6939SJiyong Park/* ------------------------------------------------------------------ 479*54fd6939SJiyong Park * The following function strictly follows the AArch64 PCS to use 480*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers) to restore EL1 system 481*54fd6939SJiyong Park * register context. It assumes that 'x0' is pointing to a 482*54fd6939SJiyong Park * 'el1_sys_regs' structure from where the register context will be 483*54fd6939SJiyong Park * restored 484*54fd6939SJiyong Park * ------------------------------------------------------------------ 485*54fd6939SJiyong Park */ 486*54fd6939SJiyong Parkfunc el1_sysregs_context_restore 487*54fd6939SJiyong Park 488*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_SPSR_EL1] 489*54fd6939SJiyong Park msr spsr_el1, x9 490*54fd6939SJiyong Park msr elr_el1, x10 491*54fd6939SJiyong Park 492*54fd6939SJiyong Park#if !ERRATA_SPECULATIVE_AT 493*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_SCTLR_EL1] 494*54fd6939SJiyong Park msr sctlr_el1, x15 495*54fd6939SJiyong Park msr tcr_el1, x16 496*54fd6939SJiyong Park#endif 497*54fd6939SJiyong Park 498*54fd6939SJiyong Park ldp x17, x9, [x0, #CTX_CPACR_EL1] 499*54fd6939SJiyong Park msr cpacr_el1, x17 500*54fd6939SJiyong Park msr csselr_el1, x9 501*54fd6939SJiyong Park 502*54fd6939SJiyong Park ldp x10, x11, [x0, #CTX_SP_EL1] 503*54fd6939SJiyong Park msr sp_el1, x10 504*54fd6939SJiyong Park msr esr_el1, x11 505*54fd6939SJiyong Park 506*54fd6939SJiyong Park ldp x12, x13, [x0, #CTX_TTBR0_EL1] 507*54fd6939SJiyong Park msr ttbr0_el1, x12 508*54fd6939SJiyong Park msr ttbr1_el1, x13 509*54fd6939SJiyong Park 510*54fd6939SJiyong Park ldp x14, x15, [x0, #CTX_MAIR_EL1] 511*54fd6939SJiyong Park msr mair_el1, x14 512*54fd6939SJiyong Park msr amair_el1, x15 513*54fd6939SJiyong Park 514*54fd6939SJiyong Park ldp x16, x17, [x0, #CTX_ACTLR_EL1] 515*54fd6939SJiyong Park msr actlr_el1, x16 516*54fd6939SJiyong Park msr tpidr_el1, x17 517*54fd6939SJiyong Park 518*54fd6939SJiyong Park ldp x9, x10, [x0, #CTX_TPIDR_EL0] 519*54fd6939SJiyong Park msr tpidr_el0, x9 520*54fd6939SJiyong Park msr tpidrro_el0, x10 521*54fd6939SJiyong Park 522*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_PAR_EL1] 523*54fd6939SJiyong Park msr par_el1, x13 524*54fd6939SJiyong Park msr far_el1, x14 525*54fd6939SJiyong Park 526*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_AFSR0_EL1] 527*54fd6939SJiyong Park msr afsr0_el1, x15 528*54fd6939SJiyong Park msr afsr1_el1, x16 529*54fd6939SJiyong Park 530*54fd6939SJiyong Park ldp x17, x9, [x0, #CTX_CONTEXTIDR_EL1] 531*54fd6939SJiyong Park msr contextidr_el1, x17 532*54fd6939SJiyong Park msr vbar_el1, x9 533*54fd6939SJiyong Park 534*54fd6939SJiyong Park /* Restore AArch32 system registers if the build has instructed so */ 535*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 536*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_SPSR_ABT] 537*54fd6939SJiyong Park msr spsr_abt, x11 538*54fd6939SJiyong Park msr spsr_und, x12 539*54fd6939SJiyong Park 540*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_SPSR_IRQ] 541*54fd6939SJiyong Park msr spsr_irq, x13 542*54fd6939SJiyong Park msr spsr_fiq, x14 543*54fd6939SJiyong Park 544*54fd6939SJiyong Park ldp x15, x16, [x0, #CTX_DACR32_EL2] 545*54fd6939SJiyong Park msr dacr32_el2, x15 546*54fd6939SJiyong Park msr ifsr32_el2, x16 547*54fd6939SJiyong Park#endif 548*54fd6939SJiyong Park /* Restore NS timer registers if the build has instructed so */ 549*54fd6939SJiyong Park#if NS_TIMER_SWITCH 550*54fd6939SJiyong Park ldp x10, x11, [x0, #CTX_CNTP_CTL_EL0] 551*54fd6939SJiyong Park msr cntp_ctl_el0, x10 552*54fd6939SJiyong Park msr cntp_cval_el0, x11 553*54fd6939SJiyong Park 554*54fd6939SJiyong Park ldp x12, x13, [x0, #CTX_CNTV_CTL_EL0] 555*54fd6939SJiyong Park msr cntv_ctl_el0, x12 556*54fd6939SJiyong Park msr cntv_cval_el0, x13 557*54fd6939SJiyong Park 558*54fd6939SJiyong Park ldr x14, [x0, #CTX_CNTKCTL_EL1] 559*54fd6939SJiyong Park msr cntkctl_el1, x14 560*54fd6939SJiyong Park#endif 561*54fd6939SJiyong Park /* Restore MTE system registers if the build has instructed so */ 562*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS 563*54fd6939SJiyong Park ldp x11, x12, [x0, #CTX_TFSRE0_EL1] 564*54fd6939SJiyong Park msr TFSRE0_EL1, x11 565*54fd6939SJiyong Park msr TFSR_EL1, x12 566*54fd6939SJiyong Park 567*54fd6939SJiyong Park ldp x13, x14, [x0, #CTX_RGSR_EL1] 568*54fd6939SJiyong Park msr RGSR_EL1, x13 569*54fd6939SJiyong Park msr GCR_EL1, x14 570*54fd6939SJiyong Park#endif 571*54fd6939SJiyong Park 572*54fd6939SJiyong Park /* No explict ISB required here as ERET covers it */ 573*54fd6939SJiyong Park ret 574*54fd6939SJiyong Parkendfunc el1_sysregs_context_restore 575*54fd6939SJiyong Park 576*54fd6939SJiyong Park/* ------------------------------------------------------------------ 577*54fd6939SJiyong Park * The following function follows the aapcs_64 strictly to use 578*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers according to AArch64 PCS) 579*54fd6939SJiyong Park * to save floating point register context. It assumes that 'x0' is 580*54fd6939SJiyong Park * pointing to a 'fp_regs' structure where the register context will 581*54fd6939SJiyong Park * be saved. 582*54fd6939SJiyong Park * 583*54fd6939SJiyong Park * Access to VFP registers will trap if CPTR_EL3.TFP is set. 584*54fd6939SJiyong Park * However currently we don't use VFP registers nor set traps in 585*54fd6939SJiyong Park * Trusted Firmware, and assume it's cleared. 586*54fd6939SJiyong Park * 587*54fd6939SJiyong Park * TODO: Revisit when VFP is used in secure world 588*54fd6939SJiyong Park * ------------------------------------------------------------------ 589*54fd6939SJiyong Park */ 590*54fd6939SJiyong Park#if CTX_INCLUDE_FPREGS 591*54fd6939SJiyong Parkfunc fpregs_context_save 592*54fd6939SJiyong Park stp q0, q1, [x0, #CTX_FP_Q0] 593*54fd6939SJiyong Park stp q2, q3, [x0, #CTX_FP_Q2] 594*54fd6939SJiyong Park stp q4, q5, [x0, #CTX_FP_Q4] 595*54fd6939SJiyong Park stp q6, q7, [x0, #CTX_FP_Q6] 596*54fd6939SJiyong Park stp q8, q9, [x0, #CTX_FP_Q8] 597*54fd6939SJiyong Park stp q10, q11, [x0, #CTX_FP_Q10] 598*54fd6939SJiyong Park stp q12, q13, [x0, #CTX_FP_Q12] 599*54fd6939SJiyong Park stp q14, q15, [x0, #CTX_FP_Q14] 600*54fd6939SJiyong Park stp q16, q17, [x0, #CTX_FP_Q16] 601*54fd6939SJiyong Park stp q18, q19, [x0, #CTX_FP_Q18] 602*54fd6939SJiyong Park stp q20, q21, [x0, #CTX_FP_Q20] 603*54fd6939SJiyong Park stp q22, q23, [x0, #CTX_FP_Q22] 604*54fd6939SJiyong Park stp q24, q25, [x0, #CTX_FP_Q24] 605*54fd6939SJiyong Park stp q26, q27, [x0, #CTX_FP_Q26] 606*54fd6939SJiyong Park stp q28, q29, [x0, #CTX_FP_Q28] 607*54fd6939SJiyong Park stp q30, q31, [x0, #CTX_FP_Q30] 608*54fd6939SJiyong Park 609*54fd6939SJiyong Park mrs x9, fpsr 610*54fd6939SJiyong Park str x9, [x0, #CTX_FP_FPSR] 611*54fd6939SJiyong Park 612*54fd6939SJiyong Park mrs x10, fpcr 613*54fd6939SJiyong Park str x10, [x0, #CTX_FP_FPCR] 614*54fd6939SJiyong Park 615*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 616*54fd6939SJiyong Park mrs x11, fpexc32_el2 617*54fd6939SJiyong Park str x11, [x0, #CTX_FP_FPEXC32_EL2] 618*54fd6939SJiyong Park#endif 619*54fd6939SJiyong Park ret 620*54fd6939SJiyong Parkendfunc fpregs_context_save 621*54fd6939SJiyong Park 622*54fd6939SJiyong Park/* ------------------------------------------------------------------ 623*54fd6939SJiyong Park * The following function follows the aapcs_64 strictly to use x9-x17 624*54fd6939SJiyong Park * (temporary caller-saved registers according to AArch64 PCS) to 625*54fd6939SJiyong Park * restore floating point register context. It assumes that 'x0' is 626*54fd6939SJiyong Park * pointing to a 'fp_regs' structure from where the register context 627*54fd6939SJiyong Park * will be restored. 628*54fd6939SJiyong Park * 629*54fd6939SJiyong Park * Access to VFP registers will trap if CPTR_EL3.TFP is set. 630*54fd6939SJiyong Park * However currently we don't use VFP registers nor set traps in 631*54fd6939SJiyong Park * Trusted Firmware, and assume it's cleared. 632*54fd6939SJiyong Park * 633*54fd6939SJiyong Park * TODO: Revisit when VFP is used in secure world 634*54fd6939SJiyong Park * ------------------------------------------------------------------ 635*54fd6939SJiyong Park */ 636*54fd6939SJiyong Parkfunc fpregs_context_restore 637*54fd6939SJiyong Park ldp q0, q1, [x0, #CTX_FP_Q0] 638*54fd6939SJiyong Park ldp q2, q3, [x0, #CTX_FP_Q2] 639*54fd6939SJiyong Park ldp q4, q5, [x0, #CTX_FP_Q4] 640*54fd6939SJiyong Park ldp q6, q7, [x0, #CTX_FP_Q6] 641*54fd6939SJiyong Park ldp q8, q9, [x0, #CTX_FP_Q8] 642*54fd6939SJiyong Park ldp q10, q11, [x0, #CTX_FP_Q10] 643*54fd6939SJiyong Park ldp q12, q13, [x0, #CTX_FP_Q12] 644*54fd6939SJiyong Park ldp q14, q15, [x0, #CTX_FP_Q14] 645*54fd6939SJiyong Park ldp q16, q17, [x0, #CTX_FP_Q16] 646*54fd6939SJiyong Park ldp q18, q19, [x0, #CTX_FP_Q18] 647*54fd6939SJiyong Park ldp q20, q21, [x0, #CTX_FP_Q20] 648*54fd6939SJiyong Park ldp q22, q23, [x0, #CTX_FP_Q22] 649*54fd6939SJiyong Park ldp q24, q25, [x0, #CTX_FP_Q24] 650*54fd6939SJiyong Park ldp q26, q27, [x0, #CTX_FP_Q26] 651*54fd6939SJiyong Park ldp q28, q29, [x0, #CTX_FP_Q28] 652*54fd6939SJiyong Park ldp q30, q31, [x0, #CTX_FP_Q30] 653*54fd6939SJiyong Park 654*54fd6939SJiyong Park ldr x9, [x0, #CTX_FP_FPSR] 655*54fd6939SJiyong Park msr fpsr, x9 656*54fd6939SJiyong Park 657*54fd6939SJiyong Park ldr x10, [x0, #CTX_FP_FPCR] 658*54fd6939SJiyong Park msr fpcr, x10 659*54fd6939SJiyong Park 660*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS 661*54fd6939SJiyong Park ldr x11, [x0, #CTX_FP_FPEXC32_EL2] 662*54fd6939SJiyong Park msr fpexc32_el2, x11 663*54fd6939SJiyong Park#endif 664*54fd6939SJiyong Park /* 665*54fd6939SJiyong Park * No explict ISB required here as ERET to 666*54fd6939SJiyong Park * switch to secure EL1 or non-secure world 667*54fd6939SJiyong Park * covers it 668*54fd6939SJiyong Park */ 669*54fd6939SJiyong Park 670*54fd6939SJiyong Park ret 671*54fd6939SJiyong Parkendfunc fpregs_context_restore 672*54fd6939SJiyong Park#endif /* CTX_INCLUDE_FPREGS */ 673*54fd6939SJiyong Park 674*54fd6939SJiyong Park/* ------------------------------------------------------------------ 675*54fd6939SJiyong Park * The following function is used to save and restore all the general 676*54fd6939SJiyong Park * purpose and ARMv8.3-PAuth (if enabled) registers. 677*54fd6939SJiyong Park * It also checks if Secure Cycle Counter is not disabled in MDCR_EL3 678*54fd6939SJiyong Park * when ARMv8.5-PMU is implemented, and if called from Non-secure 679*54fd6939SJiyong Park * state saves PMCR_EL0 and disables Cycle Counter. 680*54fd6939SJiyong Park * 681*54fd6939SJiyong Park * Ideally we would only save and restore the callee saved registers 682*54fd6939SJiyong Park * when a world switch occurs but that type of implementation is more 683*54fd6939SJiyong Park * complex. So currently we will always save and restore these 684*54fd6939SJiyong Park * registers on entry and exit of EL3. 685*54fd6939SJiyong Park * These are not macros to ensure their invocation fits within the 32 686*54fd6939SJiyong Park * instructions per exception vector. 687*54fd6939SJiyong Park * clobbers: x18 688*54fd6939SJiyong Park * ------------------------------------------------------------------ 689*54fd6939SJiyong Park */ 690*54fd6939SJiyong Parkfunc save_gp_pmcr_pauth_regs 691*54fd6939SJiyong Park stp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] 692*54fd6939SJiyong Park stp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] 693*54fd6939SJiyong Park stp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] 694*54fd6939SJiyong Park stp x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6] 695*54fd6939SJiyong Park stp x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8] 696*54fd6939SJiyong Park stp x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10] 697*54fd6939SJiyong Park stp x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12] 698*54fd6939SJiyong Park stp x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14] 699*54fd6939SJiyong Park stp x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16] 700*54fd6939SJiyong Park stp x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18] 701*54fd6939SJiyong Park stp x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20] 702*54fd6939SJiyong Park stp x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22] 703*54fd6939SJiyong Park stp x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24] 704*54fd6939SJiyong Park stp x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26] 705*54fd6939SJiyong Park stp x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28] 706*54fd6939SJiyong Park mrs x18, sp_el0 707*54fd6939SJiyong Park str x18, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_SP_EL0] 708*54fd6939SJiyong Park 709*54fd6939SJiyong Park /* ---------------------------------------------------------- 710*54fd6939SJiyong Park * Check if earlier initialization MDCR_EL3.SCCD/MCCD to 1 711*54fd6939SJiyong Park * failed, meaning that FEAT_PMUv3p5/7 is not implemented and 712*54fd6939SJiyong Park * PMCR_EL0 should be saved in non-secure context. 713*54fd6939SJiyong Park * ---------------------------------------------------------- 714*54fd6939SJiyong Park */ 715*54fd6939SJiyong Park mov_imm x10, (MDCR_SCCD_BIT | MDCR_MCCD_BIT) 716*54fd6939SJiyong Park mrs x9, mdcr_el3 717*54fd6939SJiyong Park tst x9, x10 718*54fd6939SJiyong Park bne 1f 719*54fd6939SJiyong Park 720*54fd6939SJiyong Park /* Secure Cycle Counter is not disabled */ 721*54fd6939SJiyong Park mrs x9, pmcr_el0 722*54fd6939SJiyong Park 723*54fd6939SJiyong Park /* Check caller's security state */ 724*54fd6939SJiyong Park mrs x10, scr_el3 725*54fd6939SJiyong Park tst x10, #SCR_NS_BIT 726*54fd6939SJiyong Park beq 2f 727*54fd6939SJiyong Park 728*54fd6939SJiyong Park /* Save PMCR_EL0 if called from Non-secure state */ 729*54fd6939SJiyong Park str x9, [sp, #CTX_EL3STATE_OFFSET + CTX_PMCR_EL0] 730*54fd6939SJiyong Park 731*54fd6939SJiyong Park /* Disable cycle counter when event counting is prohibited */ 732*54fd6939SJiyong Park2: orr x9, x9, #PMCR_EL0_DP_BIT 733*54fd6939SJiyong Park msr pmcr_el0, x9 734*54fd6939SJiyong Park isb 735*54fd6939SJiyong Park1: 736*54fd6939SJiyong Park#if CTX_INCLUDE_PAUTH_REGS 737*54fd6939SJiyong Park /* ---------------------------------------------------------- 738*54fd6939SJiyong Park * Save the ARMv8.3-PAuth keys as they are not banked 739*54fd6939SJiyong Park * by exception level 740*54fd6939SJiyong Park * ---------------------------------------------------------- 741*54fd6939SJiyong Park */ 742*54fd6939SJiyong Park add x19, sp, #CTX_PAUTH_REGS_OFFSET 743*54fd6939SJiyong Park 744*54fd6939SJiyong Park mrs x20, APIAKeyLo_EL1 /* x21:x20 = APIAKey */ 745*54fd6939SJiyong Park mrs x21, APIAKeyHi_EL1 746*54fd6939SJiyong Park mrs x22, APIBKeyLo_EL1 /* x23:x22 = APIBKey */ 747*54fd6939SJiyong Park mrs x23, APIBKeyHi_EL1 748*54fd6939SJiyong Park mrs x24, APDAKeyLo_EL1 /* x25:x24 = APDAKey */ 749*54fd6939SJiyong Park mrs x25, APDAKeyHi_EL1 750*54fd6939SJiyong Park mrs x26, APDBKeyLo_EL1 /* x27:x26 = APDBKey */ 751*54fd6939SJiyong Park mrs x27, APDBKeyHi_EL1 752*54fd6939SJiyong Park mrs x28, APGAKeyLo_EL1 /* x29:x28 = APGAKey */ 753*54fd6939SJiyong Park mrs x29, APGAKeyHi_EL1 754*54fd6939SJiyong Park 755*54fd6939SJiyong Park stp x20, x21, [x19, #CTX_PACIAKEY_LO] 756*54fd6939SJiyong Park stp x22, x23, [x19, #CTX_PACIBKEY_LO] 757*54fd6939SJiyong Park stp x24, x25, [x19, #CTX_PACDAKEY_LO] 758*54fd6939SJiyong Park stp x26, x27, [x19, #CTX_PACDBKEY_LO] 759*54fd6939SJiyong Park stp x28, x29, [x19, #CTX_PACGAKEY_LO] 760*54fd6939SJiyong Park#endif /* CTX_INCLUDE_PAUTH_REGS */ 761*54fd6939SJiyong Park 762*54fd6939SJiyong Park ret 763*54fd6939SJiyong Parkendfunc save_gp_pmcr_pauth_regs 764*54fd6939SJiyong Park 765*54fd6939SJiyong Park/* ------------------------------------------------------------------ 766*54fd6939SJiyong Park * This function restores ARMv8.3-PAuth (if enabled) and all general 767*54fd6939SJiyong Park * purpose registers except x30 from the CPU context. 768*54fd6939SJiyong Park * x30 register must be explicitly restored by the caller. 769*54fd6939SJiyong Park * ------------------------------------------------------------------ 770*54fd6939SJiyong Park */ 771*54fd6939SJiyong Parkfunc restore_gp_pmcr_pauth_regs 772*54fd6939SJiyong Park#if CTX_INCLUDE_PAUTH_REGS 773*54fd6939SJiyong Park /* Restore the ARMv8.3 PAuth keys */ 774*54fd6939SJiyong Park add x10, sp, #CTX_PAUTH_REGS_OFFSET 775*54fd6939SJiyong Park 776*54fd6939SJiyong Park ldp x0, x1, [x10, #CTX_PACIAKEY_LO] /* x1:x0 = APIAKey */ 777*54fd6939SJiyong Park ldp x2, x3, [x10, #CTX_PACIBKEY_LO] /* x3:x2 = APIBKey */ 778*54fd6939SJiyong Park ldp x4, x5, [x10, #CTX_PACDAKEY_LO] /* x5:x4 = APDAKey */ 779*54fd6939SJiyong Park ldp x6, x7, [x10, #CTX_PACDBKEY_LO] /* x7:x6 = APDBKey */ 780*54fd6939SJiyong Park ldp x8, x9, [x10, #CTX_PACGAKEY_LO] /* x9:x8 = APGAKey */ 781*54fd6939SJiyong Park 782*54fd6939SJiyong Park msr APIAKeyLo_EL1, x0 783*54fd6939SJiyong Park msr APIAKeyHi_EL1, x1 784*54fd6939SJiyong Park msr APIBKeyLo_EL1, x2 785*54fd6939SJiyong Park msr APIBKeyHi_EL1, x3 786*54fd6939SJiyong Park msr APDAKeyLo_EL1, x4 787*54fd6939SJiyong Park msr APDAKeyHi_EL1, x5 788*54fd6939SJiyong Park msr APDBKeyLo_EL1, x6 789*54fd6939SJiyong Park msr APDBKeyHi_EL1, x7 790*54fd6939SJiyong Park msr APGAKeyLo_EL1, x8 791*54fd6939SJiyong Park msr APGAKeyHi_EL1, x9 792*54fd6939SJiyong Park#endif /* CTX_INCLUDE_PAUTH_REGS */ 793*54fd6939SJiyong Park 794*54fd6939SJiyong Park /* ---------------------------------------------------------- 795*54fd6939SJiyong Park * Restore PMCR_EL0 when returning to Non-secure state if 796*54fd6939SJiyong Park * Secure Cycle Counter is not disabled in MDCR_EL3 when 797*54fd6939SJiyong Park * ARMv8.5-PMU is implemented. 798*54fd6939SJiyong Park * ---------------------------------------------------------- 799*54fd6939SJiyong Park */ 800*54fd6939SJiyong Park mrs x0, scr_el3 801*54fd6939SJiyong Park tst x0, #SCR_NS_BIT 802*54fd6939SJiyong Park beq 2f 803*54fd6939SJiyong Park 804*54fd6939SJiyong Park /* ---------------------------------------------------------- 805*54fd6939SJiyong Park * Back to Non-secure state. 806*54fd6939SJiyong Park * Check if earlier initialization MDCR_EL3.SCCD/MCCD to 1 807*54fd6939SJiyong Park * failed, meaning that FEAT_PMUv3p5/7 is not implemented and 808*54fd6939SJiyong Park * PMCR_EL0 should be restored from non-secure context. 809*54fd6939SJiyong Park * ---------------------------------------------------------- 810*54fd6939SJiyong Park */ 811*54fd6939SJiyong Park mov_imm x1, (MDCR_SCCD_BIT | MDCR_MCCD_BIT) 812*54fd6939SJiyong Park mrs x0, mdcr_el3 813*54fd6939SJiyong Park tst x0, x1 814*54fd6939SJiyong Park bne 2f 815*54fd6939SJiyong Park ldr x0, [sp, #CTX_EL3STATE_OFFSET + CTX_PMCR_EL0] 816*54fd6939SJiyong Park msr pmcr_el0, x0 817*54fd6939SJiyong Park2: 818*54fd6939SJiyong Park ldp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] 819*54fd6939SJiyong Park ldp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] 820*54fd6939SJiyong Park ldp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] 821*54fd6939SJiyong Park ldp x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6] 822*54fd6939SJiyong Park ldp x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8] 823*54fd6939SJiyong Park ldp x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10] 824*54fd6939SJiyong Park ldp x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12] 825*54fd6939SJiyong Park ldp x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14] 826*54fd6939SJiyong Park ldp x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16] 827*54fd6939SJiyong Park ldp x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18] 828*54fd6939SJiyong Park ldp x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20] 829*54fd6939SJiyong Park ldp x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22] 830*54fd6939SJiyong Park ldp x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24] 831*54fd6939SJiyong Park ldp x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26] 832*54fd6939SJiyong Park ldr x28, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_SP_EL0] 833*54fd6939SJiyong Park msr sp_el0, x28 834*54fd6939SJiyong Park ldp x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28] 835*54fd6939SJiyong Park ret 836*54fd6939SJiyong Parkendfunc restore_gp_pmcr_pauth_regs 837*54fd6939SJiyong Park 838*54fd6939SJiyong Park/* 839*54fd6939SJiyong Park * In case of ERRATA_SPECULATIVE_AT, save SCTLR_EL1 and TCR_EL1 840*54fd6939SJiyong Park * registers and update EL1 registers to disable stage1 and stage2 841*54fd6939SJiyong Park * page table walk 842*54fd6939SJiyong Park */ 843*54fd6939SJiyong Parkfunc save_and_update_ptw_el1_sys_regs 844*54fd6939SJiyong Park /* ---------------------------------------------------------- 845*54fd6939SJiyong Park * Save only sctlr_el1 and tcr_el1 registers 846*54fd6939SJiyong Park * ---------------------------------------------------------- 847*54fd6939SJiyong Park */ 848*54fd6939SJiyong Park mrs x29, sctlr_el1 849*54fd6939SJiyong Park str x29, [sp, #(CTX_EL1_SYSREGS_OFFSET + CTX_SCTLR_EL1)] 850*54fd6939SJiyong Park mrs x29, tcr_el1 851*54fd6939SJiyong Park str x29, [sp, #(CTX_EL1_SYSREGS_OFFSET + CTX_TCR_EL1)] 852*54fd6939SJiyong Park 853*54fd6939SJiyong Park /* ------------------------------------------------------------ 854*54fd6939SJiyong Park * Must follow below order in order to disable page table 855*54fd6939SJiyong Park * walk for lower ELs (EL1 and EL0). First step ensures that 856*54fd6939SJiyong Park * page table walk is disabled for stage1 and second step 857*54fd6939SJiyong Park * ensures that page table walker should use TCR_EL1.EPDx 858*54fd6939SJiyong Park * bits to perform address translation. ISB ensures that CPU 859*54fd6939SJiyong Park * does these 2 steps in order. 860*54fd6939SJiyong Park * 861*54fd6939SJiyong Park * 1. Update TCR_EL1.EPDx bits to disable page table walk by 862*54fd6939SJiyong Park * stage1. 863*54fd6939SJiyong Park * 2. Enable MMU bit to avoid identity mapping via stage2 864*54fd6939SJiyong Park * and force TCR_EL1.EPDx to be used by the page table 865*54fd6939SJiyong Park * walker. 866*54fd6939SJiyong Park * ------------------------------------------------------------ 867*54fd6939SJiyong Park */ 868*54fd6939SJiyong Park orr x29, x29, #(TCR_EPD0_BIT) 869*54fd6939SJiyong Park orr x29, x29, #(TCR_EPD1_BIT) 870*54fd6939SJiyong Park msr tcr_el1, x29 871*54fd6939SJiyong Park isb 872*54fd6939SJiyong Park mrs x29, sctlr_el1 873*54fd6939SJiyong Park orr x29, x29, #SCTLR_M_BIT 874*54fd6939SJiyong Park msr sctlr_el1, x29 875*54fd6939SJiyong Park isb 876*54fd6939SJiyong Park 877*54fd6939SJiyong Park ret 878*54fd6939SJiyong Parkendfunc save_and_update_ptw_el1_sys_regs 879*54fd6939SJiyong Park 880*54fd6939SJiyong Park/* ------------------------------------------------------------------ 881*54fd6939SJiyong Park * This routine assumes that the SP_EL3 is pointing to a valid 882*54fd6939SJiyong Park * context structure from where the gp regs and other special 883*54fd6939SJiyong Park * registers can be retrieved. 884*54fd6939SJiyong Park * ------------------------------------------------------------------ 885*54fd6939SJiyong Park */ 886*54fd6939SJiyong Parkfunc el3_exit 887*54fd6939SJiyong Park#if ENABLE_ASSERTIONS 888*54fd6939SJiyong Park /* el3_exit assumes SP_EL0 on entry */ 889*54fd6939SJiyong Park mrs x17, spsel 890*54fd6939SJiyong Park cmp x17, #MODE_SP_EL0 891*54fd6939SJiyong Park ASM_ASSERT(eq) 892*54fd6939SJiyong Park#endif 893*54fd6939SJiyong Park 894*54fd6939SJiyong Park /* ---------------------------------------------------------- 895*54fd6939SJiyong Park * Save the current SP_EL0 i.e. the EL3 runtime stack which 896*54fd6939SJiyong Park * will be used for handling the next SMC. 897*54fd6939SJiyong Park * Then switch to SP_EL3. 898*54fd6939SJiyong Park * ---------------------------------------------------------- 899*54fd6939SJiyong Park */ 900*54fd6939SJiyong Park mov x17, sp 901*54fd6939SJiyong Park msr spsel, #MODE_SP_ELX 902*54fd6939SJiyong Park str x17, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] 903*54fd6939SJiyong Park 904*54fd6939SJiyong Park /* ---------------------------------------------------------- 905*54fd6939SJiyong Park * Restore SPSR_EL3, ELR_EL3 and SCR_EL3 prior to ERET 906*54fd6939SJiyong Park * ---------------------------------------------------------- 907*54fd6939SJiyong Park */ 908*54fd6939SJiyong Park ldr x18, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] 909*54fd6939SJiyong Park ldp x16, x17, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] 910*54fd6939SJiyong Park msr scr_el3, x18 911*54fd6939SJiyong Park msr spsr_el3, x16 912*54fd6939SJiyong Park msr elr_el3, x17 913*54fd6939SJiyong Park 914*54fd6939SJiyong Park#if IMAGE_BL31 915*54fd6939SJiyong Park /* ---------------------------------------------------------- 916*54fd6939SJiyong Park * Restore CPTR_EL3. 917*54fd6939SJiyong Park * ZCR is only restored if SVE is supported and enabled. 918*54fd6939SJiyong Park * Synchronization is required before zcr_el3 is addressed. 919*54fd6939SJiyong Park * ---------------------------------------------------------- 920*54fd6939SJiyong Park */ 921*54fd6939SJiyong Park ldp x19, x20, [sp, #CTX_EL3STATE_OFFSET + CTX_CPTR_EL3] 922*54fd6939SJiyong Park msr cptr_el3, x19 923*54fd6939SJiyong Park 924*54fd6939SJiyong Park ands x19, x19, #CPTR_EZ_BIT 925*54fd6939SJiyong Park beq sve_not_enabled 926*54fd6939SJiyong Park 927*54fd6939SJiyong Park isb 928*54fd6939SJiyong Park msr S3_6_C1_C2_0, x20 /* zcr_el3 */ 929*54fd6939SJiyong Parksve_not_enabled: 930*54fd6939SJiyong Park#endif 931*54fd6939SJiyong Park 932*54fd6939SJiyong Park#if IMAGE_BL31 && DYNAMIC_WORKAROUND_CVE_2018_3639 933*54fd6939SJiyong Park /* ---------------------------------------------------------- 934*54fd6939SJiyong Park * Restore mitigation state as it was on entry to EL3 935*54fd6939SJiyong Park * ---------------------------------------------------------- 936*54fd6939SJiyong Park */ 937*54fd6939SJiyong Park ldr x17, [sp, #CTX_CVE_2018_3639_OFFSET + CTX_CVE_2018_3639_DISABLE] 938*54fd6939SJiyong Park cbz x17, 1f 939*54fd6939SJiyong Park blr x17 940*54fd6939SJiyong Park1: 941*54fd6939SJiyong Park#endif 942*54fd6939SJiyong Park restore_ptw_el1_sys_regs 943*54fd6939SJiyong Park 944*54fd6939SJiyong Park /* ---------------------------------------------------------- 945*54fd6939SJiyong Park * Restore general purpose (including x30), PMCR_EL0 and 946*54fd6939SJiyong Park * ARMv8.3-PAuth registers. 947*54fd6939SJiyong Park * Exit EL3 via ERET to a lower exception level. 948*54fd6939SJiyong Park * ---------------------------------------------------------- 949*54fd6939SJiyong Park */ 950*54fd6939SJiyong Park bl restore_gp_pmcr_pauth_regs 951*54fd6939SJiyong Park ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 952*54fd6939SJiyong Park 953*54fd6939SJiyong Park#if IMAGE_BL31 && RAS_EXTENSION 954*54fd6939SJiyong Park /* ---------------------------------------------------------- 955*54fd6939SJiyong Park * Issue Error Synchronization Barrier to synchronize SErrors 956*54fd6939SJiyong Park * before exiting EL3. We're running with EAs unmasked, so 957*54fd6939SJiyong Park * any synchronized errors would be taken immediately; 958*54fd6939SJiyong Park * therefore no need to inspect DISR_EL1 register. 959*54fd6939SJiyong Park * ---------------------------------------------------------- 960*54fd6939SJiyong Park */ 961*54fd6939SJiyong Park esb 962*54fd6939SJiyong Park#else 963*54fd6939SJiyong Park dsb sy 964*54fd6939SJiyong Park#endif 965*54fd6939SJiyong Park#ifdef IMAGE_BL31 966*54fd6939SJiyong Park str xzr, [sp, #CTX_EL3STATE_OFFSET + CTX_IS_IN_EL3] 967*54fd6939SJiyong Park#endif 968*54fd6939SJiyong Park exception_return 969*54fd6939SJiyong Park 970*54fd6939SJiyong Parkendfunc el3_exit 971