#define EXC_HV H
 #define EXC_STD
 
-#define __EXCEPTION_PROLOG_1(area, h)                                  \
+#define EXCEPTION_PROLOG_1(area)                                       \
        GET_PACA(r13);                                                  \
        std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
        std     r10,area+EX_R10(r13);                                   \
        std     r11,area+EX_R11(r13);                                   \
        std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG_##h##SCRATCH0;                             \
+       GET_SCRATCH0(r9);                                               \
        std     r9,area+EX_R13(r13);                                    \
        mfcr    r9
-#define EXCEPTION_PROLOG_1(area, h) __EXCEPTION_PROLOG_1(area, h)
 
 #define __EXCEPTION_PROLOG_PSERIES_1(label, h)                         \
        ld      r12,PACAKBASE(r13);     /* get high part of &label */   \
        __EXCEPTION_PROLOG_PSERIES_1(label, h)
 
 #define EXCEPTION_PROLOG_PSERIES(area, label, h)                       \
-       EXCEPTION_PROLOG_1(area, h);                                    \
+       EXCEPTION_PROLOG_1(area);                                       \
        EXCEPTION_PROLOG_PSERIES_1(label, h);
 
 /*
 label##_pSeries:                                       \
        HMT_MEDIUM;                                     \
        DO_KVM  vec;                                    \
-       mtspr   SPRN_SPRG_SCRATCH0,r13;         /* save r13 */  \
+       SET_SCRATCH0(r13);              /* save r13 */          \
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_STD)
 
 #define STD_EXCEPTION_HV(loc, vec, label)              \
 label##_hv:                                            \
        HMT_MEDIUM;                                     \
        DO_KVM  vec;                                    \
-       mtspr   SPRN_SPRG_HSCRATCH0,r13;/* save r13 */  \
+       SET_SCRATCH0(r13);      /* save r13 */          \
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, EXC_HV)
 
 #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h)                    \
        HMT_MEDIUM;                                                     \
        DO_KVM  vec;                                                    \
-       mtspr   SPRN_SPRG_##h##SCRATCH0,r13;    /* save r13 */          \
+       SET_SCRATCH0(r13);    /* save r13 */                            \
        GET_PACA(r13);                                                  \
        std     r9,PACA_EXGEN+EX_R9(r13);       /* save r9, r10 */      \
        std     r10,PACA_EXGEN+EX_R10(r13);                             \
        mfcr    r9;                                                     \
        cmpwi   r10,0;                                                  \
        beq     masked_##h##interrupt;                                  \
-       mfspr   r10,SPRN_SPRG_##h##SCRATCH0;                            \
+       GET_SCRATCH0(r10);                                              \
        std     r10,PACA_EXGEN+EX_R13(r13);                             \
        std     r11,PACA_EXGEN+EX_R11(r13);                             \
        std     r12,PACA_EXGEN+EX_R12(r13);                             \
 
        FTR_SECTION_ELSE_NESTED(66);                    \
        mtspr   SPRN_SPRG_HPACA,rX;                     \
        ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
+
+#define GET_SCRATCH0(rX)                               \
+       BEGIN_FTR_SECTION_NESTED(66);                   \
+       mfspr   rX,SPRN_SPRG_SCRATCH0;                  \
+       FTR_SECTION_ELSE_NESTED(66);                    \
+       mfspr   rX,SPRN_SPRG_HSCRATCH0;                 \
+       ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
+
+#define SET_SCRATCH0(rX)                               \
+       BEGIN_FTR_SECTION_NESTED(66);                   \
+       mtspr   SPRN_SPRG_SCRATCH0,rX;                  \
+       FTR_SECTION_ELSE_NESTED(66);                    \
+       mtspr   SPRN_SPRG_HSCRATCH0,rX;                 \
+       ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
 #endif
 
 #ifdef CONFIG_PPC_BOOK3E_64
 
 _machine_check_pSeries:
        HMT_MEDIUM
        DO_KVM  0x200
-       mtspr   SPRN_SPRG_SCRATCH0,r13          /* save r13 */
+       SET_SCRATCH0(r13)
        EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD)
 
        . = 0x300
 data_access_pSeries:
        HMT_MEDIUM
        DO_KVM  0x300
-       mtspr   SPRN_SPRG_SCRATCH0,r13
+       SET_SCRATCH0(r13)
 BEGIN_FTR_SECTION
        GET_PACA(r13)
        std     r9,PACA_EXSLB+EX_R9(r13)
        std     r11,PACA_EXGEN+EX_R11(r13)
        ld      r11,PACA_EXSLB+EX_R9(r13)
        std     r12,PACA_EXGEN+EX_R12(r13)
-       mfspr   r12,SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r12)
        std     r10,PACA_EXGEN+EX_R10(r13)
        std     r11,PACA_EXGEN+EX_R9(r13)
        std     r12,PACA_EXGEN+EX_R13(r13)
 data_access_slb_pSeries:
        HMT_MEDIUM
        DO_KVM  0x380
-       mtspr   SPRN_SPRG_SCRATCH0,r13
+       SET_SCRATCH0(r13)
        GET_PACA(r13)
        std     r3,PACA_EXSLB+EX_R3(r13)
        mfspr   r3,SPRN_DAR
        std     r10,PACA_EXSLB+EX_R10(r13)
        std     r11,PACA_EXSLB+EX_R11(r13)
        std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r10)
        std     r10,PACA_EXSLB+EX_R13(r13)
        mfspr   r12,SPRN_SRR1           /* and SRR1 */
 #ifndef CONFIG_RELOCATABLE
 instruction_access_slb_pSeries:
        HMT_MEDIUM
        DO_KVM  0x480
