diff options
| author | Sanrio Alvares <salvares@codeaurora.org> | 2016-01-28 17:10:34 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:19:14 -0700 |
| commit | 1f7d497b0ace1658c36f631dd594fede4ee3cfbb (patch) | |
| tree | f2884267b5b21ae0665a3bb98c77aa140c6c55ec /arch | |
| parent | d44405349999fc1bd5274e75a10b335642da22c7 (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.h | 2 | ||||
| -rw-r--r-- | arch/arm64/kernel/fpsimd.c | 15 |
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(¤t->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 |
