KVM: PPC: Book3S HV: Save and restore CR in __kvmppc_vcore_entry
authorPaul Mackerras <paulus@samba.org>
Fri, 3 Feb 2012 00:53:21 +0000 (00:53 +0000)
committerPaul Mackerras <paulus@samba.org>
Tue, 3 Apr 2012 06:42:30 +0000 (16:42 +1000)
The ABI specifies that CR fields CR2--CR4 are nonvolatile across function
calls.  Currently __kvmppc_vcore_entry doesn't save and restore the CR,
leading to CR2--CR4 getting corrupted with guest values, possibly leading
to incorrect behaviour in its caller.  This adds instructions to save
and restore CR at the points where we save and restore the nonvolatile
GPRs.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kvm/book3s_hv_interrupts.S

index 3f7b674..d3fb4df 100644 (file)
@@ -46,8 +46,10 @@ _GLOBAL(__kvmppc_vcore_entry)
        /* Save host state to the stack */
        stdu    r1, -SWITCH_FRAME_SIZE(r1)
 
-       /* Save non-volatile registers (r14 - r31) */
+       /* Save non-volatile registers (r14 - r31) and CR */
        SAVE_NVGPRS(r1)
+       mfcr    r3
+       std     r3, _CCR(r1)
 
        /* Save host DSCR */
 BEGIN_FTR_SECTION
@@ -157,8 +159,10 @@ kvmppc_handler_highmem:
         * R13      = PACA
         */
 
-       /* Restore non-volatile host registers (r14 - r31) */
+       /* Restore non-volatile host registers (r14 - r31) and CR */
        REST_NVGPRS(r1)
+       ld      r4, _CCR(r1)
+       mtcr    r4
 
        addi    r1, r1, SWITCH_FRAME_SIZE
        ld      r0, PPC_LR_STKOFF(r1)