diff options
author | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-05-20 21:43:27 +0100 |
---|---|---|
committer | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-05-23 08:49:36 +0100 |
commit | 399fb08fff2e4a0cad4cd1cf0ece84db6670447f (patch) | |
tree | 870a276f6e367046f563809a9e9e186e958b640c /services/spd | |
parent | 239b04fa31647100c537852b4a3fc8bd47e33aa6 (diff) |
Use a vector table for TSP entrypoints
The TSP has a number of entrypoints used by the TSP on different
occasions. These were provided to the TSPD as a table of function
pointers, and required the TSPD to read the entry in the table,
which is in TSP memory, in order to program the exception return
address.
Ideally, the TSPD has no access to the TSP memory.
This patch changes the table of function pointers into a vector
table of single instruction entrypoints. This allows the TSPD to
calculate the entrypoint address instead of read it.
Fixes ARM-software/tf-issues#160
Change-Id: Iec6e055d537ade78a45799fbc6f43765a4725ad3
Diffstat (limited to 'services/spd')
-rw-r--r-- | services/spd/tspd/tspd_main.c | 16 | ||||
-rw-r--r-- | services/spd/tspd/tspd_pm.c | 16 | ||||
-rw-r--r-- | services/spd/tspd/tspd_private.h | 4 |
3 files changed, 18 insertions, 18 deletions
diff --git a/services/spd/tspd/tspd_main.c b/services/spd/tspd/tspd_main.c index ec2d334d..1dbe6ba0 100644 --- a/services/spd/tspd/tspd_main.c +++ b/services/spd/tspd/tspd_main.c @@ -53,10 +53,10 @@ #include "tspd_private.h" /******************************************************************************* - * Single structure to hold information about the various entry points into the - * Secure Payload. It is initialised once on the primary core after a cold boot. + * Address of the entrypoint vector table in the Secure Payload. It is + * initialised once on the primary core after a cold boot. ******************************************************************************/ -entry_info_t *tsp_entry_info; +tsp_vectors_t *tsp_vectors; /******************************************************************************* * Array to keep track of per-cpu Secure Payload state @@ -127,7 +127,7 @@ static uint64_t tspd_sel1_interrupt_handler(uint32_t id, SPSR_64(MODE_EL1, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS)); SMC_SET_EL3(&tsp_ctx->cpu_ctx, CTX_ELR_EL3, - (uint64_t) tsp_entry_info->fiq_entry); + (uint64_t) &tsp_vectors->fiq_entry); cm_el1_sysregs_context_restore(SECURE); cm_set_next_eret_context(SECURE); @@ -370,8 +370,8 @@ uint64_t tspd_smc_handler(uint32_t smc_fid, * Stash the SP entry points information. This is done * only once on the primary cpu */ - assert(tsp_entry_info == NULL); - tsp_entry_info = (entry_info_t *) x1; + assert(tsp_vectors == NULL); + tsp_vectors = (tsp_vectors_t *) x1; /* * SP reports completion. The SPD must have initiated @@ -465,11 +465,11 @@ uint64_t tspd_smc_handler(uint32_t smc_fid, */ if (GET_SMC_TYPE(smc_fid) == SMC_TYPE_FAST) { cm_set_elr_el3(SECURE, (uint64_t) - tsp_entry_info->fast_smc_entry); + &tsp_vectors->fast_smc_entry); } else { set_std_smc_active_flag(tsp_ctx->state); cm_set_elr_el3(SECURE, (uint64_t) - tsp_entry_info->std_smc_entry); + &tsp_vectors->std_smc_entry); } cm_el1_sysregs_context_restore(SECURE); diff --git a/services/spd/tspd/tspd_pm.c b/services/spd/tspd/tspd_pm.c index d99aa222..2f204494 100644 --- a/services/spd/tspd/tspd_pm.c +++ b/services/spd/tspd/tspd_pm.c @@ -55,11 +55,11 @@ static int32_t tspd_cpu_off_handler(uint64_t cookie) uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; - assert(tsp_entry_info); + assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point and enter the TSP */ - cm_set_elr_el3(SECURE, (uint64_t) tsp_entry_info->cpu_off_entry); + cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_off_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* @@ -89,14 +89,14 @@ static void tspd_cpu_suspend_handler(uint64_t power_state) uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; - assert(tsp_entry_info); + assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_ON); /* Program the entry point, power_state parameter and enter the TSP */ write_ctx_reg(get_gpregs_ctx(&tsp_ctx->cpu_ctx), CTX_GPREG_X0, power_state); - cm_set_elr_el3(SECURE, (uint64_t) tsp_entry_info->cpu_suspend_entry); + cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_suspend_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* @@ -123,11 +123,11 @@ static void tspd_cpu_on_finish_handler(uint64_t cookie) uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; - assert(tsp_entry_info); + assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_OFF); /* Initialise this cpu's secure context */ - tspd_init_secure_context((uint64_t) tsp_entry_info->cpu_on_entry, + tspd_init_secure_context((uint64_t) &tsp_vectors->cpu_on_entry, TSP_AARCH64, mpidr, tsp_ctx); @@ -158,14 +158,14 @@ static void tspd_cpu_suspend_finish_handler(uint64_t suspend_level) uint32_t linear_id = platform_get_core_pos(mpidr); tsp_context_t *tsp_ctx = &tspd_sp_context[linear_id]; - assert(tsp_entry_info); + assert(tsp_vectors); assert(get_tsp_pstate(tsp_ctx->state) == TSP_PSTATE_SUSPEND); /* Program the entry point, suspend_level and enter the SP */ write_ctx_reg(get_gpregs_ctx(&tsp_ctx->cpu_ctx), CTX_GPREG_X0, suspend_level); - cm_set_elr_el3(SECURE, (uint64_t) tsp_entry_info->cpu_resume_entry); + cm_set_elr_el3(SECURE, (uint64_t) &tsp_vectors->cpu_resume_entry); rc = tspd_synchronous_sp_entry(tsp_ctx); /* diff --git a/services/spd/tspd/tspd_private.h b/services/spd/tspd/tspd_private.h index 7395bb9e..fbb03887 100644 --- a/services/spd/tspd/tspd_private.h +++ b/services/spd/tspd/tspd_private.h @@ -183,7 +183,7 @@ extern const spd_pm_ops_t tspd_pm; /******************************************************************************* * Forward declarations ******************************************************************************/ -struct entry_info; +struct tsp_vectors; /******************************************************************************* * Function & Data prototypes @@ -197,7 +197,7 @@ extern int32_t tspd_init_secure_context(uint64_t entrypoint, uint64_t mpidr, tsp_context_t *tsp_ctx); extern tsp_context_t tspd_sp_context[TSPD_CORE_COUNT]; -extern struct entry_info *tsp_entry_info; +extern struct tsp_vectors *tsp_vectors; #endif /*__ASSEMBLY__*/ #endif /* __TSPD_PRIVATE_H__ */ |