Commit f6127716 authored by Alexander Graf's avatar Alexander Graf Committed by Avi Kivity

KVM: PPC: Save/Restore CR over vcpu_run

On PPC, CR2-CR4 are nonvolatile, thus have to be saved across function calls.
We didn't respect that for any architecture until Paul spotted it in his
patch for Book3S-HV. This patch saves/restores CR for all KVM capable PPC hosts.
Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent 3aaefef2
...@@ -49,7 +49,8 @@ ...@@ -49,7 +49,8 @@
* kernel with the -ffixed-r2 gcc option. * kernel with the -ffixed-r2 gcc option.
*/ */
#define HOST_R2 (3 * LONGBYTES) #define HOST_R2 (3 * LONGBYTES)
#define HOST_NV_GPRS (4 * LONGBYTES) #define HOST_CR (4 * LONGBYTES)
#define HOST_NV_GPRS (5 * LONGBYTES)
#define HOST_NV_GPR(n) (HOST_NV_GPRS + ((n - 14) * LONGBYTES)) #define HOST_NV_GPR(n) (HOST_NV_GPRS + ((n - 14) * LONGBYTES))
#define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + LONGBYTES) #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(31) + LONGBYTES)
#define HOST_STACK_SIZE ((HOST_MIN_STACK_SIZE + 15) & ~15) /* Align. */ #define HOST_STACK_SIZE ((HOST_MIN_STACK_SIZE + 15) & ~15) /* Align. */
...@@ -396,6 +397,7 @@ skip_nv_load: ...@@ -396,6 +397,7 @@ skip_nv_load:
heavyweight_exit: heavyweight_exit:
/* Not returning to guest. */ /* Not returning to guest. */
PPC_LL r5, HOST_STACK_LR(r1) PPC_LL r5, HOST_STACK_LR(r1)
lwz r6, HOST_CR(r1)
/* /*
* We already saved guest volatile register state; now save the * We already saved guest volatile register state; now save the
...@@ -442,6 +444,7 @@ heavyweight_exit: ...@@ -442,6 +444,7 @@ heavyweight_exit:
/* Return to kvm_vcpu_run(). */ /* Return to kvm_vcpu_run(). */
mtlr r5 mtlr r5
mtcr r6
addi r1, r1, HOST_STACK_SIZE addi r1, r1, HOST_STACK_SIZE
/* r3 still contains the return code from kvmppc_handle_exit(). */ /* r3 still contains the return code from kvmppc_handle_exit(). */
blr blr
...@@ -457,8 +460,11 @@ _GLOBAL(__kvmppc_vcpu_run) ...@@ -457,8 +460,11 @@ _GLOBAL(__kvmppc_vcpu_run)
/* Save host state to stack. */ /* Save host state to stack. */
PPC_STL r3, HOST_RUN(r1) PPC_STL r3, HOST_RUN(r1)
mflr r3 mflr r3
mfcr r5
PPC_STL r3, HOST_STACK_LR(r1) PPC_STL r3, HOST_STACK_LR(r1)
stw r5, HOST_CR(r1)
/* Save host non-volatile register state to stack. */ /* Save host non-volatile register state to stack. */
PPC_STL r14, HOST_NV_GPR(r14)(r1) PPC_STL r14, HOST_NV_GPR(r14)(r1)
PPC_STL r15, HOST_NV_GPR(r15)(r1) PPC_STL r15, HOST_NV_GPR(r15)(r1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment