diff options
Diffstat (limited to 'arch/s390/kvm/kvm-s390.c')
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 23 | 
1 files changed, 15 insertions, 8 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 776dafe918db..ed8064cb5c49 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -343,10 +343,11 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)  void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)  { -	save_fp_regs(&vcpu->arch.host_fpregs); +	save_fp_ctl(&vcpu->arch.host_fpregs.fpc); +	save_fp_regs(vcpu->arch.host_fpregs.fprs);  	save_access_regs(vcpu->arch.host_acrs); -	vcpu->arch.guest_fpregs.fpc &= FPC_VALID_MASK; -	restore_fp_regs(&vcpu->arch.guest_fpregs); +	restore_fp_ctl(&vcpu->arch.guest_fpregs.fpc); +	restore_fp_regs(vcpu->arch.guest_fpregs.fprs);  	restore_access_regs(vcpu->run->s.regs.acrs);  	gmap_enable(vcpu->arch.gmap);  	atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags); @@ -356,9 +357,11 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)  {  	atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);  	gmap_disable(vcpu->arch.gmap); -	save_fp_regs(&vcpu->arch.guest_fpregs); +	save_fp_ctl(&vcpu->arch.guest_fpregs.fpc); +	save_fp_regs(vcpu->arch.guest_fpregs.fprs);  	save_access_regs(vcpu->run->s.regs.acrs); -	restore_fp_regs(&vcpu->arch.host_fpregs); +	restore_fp_ctl(&vcpu->arch.host_fpregs.fpc); +	restore_fp_regs(vcpu->arch.host_fpregs.fprs);  	restore_access_regs(vcpu->arch.host_acrs);  } @@ -618,9 +621,12 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,  int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)  { +	if (test_fp_ctl(fpu->fpc)) +		return -EINVAL;  	memcpy(&vcpu->arch.guest_fpregs.fprs, &fpu->fprs, sizeof(fpu->fprs)); -	vcpu->arch.guest_fpregs.fpc = fpu->fpc & FPC_VALID_MASK; -	restore_fp_regs(&vcpu->arch.guest_fpregs); +	vcpu->arch.guest_fpregs.fpc = fpu->fpc; +	restore_fp_ctl(&vcpu->arch.guest_fpregs.fpc); +	restore_fp_regs(vcpu->arch.guest_fpregs.fprs);  	return 0;  } @@ -876,7 +882,8 @@ int kvm_s390_vcpu_store_status(struct kvm_vcpu *vcpu, unsigned long addr)  	 * copying in vcpu load/put. Lets update our copies before we save  	 * it into the save area  	 */ -	save_fp_regs(&vcpu->arch.guest_fpregs); +	save_fp_ctl(&vcpu->arch.guest_fpregs.fpc); +	save_fp_regs(vcpu->arch.guest_fpregs.fprs);  	save_access_regs(vcpu->run->s.regs.acrs);  	if (__guestcopy(vcpu, addr + offsetof(struct save_area, fp_regs),  | 
