From c2fec7c4dbcc31a1c7da8453de1ab9109974c57c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 2 Apr 2022 15:55:35 +0200 Subject: [PATCH] 5.4-stable patches added patches: powerpc-fix-build-errors-with-newer-binutils.patch powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch powerpc-lib-sstep-fix-sthcx-instruction.patch --- ...fix-build-errors-with-newer-binutils.patch | 164 ++++++++++++++++++ ...fix-build-errors-with-newer-binutils.patch | 61 +++++++ ...erpc-lib-sstep-fix-sthcx-instruction.patch | 35 ++++ queue-5.4/series | 3 + 4 files changed, 263 insertions(+) create mode 100644 queue-5.4/powerpc-fix-build-errors-with-newer-binutils.patch create mode 100644 queue-5.4/powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch create mode 100644 queue-5.4/powerpc-lib-sstep-fix-sthcx-instruction.patch diff --git a/queue-5.4/powerpc-fix-build-errors-with-newer-binutils.patch b/queue-5.4/powerpc-fix-build-errors-with-newer-binutils.patch new file mode 100644 index 00000000000..05c0aef7a83 --- /dev/null +++ b/queue-5.4/powerpc-fix-build-errors-with-newer-binutils.patch @@ -0,0 +1,164 @@ +From 8667d0d64dd1f84fd41b5897fd87fa9113ae05e3 Mon Sep 17 00:00:00 2001 +From: Anders Roxell +Date: Thu, 24 Feb 2022 17:22:14 +0100 +Subject: powerpc: Fix build errors with newer binutils + +From: Anders Roxell + +commit 8667d0d64dd1f84fd41b5897fd87fa9113ae05e3 upstream. + +Building tinyconfig with gcc (Debian 11.2.0-16) and assembler (Debian +2.37.90.20220207) the following build error shows up: + + {standard input}: Assembler messages: + {standard input}:1190: Error: unrecognized opcode: `stbcix' + {standard input}:1433: Error: unrecognized opcode: `lwzcix' + {standard input}:1453: Error: unrecognized opcode: `stbcix' + {standard input}:1460: Error: unrecognized opcode: `stwcix' + {standard input}:1596: Error: unrecognized opcode: `stbcix' + ... + +Rework to add assembler directives [1] around the instruction. Going +through them one by one shows that the changes should be safe. Like +__get_user_atomic_128_aligned() is only called in p9_hmi_special_emu(), +which according to the name is specific to power9. And __raw_rm_read*() +are only called in things that are powernv or book3s_hv specific. + +[1] https://sourceware.org/binutils/docs/as/PowerPC_002dPseudo.html#PowerPC_002dPseudo + +Cc: stable@vger.kernel.org +Co-developed-by: Arnd Bergmann +Signed-off-by: Arnd Bergmann +Signed-off-by: Anders Roxell +Reviewed-by: Segher Boessenkool +[mpe: Make commit subject more descriptive] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220224162215.3406642-2-anders.roxell@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + arch/powerpc/include/asm/io.h | 40 ++++++++++++++++++++++++++++------- + arch/powerpc/include/asm/uaccess.h | 3 ++ + arch/powerpc/platforms/powernv/rng.c | 6 ++++- + 3 files changed, 40 insertions(+), 9 deletions(-) + +--- a/arch/powerpc/include/asm/io.h ++++ b/arch/powerpc/include/asm/io.h +@@ -345,25 +345,37 @@ static inline void __raw_writeq_be(unsig + */ + static inline void __raw_rm_writeb(u8 val, volatile void __iomem *paddr) + { +- __asm__ __volatile__("stbcix %0,0,%1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ stbcix %0,0,%1; \ ++ .machine pop;" + : : "r" (val), "r" (paddr) : "memory"); + } + + static inline void __raw_rm_writew(u16 val, volatile void __iomem *paddr) + { +- __asm__ __volatile__("sthcix %0,0,%1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ sthcix %0,0,%1; \ ++ .machine pop;" + : : "r" (val), "r" (paddr) : "memory"); + } + + static inline void __raw_rm_writel(u32 val, volatile void __iomem *paddr) + { +- __asm__ __volatile__("stwcix %0,0,%1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ stwcix %0,0,%1; \ ++ .machine pop;" + : : "r" (val), "r" (paddr) : "memory"); + } + + static inline void __raw_rm_writeq(u64 val, volatile void __iomem *paddr) + { +- __asm__ __volatile__("stdcix %0,0,%1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ stdcix %0,0,%1; \ ++ .machine pop;" + : : "r" (val), "r" (paddr) : "memory"); + } + +@@ -375,7 +387,10 @@ static inline void __raw_rm_writeq_be(u6 + static inline u8 __raw_rm_readb(volatile void __iomem *paddr) + { + u8 ret; +- __asm__ __volatile__("lbzcix %0,0, %1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ lbzcix %0,0, %1; \ ++ .machine pop;" + : "=r" (ret) : "r" (paddr) : "memory"); + return ret; + } +@@ -383,7 +398,10 @@ static inline u8 __raw_rm_readb(volatile + static inline u16 __raw_rm_readw(volatile void __iomem *paddr) + { + u16 ret; +- __asm__ __volatile__("lhzcix %0,0, %1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ lhzcix %0,0, %1; \ ++ .machine pop;" + : "=r" (ret) : "r" (paddr) : "memory"); + return ret; + } +@@ -391,7 +409,10 @@ static inline u16 __raw_rm_readw(volatil + static inline u32 __raw_rm_readl(volatile void __iomem *paddr) + { + u32 ret; +- __asm__ __volatile__("lwzcix %0,0, %1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ lwzcix %0,0, %1; \ ++ .machine pop;" + : "=r" (ret) : "r" (paddr) : "memory"); + return ret; + } +@@ -399,7 +420,10 @@ static inline u32 __raw_rm_readl(volatil + static inline u64 __raw_rm_readq(volatile void __iomem *paddr) + { + u64 ret; +- __asm__ __volatile__("ldcix %0,0, %1" ++ __asm__ __volatile__(".machine push; \ ++ .machine power6; \ ++ ldcix %0,0, %1; \ ++ .machine pop;" + : "=r" (ret) : "r" (paddr) : "memory"); + return ret; + } +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -191,8 +191,11 @@ extern long __get_user_bad(void); + */ + #define __get_user_atomic_128_aligned(kaddr, uaddr, err) \ + __asm__ __volatile__( \ ++ ".machine push\n" \ ++ ".machine altivec\n" \ + "1: lvx 0,0,%1 # get user\n" \ + " stvx 0,0,%2 # put kernel\n" \ ++ ".machine pop\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: li %0,%3\n" \ +--- a/arch/powerpc/platforms/powernv/rng.c ++++ b/arch/powerpc/platforms/powernv/rng.c +@@ -43,7 +43,11 @@ static unsigned long rng_whiten(struct p + unsigned long parity; + + /* Calculate the parity of the value */ +- asm ("popcntd %0,%1" : "=r" (parity) : "r" (val)); ++ asm (".machine push; \ ++ .machine power7; \ ++ popcntd %0,%1; \ ++ .machine pop;" ++ : "=r" (parity) : "r" (val)); + + /* xor our value with the previous mask */ + val ^= rng->mask; diff --git a/queue-5.4/powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch b/queue-5.4/powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch new file mode 100644 index 00000000000..2270d596252 --- /dev/null +++ b/queue-5.4/powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch @@ -0,0 +1,61 @@ +From 8219d31effa7be5dbc7ff915d7970672e028c701 Mon Sep 17 00:00:00 2001 +From: Anders Roxell +Date: Thu, 24 Feb 2022 17:22:15 +0100 +Subject: powerpc/lib/sstep: Fix build errors with newer binutils + +From: Anders Roxell + +commit 8219d31effa7be5dbc7ff915d7970672e028c701 upstream. + +Building tinyconfig with gcc (Debian 11.2.0-16) and assembler (Debian +2.37.90.20220207) the following build error shows up: + + {standard input}: Assembler messages: + {standard input}:10576: Error: unrecognized opcode: `stbcx.' + {standard input}:10680: Error: unrecognized opcode: `lharx' + {standard input}:10694: Error: unrecognized opcode: `lbarx' + +Rework to add assembler directives [1] around the instruction. The +problem with this might be that we can trick a power6 into +single-stepping through an stbcx. for instance, and it will execute that +in kernel mode. + +[1] https://sourceware.org/binutils/docs/as/PowerPC_002dPseudo.html#PowerPC_002dPseudo + +Fixes: 350779a29f11 ("powerpc: Handle most loads and stores in instruction emulation code") +Cc: stable@vger.kernel.org # v4.14+ +Co-developed-by: Arnd Bergmann +Signed-off-by: Arnd Bergmann +Signed-off-by: Anders Roxell +Reviewed-by: Segher Boessenkool +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220224162215.3406642-3-anders.roxell@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + arch/powerpc/lib/sstep.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/arch/powerpc/lib/sstep.c ++++ b/arch/powerpc/lib/sstep.c +@@ -906,7 +906,10 @@ NOKPROBE_SYMBOL(emulate_dcbz); + + #define __put_user_asmx(x, addr, err, op, cr) \ + __asm__ __volatile__( \ ++ ".machine push\n" \ ++ ".machine power8\n" \ + "1: " op " %2,0,%3\n" \ ++ ".machine pop\n" \ + " mfcr %1\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ +@@ -919,7 +922,10 @@ NOKPROBE_SYMBOL(emulate_dcbz); + + #define __get_user_asmx(x, addr, err, op) \ + __asm__ __volatile__( \ ++ ".machine push\n" \ ++ ".machine power8\n" \ + "1: "op" %1,0,%2\n" \ ++ ".machine pop\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: li %0,%3\n" \ diff --git a/queue-5.4/powerpc-lib-sstep-fix-sthcx-instruction.patch b/queue-5.4/powerpc-lib-sstep-fix-sthcx-instruction.patch new file mode 100644 index 00000000000..0cf10b38ce0 --- /dev/null +++ b/queue-5.4/powerpc-lib-sstep-fix-sthcx-instruction.patch @@ -0,0 +1,35 @@ +From a633cb1edddaa643fadc70abc88f89a408fa834a Mon Sep 17 00:00:00 2001 +From: Anders Roxell +Date: Thu, 24 Feb 2022 17:22:13 +0100 +Subject: powerpc/lib/sstep: Fix 'sthcx' instruction + +From: Anders Roxell + +commit a633cb1edddaa643fadc70abc88f89a408fa834a upstream. + +Looks like there been a copy paste mistake when added the instruction +'stbcx' twice and one was probably meant to be 'sthcx'. Changing to +'sthcx' from 'stbcx'. + +Fixes: 350779a29f11 ("powerpc: Handle most loads and stores in instruction emulation code") +Cc: stable@vger.kernel.org # v4.14+ +Reported-by: Arnd Bergmann +Signed-off-by: Anders Roxell +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20220224162215.3406642-1-anders.roxell@linaro.org +Signed-off-by: Greg Kroah-Hartman +--- + arch/powerpc/lib/sstep.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/powerpc/lib/sstep.c ++++ b/arch/powerpc/lib/sstep.c +@@ -2912,7 +2912,7 @@ int emulate_loadstore(struct pt_regs *re + __put_user_asmx(op->val, ea, err, "stbcx.", cr); + break; + case 2: +- __put_user_asmx(op->val, ea, err, "stbcx.", cr); ++ __put_user_asmx(op->val, ea, err, "sthcx.", cr); + break; + #endif + case 4: diff --git a/queue-5.4/series b/queue-5.4/series index 797209fdfe2..b4342e02dfd 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -314,3 +314,6 @@ media-hdpvr-initialize-dev-worker-at-hdpvr_register_.patch tracing-have-trace_define_enum-affect-trace-event-ty.patch mmc-host-return-an-error-when-enable_sdio_irq-ops-is.patch alsa-hda-realtek-add-alc256-samsung-headphone-fixup.patch +powerpc-lib-sstep-fix-sthcx-instruction.patch +powerpc-lib-sstep-fix-build-errors-with-newer-binutils.patch +powerpc-fix-build-errors-with-newer-binutils.patch -- 2.47.3