]> Git Repo - J-linux.git/commitdiff
Merge tag 'powerpc-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
authorLinus Torvalds <[email protected]>
Sat, 24 Oct 2020 18:09:13 +0000 (11:09 -0700)
committerLinus Torvalds <[email protected]>
Sat, 24 Oct 2020 18:09:13 +0000 (11:09 -0700)
Pull powerpc fixes from Michael Ellerman:

 - A fix for undetected data corruption on Power9 Nimbus <= DD2.1 in the
   emulation of VSX loads. The affected CPUs were not widely available.

 - Two fixes for machine check handling in guests under PowerVM.

 - A fix for our recent changes to SMP setup, when
   CONFIG_CPUMASK_OFFSTACK=y.

 - Three fixes for races in the handling of some of our powernv sysfs
   attributes.

 - One change to remove TM from the set of Power10 CPU features.

 - A couple of other minor fixes.

Thanks to: Aneesh Kumar K.V, Christophe Leroy, Ganesh Goudar, Jordan
Niethe, Mahesh Salgaonkar, Michael Neuling, Oliver O'Halloran, Qian Cai,
Srikar Dronamraju, Vasant Hegde.

* tag 'powerpc-5.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/pseries: Avoid using addr_to_pfn in real mode
  powerpc/uaccess: Don't use "m<>" constraint with GCC 4.9
  powerpc/eeh: Fix eeh_dev_check_failure() for PE#0
  powerpc/64s: Remove TM from Power10 features
  selftests/powerpc: Make alignment handler test P9N DD2.1 vector CI load workaround
  powerpc: Fix undetected data corruption with P9N DD2.1 VSX CI load emulation
  powerpc/powernv/dump: Handle multiple writes to ack attribute
  powerpc/powernv/dump: Fix race while processing OPAL dump
  powerpc/smp: Use GFP_ATOMIC while allocating tmp mask
  powerpc/smp: Remove unnecessary variable
  powerpc/mce: Avoid nmi_enter/exit in real mode on pseries hash
  powerpc/opal_elog: Handle multiple writes to ack attribute

1  2 
arch/powerpc/include/asm/uaccess.h

