diff options
author | James Zhao <jamesz@nvidia.com> | 2013-08-19 18:41:47 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:44:12 -0700 |
commit | baf520acde48d5b0987716908872135f67c31bd6 (patch) | |
tree | e2c6ce418742df9eda145041e10e9b59f4a0fbc3 /security/tlk_driver | |
parent | 84db025b3ed9152f9640e9e6a5d9fe8841081eec (diff) |
security: tlk_driver: Use CPU0 for smc calls
- All smc calls need to be done through CPU0.
- Add the sched_setaffinity logic to tlk_generic_smc(), will solve
the occasional prefetch abort.
- Also adding sched_setaffinity logic to tlk_extended_smc().
bug 1322280
Change-Id: I67716bec49aec1f1c9a2e33ec3de90aec2048870
Signed-off-by: James Zhao <jamesz@nvidia.com>
Signed-off-by: Aaron Gamble <jgamble@nvidia.com>
Reviewed-on: http://git-master/r/264177
Tested-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Chris Johnson <cwj@nvidia.com>
Tested-by: Chris Johnson <cwj@nvidia.com>
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>
Diffstat (limited to 'security/tlk_driver')
-rw-r--r-- | security/tlk_driver/ote_comms.c | 94 |
1 files changed, 63 insertions, 31 deletions
diff --git a/security/tlk_driver/ote_comms.c b/security/tlk_driver/ote_comms.c index 40a3ec723ce8..02232ac74964 100644 --- a/security/tlk_driver/ote_comms.c +++ b/security/tlk_driver/ote_comms.c @@ -193,11 +193,32 @@ static void te_unpin_temp_buffers(struct te_request *request, uint32_t tlk_generic_smc(uint32_t arg0, uint32_t arg1, uint32_t arg2) { +#ifdef CONFIG_SMP + cpumask_t saved_cpu_mask; +#endif uint32_t saved_regs[9]; - register uint32_t r0 asm("r0") = arg0; - register uint32_t r1 asm("r1") = arg1; - register uint32_t r2 asm("r2") = arg2; - register uint32_t r3 asm("r3") = (uint32_t)saved_regs; + register uint32_t r0 asm("r0"); + register uint32_t r1 asm("r1"); + register uint32_t r2 asm("r2"); + register uint32_t r3 asm("r3"); + +#ifdef CONFIG_SMP +{ + long ret; + cpumask_t local_cpu_mask = CPU_MASK_NONE; + + cpu_set(0, local_cpu_mask); + cpumask_copy(&saved_cpu_mask, tsk_cpus_allowed(current)); + ret = sched_setaffinity(0, &local_cpu_mask); + if (ret) + pr_err("sched_setaffinity #1 -> 0x%lX", ret); +} +#endif + + r0 = arg0; + r1 = arg1; + r2 = arg2; + r3 = (uint32_t)saved_regs; asm volatile( __asmeq("%0", "r0") @@ -216,12 +237,39 @@ uint32_t tlk_generic_smc(uint32_t arg0, uint32_t arg1, uint32_t arg2) : "r" (r0), "r" (r1), "r" (r2), "r" (r3) ); +#ifdef CONFIG_SMP +{ + long ret = sched_setaffinity(0, &saved_cpu_mask); + if (ret) + pr_err("sched_setaffinity #2 -> 0x%lX", ret); +} +#endif + return r0; } -uint32_t __naked tlk_extended_smc(uint32_t *regs) +uint32_t tlk_extended_smc(uint32_t *regs) { - register uint32_t r0 asm("r0") = (uint32_t)regs; +#ifdef CONFIG_SMP + cpumask_t saved_cpu_mask; +#endif + + register uint32_t r0 asm("r0"); + +#ifdef CONFIG_SMP +{ + long ret; + cpumask_t local_cpu_mask = CPU_MASK_NONE; + + cpu_set(0, local_cpu_mask); + cpumask_copy(&saved_cpu_mask, tsk_cpus_allowed(current)); + ret = sched_setaffinity(0, &local_cpu_mask); + if (ret) + pr_err("sched_setaffinity #1 -> 0x%lX", ret); +} +#endif + + r0 = (uint32_t)regs; /* allows MAX_EXT_SMC_ARGS (r0-r11) to be passed in registers */ asm volatile( @@ -234,10 +282,18 @@ uint32_t __naked tlk_extended_smc(uint32_t *regs) #endif "smc #0 @ switch to secure world\n" "ldmfd sp!, {r4-r12} @ restore saved regs\n" - "bx lr" : "=r" (r0) : "r" (r0) ); + +#ifdef CONFIG_SMP +{ + long ret = sched_setaffinity(0, &saved_cpu_mask); + if (ret) + pr_err("sched_setaffinity #2 -> 0x%lX", ret); +} +#endif + return r0; } @@ -246,37 +302,13 @@ uint32_t __naked tlk_extended_smc(uint32_t *regs) */ static void do_smc(struct te_request *request) { -#ifdef CONFIG_SMP - cpumask_t saved_cpu_mask; -#endif phys_addr_t smc_args = virt_to_phys(request); phys_addr_t smc_params = 0; if (request->params) smc_params = virt_to_phys(request->params); -#ifdef CONFIG_SMP -{ - long ret; - cpumask_t local_cpu_mask = CPU_MASK_NONE; - - cpu_set(0, local_cpu_mask); - cpumask_copy(&saved_cpu_mask, tsk_cpus_allowed(current)); - ret = sched_setaffinity(0, &local_cpu_mask); - if (ret) - pr_err("sched_setaffinity #1 -> 0x%lX", ret); -} -#endif - tlk_generic_smc(request->type, smc_args, smc_params); - -#ifdef CONFIG_SMP -{ - long ret = sched_setaffinity(0, &saved_cpu_mask); - if (ret) - pr_err("sched_setaffinity #2 -> 0x%lX", ret); -} -#endif } /* |