/* * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include /************************************************************ * For R-class everything is in secure world. * Prepare the CPU system registers for first entry into EL1 ************************************************************/ void cm_prepare_el2_exit(void) { uint64_t hcr_el2 = 0U; /* * The use of ARMv8.3 pointer authentication (PAuth) is governed * by fields in HCR_EL2, which trigger a 'trap to EL2' if not * enabled. This register initialized at boot up, update PAuth * bits. * * HCR_API_BIT: Set to one to disable traps to EL2 if lower ELs * access PAuth registers * * HCR_APK_BIT: Set to one to disable traps to EL2 if lower ELs * access PAuth instructions */ hcr_el2 = read_hcr_el2(); write_hcr_el2(hcr_el2 | HCR_API_BIT | HCR_APK_BIT); /* * Initialise CNTHCTL_EL2. All fields are architecturally UNKNOWN * on reset and are set to zero except for field(s) listed below. * * CNTHCTL_EL2.EL1PCEN: Set to one to disable traps to EL2 * if lower ELs accesses to the physical timer registers. * * CNTHCTL_EL2.EL1PCTEN: Set to one to disable traps to EL2 * if lower ELs access to the physical counter registers. */ write_cnthctl_el2(CNTHCTL_RESET_VAL | EL1PCEN_BIT | EL1PCTEN_BIT); /* * On Armv8-R, the EL1&0 memory system architecture is configurable * as a VMSA or PMSA. All the fields architecturally UNKNOWN on reset * and are set to zero except for field listed below. * * VCTR_EL2.MSA: Set to one to ensure the VMSA is enabled so that * rich OS can boot. */ write_vtcr_el2(VTCR_RESET_VAL | VTCR_EL2_MSA); }