*/
        . = 0x200
        DO_KVM  0x200
-       mtspr   SPRN_SPRG_SCRATCH0,r10
-       mtspr   SPRN_SPRG_SCRATCH1,r11
-       mfcr    r10
+       EXCEPTION_PROLOG_0
 #ifdef CONFIG_PPC_CHRP
        mfspr   r11, SPRN_SPRG_THREAD
        lwz     r11, RTAS_SP(r11)
 
  * We assume sprg3 has the physical address of the current
  * task's thread_struct.
  */
-
 .macro EXCEPTION_PROLOG
+       EXCEPTION_PROLOG_0
+       EXCEPTION_PROLOG_1
+       EXCEPTION_PROLOG_2
+.endm
+
+.macro EXCEPTION_PROLOG_0
        mtspr   SPRN_SPRG_SCRATCH0,r10
        mtspr   SPRN_SPRG_SCRATCH1,r11
        mfcr    r10
-       EXCEPTION_PROLOG_1
-       EXCEPTION_PROLOG_2
 .endm
 
 .macro EXCEPTION_PROLOG_1
 
  */
        . = 0x1400
 DataTLBError:
-       mtspr   SPRN_SPRG_SCRATCH0, r10
-       mtspr   SPRN_SPRG_SCRATCH1, r11
-       mfcr    r10
-
+       EXCEPTION_PROLOG_0
        mfspr   r11, SPRN_DAR
        cmpwi   cr0, r11, RPN_PATTERN
        beq-    FixupDAR        /* must be a buggy dcbX, icbi insn. */
  */
        . = 0x1c00
 DataBreakpoint:
-       mtspr   SPRN_SPRG_SCRATCH0, r10
-       mtspr   SPRN_SPRG_SCRATCH1, r11
-       mfcr    r10
+       EXCEPTION_PROLOG_0
        mfspr   r11, SPRN_SRR0
        cmplwi  cr0, r11, (.Ldtlbie - PAGE_OFFSET)@l
        cmplwi  cr7, r11, (.Litlbie - PAGE_OFFSET)@l