diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-16 16:34:58 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-16 16:34:58 -0700 |
commit | 1c37e5b69325dc91a96404dafd05fea09756db55 (patch) | |
tree | 3f2f23291727cf37edac98394bb17d417ba2064d | |
parent | 96bd85a9ee09f29e166c469cc767b164a5b397c4 (diff) | |
parent | c14c8b7e5568aee21796230b4d03e18d028fcda5 (diff) |
Merge "Revert "arm64: fpsimd: Enable FP(floating-point) settings for msm8996""
-rw-r--r-- | arch/arm64/Kconfig | 31 | ||||
-rw-r--r-- | arch/arm64/configs/msm-perf_defconfig | 2 | ||||
-rw-r--r-- | arch/arm64/configs/msm_defconfig | 2 | ||||
-rw-r--r-- | arch/arm64/include/asm/app_api.h | 42 | ||||
-rw-r--r-- | arch/arm64/include/asm/elf.h | 7 | ||||
-rw-r--r-- | arch/arm64/include/asm/fpsimd.h | 8 | ||||
-rw-r--r-- | arch/arm64/kernel/Makefile | 2 | ||||
-rw-r--r-- | arch/arm64/kernel/app_api.c | 75 | ||||
-rw-r--r-- | arch/arm64/kernel/app_setting.c | 120 | ||||
-rw-r--r-- | arch/arm64/kernel/entry-fpsimd.S | 16 | ||||
-rw-r--r-- | arch/arm64/kernel/entry.S | 13 | ||||
-rw-r--r-- | arch/arm64/kernel/fpsimd.c | 49 | ||||
-rw-r--r-- | include/linux/mm_types.h | 4 | ||||
-rw-r--r-- | kernel/sched/core.c | 8 | ||||
-rw-r--r-- | mm/mmap.c | 9 |
15 files changed, 4 insertions, 384 deletions
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 69c9b84b367b..0314b80695ca 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -513,37 +513,6 @@ config ARM64_64K_PAGES endchoice -config MSM_APP_API - bool "API support to enable / disable app settings for MSM8996" - depends on ARCH_MSM8996 && (ENABLE_FP_SIMD_SETTINGS || MSM_APP_SETTINGS) - help - Add API support to enable / disable the app settings to be used - at runtime. These APIs are used to enable / disable app setting - when specific aarch32 or aarch64 processes are running. - - If you are not sure what to do, select 'N' here. - -config ENABLE_FP_SIMD_SETTINGS - bool "Enable FP(Floating Point) Settings for Qualcomm MSM8996" - depends on ARCH_MSM8996 - select MSM_APP_API - help - Enable FP(Floating Point) and SIMD settings for the MSM8996 during - the execution of the aarch32 processes and disable these settings - when you switch to the aarch64 processes. - - If you are not sure what to do, select 'N' here. - -config MSM_APP_SETTINGS - bool "Support to enable / disable app settings for MSM8996" - depends on ARCH_MSM8996 - select MSM_APP_API - help - Expose an interface used by the userspace at runtime to - enable / disable the app specific settings. - - If you are not sure what to do, select 'N' here. - choice prompt "Virtual address space size" default ARM64_VA_BITS_39 if ARM64_4K_PAGES diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index 210017d4467e..9ded3e3d5ff4 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -44,8 +44,6 @@ CONFIG_ARCH_QCOM=y CONFIG_ARCH_MSM8996=y CONFIG_PCI=y CONFIG_PCI_MSM=y -CONFIG_ENABLE_FP_SIMD_SETTINGS=y -CONFIG_MSM_APP_SETTINGS=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 CONFIG_PREEMPT=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index 18a4322d9f9f..f4b10dcd45cb 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -41,8 +41,6 @@ CONFIG_ARCH_QCOM=y CONFIG_ARCH_MSM8996=y CONFIG_PCI=y CONFIG_PCI_MSM=y -CONFIG_ENABLE_FP_SIMD_SETTINGS=y -CONFIG_MSM_APP_SETTINGS=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 CONFIG_PREEMPT=y diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h deleted file mode 100644 index 2162400fde13..000000000000 --- a/arch/arm64/include/asm/app_api.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef __ASM_APP_API_H -#define __ASM_APP_API_H - -#include <linux/types.h> -#include <linux/sched.h> -#include <linux/fs.h> - -#define APP_SETTING_BIT 30 -#define MAX_ENTRIES 10 - -/* - * APIs to set / clear the app setting bits - * in the register. - */ -#ifdef CONFIG_MSM_APP_API -extern void set_app_setting_bit(uint32_t bit); -extern void clear_app_setting_bit(uint32_t bit); -#else -static inline void set_app_setting_bit(uint32_t bit) {} -static inline void clear_app_setting_bit(uint32_t bit) {} -#endif - -#ifdef CONFIG_MSM_APP_SETTINGS -extern void switch_app_setting_bit(struct task_struct *prev, - struct task_struct *next); -extern void apply_app_setting_bit(struct file *file); -extern bool use_app_setting; -#endif - -#endif diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h index 99733665be07..faad6df49e5b 100644 --- a/arch/arm64/include/asm/elf.h +++ b/arch/arm64/include/asm/elf.h @@ -23,7 +23,6 @@ */ #include <asm/ptrace.h> #include <asm/user.h> -#include <asm/fpsimd.h> typedef unsigned long elf_greg_t; @@ -178,11 +177,7 @@ typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; ((x)->e_flags & EF_ARM_EABI_MASK)) #define compat_start_thread compat_start_thread -#define COMPAT_SET_PERSONALITY(ex) \ -do { \ - set_thread_flag(TIF_32BIT); \ -} while (0) - +#define COMPAT_SET_PERSONALITY(ex) set_thread_flag(TIF_32BIT); #define COMPAT_ARCH_DLINFO extern int aarch32_setup_vectors_page(struct linux_binprm *bprm, int uses_interp); diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h index 3efaa5cebc03..50f559f574fe 100644 --- a/arch/arm64/include/asm/fpsimd.h +++ b/arch/arm64/include/asm/fpsimd.h @@ -81,14 +81,6 @@ extern void fpsimd_save_partial_state(struct fpsimd_partial_state *state, u32 num_regs); extern void fpsimd_load_partial_state(struct fpsimd_partial_state *state); -#ifdef CONFIG_ENABLE_FP_SIMD_SETTINGS -extern void fpsimd_disable_trap(void); -extern void fpsimd_enable_trap(void); -#else -static inline void fpsimd_disable_trap(void) {} -static inline void fpsimd_enable_trap(void) {} -#endif - #endif #endif diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 57e55e4d5fcc..9f7794c5743f 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -43,8 +43,6 @@ arm64-obj-$(CONFIG_EFI) += efi.o efi-entry.stub.o arm64-obj-$(CONFIG_PCI) += pci.o arm64-obj-$(CONFIG_ARMV8_DEPRECATED) += armv8_deprecated.o arm64-obj-$(CONFIG_ACPI) += acpi.o -arm64-obj-$(CONFIG_MSM_APP_API) += app_api.o -arm64-obj-$(CONFIG_MSM_APP_SETTINGS) += app_setting.o obj-y += $(arm64-obj-y) vdso/ obj-m += $(arm64-obj-m) diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c deleted file mode 100644 index 39eeee1a9029..000000000000 --- a/arch/arm64/kernel/app_api.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/bitops.h> -#include <linux/spinlock.h> -#include <linux/cpu.h> -#include <linux/export.h> - -#include <asm/app_api.h> - -static spinlock_t spinlock; -static DEFINE_PER_CPU(int, app_config_applied); -static unsigned long app_config_set[NR_CPUS]; -static unsigned long app_config_clear[NR_CPUS]; - -void set_app_setting_bit(uint32_t bit) -{ - unsigned long flags; - uint64_t reg; - int cpu; - - spin_lock_irqsave(&spinlock, flags); - asm volatile("mrs %0, S3_1_C15_C15_0" : "=r" (reg)); - reg = reg | BIT(bit); - isb(); - asm volatile("msr S3_1_C15_C15_0, %0" : : "r" (reg)); - isb(); - if (bit == APP_SETTING_BIT) { - cpu = raw_smp_processor_id(); - app_config_set[cpu]++; - - this_cpu_write(app_config_applied, 1); - } - spin_unlock_irqrestore(&spinlock, flags); - -} -EXPORT_SYMBOL(set_app_setting_bit); - -void clear_app_setting_bit(uint32_t bit) -{ - unsigned long flags; - uint64_t reg; - int cpu; - - spin_lock_irqsave(&spinlock, flags); - asm volatile("mrs %0, S3_1_C15_C15_0" : "=r" (reg)); - reg = reg & ~BIT(bit); - isb(); - asm volatile("msr S3_1_C15_C15_0, %0" : : "r" (reg)); - isb(); - if (bit == APP_SETTING_BIT) { - cpu = raw_smp_processor_id(); - app_config_clear[cpu]++; - - this_cpu_write(app_config_applied, 0); - } - spin_unlock_irqrestore(&spinlock, flags); -} -EXPORT_SYMBOL(clear_app_setting_bit); - -static int __init init_app_api(void) -{ - spin_lock_init(&spinlock); - return 0; -} -early_initcall(init_app_api); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c deleted file mode 100644 index 6b4eb28d0e24..000000000000 --- a/arch/arm64/kernel/app_setting.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include <linux/module.h> -#include <linux/cpu.h> -#include <linux/slab.h> -#include <linux/notifier.h> - -#include <asm/app_api.h> - -#define MAX_LEN 100 - -static char *lib_names[MAX_ENTRIES]; -static unsigned int count; -static struct mutex mutex; - -static char lib_str[MAX_LEN] = ""; -static struct kparam_string kps = { - .string = lib_str, - .maxlen = MAX_LEN, -}; -static int set_name(const char *str, struct kernel_param *kp); -module_param_call(lib_name, set_name, param_get_string, &kps, S_IWUSR); - -bool use_app_setting = true; -module_param(use_app_setting, bool, 0644); -MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); - -static int set_name(const char *str, struct kernel_param *kp) -{ - int len = strlen(str); - char *name; - - if (len >= MAX_LEN) { - pr_err("app_setting: name string too long\n"); - return -ENOSPC; - } - - /* - * echo adds '\n' which we need to chop off later - */ - name = kzalloc(len + 1, GFP_KERNEL); - if (!name) - return -ENOMEM; - - strlcpy(name, str, len + 1); - - if (name[len - 1] == '\n') - name[len - 1] = '\0'; - - mutex_lock(&mutex); - if (count < MAX_ENTRIES) { - lib_names[count] = name; - /* - * mb to ensure that the new lib_names entry is present - * before updating the view presented by get_lib_names - */ - mb(); - count++; - } else { - pr_err("app_setting: set name failed. Max entries reached\n"); - kfree(name); - mutex_unlock(&mutex); - return -EPERM; - } - mutex_unlock(&mutex); - - return 0; -} - -void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next) -{ - if (prev->mm && unlikely(prev->mm->app_setting)) - clear_app_setting_bit(APP_SETTING_BIT); - - if (next->mm && unlikely(next->mm->app_setting)) - set_app_setting_bit(APP_SETTING_BIT); -} -EXPORT_SYMBOL(switch_app_setting_bit); - -void apply_app_setting_bit(struct file *file) -{ - bool found = false; - int i; - - if (file && file->f_path.dentry) { - const char *name = file->f_path.dentry->d_name.name; - - for (i = 0; i < count; i++) { - if (unlikely(!strcmp(name, lib_names[i]))) { - found = true; - break; - } - } - if (found) { - preempt_disable(); - set_app_setting_bit(APP_SETTING_BIT); - /* This will take care of child processes as well */ - current->mm->app_setting = 1; - preempt_enable(); - } - } -} -EXPORT_SYMBOL(apply_app_setting_bit); - -static int __init app_setting_init(void) -{ - mutex_init(&mutex); - return 0; -} -module_init(app_setting_init); diff --git a/arch/arm64/kernel/entry-fpsimd.S b/arch/arm64/kernel/entry-fpsimd.S index 1ffe15459c92..c44a82f146b1 100644 --- a/arch/arm64/kernel/entry-fpsimd.S +++ b/arch/arm64/kernel/entry-fpsimd.S @@ -64,20 +64,4 @@ ENTRY(fpsimd_load_partial_state) ret ENDPROC(fpsimd_load_partial_state) -#ifdef CONFIG_ENABLE_FP_SIMD_SETTINGS -ENTRY(fpsimd_enable_trap) - mrs x0, cpacr_el1 - bic x0, x0, #(3 << 20) - orr x0, x0, #(1 << 20) - msr cpacr_el1, x0 - ret -ENDPROC(fpsimd_enable_trap) -ENTRY(fpsimd_disable_trap) - mrs x0, cpacr_el1 - orr x0, x0, #(3 << 20) - msr cpacr_el1, x0 - ret -ENDPROC(fpsimd_disable_trap) -#endif - #endif diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 485186bff022..e3131b39fbf2 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -427,7 +427,7 @@ el0_sync_compat: cmp x24, #ESR_ELx_EC_IABT_LOW // instruction abort in EL0 b.eq el0_ia cmp x24, #ESR_ELx_EC_FP_ASIMD // FP/ASIMD access - b.eq el0_fpsimd_acc_compat + b.eq el0_fpsimd_acc cmp x24, #ESR_ELx_EC_FP_EXC32 // FP/ASIMD exception b.eq el0_fpsimd_exc cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception @@ -498,17 +498,6 @@ el0_fpsimd_acc: mov x1, sp bl do_fpsimd_acc b ret_to_user -el0_fpsimd_acc_compat: - /* - * Floating Point or Advanced SIMD access - */ - enable_dbg - ct_user_exit - mov x0, x25 - mov x1, sp - bl do_fpsimd_acc_compat - b ret_to_user - el0_fpsimd_exc: /* * Floating Point or Advanced SIMD exception diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index 2ed553f3a4ae..4c46c54a3ad7 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -20,7 +20,6 @@ #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> @@ -28,7 +27,6 @@ #include <asm/fpsimd.h> #include <asm/cputype.h> -#include <asm/app_api.h> #define FPEXC_IOF (1 << 0) #define FPEXC_DZF (1 << 1) @@ -37,8 +35,6 @@ #define FPEXC_IXF (1 << 4) #define FPEXC_IDF (1 << 7) -#define FP_SIMD_BIT 31 - /* * In order to reduce the number of times the FPSIMD state is needlessly saved * and restored, we need to keep track of two things: @@ -92,42 +88,14 @@ * whatever is in the FPSIMD registers is not saved to memory, but discarded. */ 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); - -void fpsimd_settings_enable(void) -{ - set_app_setting_bit(FP_SIMD_BIT); -} - -void fpsimd_settings_disable(void) -{ - clear_app_setting_bit(FP_SIMD_BIT); -} /* * 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); -} - -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); + /* TODO: implement lazy context saving/restoring */ + WARN_ON(1); } /* @@ -167,11 +135,6 @@ 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 (fpsimd_settings && __this_cpu_read(fpsimd_stg_enable)) { - fpsimd_settings_disable(); - this_cpu_write(fpsimd_stg_enable, 0); - } - if (next->mm) { /* * If we are switching to a task whose most recent userland @@ -189,14 +152,6 @@ void fpsimd_thread_switch(struct task_struct *next) else 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 - fpsimd_disable_trap(); } } diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 9f9e60736eba..ea0009064bbc 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -522,10 +522,6 @@ struct mm_struct { #ifdef CONFIG_HUGETLB_PAGE atomic_long_t hugetlb_usage; #endif -#ifdef CONFIG_MSM_APP_SETTINGS - int app_setting; -#endif - }; static inline void mm_init_cpumask(struct mm_struct *mm) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 58303b3dc356..db0472b37feb 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -85,9 +85,6 @@ #ifdef CONFIG_PARAVIRT #include <asm/paravirt.h> #endif -#ifdef CONFIG_MSM_APP_SETTINGS -#include <asm/app_api.h> -#endif #include "sched.h" #include "../workqueue_internal.h" @@ -5895,11 +5892,6 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, fire_sched_out_preempt_notifiers(prev, next); prepare_lock_switch(rq, next); prepare_arch_switch(next); - -#ifdef CONFIG_MSM_APP_SETTINGS - if (use_app_setting) - switch_app_setting_bit(prev, next); -#endif } /** diff --git a/mm/mmap.c b/mm/mmap.c index 8b0a0ed2c466..6c561acdca92 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -48,10 +48,6 @@ #include <asm/tlb.h> #include <asm/mmu_context.h> -#ifdef CONFIG_MSM_APP_SETTINGS -#include <asm/app_api.h> -#endif - #include "internal.h" #ifndef arch_mmap_check @@ -1301,11 +1297,6 @@ unsigned long do_mmap(struct file *file, unsigned long addr, if (!len) return -EINVAL; -#ifdef CONFIG_MSM_APP_SETTINGS - if (use_app_setting) - apply_app_setting_bit(file); -#endif - /* * Does the application expect PROT_READ to imply PROT_EXEC? * |