powerpc/32: add a macro to get and/or save DAR and DSISR on stack.
authorChristophe Leroy <christophe.leroy@c-s.fr>
Sat, 21 Dec 2019 08:32:26 +0000 (08:32 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 26 Jan 2020 11:15:09 +0000 (22:15 +1100)
Refactor reading and saving of DAR and DSISR in exception vectors.

This will ease the implementation of VMAP stack.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1286b3e51b07727c6b4b05f2df9af3f9b1717fb5.1576916812.git.christophe.leroy@c-s.fr
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/head_32.h
arch/powerpc/kernel/head_8xx.S

index bebb49d..449625b 100644 (file)
@@ -339,10 +339,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
        DO_KVM  0x600
 Alignment:
        EXCEPTION_PROLOG
-       mfspr   r4,SPRN_DAR
-       stw     r4,_DAR(r11)
-       mfspr   r5,SPRN_DSISR
-       stw     r5,_DSISR(r11)
+       save_dar_dsisr_on_stack r4, r5, r11
        addi    r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0x600, alignment_exception)
 
index 436ffd8..f19a1ab 100644 (file)
        RFI                             /* jump to handler, enable MMU */
 .endm
 
+.macro save_dar_dsisr_on_stack reg1, reg2, sp
+       mfspr   \reg1, SPRN_DAR
+       mfspr   \reg2, SPRN_DSISR
+       stw     \reg1, _DAR(\sp)
+       stw     \reg2, _DSISR(\sp)
+.endm
+
+.macro get_and_save_dar_dsisr_on_stack reg1, reg2, sp
+       save_dar_dsisr_on_stack \reg1, \reg2, \sp
+.endm
+
 /*
  * Note: code which follows this uses cr0.eq (set if from kernel),
  * r11, r12 (SRR0), and r9 (SRR1).
index 175c3cf..25e19af 100644 (file)
@@ -128,12 +128,9 @@ instruction_counter:
        . = 0x200
 MachineCheck:
        EXCEPTION_PROLOG
-       mfspr r4,SPRN_DAR
-       stw r4,_DAR(r11)
-       li r5,RPN_PATTERN
-       mtspr SPRN_DAR,r5       /* Tag DAR, to be used in DTLB Error */
-       mfspr r5,SPRN_DSISR
-       stw r5,_DSISR(r11)
+       save_dar_dsisr_on_stack r4, r5, r11
+       li      r6, RPN_PATTERN
+       mtspr   SPRN_DAR, r6    /* Tag DAR, to be used in DTLB Error */
        addi r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0x200, machine_check_exception)
 
@@ -156,12 +153,9 @@ InstructionAccess:
        . = 0x600
 Alignment:
        EXCEPTION_PROLOG
-       mfspr   r4,SPRN_DAR
-       stw     r4,_DAR(r11)
-       li      r5,RPN_PATTERN
-       mtspr   SPRN_DAR,r5     /* Tag DAR, to be used in DTLB Error */
-       mfspr   r5,SPRN_DSISR
-       stw     r5,_DSISR(r11)
+       save_dar_dsisr_on_stack r4, r5, r11
+       li      r6, RPN_PATTERN
+       mtspr   SPRN_DAR, r6    /* Tag DAR, to be used in DTLB Error */
        addi    r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_STD(0x600, alignment_exception)
 
@@ -502,10 +496,7 @@ DataTLBError:
 DARFixed:/* Return from dcbx instruction bug workaround */
        EXCEPTION_PROLOG_1
        EXCEPTION_PROLOG_2
-       mfspr   r5,SPRN_DSISR
-       stw     r5,_DSISR(r11)
-       mfspr   r4,SPRN_DAR
-       stw     r4, _DAR(r11)
+       get_and_save_dar_dsisr_on_stack r4, r5, r11
        andis.  r10,r5,DSISR_NOHPTE@h
        beq+    .Ldtlbie
        tlbie   r4