mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 13:58:46 +00:00
powerpc fixes for 6.5 #4
- 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, Uwe Kleine-König. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEJFGtCPCthwEv2Y/bUevqPMjhpYAFAmS8gAsTHG1wZUBlbGxl cm1hbi5pZC5hdQAKCRBR6+o8yOGlgN3xD/98z+1PgZY/ymA2Ie/iD7UglZol7XZD 2EjVKmMygOonogO+ROy5/Og/wlFyM2GUzUxeMk5E8JVlKveZSmrwTvy3rwMPjLlB +aRG3vhYMv/lqLPUEVYo6sJuuBxr+029jZRCY2hCrv3nxbIBuLiGVmwtBLuX1O4J KWX5EaY3Tk+VigkiaRksAzZXksHGDTHeDDh0lsGagDEDi6aUxfouTnetmlLsinQq 4GgPrAnY12QVW5WnacxuLmyuioVxbZaYVKdFHpqSCV3UHAd9OZ6sxDwUfbLp6wGd OetuCF/KTFQHAjUu3zvlGcTWa18kS7NsAfOvw82Asg1Tc77i8EoMWmo2ag5n0DQC yTO6cCETHnU6ZjL5osqDh9sTK8CLpDyesIPwMYcRjMLKBzAAWrYgXFDNaUkwypsk o1c72WmhmZlDZFJaZstlpYpxQuouCHlYp+/qaHoI0J6q1CuWfY5Zhm3EgYnY0QXc HoJqSW2Yx0BAE9X7xSjqyKPcl0a5mpah+x4jZfWWHMT8wTgckRMAwL134UZS7qkg Mte2OGJ4+N8uGEQtEcjcQDGdyBi88G24uvJSDRqwbhprWC1Kb2HPQ/sXYIWedhbm Msgw14uRrna0fhbEWYQItjE5tzKE8aLCA0PDOnrpx+j7fx5/UB1EecPDUBdOols+ 2SRRyxOHbr0i/Q== =lQg7 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
c278253139
3
arch/powerpc/crypto/.gitignore
vendored
Normal file
3
arch/powerpc/crypto/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
aesp10-ppc.S
|
||||
ghashp10-ppc.S
|
@ -4,14 +4,13 @@
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/asm-compat.h>
|
||||
#include <asm/extable.h>
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#include <asm/asm-offsets.h>
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
.macro __EMIT_BUG_ENTRY addr,file,line,flags
|
||||
.macro EMIT_BUG_ENTRY addr,file,line,flags
|
||||
.section __bug_table,"aw"
|
||||
5001: .4byte \addr - .
|
||||
.4byte 5002f - .
|
||||
@ -23,7 +22,7 @@
|
||||
.previous
|
||||
.endm
|
||||
#else
|
||||
.macro __EMIT_BUG_ENTRY addr,file,line,flags
|
||||
.macro EMIT_BUG_ENTRY addr,file,line,flags
|
||||
.section __bug_table,"aw"
|
||||
5001: .4byte \addr - .
|
||||
.short \flags
|
||||
@ -32,18 +31,6 @@
|
||||
.endm
|
||||
#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__ */
|
||||
/* _EMIT_BUG_ENTRY expects args %0,%1,%2,%3 to be FILE, LINE, flags and
|
||||
sizeof(struct bug_entry), respectively */
|
||||
@ -73,16 +60,6 @@
|
||||
"i" (sizeof(struct bug_entry)), \
|
||||
##__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
|
||||
* optimisations. However depending on the complexity of the condition
|
||||
@ -95,16 +72,7 @@
|
||||
} while (0)
|
||||
#define HAVE_ARCH_BUG
|
||||
|
||||
#define __WARN_FLAGS(flags) do { \
|
||||
__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)
|
||||
#define __WARN_FLAGS(flags) BUG_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags))
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#define BUG_ON(x) do { \
|
||||
@ -117,25 +85,15 @@ __label_warn_on: \
|
||||
} while (0)
|
||||
|
||||
#define WARN_ON(x) ({ \
|
||||
bool __ret_warn_on = false; \
|
||||
do { \
|
||||
if (__builtin_constant_p((x))) { \
|
||||
if (!(x)) \
|
||||
break; \
|
||||
int __ret_warn_on = !!(x); \
|
||||
if (__builtin_constant_p(__ret_warn_on)) { \
|
||||
if (__ret_warn_on) \
|
||||
__WARN(); \
|
||||
__ret_warn_on = true; \
|
||||
} else { \
|
||||
__label__ __label_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); \
|
||||
} else { \
|
||||
BUG_ENTRY(PPC_TLNEI " %4, 0", \
|
||||
BUGFLAG_WARNING | BUGFLAG_TAINT(TAINT_WARN), \
|
||||
"r" (__ret_warn_on)); \
|
||||
} \
|
||||
unlikely(__ret_warn_on); \
|
||||
})
|
||||
|
||||
@ -148,14 +106,13 @@ __label_warn_on: \
|
||||
#ifdef __ASSEMBLY__
|
||||
.macro EMIT_BUG_ENTRY addr,file,line,flags
|
||||
.endm
|
||||
.macro EMIT_WARN_ENTRY addr,file,line,flags
|
||||
.endm
|
||||
#else /* !__ASSEMBLY__ */
|
||||
#define _EMIT_BUG_ENTRY
|
||||
#define _EMIT_WARN_ENTRY
|
||||
#endif
|
||||
#endif /* CONFIG_BUG */
|
||||
|
||||
#define EMIT_WARN_ENTRY EMIT_BUG_ENTRY
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
@ -12,14 +12,8 @@
|
||||
|
||||
/*
|
||||
* 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)
|
||||
#endif
|
||||
#define compat_elf_check_arch(x) ((x)->e_machine == EM_PPC)
|
||||
|
||||
#define CORE_DUMP_USE_REGSET
|
||||
|
@ -183,13 +183,9 @@ static inline bool test_thread_local_flags(unsigned int flags)
|
||||
#define clear_tsk_compat_task(tsk) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||
#if defined(CONFIG_PPC64)
|
||||
#define is_elf2_task() (test_thread_flag(TIF_ELF2ABI))
|
||||
#else
|
||||
#define is_elf2_task() (1)
|
||||
#endif
|
||||
#else
|
||||
#define is_elf2_task() (0)
|
||||
#endif
|
||||
|
||||
|
@ -1508,13 +1508,8 @@ static void do_program_check(struct pt_regs *regs)
|
||||
|
||||
if (!(regs->msr & MSR_PR) && /* not user-mode */
|
||||
report_bug(bugaddr, regs) == BUG_TRAP_TYPE_WARN) {
|
||||
const struct exception_table_entry *entry;
|
||||
|
||||
entry = search_exception_tables(bugaddr);
|
||||
if (entry) {
|
||||
regs_set_return_ip(regs, extable_fixup(entry) + regs->nip - bugaddr);
|
||||
return;
|
||||
}
|
||||
regs_add_return_ip(regs, 4);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) && user_mode(regs)) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
KASAN_SANITIZE := n
|
||||
KCOV_INSTRUMENT := n
|
||||
|
||||
obj-$(CONFIG_PPC32) += init_32.o
|
||||
obj-$(CONFIG_PPC_8xx) += 8xx.o
|
||||
|
@ -477,7 +477,7 @@ static int mpc512x_lpbfifo_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mpc512x_lpbfifo_remove(struct platform_device *pdev)
|
||||
static void mpc512x_lpbfifo_remove(struct platform_device *pdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct dma_device *dma_dev = lpbfifo.chan->device;
|
||||
@ -494,8 +494,6 @@ static int mpc512x_lpbfifo_remove(struct platform_device *pdev)
|
||||
free_irq(lpbfifo.irq, &pdev->dev);
|
||||
irq_dispose_mapping(lpbfifo.irq);
|
||||
dma_release_channel(lpbfifo.chan);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id mpc512x_lpbfifo_match[] = {
|
||||
@ -506,7 +504,7 @@ MODULE_DEVICE_TABLE(of, mpc512x_lpbfifo_match);
|
||||
|
||||
static struct platform_driver mpc512x_lpbfifo_driver = {
|
||||
.probe = mpc512x_lpbfifo_probe,
|
||||
.remove = mpc512x_lpbfifo_remove,
|
||||
.remove_new = mpc512x_lpbfifo_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = mpc512x_lpbfifo_match,
|
||||
|
@ -744,6 +744,12 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
|
||||
}
|
||||
|
||||
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);
|
||||
vma = task_ref->vma;
|
||||
/*
|
||||
@ -752,7 +758,6 @@ static int reconfig_close_windows(struct vas_caps *vcap, int excess_creds,
|
||||
*/
|
||||
win->vas_win.status |= flag;
|
||||
|
||||
mmap_write_lock(task_ref->mm);
|
||||
/*
|
||||
* vma is set in the original mapping. But this mapping
|
||||
* 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,
|
||||
if (vma)
|
||||
zap_vma_pages(vma);
|
||||
|
||||
mmap_write_unlock(task_ref->mm);
|
||||
mutex_unlock(&task_ref->mmap_mutex);
|
||||
mmap_write_unlock(task_ref->mm);
|
||||
/*
|
||||
* Close VAS window in the hypervisor, but do not
|
||||
* free vas_window struct since it may be reused
|
||||
|
Loading…
x
Reference in New Issue
Block a user