]> Git Repo - linux.git/commitdiff
Merge tag 'powerpc-4.13-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
authorLinus Torvalds <[email protected]>
Fri, 21 Jul 2017 20:54:37 +0000 (13:54 -0700)
committerLinus Torvalds <[email protected]>
Fri, 21 Jul 2017 20:54:37 +0000 (13:54 -0700)
Pull powerpc fixes from Michael Ellerman:
 "A handful of fixes, mostly for new code:

   - some reworking of the new STRICT_KERNEL_RWX support to make sure we
     also remove executable permission from __init memory before it's
     freed.

   - a fix to some recent optimisations to the hypercall entry where we
     were clobbering r12, this was breaking nested guests (PR KVM).

   - a fix for the recent patch to opal_configure_cores(). This could
     break booting on bare metal Power8 boxes if the kernel was built
     without CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG.

   - .. and finally a workaround for spurious PMU interrupts on Power9
     DD2.

  Thanks to: Nicholas Piggin, Anton Blanchard, Balbir Singh"

* tag 'powerpc-4.13-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/mm: Mark __init memory no-execute when STRICT_KERNEL_RWX=y
  powerpc/mm/hash: Refactor hash__mark_rodata_ro()
  powerpc/mm/radix: Refactor radix__mark_rodata_ro()
  powerpc/64s: Fix hypercall entry clobbering r12 input
  powerpc/perf: Avoid spurious PMU interrupts after idle
  powerpc/powernv: Fix boot on Power8 bare metal due to opal_configure_cores()

1  2 
arch/powerpc/kernel/exceptions-64s.S

index e6d8354d79ef25a34ece7766683813a65ffde57c,124091d306ff50c99df6328a60fa78d4947589d2..9029afd1fa2ab2ce231045659abf11ec9eaa32f6
@@@ -824,7 -824,7 +824,7 @@@ EXC_COMMON(trap_0b_common, 0xb00, unkno
   * r3 volatile parameter and return value for status
   * r4-r10 volatile input and output value
   * r11 volatile hypercall number and output value
-  * r12 volatile
+  * r12 volatile input and output value
   * r13-r31 nonvolatile
   * LR nonvolatile
   * CTR volatile
   * Other registers nonvolatile
   *
   * The intersection of volatile registers that don't contain possible
-  * inputs is: r12, cr0, xer, ctr. We may use these as scratch regs
-  * upon entry without saving.
+  * inputs is: cr0, xer, ctr. We may use these as scratch regs upon entry
+  * without saving, though xer is not a good idea to use, as hardware may
+  * interpret some bits so it may be costly to change them.
   */
  #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
        /*
         * There is a little bit of juggling to get syscall and hcall
-        * working well. Save r10 in ctr to be restored in case it is a
-        * hcall.
+        * working well. Save r13 in ctr to avoid using SPRG scratch
+        * register.
         *
         * Userspace syscalls have already saved the PPR, hcalls must save
         * it before setting HMT_MEDIUM.
         */
  #define SYSCALL_KVMTEST                                                       \
-       mr      r12,r13;                                                \
+       mtctr   r13;                                                    \
        GET_PACA(r13);                                                  \
-       mtctr   r10;                                                    \
+       std     r10,PACA_EXGEN+EX_R10(r13);                             \
        KVMTEST_PR(0xc00); /* uses r10, branch to do_kvm_0xc00_system_call */ \
        HMT_MEDIUM;                                                     \
-       mr      r9,r12;                                                 \
+       mfctr   r9;
  
  #else
  #define SYSCALL_KVMTEST                                                       \
@@@ -935,8 -936,8 +936,8 @@@ EXC_VIRT_END(system_call, 0x4c00, 0x100
         * This is a hcall, so register convention is as above, with these
         * differences:
         * r13 = PACA
-        * r12 = orig r13
-        * ctr = orig r10
+        * ctr = orig r13
+        * orig r10 saved in PACA
         */
  TRAMP_KVM_BEGIN(do_kvm_0xc00)
         /*
          * HMT_MEDIUM. That allows the KVM code to save that value into the
          * guest state (it is the guest's PPR value).
          */
-       OPT_GET_SPR(r0, SPRN_PPR, CPU_FTR_HAS_PPR)
+       OPT_GET_SPR(r10, SPRN_PPR, CPU_FTR_HAS_PPR)
        HMT_MEDIUM
-       OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r0, CPU_FTR_HAS_PPR)
+       OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r10, CPU_FTR_HAS_PPR)
        mfctr   r10
-       SET_SCRATCH0(r12)
+       SET_SCRATCH0(r10)
        std     r9,PACA_EXGEN+EX_R9(r13)
        mfcr    r9
-       std     r10,PACA_EXGEN+EX_R10(r13)
        KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
  #endif
  
@@@ -1314,31 -1314,6 +1314,31 @@@ EXC_REAL_NONE(0x1800, 0x100
  EXC_VIRT_NONE(0x5800, 0x100)
  #endif
  
 +#if defined(CONFIG_HARDLOCKUP_DETECTOR) && defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH)
 +
 +#define MASKED_DEC_HANDLER_LABEL 3f
 +
 +#define MASKED_DEC_HANDLER(_H)                                \
 +3: /* soft-nmi */                                     \
 +      std     r12,PACA_EXGEN+EX_R12(r13);             \
 +      GET_SCRATCH0(r10);                              \
 +      std     r10,PACA_EXGEN+EX_R13(r13);             \
 +      EXCEPTION_PROLOG_PSERIES_1(soft_nmi_common, _H)
 +
 +EXC_COMMON_BEGIN(soft_nmi_common)
 +      mr      r10,r1
 +      ld      r1,PACAEMERGSP(r13)
 +      ld      r1,PACA_NMI_EMERG_SP(r13)
 +      subi    r1,r1,INT_FRAME_SIZE
 +      EXCEPTION_COMMON_NORET_STACK(PACA_EXGEN, 0x900,
 +                      system_reset, soft_nmi_interrupt,
 +                      ADD_NVGPRS;ADD_RECONCILE)
 +      b       ret_from_except
 +
 +#else
 +#define MASKED_DEC_HANDLER_LABEL 2f /* normal return */
 +#define MASKED_DEC_HANDLER(_H)
 +#endif
  
  /*
   * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
@@@ -1361,7 -1336,7 +1361,7 @@@ masked_##_H##interrupt:                                 
        lis     r10,0x7fff;                             \
        ori     r10,r10,0xffff;                         \
        mtspr   SPRN_DEC,r10;                           \
 -      b       2f;                                     \
 +      b       MASKED_DEC_HANDLER_LABEL;               \
  1:    cmpwi   r10,PACA_IRQ_DBELL;                     \
        beq     2f;                                     \
        cmpwi   r10,PACA_IRQ_HMI;                       \
        ld      r11,PACA_EXGEN+EX_R11(r13);             \
        GET_SCRATCH0(r13);                              \
        ##_H##rfid;                                     \
 -      b       .
 +      b       .;                                      \
 +      MASKED_DEC_HANDLER(_H)
  
  /*
   * Real mode exceptions actually use this too, but alternate
This page took 0.076022 seconds and 4 git commands to generate.