summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorSanrio Alvares <salvares@codeaurora.org>2016-01-28 17:10:34 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:19:14 -0700
commit1f7d497b0ace1658c36f631dd594fede4ee3cfbb (patch)
treef2884267b5b21ae0665a3bb98c77aa140c6c55ec /arch
parentd44405349999fc1bd5274e75a10b335642da22c7 (diff)
arm64: fpsimd: add support to enable/disable fpsimd_settings.
Add support to enable/disable fpsimd_settings at runtime through kernel command line. fpsimd.fpsimd_settings=0 should disable it. Change-Id: I14bf5f20e36ec4547aad45382cfffc91666a2ff4 Signed-off-by: Sanrio Alvares <salvares@codeaurora.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm64/include/asm/elf.h2
-rw-r--r--arch/arm64/kernel/fpsimd.c15
2 files changed, 14 insertions, 3 deletions
diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
index 6c0f3564f6a9..99733665be07 100644
--- a/arch/arm64/include/asm/elf.h
+++ b/arch/arm64/include/asm/elf.h
@@ -180,8 +180,6 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG];
#define compat_start_thread compat_start_thread
#define COMPAT_SET_PERSONALITY(ex) \
do { \
- if (current->mm) \
- fpsimd_enable_trap(); \
set_thread_flag(TIF_32BIT); \
} while (0)
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 10133c0c60f4..74bc79e99717 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -20,6 +20,7 @@
#include <linux/cpu.h>
#include <linux/cpu_pm.h>
#include <linux/kernel.h>
+#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/signal.h>
@@ -90,11 +91,17 @@
static DEFINE_PER_CPU(struct fpsimd_state *, fpsimd_last_state);
static DEFINE_PER_CPU(int, fpsimd_stg_enable);
+static int fpsimd_settings = 0x1; /* default = 0x1 */
+module_param(fpsimd_settings, int, 0644);
+
/*
* Trapped FP/ASIMD access.
*/
void do_fpsimd_acc(unsigned int esr, struct pt_regs *regs)
{
+ if (!fpsimd_settings)
+ return;
+
fpsimd_disable_trap();
fpsimd_settings_disable();
this_cpu_write(fpsimd_stg_enable, 0);
@@ -102,6 +109,9 @@ void do_fpsimd_acc(unsigned int esr, struct pt_regs *regs)
void do_fpsimd_acc_compat(unsigned int esr, struct pt_regs *regs)
{
+ if (!fpsimd_settings)
+ return;
+
fpsimd_disable_trap();
fpsimd_settings_enable();
this_cpu_write(fpsimd_stg_enable, 1);
@@ -144,7 +154,7 @@ void fpsimd_thread_switch(struct task_struct *next)
if (current->mm && !test_thread_flag(TIF_FOREIGN_FPSTATE))
fpsimd_save_state(&current->thread.fpsimd_state);
- if (__this_cpu_read(fpsimd_stg_enable)) {
+ if (fpsimd_settings && __this_cpu_read(fpsimd_stg_enable)) {
fpsimd_settings_disable();
this_cpu_write(fpsimd_stg_enable, 0);
}
@@ -167,6 +177,9 @@ void fpsimd_thread_switch(struct task_struct *next)
set_ti_thread_flag(task_thread_info(next),
TIF_FOREIGN_FPSTATE);
+ if (!fpsimd_settings)
+ return;
+
if (test_ti_thread_flag(task_thread_info(next), TIF_32BIT))
fpsimd_enable_trap();
else