Loading arch/arm64/include/asm/elf.h +0 −2 Original line number Diff line number Diff line Loading @@ -184,8 +184,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) Loading arch/arm64/kernel/fpsimd.c +14 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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 Loading
arch/arm64/include/asm/elf.h +0 −2 Original line number Diff line number Diff line Loading @@ -184,8 +184,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) Loading
arch/arm64/kernel/fpsimd.c +14 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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