summaryrefslogtreecommitdiff
path: root/security
diff options
context:
space:
mode:
authorJames Zhao <jamesz@nvidia.com>2013-08-19 18:41:47 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:44:12 -0700
commitbaf520acde48d5b0987716908872135f67c31bd6 (patch)
treee2c6ce418742df9eda145041e10e9b59f4a0fbc3 /security
parent84db025b3ed9152f9640e9e6a5d9fe8841081eec (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')
-rw-r--r--security/tlk_driver/ote_comms.c94
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
}
/*