mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 21:44:15 +00:00
fix(spmd): skip NS EL1 context save & restore operations
NS EL1 context save and restore is taken by SPMC upon entering and exiting S-EL2 BREAKING CHANGE: Corresponding support is needed in Hafnium SPMC Change-Id: I8524f1229b3e13c2df4e4b5be3f12436289c30c7 Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
This commit is contained in:
parent
2cbc8952a5
commit
2d960a1160
2 changed files with 15 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
|
* Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -528,9 +528,10 @@ bool spmd_el3_invoke_partition_info_get(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the non-secure context before entering SPMC */
|
/* Save the non-secure context before entering SPMC */
|
||||||
cm_el1_sysregs_context_save(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_save(NON_SECURE);
|
cm_el2_sysregs_context_save(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_save(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
spmd_build_ffa_info_get_regs(ctx, target_uuid, start_index, tag);
|
spmd_build_ffa_info_get_regs(ctx, target_uuid, start_index, tag);
|
||||||
|
@ -548,9 +549,10 @@ bool spmd_el3_invoke_partition_info_get(
|
||||||
|
|
||||||
assert(is_ffa_error(retval) || is_ffa_success(retval));
|
assert(is_ffa_error(retval) || is_ffa_success(retval));
|
||||||
|
|
||||||
cm_el1_sysregs_context_restore(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_restore(NON_SECURE);
|
cm_el2_sysregs_context_restore(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_restore(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
cm_set_next_eret_context(NON_SECURE);
|
cm_set_next_eret_context(NON_SECURE);
|
||||||
return true;
|
return true;
|
||||||
|
@ -667,9 +669,10 @@ bool spmd_el3_ffa_msg_direct_req(uint64_t x1,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the non-secure context before entering SPMC */
|
/* Save the non-secure context before entering SPMC */
|
||||||
cm_el1_sysregs_context_save(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_save(NON_SECURE);
|
cm_el2_sysregs_context_save(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_save(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -707,9 +710,10 @@ bool spmd_el3_ffa_msg_direct_req(uint64_t x1,
|
||||||
ffa_endpoint_destination(x1)));
|
ffa_endpoint_destination(x1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
cm_el1_sysregs_context_restore(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_restore(NON_SECURE);
|
cm_el2_sysregs_context_restore(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_restore(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
cm_set_next_eret_context(NON_SECURE);
|
cm_set_next_eret_context(NON_SECURE);
|
||||||
|
|
||||||
|
|
|
@ -227,9 +227,10 @@ static uint64_t spmd_secure_interrupt_handler(uint32_t id,
|
||||||
assert(handle == cm_get_context(NON_SECURE));
|
assert(handle == cm_get_context(NON_SECURE));
|
||||||
|
|
||||||
/* Save the non-secure context before entering SPMC */
|
/* Save the non-secure context before entering SPMC */
|
||||||
cm_el1_sysregs_context_save(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_save(NON_SECURE);
|
cm_el2_sysregs_context_save(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_save(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Convey the event to the SPMC through the FFA_INTERRUPT interface. */
|
/* Convey the event to the SPMC through the FFA_INTERRUPT interface. */
|
||||||
|
@ -252,9 +253,10 @@ static uint64_t spmd_secure_interrupt_handler(uint32_t id,
|
||||||
|
|
||||||
ctx->secure_interrupt_ongoing = false;
|
ctx->secure_interrupt_ongoing = false;
|
||||||
|
|
||||||
cm_el1_sysregs_context_restore(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_restore(NON_SECURE);
|
cm_el2_sysregs_context_restore(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_restore(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
cm_set_next_eret_context(NON_SECURE);
|
cm_set_next_eret_context(NON_SECURE);
|
||||||
|
|
||||||
|
@ -688,9 +690,6 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
|
||||||
|
|
||||||
/* Save incoming security state */
|
/* Save incoming security state */
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
if (secure_state_in == NON_SECURE) {
|
|
||||||
cm_el1_sysregs_context_save(secure_state_in);
|
|
||||||
}
|
|
||||||
cm_el2_sysregs_context_save(secure_state_in);
|
cm_el2_sysregs_context_save(secure_state_in);
|
||||||
#else
|
#else
|
||||||
cm_el1_sysregs_context_save(secure_state_in);
|
cm_el1_sysregs_context_save(secure_state_in);
|
||||||
|
@ -698,9 +697,6 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
|
||||||
|
|
||||||
/* Restore outgoing security state */
|
/* Restore outgoing security state */
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
if (secure_state_out == NON_SECURE) {
|
|
||||||
cm_el1_sysregs_context_restore(secure_state_out);
|
|
||||||
}
|
|
||||||
cm_el2_sysregs_context_restore(secure_state_out);
|
cm_el2_sysregs_context_restore(secure_state_out);
|
||||||
#else
|
#else
|
||||||
cm_el1_sysregs_context_restore(secure_state_out);
|
cm_el1_sysregs_context_restore(secure_state_out);
|
||||||
|
@ -951,9 +947,10 @@ uint64_t spmd_smc_handler(uint32_t smc_fid,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Save non-secure system registers context */
|
/* Save non-secure system registers context */
|
||||||
cm_el1_sysregs_context_save(NON_SECURE);
|
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
cm_el2_sysregs_context_save(NON_SECURE);
|
cm_el2_sysregs_context_save(NON_SECURE);
|
||||||
|
#else
|
||||||
|
cm_el1_sysregs_context_save(NON_SECURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue