From 0ce6012eebdbcdea848b53cb0adeac64705509fa Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 6 Dec 2016 21:23:25 +0100 Subject: [PATCH] 4.4-stable patches added patches: arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch --- ...alls-instead-of-calling-them-via-ipi.patch | 105 ++++++++++++++++++ ...ate.pan-from-the-cpu_enable_pan-call.patch | 59 ++++++++++ ...figure-pstate-after-resume-from-idle.patch | 58 ++++++++++ queue-4.4/series | 3 + 4 files changed, 225 insertions(+) create mode 100644 queue-4.4/arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch create mode 100644 queue-4.4/arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch create mode 100644 queue-4.4/arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch diff --git a/queue-4.4/arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch b/queue-4.4/arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch new file mode 100644 index 00000000000..f6117c813ff --- /dev/null +++ b/queue-4.4/arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch @@ -0,0 +1,105 @@ +From 2a6dcb2b5f3e21592ca8dfa198dcce7bec09b020 Mon Sep 17 00:00:00 2001 +From: James Morse +Date: Tue, 18 Oct 2016 11:27:46 +0100 +Subject: arm64: cpufeature: Schedule enable() calls instead of calling them via IPI + +From: James Morse + +commit 2a6dcb2b5f3e21592ca8dfa198dcce7bec09b020 upstream. + +The enable() call for a cpufeature/errata is called using on_each_cpu(). +This issues a cross-call IPI to get the work done. Implicitly, this +stashes the running PSTATE in SPSR when the CPU receives the IPI, and +restores it when we return. This means an enable() call can never modify +PSTATE. + +To allow PAN to do this, change the on_each_cpu() call to use +stop_machine(). This schedules the work on each CPU which allows +us to modify PSTATE. + +This involves changing the protype of all the enable() functions. + +enable_cpu_capabilities() is called during boot and enables the feature +on all online CPUs. This path now uses stop_machine(). CPU features for +hotplug'd CPUs are enabled by verify_local_cpu_features() which only +acts on the local CPU, and can already modify the running PSTATE as it +is called from secondary_start_kernel(). + +Reported-by: Tony Thompson +Reported-by: Vladimir Murzin +Signed-off-by: James Morse +Cc: Suzuki K Poulose +Signed-off-by: Will Deacon +[Removed enable() hunks for features/errata v4.4. doesn't have. Changed + caps->enable arg in enable_cpu_capabilities()] +Signed-off-by: James Morse +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm64/include/asm/cpufeature.h | 2 +- + arch/arm64/include/asm/processor.h | 2 +- + arch/arm64/kernel/cpufeature.c | 10 +++++++++- + arch/arm64/mm/fault.c | 3 ++- + 4 files changed, 13 insertions(+), 4 deletions(-) + +--- a/arch/arm64/include/asm/cpufeature.h ++++ b/arch/arm64/include/asm/cpufeature.h +@@ -77,7 +77,7 @@ struct arm64_cpu_capabilities { + const char *desc; + u16 capability; + bool (*matches)(const struct arm64_cpu_capabilities *); +- void (*enable)(void *); /* Called on all active CPUs */ ++ int (*enable)(void *); /* Called on all active CPUs */ + union { + struct { /* To be used for erratum handling only */ + u32 midr_model; +--- a/arch/arm64/include/asm/processor.h ++++ b/arch/arm64/include/asm/processor.h +@@ -186,6 +186,6 @@ static inline void spin_lock_prefetch(co + + #endif + +-void cpu_enable_pan(void *__unused); ++int cpu_enable_pan(void *__unused); + + #endif /* __ASM_PROCESSOR_H */ +--- a/arch/arm64/kernel/cpufeature.c ++++ b/arch/arm64/kernel/cpufeature.c +@@ -19,7 +19,9 @@ + #define pr_fmt(fmt) "CPU features: " fmt + + #include ++#include + #include ++#include + #include + #include + #include +@@ -764,7 +766,13 @@ static void enable_cpu_capabilities(cons + + for (i = 0; caps[i].desc; i++) + if (caps[i].enable && cpus_have_cap(caps[i].capability)) +- on_each_cpu(caps[i].enable, NULL, true); ++ /* ++ * Use stop_machine() as it schedules the work allowing ++ * us to modify PSTATE, instead of on_each_cpu() which ++ * uses an IPI, giving us a PSTATE that disappears when ++ * we return. ++ */ ++ stop_machine(caps[i].enable, NULL, cpu_online_mask); + } + + #ifdef CONFIG_HOTPLUG_CPU +--- a/arch/arm64/mm/fault.c ++++ b/arch/arm64/mm/fault.c +@@ -606,8 +606,9 @@ asmlinkage int __exception do_debug_exce + } + + #ifdef CONFIG_ARM64_PAN +-void cpu_enable_pan(void *__unused) ++int cpu_enable_pan(void *__unused) + { + config_sctlr_el1(SCTLR_EL1_SPAN, 0); ++ return 0; + } + #endif /* CONFIG_ARM64_PAN */ diff --git a/queue-4.4/arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch b/queue-4.4/arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch new file mode 100644 index 00000000000..a1a8020b349 --- /dev/null +++ b/queue-4.4/arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch @@ -0,0 +1,59 @@ +From 7209c868600bd8926e37c10b9aae83124ccc1dd8 Mon Sep 17 00:00:00 2001 +From: James Morse +Date: Tue, 18 Oct 2016 11:27:47 +0100 +Subject: arm64: mm: Set PSTATE.PAN from the cpu_enable_pan() call + +From: James Morse + +commit 7209c868600bd8926e37c10b9aae83124ccc1dd8 upstream. + +Commit 338d4f49d6f7 ("arm64: kernel: Add support for Privileged Access +Never") enabled PAN by enabling the 'SPAN' feature-bit in SCTLR_EL1. +This means the PSTATE.PAN bit won't be set until the next return to the +kernel from userspace. On a preemptible kernel we may schedule work that +accesses userspace on a CPU before it has done this. + +Now that cpufeature enable() calls are scheduled via stop_machine(), we +can set PSTATE.PAN from the cpu_enable_pan() call. + +Add WARN_ON_ONCE(in_interrupt()) to check the PSTATE value we updated +is not immediately discarded. + +Reported-by: Tony Thompson +Reported-by: Vladimir Murzin +Signed-off-by: James Morse +[will: fixed typo in comment] +Signed-off-by: Will Deacon +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm64/mm/fault.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/arch/arm64/mm/fault.c ++++ b/arch/arm64/mm/fault.c +@@ -29,7 +29,9 @@ + #include + #include + #include ++#include + ++#include + #include + #include + #include +@@ -608,7 +610,14 @@ asmlinkage int __exception do_debug_exce + #ifdef CONFIG_ARM64_PAN + int cpu_enable_pan(void *__unused) + { ++ /* ++ * We modify PSTATE. This won't work from irq context as the PSTATE ++ * is discarded once we return from the exception. ++ */ ++ WARN_ON_ONCE(in_interrupt()); ++ + config_sctlr_el1(SCTLR_EL1_SPAN, 0); ++ asm(SET_PSTATE_PAN(1)); + return 0; + } + #endif /* CONFIG_ARM64_PAN */ diff --git a/queue-4.4/arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch b/queue-4.4/arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch new file mode 100644 index 00000000000..50a5b9b1f3f --- /dev/null +++ b/queue-4.4/arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch @@ -0,0 +1,58 @@ +From d08544127d9fb4505635e3cb6871fd50a42947bd Mon Sep 17 00:00:00 2001 +From: James Morse +Date: Tue, 18 Oct 2016 11:27:48 +0100 +Subject: arm64: suspend: Reconfigure PSTATE after resume from idle + +From: James Morse + +commit d08544127d9fb4505635e3cb6871fd50a42947bd upstream. + +The suspend/resume path in kernel/sleep.S, as used by cpu-idle, does not +save/restore PSTATE. As a result of this cpufeatures that were detected +and have bits in PSTATE get lost when we resume from idle. + +UAO gets set appropriately on the next context switch. PAN will be +re-enabled next time we return from user-space, but on a preemptible +kernel we may run work accessing user space before this point. + +Add code to re-enable theses two features in __cpu_suspend_exit(). +We re-use uao_thread_switch() passing current. + +Signed-off-by: James Morse +Cc: Lorenzo Pieralisi +Signed-off-by: Will Deacon +[Removed UAO hooks and commit-message references: this feature is not + present in v4.4] +Signed-off-by: James Morse +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arm64/kernel/suspend.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/arch/arm64/kernel/suspend.c ++++ b/arch/arm64/kernel/suspend.c +@@ -1,7 +1,9 @@ + #include + #include + #include ++#include + #include ++#include + #include + #include + #include +@@ -111,6 +113,13 @@ int cpu_suspend(unsigned long arg, int ( + set_my_cpu_offset(per_cpu_offset(smp_processor_id())); + + /* ++ * PSTATE was not saved over suspend/resume, re-enable any ++ * detected features that might not have been set correctly. ++ */ ++ asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN, ++ CONFIG_ARM64_PAN)); ++ ++ /* + * Restore HW breakpoint registers to sane values + * before debug exceptions are possibly reenabled + * through local_dbg_restore. diff --git a/queue-4.4/series b/queue-4.4/series index a242114deed..e9f4c3036f4 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -8,3 +8,6 @@ pci-export-pcie_find_root_port.patch pci-set-read-completion-boundary-to-128-iff-root-port-supports-it-_hpx.patch mwifiex-printk-overflow-with-32-byte-ssids.patch pwm-fix-device-reference-leak.patch +arm64-cpufeature-schedule-enable-calls-instead-of-calling-them-via-ipi.patch +arm64-mm-set-pstate.pan-from-the-cpu_enable_pan-call.patch +arm64-suspend-reconfigure-pstate-after-resume-from-idle.patch -- 2.47.3