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>
This commit is contained in:
parent
d444053499
commit
1f7d497b0a
2 changed files with 14 additions and 3 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue