powerpc: Fix register clobbering when accumulating stolen time
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 2 Mar 2012 00:01:31 +0000 (11:01 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 8 Mar 2012 23:55:16 +0000 (10:55 +1100)
When running under a hypervisor that supports stolen time accounting,
we may call C code from the macro EXCEPTION_PROLOG_COMMON in the
exception entry path, which clobbers CR0.

However, the FPU and vector traps rely on CR0 indicating whether we
are coming from userspace or kernel to decide what to do.

So we need to restore that value after the C call

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/ppc_asm.h

index 368f72f798087b331b31300c9c9f2aa5dec50588..50f73aa2ba219acbb132795af18cc7f447e019ff 100644 (file)
@@ -60,6 +60,8 @@ BEGIN_FW_FTR_SECTION;                                                 \
        cmpd    cr1,r11,r10;                                            \
        beq+    cr1,33f;                                                \
        bl      .accumulate_stolen_time;                                \
+       ld      r12,_MSR(r1);                                           \
+       andi.   r10,r12,MSR_PR;         /* Restore cr0 (coming from user) */ \
 33:                                                                    \
 END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)