diff options
Diffstat (limited to 'services')
-rw-r--r-- | services/std_svc/spm/spm_main.c | 13 | ||||
-rw-r--r-- | services/std_svc/spm/spm_private.h | 2 |
2 files changed, 15 insertions, 0 deletions
diff --git a/services/std_svc/spm/spm_main.c b/services/std_svc/spm/spm_main.c index e156106a..979b9a8f 100644 --- a/services/std_svc/spm/spm_main.c +++ b/services/std_svc/spm/spm_main.c @@ -125,6 +125,13 @@ int32_t spm_init(void) secure_partition_setup(); /* + * Make all CPUs use the same secure context. + */ + for (unsigned int i = 0; i < PLATFORM_CORE_COUNT; i++) { + cm_set_context_by_index(i, &sp_ctx.cpu_ctx, SECURE); + } + + /* * Arrange for an entry into the secure partition. */ sp_ctx.sp_init_in_progress = 1; @@ -369,6 +376,9 @@ uint64_t spm_smc_handler(uint32_t smc_fid, assert(0); } + /* Release the Secure Partition context */ + spin_unlock(&sp_ctx.lock); + /* * This is the result from the Secure partition of an * earlier request. Copy the result into the non-secure @@ -442,6 +452,9 @@ uint64_t spm_smc_handler(uint32_t smc_fid, /* Save the Normal world context */ cm_el1_sysregs_context_save(NON_SECURE); + /* Lock the Secure Partition context. */ + spin_lock(&sp_ctx.lock); + /* * Restore the secure world context and prepare for * entry in S-EL0 diff --git a/services/std_svc/spm/spm_private.h b/services/std_svc/spm/spm_private.h index 2fc46c8d..1d16b458 100644 --- a/services/std_svc/spm/spm_private.h +++ b/services/std_svc/spm/spm_private.h @@ -32,6 +32,7 @@ #ifndef __ASSEMBLY__ +#include <spinlock.h> #include <stdint.h> #include <xlat_tables_v2.h> @@ -44,6 +45,7 @@ typedef struct secure_partition_context { uint64_t c_rt_ctx; cpu_context_t cpu_ctx; unsigned int sp_init_in_progress; + spinlock_t lock; } secure_partition_context_t; uint64_t spm_secure_partition_enter(uint64_t *c_rt_ctx); |