index 916daa4b4d0d414153ccf62f01a521f6d38049eb,a1c1aab4e0388932136bd359915c2cdea4b6b286..ef5bbb705c08b7b12a7c11451305f2a64d8b5266
@@@ -8,21 -8,62 +8,21 @@@
  #include <asm/extable.h>
  #include <asm/kup.h>
  
 -/*
 - * The fs value determines whether argument validity checking should be
 - * performed or not.  If get_fs() == USER_DS, checking is performed, with
 - * get_fs() == KERNEL_DS, checking is bypassed.
 - *
 - * For historical reasons, these macros are grossly misnamed.
 - *
 - * The fs/ds values are now the highest legal address in the "segment".
 - * This simplifies the checking in the routines below.
 - */
 -
 -#define MAKE_MM_SEG(s)  ((mm_segment_t) { (s) })
 -
 -#define KERNEL_DS     MAKE_MM_SEG(~0UL)
  #ifdef __powerpc64__
  /* We use TASK_SIZE_USER64 as TASK_SIZE is not constant */
 -#define USER_DS               MAKE_MM_SEG(TASK_SIZE_USER64 - 1)
 +#define TASK_SIZE_MAX         TASK_SIZE_USER64
  #else
 -#define USER_DS               MAKE_MM_SEG(TASK_SIZE - 1)
 +#define TASK_SIZE_MAX         TASK_SIZE
  #endif
  
 -#define get_fs()      (current->thread.addr_limit)
 -
 -static inline void set_fs(mm_segment_t fs)
 -{
 -      current->thread.addr_limit = fs;
 -      /* On user-mode return check addr_limit (fs) is correct */
 -      set_thread_flag(TIF_FSCHECK);
 -}
 -
 -#define uaccess_kernel() (get_fs().seg == KERNEL_DS.seg)
 -#define user_addr_max()       (get_fs().seg)
 -
 -#ifdef __powerpc64__
 -/*
 - * This check is sufficient because there is a large enough
 - * gap between user addresses and the kernel addresses
 - */
 -#define __access_ok(addr, size, segment)      \
 -      (((addr) <= (segment).seg) && ((size) <= (segment).seg))
 -
 -#else
 -
 -static inline int __access_ok(unsigned long addr, unsigned long size,
 -                      mm_segment_t seg)
 +static inline bool __access_ok(unsigned long addr, unsigned long size)
  {
 -      if (addr > seg.seg)
 -              return 0;
 -      return (size == 0 || size - 1 <= seg.seg - addr);
 +      return addr < TASK_SIZE_MAX && size <= TASK_SIZE_MAX - addr;
  }
  
 -#endif
 -
  #define access_ok(addr, size)         \
        (__chk_user_ptr(addr),          \
 -       __access_ok((__force unsigned long)(addr), (size), get_fs()))
 +       __access_ok((unsigned long)(addr), (size)))
  
  /*
   * These are the main single-value transfer routines.  They automatically
@@@ -182,7 -223,7 +182,7 @@@ do {                                                               
                "1:     " op "%U1%X1 %0,%1      # put_user\n"   \
                EX_TABLE(1b, %l2)                               \
                :                                               \
-               : "r" (x), "m<>" (*addr)                                \
+               : "r" (x), "m"UPD_CONSTR (*addr)                \
                :                                               \
                : label)
  
@@@ -253,7 -294,7 +253,7 @@@ extern long __get_user_bad(void)
                ".previous\n"                           \
                EX_TABLE(1b, 3b)                        \
                : "=r" (err), "=r" (x)                  \
-               : "m<>" (*addr), "i" (-EFAULT), "0" (err))
+               : "m"UPD_CONSTR (*addr), "i" (-EFAULT), "0" (err))
  
  #ifdef __powerpc64__
  #define __get_user_asm2(x, addr, err)                 \
@@@ -363,32 -404,6 +363,32 @@@ do {                                                             
  extern unsigned long __copy_tofrom_user(void __user *to,
                const void __user *from, unsigned long size);
  
 +#ifdef CONFIG_ARCH_HAS_COPY_MC
 +unsigned long __must_check
 +copy_mc_generic(void *to, const void *from, unsigned long size);
 +
 +static inline unsigned long __must_check
 +copy_mc_to_kernel(void *to, const void *from, unsigned long size)
 +{
 +      return copy_mc_generic(to, from, size);
 +}
 +#define copy_mc_to_kernel copy_mc_to_kernel
 +
 +static inline unsigned long __must_check
 +copy_mc_to_user(void __user *to, const void *from, unsigned long n)
 +{
 +      if (likely(check_copy_size(from, n, true))) {
 +              if (access_ok(to, n)) {
 +                      allow_write_to_user(to, n);
 +                      n = copy_mc_generic((void *)to, from, n);
 +                      prevent_write_to_user(to, n);
 +              }
 +      }
 +
 +      return n;
 +}
 +#endif
 +
  #ifdef __powerpc64__
  static inline unsigned long
  raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
@@@ -477,6 -492,20 +477,6 @@@ raw_copy_to_user(void __user *to, cons
        return ret;
  }
  
 -static __always_inline unsigned long __must_check
 -copy_to_user_mcsafe(void __user *to, const void *from, unsigned long n)
 -{
 -      if (likely(check_copy_size(from, n, true))) {
 -              if (access_ok(to, n)) {
 -                      allow_write_to_user(to, n);
 -                      n = memcpy_mcsafe((void *)to, from, n);
 -                      prevent_write_to_user(to, n);
 -              }
 -      }
 -
 -      return n;
 -}
 -
  unsigned long __arch_clear_user(void __user *addr, unsigned long size);
  
  static inline unsigned long clear_user(void __user *addr, unsigned long size)
@@@ -563,20 -592,4 +563,20 @@@ do {                                                                     
                __put_user_goto(*(u8*)(_src + _i), (u8 __user *)(_dst + _i), e);\
  } while (0)
  
 +#define HAVE_GET_KERNEL_NOFAULT
 +
 +#define __get_kernel_nofault(dst, src, type, err_label)                       \
 +do {                                                                  \
 +      int __kr_err;                                                   \
 +                                                                      \
 +      __get_user_size_allowed(*((type *)(dst)), (__force type __user *)(src),\
 +                      sizeof(type), __kr_err);                        \
 +      if (unlikely(__kr_err))                                         \
 +              goto err_label;                                         \
 +} while (0)
 +
 +#define __put_kernel_nofault(dst, src, type, err_label)                       \
 +      __put_user_size_goto(*((type *)(src)),                          \
 +              (__force type __user *)(dst), sizeof(type), err_label)
 +
  #endif        /* _ARCH_POWERPC_UACCESS_H */
This page took 0.052565 seconds and 4 git commands to generate.