diff options
Diffstat (limited to 'lib/extensions/sve/sve.c')
-rw-r--r-- | lib/extensions/sve/sve.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/extensions/sve/sve.c b/lib/extensions/sve/sve.c index 2702c30f3..aa8904b9b 100644 --- a/lib/extensions/sve/sve.c +++ b/lib/extensions/sve/sve.c @@ -43,3 +43,23 @@ void sve_enable(cpu_context_t *context) write_ctx_reg(get_el3state_ctx(context), CTX_ZCR_EL3, (ZCR_EL3_LEN_MASK & CONVERT_SVE_LENGTH(512))); } + +void sve_disable(cpu_context_t *context) +{ + u_register_t reg; + el3_state_t *state; + + /* Make sure SME is implemented in hardware before continuing. */ + if (!sve_supported()) { + return; + } + + /* Get the context state. */ + state = get_el3state_ctx(context); + + /* Disable SVE and FPU since they share registers. */ + reg = read_ctx_reg(state, CTX_CPTR_EL3); + reg &= ~CPTR_EZ_BIT; /* Trap SVE */ + reg |= TFP_BIT; /* Trap FPU/SIMD */ + write_ctx_reg(state, CTX_CPTR_EL3, reg); +} |