]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/exceptions-64s.S
powerpc: Implement PPR save/restore
[karo-tx-linux.git] / arch / powerpc / kernel / exceptions-64s.S
index 32fc04f788900d16ed52302356b2f90a68e4c580..3425aba8da51906f72cf607946c1eef20d8662f1 100644 (file)
@@ -104,7 +104,7 @@ __start_interrupts:
 
        .globl system_reset_pSeries;
 system_reset_pSeries:
-       HMT_MEDIUM;
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
 #ifdef CONFIG_PPC_P7_NAP
 BEGIN_FTR_SECTION
@@ -158,7 +158,7 @@ machine_check_pSeries_1:
        . = 0x300
        .globl data_access_pSeries
 data_access_pSeries:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
 BEGIN_FTR_SECTION
        b       data_access_check_stab
@@ -170,7 +170,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
        . = 0x380
        .globl data_access_slb_pSeries
 data_access_slb_pSeries:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
        EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380)
        std     r3,PACA_EXSLB+EX_R3(r13)
@@ -201,7 +201,7 @@ data_access_slb_pSeries:
        . = 0x480
        .globl instruction_access_slb_pSeries
 instruction_access_slb_pSeries:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
        EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480)
        std     r3,PACA_EXSLB+EX_R3(r13)
@@ -324,10 +324,11 @@ vsx_unavailable_pSeries_1:
        . = 0x1500
        .global denorm_exception_hv
 denorm_exception_hv:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        mtspr   SPRN_SPRG_HSCRATCH0,r13
        mfspr   r13,SPRN_SPRG_HPACA
        std     r9,PACA_EXGEN+EX_R9(r13)
+       HMT_MEDIUM_PPR_SAVE(PACA_EXGEN, r9)
        std     r10,PACA_EXGEN+EX_R10(r13)
        std     r11,PACA_EXGEN+EX_R11(r13)
        std     r12,PACA_EXGEN+EX_R12(r13)
@@ -369,7 +370,7 @@ denorm_exception_hv:
 machine_check_pSeries:
        .globl machine_check_fwnmi
 machine_check_fwnmi:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)               /* save r13 */
        EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common,
                                 EXC_STD, KVMTEST, 0x200)
@@ -498,6 +499,7 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
        mtspr   SPRN_HSRR0,r11
        mtcrf   0x80,r9
        ld      r9,PACA_EXGEN+EX_R9(r13)
+       RESTORE_PPR_PACA(PACA_EXGEN, r10)
        ld      r10,PACA_EXGEN+EX_R10(r13)
        ld      r11,PACA_EXGEN+EX_R11(r13)
        ld      r12,PACA_EXGEN+EX_R12(r13)
@@ -603,7 +605,7 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
        .globl system_reset_fwnmi
       .align 7
 system_reset_fwnmi:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)               /* save r13 */
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
                                 NOTEST, 0x100)
@@ -716,7 +718,7 @@ machine_check_common:
        . = 0x4380
        .globl data_access_slb_relon_pSeries
 data_access_slb_relon_pSeries:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
        EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380)
        std     r3,PACA_EXSLB+EX_R3(r13)
@@ -741,7 +743,7 @@ data_access_slb_relon_pSeries:
        . = 0x4480
        .globl instruction_access_slb_relon_pSeries
 instruction_access_slb_relon_pSeries:
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
        EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480)
        std     r3,PACA_EXSLB+EX_R3(r13)
@@ -1062,6 +1064,7 @@ _GLOBAL(slb_miss_realmode)
        mtcrf   0x01,r9         /* slb_allocate uses cr0 and cr7 */
 .machine       pop
 
+       RESTORE_PPR_PACA(PACA_EXSLB, r9)
        ld      r9,PACA_EXSLB+EX_R9(r13)
        ld      r10,PACA_EXSLB+EX_R10(r13)
        ld      r11,PACA_EXSLB+EX_R11(r13)
@@ -1411,7 +1414,7 @@ initial_stab:
 
 #ifdef CONFIG_PPC_POWERNV
 _GLOBAL(opal_mc_secondary_handler)
-       HMT_MEDIUM
+       HMT_MEDIUM_PPR_DISCARD
        SET_SCRATCH0(r13)
        GET_PACA(r13)
        clrldi  r3,r3,2