Commit c2782531 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-6.5-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:

 - Reinstate support for little endian ELFv1 binaries, which it turns
   out still exist in the wild.

 - Revert a change which used asm goto for WARN_ON/__WARN_FLAGS, as it
   lead to dead code generation and seemed to trigger compiler bugs in
   some edge cases.

 - Fix a deadlock in the pseries VAS code, between live migration and
   the driver's mmap handler.

 - Disable KCOV instrumentation in the powerpc KASAN code.

Thanks to Andrew Donnellan, Benjamin Gray, Christophe Leroy, Haren
Myneni, Russell Currey, and Uwe Kleine-König.

* tag 'powerpc-6.5-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  Revert "powerpc/64s: Remove support for ELFv1 little endian userspace"
  powerpc/kasan: Disable KCOV in KASAN code
  powerpc/512x: lpbfifo: Convert to platform remove callback returning void
  powerpc/crypto: Add gitignore for generated P10 AES/GCM .S files
  Revert "powerpc/bug: Provide better flexibility to WARN_ON/__WARN_FLAGS() with asm goto"
  powerpc/pseries/vas: Hold mmap_mutex after mmap lock during window close
parents 295e1388 106ea7ff
# SPDX-License-Identifier: GPL-2.0-only
aesp10-ppc.S
ghashp10-ppc.S
...@@ -4,14 +4,13 @@ ...@@ -4,14 +4,13 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/asm-compat.h> #include <asm/asm-compat.h>
#include <asm/extable.h>
#ifdef CONFIG_BUG #ifdef CONFIG_BUG
#ifdef __ASSEMBLY__ #ifdef __ASSEMBLY__
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#ifdef CONFIG_DEBUG_BUGVERBOSE #ifdef CONFIG_DEBUG_BUGVERBOSE
.macro __EMIT_BUG_ENTRY addr,file,line,flags .macro EMIT_BUG_ENTRY addr,file,line,flags
.section __bug_table,"aw" .section __bug_table,"aw"
5001: .4byte \addr - . 5001: .4byte \addr - .
.4byte 5002f - . .4byte 5002f - .
...@@ -23,7 +22,7 @@ ...@@ -23,7 +22,7 @@
.previous .previous
.endm .endm
#else #else
.macro __EMIT_BUG_ENTRY addr,file,line,flags .macro EMIT_BUG_ENTRY addr,file,line,flags
.section __bug_table,"aw" .section __bug_table,"aw"
5001: .4byte \addr - . 5001: .4byte \addr - .
.short \flags .short \flags
...@@ -32,18 +31,6 @@ ...@@ -32,18 +31,6 @@
.endm .endm
#endif /* verbose */ #endif /* verbose */
.macro EMIT_WARN_ENTRY addr,file,line,flags
EX_TABLE(\addr,\addr+4)
__EMIT_BUG_ENTRY \addr,\file,\line,\flags
.endm
.macro EMIT_BUG_ENTRY addr,file,line,flags
.if \flags & 1 /* BUGFLAG_WARNING */
.err /* Use EMIT_WARN_ENTRY for warnings */
.endif
__EMIT_BUG_ENTRY \addr,\file,\line,\flags
.endm
#else /* !__ASSEMBLY__ */ #else /* !__ASSEMBLY__ */
/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and /* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
sizeof(struct bug_entry), respectively */ sizeof(struct bug_entry), respectively */
...@@ -73,16 +60,6 @@ ...@@ -73,16 +60,6 @@
"i" (sizeof(struct bug_entry)), \ "i" (sizeof(struct bug_entry)), \
##__VA_ARGS__) ##__VA_ARGS__)
#define WARN_ENTRY(insn, flags, label, ...) \
asm_volatile_goto( \
"1: " insn "\n" \
EX_TABLE(1b, %l[label]) \
_EMIT_BUG_ENTRY \
: : "i" (__FILE__), "i" (__LINE__), \
"i" (flags), \
"i" (sizeof(struct bug_entry)), \
##__VA_ARGS__ : : label)
/* /*
* BUG_ON() and WARN_ON() do their best to cooperate with compile-time * BUG_ON() and WARN_ON() do their best to cooperate with compile-time
* optimisations. However depending on the complexity of the condition * optimisations. However depending on the complexity of the condition
...@@ -95,16 +72,7 @@ ...@@ -95,16 +72,7 @@
} while (0) } while (0)
#define HAVE_ARCH_BUG #define HAVE_ARCH_BUG
#define __WARN_FLAGS(flags) do { \ #define __WARN_FLAGS(flags) BUG_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags))
__label__ __label_warn_on; \
\
WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
barrier_before_unreachable(); \
__builtin_unreachable(); \
\
__label_warn_on: \
break; \
} while (0)
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#define BUG_ON(x) do { \ #define BUG_ON(x) do { \
...@@ -117,25 +85,15 @@ __label_warn_on: \ ...@@ -117,25 +85,15 @@ __label_warn_on: \
} while (0) } while (0)
#define WARN_ON(x) ({ \ #define WARN_ON(x) ({ \
bool __ret_warn_on = false; \ int __ret_warn_on = !!(x); \
do { \ if (__builtin_constant_p(__ret_warn_on)) { \
if (__builtin_constant_p((x))) { \ if (__ret_warn_on) \
if (!(x)) \
break; \
__WARN(); \ __WARN(); \
__ret_warn_on = true; \ } else { \
} else { \ BUG_ENTRY(PPC_TLNEI " %4, 0", \
__label__ __label_warn_on; \ BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN), \
\ "r" (__ret_warn_on)); \
WARN_ENTRY(PPC_TLNEI " %4, 0", \ } \
BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN), \
__label_warn_on, \
"r" ((__force long)(x))); \
break; \
__label_warn_on: \
__ret_warn_on = true; \
} \
} while (0); \
unlikely(__ret_warn_on); \ unlikely(__ret_warn_on); \
}) })
...@@ -148,14 +106,13 @@ __label_warn_on: \ ...@@ -148,14 +106,13 @@ __label_warn_on: \
#ifdef __ASSEMBLY__ #ifdef __ASSEMBLY__
.macro EMIT_BUG_ENTRY addr,file,line,flags .macro EMIT_BUG_ENTRY addr,file,line,flags
.endm .endm
.macro EMIT_WARN_ENTRY addr,file,line,flags
.endm
#else /* !__ASSEMBLY__ */ #else /* !__ASSEMBLY__ */
#define _EMIT_BUG_ENTRY #define _EMIT_BUG_ENTRY
#define _EMIT_WARN_ENTRY
#endif #endif
#endif /* CONFIG_BUG */ #endif /* CONFIG_BUG */
#define EMIT_WARN_ENTRY EMIT_BUG_ENTRY
#include <asm-generic/bug.h> #include <asm-generic/bug.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -12,14 +12,8 @@ ...@@ -12,14 +12,8 @@
/* /*
* This is used to ensure we don't load something for the wrong architecture. * This is used to ensure we don't load something for the wrong architecture.
* 64le only supports ELFv2 64-bit binaries (64be supports v1 and v2).
*/ */
#if defined(CONFIG_PPC64) && defined(CONFIG_CPU_LITTLE_ENDIAN)
#define elf_check_arch(x) (((x)->e_machine == ELF_ARCH) && \
(((x)->e_flags & 0x3) == 0x2))
#else
#define elf_check_arch(x) ((x)->e_machine == ELF_ARCH) #define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)
#endif
#define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC) #define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
#define CORE_DUMP_USE_REGSET #define CORE_DUMP_USE_REGSET
......
...@@ -183,13 +183,9 @@ static inline bool test_thread_local_flags(unsigned int flags) ...@@ -183,13 +183,9 @@ static inline bool test_thread_local_flags(unsigned int flags)
#define clear_tsk_compat_task(tsk) do { } while (0) #define clear_tsk_compat_task(tsk) do { } while (0)
#endif #endif
#ifdef CONFIG_PPC64 #if defined(CONFIG_PPC64)
#ifdef CONFIG_CPU_BIG_ENDIAN
#define is_elf2_task() (test_thread_flag(TIF_ELF2ABI)) #define is_elf2_task() (test_thread_flag(TIF_ELF2ABI))
#else #else
#define is_elf2_task() (1)
#endif
#else
#define is_elf2_task() (0) #define is_elf2_task() (0)
#endif #endif
......
...@@ -1508,13 +1508,8 @@ static void do_program_check(struct pt_regs *regs) ...@@ -1508,13 +1508,8 @@ static void do_program_check(struct pt_regs *regs)
if (!(regs->msr & MSR_PR) && /* not user-mode */ if (!(regs->msr & MSR_PR) && /* not user-mode */
report_bug(bugaddr, regs) == BUG_TRAP_TYPE_WARN) { report_bug(bugaddr, regs) == BUG_TRAP_TYPE_WARN) {
const struct exception_table_entry *entry; regs_add_return_ip(regs, 4);
return;
entry = search_exception_tables(bugaddr);
if (entry) {
regs_set_return_ip(regs, extable_fixup(entry) + regs->nip - bugaddr);
return;
}
} }
if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) && user_mode(regs)) { if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) && user_mode(regs)) {
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
KASAN_SANITIZE := n KASAN_SANITIZE := n
KCOV_INSTRUMENT := n
obj-$(CONFIG_PPC32) += init_32.o obj-$(CONFIG_PPC32) += init_32.o
obj-$(CONFIG_PPC_8xx) += 8xx.o obj-$(CONFIG_PPC_8xx) += 8xx.o
......
...@@ -477,7 +477,7 @@ static int mpc512x_lpbfifo_probe(struct platform_device *pdev) ...@@ -477,7 +477,7 @@ static int mpc512x_lpbfifo_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int mpc512x_lpbfifo_remove(struct platform_device *pdev) static void mpc512x_lpbfifo_remove(struct platform_device *pdev)
{ {
unsigned long flags; unsigned long flags;
struct dma_device *dma_dev = lpbfifo.chan->device; struct dma_device *dma_dev = lpbfifo.chan->device;
...@@ -494,8 +494,6 @@ static int mpc512x_lpbfifo_remove(struct platform_device *pdev) ...@@ -494,8 +494,6 @@ static int mpc512x_lpbfifo_remove(struct platform_device *pdev)
free_irq(lpbfifo.irq, &pdev->dev); free_irq(lpbfifo.irq, &pdev->dev);
irq_dispose_mapping(lpbfifo.irq); irq_dispose_mapping(lpbfifo.irq);
dma_release_channel(lpbfifo.chan); dma_release_channel(lpbfifo.chan);
return 0;
} }
static const struct of_device_id mpc512x_lpbfifo_match[] = { static const struct of_device_id mpc512x_lpbfifo_match[] = {
...@@ -506,7 +504,7 @@ MODULE_DEVICE_TABLE(of, mpc512x_lpbfifo_match); ...@@ -506,7 +504,7 @@ MODULE_DEVICE_TABLE(of, mpc512x_lpbfifo_match);
static struct platform_driver mpc512x_lpbfifo_driver = { static struct platform_driver mpc512x_lpbfifo_driver = {
.probe = mpc512x_lpbfifo_probe, .probe = mpc512x_lpbfifo_probe,
.remove = mpc512x_lpbfifo_remove, .remove_new = mpc512x_lpbfifo_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.of_match_table = mpc512x_lpbfifo_match, .of_match_table = mpc512x_lpbfifo_match,
......
...@@ -744,6 +744,12 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds, ...@@ -744,6 +744,12 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
} }
task_ref = &win->vas_win.task_ref; task_ref = &win->vas_win.task_ref;
/*
* VAS mmap (coproc_mmap()) and its fault handler
* (vas_mmap_fault()) are called after holding mmap lock.
* So hold mmap mutex after mmap_lock to avoid deadlock.
*/
mmap_write_lock(task_ref->mm);
mutex_lock(&task_ref->mmap_mutex); mutex_lock(&task_ref->mmap_mutex);
vma = task_ref->vma; vma = task_ref->vma;
/* /*
...@@ -752,7 +758,6 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds, ...@@ -752,7 +758,6 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
*/ */
win->vas_win.status |= flag; win->vas_win.status |= flag;
mmap_write_lock(task_ref->mm);
/* /*
* vma is set in the original mapping. But this mapping * vma is set in the original mapping. But this mapping
* is done with mmap() after the window is opened with ioctl. * is done with mmap() after the window is opened with ioctl.
...@@ -762,8 +767,8 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds, ...@@ -762,8 +767,8 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
if (vma) if (vma)
zap_vma_pages(vma); zap_vma_pages(vma);
mmap_write_unlock(task_ref->mm);
mutex_unlock(&task_ref->mmap_mutex); mutex_unlock(&task_ref->mmap_mutex);
mmap_write_unlock(task_ref->mm);
/* /*
* Close VAS window in the hypervisor, but do not * Close VAS window in the hypervisor, but do not
* free vas_window struct since it may be reused * free vas_window struct since it may be reused
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment