powerpc: Implement PPR save/restore
[pandora-kernel.git] / arch / powerpc / include / asm / exception-64s.h
index 391e013..370298a 100644 (file)
@@ -147,8 +147,9 @@ END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,943)
 
 #define __EXCEPTION_PROLOG_1(area, extra, vec)                         \
        GET_PACA(r13);                                                  \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
+       std     r9,area+EX_R9(r13);     /* save r9 */                   \
+       HMT_MEDIUM_PPR_SAVE(area, r9);                                  \
+       std     r10,area+EX_R10(r13);   /* save r10 - r12 */            \
        BEGIN_FTR_SECTION_NESTED(66);                                   \
        mfspr   r10,SPRN_CFAR;                                          \
        std     r10,area+EX_CFAR(r13);                                  \
@@ -264,6 +265,7 @@ do_kvm_##n:                                                         \
        std     r10,GPR1(r1);           /* save r1 in stackframe        */ \
        beq     4f;                     /* if from kernel mode          */ \
        ACCOUNT_CPU_USER_ENTRY(r9, r10);                                   \
+       SAVE_PPR(area, r9, r10);                                           \
 4:     std     r2,GPR2(r1);            /* save r2 in stackframe        */ \
        SAVE_4GPRS(3, r1);              /* save r3 - r6 in stackframe   */ \
        SAVE_2GPRS(7, r1);              /* save r7, r8 in stackframe    */ \
@@ -305,7 +307,7 @@ do_kvm_##n:                                                         \
        . = loc;                                        \
        .globl label##_pSeries;                         \
 label##_pSeries:                                       \
-       HMT_MEDIUM;                                     \
+       HMT_MEDIUM_PPR_DISCARD;                         \
        SET_SCRATCH0(r13);              /* save r13 */          \
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common,    \
                                 EXC_STD, KVMTEST_PR, vec)
@@ -314,7 +316,7 @@ label##_pSeries:                                    \
        . = loc;                                        \
        .globl label##_hv;                              \
 label##_hv:                                            \
-       HMT_MEDIUM;                                     \
+       HMT_MEDIUM_PPR_DISCARD;                         \
        SET_SCRATCH0(r13);      /* save r13 */                  \
        EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common,    \
                                 EXC_HV, KVMTEST, vec)
@@ -323,7 +325,7 @@ label##_hv:                                         \
        . = loc;                                        \
        .globl label##_relon_pSeries;                   \
 label##_relon_pSeries:                                 \
-       HMT_MEDIUM;                                     \
+       HMT_MEDIUM_PPR_DISCARD;                         \
        /* No guest interrupts come through here */     \
        SET_SCRATCH0(r13);              /* save r13 */  \
        EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \
@@ -333,7 +335,7 @@ label##_relon_pSeries:                                      \
        . = loc;                                        \
        .globl label##_relon_hv;                        \
 label##_relon_hv:                                      \
-       HMT_MEDIUM;                                     \
+       HMT_MEDIUM_PPR_DISCARD;                         \
        /* No guest interrupts come through here */     \
        SET_SCRATCH0(r13);      /* save r13 */          \
        EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \
@@ -371,7 +373,7 @@ label##_relon_hv:                                   \
 #define SOFTEN_NOTEST_HV(vec)          _SOFTEN_TEST(EXC_HV, vec)
 
 #define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)             \
-       HMT_MEDIUM;                                                     \
+       HMT_MEDIUM_PPR_DISCARD;                                         \
        SET_SCRATCH0(r13);    /* save r13 */                            \
        __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec);           \
        EXCEPTION_PROLOG_PSERIES_1(label##_common, h);
@@ -393,7 +395,7 @@ label##_hv:                                                         \
                                    EXC_HV, SOFTEN_TEST_HV)
 
 #define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)       \
-       HMT_MEDIUM;                                                     \
+       HMT_MEDIUM_PPR_DISCARD;                                         \
        SET_SCRATCH0(r13);    /* save r13 */                            \
        __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec);           \
        EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h);