Merge tag 'powerpc-5.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 Jun 2022 19:17:43 +0000 (12:17 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 9 Jun 2022 19:17:43 +0000 (12:17 -0700)
Pull powerpc fixes from Michael Ellerman:

 - On 32-bit fix overread/overwrite of thread_struct via ptrace
   PEEK/POKE.

 - Fix softirqs not switching to the softirq stack since we moved
   irq_exit().

 - Force thread size increase when KASAN is enabled to avoid stack
   overflows.

 - On Book3s 64 mark more code as not to be instrumented by KASAN to
   avoid crashes.

 - Exempt __get_wchan() from KASAN checking, as it's inherently racy.

 - Fix a recently introduced crash in the papr_scm driver in some
   configurations.

 - Remove include of <generated/compile.h> which is forbidden.

Thanks to Ariel Miculas, Chen Jingwen, Christophe Leroy, Erhard Furtner,
He Ying, Kees Cook, Masahiro Yamada, Nageswara R Sastry, Paul Mackerras,
Sachin Sant, Vaibhav Jain, and Wanming Hu.

* tag 'powerpc-5.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/32: Fix overread/overwrite of thread_struct via ptrace
  powerpc/book3e: get rid of #include <generated/compile.h>
  powerpc/kasan: Force thread size increase with KASAN
  powerpc/papr_scm: don't requests stats with '0' sized stats buffer
  powerpc: Don't select HAVE_IRQ_EXIT_ON_IRQ_STACK
  powerpc/kasan: Silence KASAN warnings in __get_wchan()
  powerpc/kasan: Mark more real-mode code as not to be instrumented

1  2 
arch/powerpc/Kconfig
arch/powerpc/kernel/process.c

diff --combined arch/powerpc/Kconfig
index be68c1f02b794b169da802fb7be41395e07df655,b1760d615bb7d3154a575fe63c058eb73e034c62..c2ce2e60c8f0f65f0c3ca1ad80142946b2a9d0ec
@@@ -223,7 -223,6 +223,6 @@@ config PP
        select HAVE_HARDLOCKUP_DETECTOR_PERF    if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH
        select HAVE_HW_BREAKPOINT               if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
        select HAVE_IOREMAP_PROT
-       select HAVE_IRQ_EXIT_ON_IRQ_STACK
        select HAVE_IRQ_TIME_ACCOUNTING
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_LZMA                 if DEFAULT_UIMAGE
@@@ -303,6 -302,11 +302,6 @@@ config COMPA
        select ARCH_WANT_OLD_COMPAT_IPC
        select COMPAT_OLD_SIGACTION
  
 -config SYSVIPC_COMPAT
 -      bool
 -      depends on COMPAT && SYSVIPC
 -      default y
 -
  config SCHED_OMIT_FRAME_POINTER
        bool
        default y
@@@ -786,7 -790,6 +785,6 @@@ config THREAD_SHIF
        range 13 15
        default "15" if PPC_256K_PAGES
        default "14" if PPC64
-       default "14" if KASAN
        default "13"
        help
          Used to define the stack size. The default is almost always what you
index b62046bf3bb88035615f5829c35d531c9579dc37,ca4d97688da9090f7ed618638dc3468a1de3cb86..ee043380962142e85dbc8634824b623e20da5444
@@@ -1713,11 -1713,10 +1713,11 @@@ static void setup_ksp_vsid(struct task_
  /*
   * Copy architecture-specific thread state
   */
 -int copy_thread(unsigned long clone_flags, unsigned long usp,
 -              unsigned long kthread_arg, struct task_struct *p,
 -              unsigned long tls)
 +int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
  {
 +      unsigned long clone_flags = args->flags;
 +      unsigned long usp = args->stack;
 +      unsigned long tls = args->tls;
        struct pt_regs *childregs, *kregs;
        extern void ret_from_fork(void);
        extern void ret_from_fork_scv(void);
        /* Copy registers */
        sp -= sizeof(struct pt_regs);
        childregs = (struct pt_regs *) sp;
 -      if (unlikely(p->flags & (PF_KTHREAD | PF_IO_WORKER))) {
 +      if (unlikely(args->fn)) {
                /* kernel thread */
                memset(childregs, 0, sizeof(struct pt_regs));
                childregs->gpr[1] = sp + sizeof(struct pt_regs);
                /* function */
 -              if (usp)
 -                      childregs->gpr[14] = ppc_function_entry((void *)usp);
 +              if (args->fn)
 +                      childregs->gpr[14] = ppc_function_entry((void *)args->fn);
  #ifdef CONFIG_PPC64
                clear_tsk_thread_flag(p, TIF_32BIT);
                childregs->softe = IRQS_ENABLED;
  #endif
 -              childregs->gpr[15] = kthread_arg;
 +              childregs->gpr[15] = (unsigned long)args->fn_arg;
                p->thread.regs = NULL;  /* no user register state */
                ti->flags |= _TIF_RESTOREALL;
                f = ret_from_kernel_thread;
@@@ -2158,12 -2157,12 +2158,12 @@@ static unsigned long ___get_wchan(struc
                return 0;
  
        do {
-               sp = *(unsigned long *)sp;
+               sp = READ_ONCE_NOCHECK(*(unsigned long *)sp);
                if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD) ||
                    task_is_running(p))
                        return 0;
                if (count > 0) {
-                       ip = ((unsigned long *)sp)[STACK_FRAME_LR_SAVE];
+                       ip = READ_ONCE_NOCHECK(((unsigned long *)sp)[STACK_FRAME_LR_SAVE]);
                        if (!in_sched_functions(ip))
                                return ip;
                }