-       mtspr   SPRN_SPRG_SCRATCH0,r13
+       SET_SCRATCH0(r13)
        GET_PACA(r13)
        std     r3,PACA_EXSLB+EX_R3(r13)
        mfspr   r3,SPRN_SRR0            /* SRR0 is faulting address */
        std     r10,PACA_EXSLB+EX_R10(r13)
        std     r11,PACA_EXSLB+EX_R11(r13)
        std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r10)
        std     r10,PACA_EXSLB+EX_R13(r13)
        mfspr   r12,SPRN_SRR1           /* and SRR1 */
 #ifndef CONFIG_RELOCATABLE
        rotldi  r10,r10,16
        mtspr   SPRN_SRR1,r10
        ld      r10,PACA_EXGEN+EX_R10(r13)
-       mfspr   r13,SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r13)
        rfid
        b       .
 
        rotldi  r10,r10,16
        mtspr   SPRN_HSRR1,r10
        ld      r10,PACA_EXGEN+EX_R10(r13)
-       mfspr   r13,SPRN_SPRG_HSCRATCH0
+       GET_SCRATCH0(r13)
        hrfid
        b       .
 
 do_stab_bolted_pSeries:
        std     r11,PACA_EXSLB+EX_R11(r13)
        std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r10)
        std     r10,PACA_EXSLB+EX_R13(r13)
        EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD)
 
       .align 7
 system_reset_fwnmi:
        HMT_MEDIUM
-       mtspr   SPRN_SPRG_SCRATCH0,r13          /* save r13 */
+       SET_SCRATCH0(r13)               /* save r13 */
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD)
 
        .globl machine_check_fwnmi
       .align 7
 machine_check_fwnmi:
        HMT_MEDIUM
-       mtspr   SPRN_SPRG_SCRATCH0,r13          /* save r13 */
+       SET_SCRATCH0(r13)               /* save r13 */
        EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, EXC_STD)
 
 #endif /* CONFIG_PPC_PSERIES */
        std     r10,PACA_EXGEN+EX_R10(r13)
        std     r11,PACA_EXGEN+EX_R11(r13)
        std     r12,PACA_EXGEN+EX_R12(r13)
-       mfspr   r10,SPRG_SCRATCH0
+       GET_SCRATCH0(r10)
        ld      r11,PACA_EXSLB+EX_R9(r13)
        ld      r12,PACA_EXSLB+EX_R3(r13)
        std     r10,PACA_EXGEN+EX_R13(r13)
 
 .global kvmppc_trampoline_\intno
 kvmppc_trampoline_\intno:
 
-       mtspr   SPRN_SPRG_SCRATCH0, r13         /* Save r13 */
+       SET_SCRATCH0(r13)               /* Save r13 */
 
        /*
         * First thing to do is to find out if we're coming
        lwz     r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
        mtcr    r12
        PPC_LL  r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
-       mfspr   r13, SPRN_SPRG_SCRATCH0         /* r13 = original r13 */
+       GET_SCRATCH0(r13)                       /* r13 = original r13 */
        b       kvmppc_resume_\intno            /* Get back original handler */
 
        /* Now we know we're handling a KVM guest */
        lwz     r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
        mtcr    r12
        PPC_LL  r12, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
-       mfspr   r13, SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r13)
 
        /* And get back into the code */
        RFI
 
        PPC_STL r4, (SHADOW_VCPU_OFF + SVCPU_SHADOW_SRR1)(r13)
 
        /* Get scratch'ed off registers */
-       mfspr   r9, SPRN_SPRG_SCRATCH0
+       GET_SCRATCH0(r9)
        PPC_LL  r8, (SHADOW_VCPU_OFF + SVCPU_SCRATCH0)(r13)
        lwz     r7, (SHADOW_VCPU_OFF + SVCPU_SCRATCH1)(r13)
 
 
        std     r12,PACA_EXGEN+EX_R13(r13)
        EXCEPTION_PROLOG_ISERIES_1
 FTR_SECTION_ELSE
-       EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD)
+       EXCEPTION_PROLOG_1(PACA_EXGEN)
        EXCEPTION_PROLOG_ISERIES_1
 ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB)
        b       data_access_common
 
 label##_iSeries:                                                       \
        HMT_MEDIUM;                                                     \
        mtspr   SPRN_SPRG_SCRATCH0,r13; /* save r13 */                  \
-       EXCEPTION_PROLOG_1(area, EXC_STD);                              \
+       EXCEPTION_PROLOG_1(area);                                       \
        EXCEPTION_PROLOG_ISERIES_1;                                     \
        b       label##_common
 
 label##_iSeries:                                                       \
        HMT_MEDIUM;                                                     \
        mtspr   SPRN_SPRG_SCRATCH0,r13; /* save r13 */                  \
-       EXCEPTION_PROLOG_1(PACA_EXGEN, EXC_STD);                        \
+       EXCEPTION_PROLOG_1(PACA_EXGEN);                                 \
        lbz     r10,PACASOFTIRQEN(r13);                                 \
        cmpwi   0,r10,0;                                                \
        beq-    label##_iSeries_masked;                                 \