mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
KVM: PPC: booke: save/restore VRSAVE (a.k.a. USPRG0)
Linux doesn't use USPRG0 (now renamed VRSAVE in the architecture, even when Altivec isn't involved), but a guest might. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
1a040b26c5
commit
eab176722f
@ -223,6 +223,7 @@ struct kvm_vcpu_arch {
|
|||||||
ulong hflags;
|
ulong hflags;
|
||||||
ulong guest_owned_ext;
|
ulong guest_owned_ext;
|
||||||
#endif
|
#endif
|
||||||
|
u32 vrsave; /* also USPRG0 */
|
||||||
u32 mmucr;
|
u32 mmucr;
|
||||||
ulong sprg4;
|
ulong sprg4;
|
||||||
ulong sprg5;
|
ulong sprg5;
|
||||||
|
@ -395,6 +395,7 @@ int main(void)
|
|||||||
DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack));
|
DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack));
|
||||||
DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid));
|
DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid));
|
||||||
DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr));
|
DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr));
|
||||||
|
DEFINE(VCPU_VRSAVE, offsetof(struct kvm_vcpu, arch.vrsave));
|
||||||
DEFINE(VCPU_SPRG4, offsetof(struct kvm_vcpu, arch.sprg4));
|
DEFINE(VCPU_SPRG4, offsetof(struct kvm_vcpu, arch.sprg4));
|
||||||
DEFINE(VCPU_SPRG5, offsetof(struct kvm_vcpu, arch.sprg5));
|
DEFINE(VCPU_SPRG5, offsetof(struct kvm_vcpu, arch.sprg5));
|
||||||
DEFINE(VCPU_SPRG6, offsetof(struct kvm_vcpu, arch.sprg6));
|
DEFINE(VCPU_SPRG6, offsetof(struct kvm_vcpu, arch.sprg6));
|
||||||
|
@ -380,7 +380,6 @@ lightweight_exit:
|
|||||||
* because host interrupt handlers would get confused. */
|
* because host interrupt handlers would get confused. */
|
||||||
lwz r1, VCPU_GPR(r1)(r4)
|
lwz r1, VCPU_GPR(r1)(r4)
|
||||||
|
|
||||||
/* XXX handle USPRG0 */
|
|
||||||
/* Host interrupt handlers may have clobbered these guest-readable
|
/* Host interrupt handlers may have clobbered these guest-readable
|
||||||
* SPRGs, so we need to reload them here with the guest's values. */
|
* SPRGs, so we need to reload them here with the guest's values. */
|
||||||
lwz r3, VCPU_SPRG4(r4)
|
lwz r3, VCPU_SPRG4(r4)
|
||||||
|
@ -298,12 +298,25 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_BOOKE
|
||||||
|
/*
|
||||||
|
* vrsave (formerly usprg0) isn't used by Linux, but may
|
||||||
|
* be used by the guest.
|
||||||
|
*
|
||||||
|
* On non-booke this is associated with Altivec and
|
||||||
|
* is handled by code in book3s.c.
|
||||||
|
*/
|
||||||
|
mtspr(SPRN_VRSAVE, vcpu->arch.vrsave);
|
||||||
|
#endif
|
||||||
kvmppc_core_vcpu_load(vcpu, cpu);
|
kvmppc_core_vcpu_load(vcpu, cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
kvmppc_core_vcpu_put(vcpu);
|
kvmppc_core_vcpu_put(vcpu);
|
||||||
|
#ifdef CONFIG_BOOKE
|
||||||
|
vcpu->arch.vrsave = mfspr(SPRN_VRSAVE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
||||||
|
Loading…
Reference in New Issue
Block a user