Merge tag 'leds_for_4.14' of git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszews...
[sfrench/cifs-2.6.git] / arch / powerpc / kernel / exceptions-64s.S
index f14f3c04ec7e0c7d366f60d161ff0ced6f1497ad..48da0f5d2f7fe0a4745bce864795df16d612a89e 100644 (file)
@@ -541,7 +541,7 @@ EXC_COMMON_BEGIN(instruction_access_common)
        RECONCILE_IRQ_STATE(r10, r11)
        ld      r12,_MSR(r1)
        ld      r3,_NIP(r1)
-       andis.  r4,r12,0x5820
+       andis.  r4,r12,DSISR_BAD_FAULT_64S@h
        li      r5,0x400
        std     r3,_DAR(r1)
        std     r4,_DSISR(r1)
@@ -1314,7 +1314,7 @@ EXC_REAL_NONE(0x1800, 0x100)
 EXC_VIRT_NONE(0x5800, 0x100)
 #endif
 
-#if defined(CONFIG_HARDLOCKUP_DETECTOR) && defined(CONFIG_HAVE_HARDLOCKUP_DETECTOR_ARCH)
+#ifdef CONFIG_PPC_WATCHDOG
 
 #define MASKED_DEC_HANDLER_LABEL 3f
 
@@ -1343,10 +1343,10 @@ EXC_COMMON_BEGIN(soft_nmi_common)
                        ADD_NVGPRS;ADD_RECONCILE)
        b       ret_from_except
 
-#else
+#else /* CONFIG_PPC_WATCHDOG */
 #define MASKED_DEC_HANDLER_LABEL 2f /* normal return */
 #define MASKED_DEC_HANDLER(_H)
-#endif
+#endif /* CONFIG_PPC_WATCHDOG */
 
 /*
  * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
@@ -1370,19 +1370,16 @@ masked_##_H##interrupt:                                 \
        ori     r10,r10,0xffff;                         \
        mtspr   SPRN_DEC,r10;                           \
        b       MASKED_DEC_HANDLER_LABEL;               \
-1:     cmpwi   r10,PACA_IRQ_DBELL;                     \
-       beq     2f;                                     \
-       cmpwi   r10,PACA_IRQ_HMI;                       \
-       beq     2f;                                     \
+1:     andi.   r10,r10,(PACA_IRQ_DBELL|PACA_IRQ_HMI);  \
+       bne     2f;                                     \
        mfspr   r10,SPRN_##_H##SRR1;                    \
-       rldicl  r10,r10,48,1; /* clear MSR_EE */        \
-       rotldi  r10,r10,16;                             \
+       xori    r10,r10,MSR_EE; /* clear MSR_EE */      \
        mtspr   SPRN_##_H##SRR1,r10;                    \
 2:     mtcrf   0x80,r9;                                \
        ld      r9,PACA_EXGEN+EX_R9(r13);               \
        ld      r10,PACA_EXGEN+EX_R10(r13);             \
        ld      r11,PACA_EXGEN+EX_R11(r13);             \
-       GET_SCRATCH0(r13);                              \
+       /* returns to kernel where r13 must be set up, so don't restore it */ \
        ##_H##rfid;                                     \
        b       .;                                      \
        MASKED_DEC_HANDLER(_H)
@@ -1485,8 +1482,10 @@ USE_TEXT_SECTION()
  */
        .balign IFETCH_ALIGN_BYTES
 do_hash_page:
-#ifdef CONFIG_PPC_STD_MMU_64
-       andis.  r0,r4,0xa450            /* weird error? */
+       #ifdef CONFIG_PPC_STD_MMU_64
+       lis     r0,DSISR_BAD_FAULT_64S@h
+       ori     r0,r0,DSISR_BAD_FAULT_64S@l
+       and.    r0,r4,r0                /* weird error? */
        bne-    handle_page_fault       /* if not, try to insert a HPTE */
        CURRENT_THREAD_INFO(r11, r1)
        lwz     r0,TI_PREEMPT(r11)      /* If we're in an "NMI" */
@@ -1669,25 +1668,27 @@ _GLOBAL(__replay_interrupt)
         * we don't give a damn about, so we don't bother storing them.
         */
        mfmsr   r12
-       LOAD_REG_ADDR(r11, 1f)
+       LOAD_REG_ADDR(r11, replay_interrupt_return)
        mfcr    r9
        ori     r12,r12,MSR_EE
        cmpwi   r3,0x900
        beq     decrementer_common
        cmpwi   r3,0x500
+BEGIN_FTR_SECTION
+       beq     h_virt_irq_common
+FTR_SECTION_ELSE
        beq     hardware_interrupt_common
+ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_300)
 BEGIN_FTR_SECTION
-       cmpwi   r3,0xe80
+       cmpwi   r3,0xa00
        beq     h_doorbell_common_msgclr
-       cmpwi   r3,0xea0
-       beq     h_virt_irq_common
        cmpwi   r3,0xe60
        beq     hmi_exception_common
 FTR_SECTION_ELSE
        cmpwi   r3,0xa00
        beq     doorbell_super_common_msgclr
 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
-1:
+replay_interrupt_return:
        blr
 
 _ASM_NOKPROBE_SYMBOL(__replay_interrupt)