Browse Source

feat(cpufeat): initialize HFG*_EL2 registers

HFG*_EL2 registers control the fine-grained traps introduced by
FEAT_FGT. These traps come enabled by default so old systems unaware
of this feature can be trapped to EL3, not being able to handle the
trap correctly. This patch disables all fine-grained traps by default
to prevent such unexpected behavior.

Change-Id: If2ae97accbeed2bea51ae03b5225ce762ecffb25
Signed-off-by: Juan Pablo Conde <juanpablo.conde@arm.com>
pull/2000/head
Juan Pablo Conde 1 year ago
parent
commit
4a530b4c65
  1. 7
      include/arch/aarch64/arch.h
  2. 33
      lib/el3_runtime/aarch64/context_mgmt.c

7
include/arch/aarch64/arch.h

@ -1375,6 +1375,13 @@
#define HCRX_EL2_EnAS0_BIT (UL(1) << 0)
#define HCRX_EL2_INIT_VAL ULL(0x0)
/*******************************************************************************
* FEAT_FGT - Definitions for Fine-Grained Trap registers
******************************************************************************/
#define HFGITR_EL2_INIT_VAL ULL(0x180000000000000)
#define HFGRTR_EL2_INIT_VAL ULL(0xC4000000000000)
#define HFGWTR_EL2_INIT_VAL ULL(0xC4000000000000)
/*******************************************************************************
* FEAT_TCR2 - Extended Translation Control Register
******************************************************************************/

33
lib/el3_runtime/aarch64/context_mgmt.c

@ -279,6 +279,20 @@ static void setup_ns_context(cpu_context_t *ctx, const struct entry_point_info *
write_ctx_reg(get_el2_sysregs_ctx(ctx), CTX_HCRX_EL2,
HCRX_EL2_INIT_VAL);
}
if (is_feat_fgt_supported()) {
/*
* Initialize HFG*_EL2 registers with a default value so legacy
* systems unaware of FEAT_FGT do not get trapped due to their lack
* of initialization for this feature.
*/
write_ctx_reg(get_el2_sysregs_ctx(ctx), CTX_HFGITR_EL2,
HFGITR_EL2_INIT_VAL);
write_ctx_reg(get_el2_sysregs_ctx(ctx), CTX_HFGRTR_EL2,
HFGRTR_EL2_INIT_VAL);
write_ctx_reg(get_el2_sysregs_ctx(ctx), CTX_HFGWTR_EL2,
HFGWTR_EL2_INIT_VAL);
}
#endif /* CTX_INCLUDE_EL2_REGS */
manage_extensions_nonsecure(ctx);
@ -829,8 +843,27 @@ void cm_prepare_el3_exit(uint32_t security_state)
if (is_feat_hcx_supported()) {
write_hcrx_el2(HCRX_EL2_INIT_VAL);
}
/*
* Initialize Fine-grained trap registers introduced
* by FEAT_FGT so all traps are initially disabled when
* switching to EL2 or a lower EL, preventing undesired
* behavior.
*/
if (is_feat_fgt_supported()) {
/*
* Initialize HFG*_EL2 registers with a default
* value so legacy systems unaware of FEAT_FGT
* do not get trapped due to their lack of
* initialization for this feature.
*/
write_hfgitr_el2(HFGITR_EL2_INIT_VAL);
write_hfgrtr_el2(HFGRTR_EL2_INIT_VAL);
write_hfgwtr_el2(HFGWTR_EL2_INIT_VAL);
}
}
if ((scr_el3 & SCR_HCE_BIT) != 0U) {
/* Use SCTLR_EL1.EE value to initialise sctlr_el2 */
sctlr_elx = read_ctx_reg(get_el1_sysregs_ctx(ctx),

Loading…
Cancel
Save