summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Robinson <pbrobinson@gmail.com>2016-12-27 04:21:10 +0000
committerPeter Robinson <pbrobinson@gmail.com>2016-12-27 04:21:10 +0000
commit12a945943d7c7f2a3c4d848683cc9bb76b6fe7af (patch)
treeea8783f7fae5594536f121f49bfbdcc18a0ac5de
parentb4fd5ce16da6980aa022e2deed8af49528edcf80 (diff)
downloadkernel-12a945943d7c7f2a3c4d848683cc9bb76b6fe7af.tar.gz
kernel-12a945943d7c7f2a3c4d848683cc9bb76b6fe7af.tar.xz
kernel-12a945943d7c7f2a3c4d848683cc9bb76b6fe7af.zip
add 3 patches in Linus's upstream to fix aarch64 build
-rw-r--r--fixes-4.10.patch359
-rw-r--r--kernel.spec2
2 files changed, 361 insertions, 0 deletions
diff --git a/fixes-4.10.patch b/fixes-4.10.patch
new file mode 100644
index 000000000..19e86a1e0
--- /dev/null
+++ b/fixes-4.10.patch
@@ -0,0 +1,359 @@
+From b4b8664d291ac1998e0f0bcdc96b6397f0fe68b3 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@zeniv.linux.org.uk>
+Date: Mon, 26 Dec 2016 04:10:19 -0500
+Subject: [PATCH 1/3] arm64: don't pull uaccess.h into *.S
+
+Split asm-only parts of arm64 uaccess.h into a new header and use that
+from *.S.
+
+Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
+---
+ arch/arm64/include/asm/asm-uaccess.h | 65 ++++++++++++++++++++++++++++++++++++
+ arch/arm64/include/asm/uaccess.h | 64 -----------------------------------
+ arch/arm64/kernel/entry.S | 2 +-
+ arch/arm64/lib/clear_user.S | 2 +-
+ arch/arm64/lib/copy_from_user.S | 2 +-
+ arch/arm64/lib/copy_in_user.S | 2 +-
+ arch/arm64/lib/copy_to_user.S | 2 +-
+ arch/arm64/mm/cache.S | 2 +-
+ arch/arm64/xen/hypercall.S | 2 +-
+ 9 files changed, 72 insertions(+), 71 deletions(-)
+ create mode 100644 arch/arm64/include/asm/asm-uaccess.h
+
+diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h
+new file mode 100644
+index 0000000..df411f3
+--- /dev/null
++++ b/arch/arm64/include/asm/asm-uaccess.h
+@@ -0,0 +1,65 @@
++#ifndef __ASM_ASM_UACCESS_H
++#define __ASM_ASM_UACCESS_H
++
++#include <asm/alternative.h>
++#include <asm/kernel-pgtable.h>
++#include <asm/sysreg.h>
++#include <asm/assembler.h>
++
++/*
++ * User access enabling/disabling macros.
++ */
++#ifdef CONFIG_ARM64_SW_TTBR0_PAN
++ .macro __uaccess_ttbr0_disable, tmp1
++ mrs \tmp1, ttbr1_el1 // swapper_pg_dir
++ add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir
++ msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
++ isb
++ .endm
++
++ .macro __uaccess_ttbr0_enable, tmp1
++ get_thread_info \tmp1
++ ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
++ msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
++ isb
++ .endm
++
++ .macro uaccess_ttbr0_disable, tmp1
++alternative_if_not ARM64_HAS_PAN
++ __uaccess_ttbr0_disable \tmp1
++alternative_else_nop_endif
++ .endm
++
++ .macro uaccess_ttbr0_enable, tmp1, tmp2
++alternative_if_not ARM64_HAS_PAN
++ save_and_disable_irq \tmp2 // avoid preemption
++ __uaccess_ttbr0_enable \tmp1
++ restore_irq \tmp2
++alternative_else_nop_endif
++ .endm
++#else
++ .macro uaccess_ttbr0_disable, tmp1
++ .endm
++
++ .macro uaccess_ttbr0_enable, tmp1, tmp2
++ .endm
++#endif
++
++/*
++ * These macros are no-ops when UAO is present.
++ */
++ .macro uaccess_disable_not_uao, tmp1
++ uaccess_ttbr0_disable \tmp1
++alternative_if ARM64_ALT_PAN_NOT_UAO
++ SET_PSTATE_PAN(1)
++alternative_else_nop_endif
++ .endm
++
++ .macro uaccess_enable_not_uao, tmp1, tmp2
++ uaccess_ttbr0_enable \tmp1, \tmp2
++alternative_if ARM64_ALT_PAN_NOT_UAO
++ SET_PSTATE_PAN(0)
++alternative_else_nop_endif
++ .endm
++
++#endif
+diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
+index d26750c..46da3ea 100644
+--- a/arch/arm64/include/asm/uaccess.h
++++ b/arch/arm64/include/asm/uaccess.h
+@@ -22,8 +22,6 @@
+ #include <asm/kernel-pgtable.h>
+ #include <asm/sysreg.h>
+
+-#ifndef __ASSEMBLY__
+-
+ /*
+ * User space memory access functions
+ */
+@@ -424,66 +422,4 @@ extern long strncpy_from_user(char *dest, const char __user *src, long count);
+ extern __must_check long strlen_user(const char __user *str);
+ extern __must_check long strnlen_user(const char __user *str, long n);
+
+-#else /* __ASSEMBLY__ */
+-
+-#include <asm/assembler.h>
+-
+-/*
+- * User access enabling/disabling macros.
+- */
+-#ifdef CONFIG_ARM64_SW_TTBR0_PAN
+- .macro __uaccess_ttbr0_disable, tmp1
+- mrs \tmp1, ttbr1_el1 // swapper_pg_dir
+- add \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir
+- msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
+- isb
+- .endm
+-
+- .macro __uaccess_ttbr0_enable, tmp1
+- get_thread_info \tmp1
+- ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
+- msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
+- isb
+- .endm
+-
+- .macro uaccess_ttbr0_disable, tmp1
+-alternative_if_not ARM64_HAS_PAN
+- __uaccess_ttbr0_disable \tmp1
+-alternative_else_nop_endif
+- .endm
+-
+- .macro uaccess_ttbr0_enable, tmp1, tmp2
+-alternative_if_not ARM64_HAS_PAN
+- save_and_disable_irq \tmp2 // avoid preemption
+- __uaccess_ttbr0_enable \tmp1
+- restore_irq \tmp2
+-alternative_else_nop_endif
+- .endm
+-#else
+- .macro uaccess_ttbr0_disable, tmp1
+- .endm
+-
+- .macro uaccess_ttbr0_enable, tmp1, tmp2
+- .endm
+-#endif
+-
+-/*
+- * These macros are no-ops when UAO is present.
+- */
+- .macro uaccess_disable_not_uao, tmp1
+- uaccess_ttbr0_disable \tmp1
+-alternative_if ARM64_ALT_PAN_NOT_UAO
+- SET_PSTATE_PAN(1)
+-alternative_else_nop_endif
+- .endm
+-
+- .macro uaccess_enable_not_uao, tmp1, tmp2
+- uaccess_ttbr0_enable \tmp1, \tmp2
+-alternative_if ARM64_ALT_PAN_NOT_UAO
+- SET_PSTATE_PAN(0)
+-alternative_else_nop_endif
+- .endm
+-
+-#endif /* __ASSEMBLY__ */
+-
+ #endif /* __ASM_UACCESS_H */
+diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
+index a7504f4..923841f 100644
+--- a/arch/arm64/kernel/entry.S
++++ b/arch/arm64/kernel/entry.S
+@@ -31,7 +31,7 @@
+ #include <asm/memory.h>
+ #include <asm/ptrace.h>
+ #include <asm/thread_info.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+ #include <asm/unistd.h>
+
+ /*
+diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S
+index add4a13..e88fb99 100644
+--- a/arch/arm64/lib/clear_user.S
++++ b/arch/arm64/lib/clear_user.S
+@@ -17,7 +17,7 @@
+ */
+ #include <linux/linkage.h>
+
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+
+ .text
+
+diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S
+index fd6cd05..4b5d826 100644
+--- a/arch/arm64/lib/copy_from_user.S
++++ b/arch/arm64/lib/copy_from_user.S
+@@ -17,7 +17,7 @@
+ #include <linux/linkage.h>
+
+ #include <asm/cache.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+
+ /*
+ * Copy from user space to a kernel buffer (alignment handled by the hardware)
+diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S
+index d828540..47184c3 100644
+--- a/arch/arm64/lib/copy_in_user.S
++++ b/arch/arm64/lib/copy_in_user.S
+@@ -19,7 +19,7 @@
+ #include <linux/linkage.h>
+
+ #include <asm/cache.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+
+ /*
+ * Copy from user space to user space (alignment handled by the hardware)
+diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S
+index 3e6ae26..351f076 100644
+--- a/arch/arm64/lib/copy_to_user.S
++++ b/arch/arm64/lib/copy_to_user.S
+@@ -17,7 +17,7 @@
+ #include <linux/linkage.h>
+
+ #include <asm/cache.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+
+ /*
+ * Copy to user space from a kernel buffer (alignment handled by the hardware)
+diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
+index 17f422a..83c27b6e 100644
+--- a/arch/arm64/mm/cache.S
++++ b/arch/arm64/mm/cache.S
+@@ -23,7 +23,7 @@
+ #include <asm/assembler.h>
+ #include <asm/cpufeature.h>
+ #include <asm/alternative.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+
+ /*
+ * flush_icache_range(start,end)
+diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S
+index 47cf3f9..947830a 100644
+--- a/arch/arm64/xen/hypercall.S
++++ b/arch/arm64/xen/hypercall.S
+@@ -49,7 +49,7 @@
+
+ #include <linux/linkage.h>
+ #include <asm/assembler.h>
+-#include <linux/uaccess.h>
++#include <asm/asm-uaccess.h>
+ #include <xen/interface/xen.h>
+
+
+--
+2.9.3
+
+From b9d9d6911bd5c370ad4b3aa57d758c093d17aed5 Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Mon, 26 Dec 2016 22:58:19 +0100
+Subject: [PATCH 2/3] smp/hotplug: Undo tglxs brainfart
+
+The attempt to prevent overwriting an active state resulted in a
+disaster which effectively disables all dynamically allocated hotplug
+states.
+
+Cleanup the mess.
+
+Fixes: dc280d936239 ("cpu/hotplug: Prevent overwriting of callbacks")
+Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de>
+Reported-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+---
+ kernel/cpu.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/kernel/cpu.c b/kernel/cpu.c
+index 042fd7e..f75c4d0 100644
+--- a/kernel/cpu.c
++++ b/kernel/cpu.c
+@@ -1471,6 +1471,7 @@ int __cpuhp_setup_state(enum cpuhp_state state,
+ bool multi_instance)
+ {
+ int cpu, ret = 0;
++ bool dynstate;
+
+ if (cpuhp_cb_check(state) || !name)
+ return -EINVAL;
+@@ -1480,6 +1481,12 @@ int __cpuhp_setup_state(enum cpuhp_state state,
+ ret = cpuhp_store_callbacks(state, name, startup, teardown,
+ multi_instance);
+
++ dynstate = state == CPUHP_AP_ONLINE_DYN;
++ if (ret > 0 && dynstate) {
++ state = ret;
++ ret = 0;
++ }
++
+ if (ret || !invoke || !startup)
+ goto out;
+
+@@ -1508,7 +1515,7 @@ int __cpuhp_setup_state(enum cpuhp_state state,
+ * If the requested state is CPUHP_AP_ONLINE_DYN, return the
+ * dynamically allocated state in case of success.
+ */
+- if (!ret && state == CPUHP_AP_ONLINE_DYN)
++ if (!ret && dynstate)
+ return state;
+ return ret;
+ }
+--
+2.9.3
+
+From 0dad3a3014a0b9e72521ff44f17e0054f43dcdea Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Mon, 26 Dec 2016 22:58:20 +0100
+Subject: [PATCH 3/3] x86/mce/AMD: Make the init code more robust
+
+If mce_device_init() fails then the mce device pointer is NULL and the
+AMD mce code happily dereferences it.
+
+Add a sanity check.
+
+Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de>
+Reported-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+---
+ arch/x86/kernel/cpu/mcheck/mce_amd.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c
+index ffacfdc..a5fd137 100644
+--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c
++++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c
+@@ -1182,6 +1182,9 @@ static int threshold_create_bank(unsigned int cpu, unsigned int bank)
+ const char *name = get_name(bank, NULL);
+ int err = 0;
+
++ if (!dev)
++ return -ENODEV;
++
+ if (is_shared_bank(bank)) {
+ nb = node_to_amd_nb(amd_get_nb_id(cpu));
+
+--
+2.9.3
+
diff --git a/kernel.spec b/kernel.spec
index 5a1fcbdcf..1f4d22250 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -496,6 +496,8 @@ Source5005: kbuild-AFTER_LINK.patch
# Standalone patches
+Patch100: fixes-4.10.patch
+
# a tempory patch for QCOM hardware enablement. Will be gone by end of 2016/F-26 GA
Patch421: qcom-QDF2432-tmp-errata.patch