KVM: s390: protvirt: Do only reset registers that are accessible
authorJanosch Frank <frankja@linux.ibm.com>
Mon, 10 Feb 2020 09:27:47 +0000 (04:27 -0500)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 27 Feb 2020 18:47:12 +0000 (19:47 +0100)
For protected VMs the hypervisor can not access guest breaking event
address, program parameter, bpbc and todpr. Do not reset those fields
as the control block does not provide access to these fields.

Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
[borntraeger@de.ibm.com: patch merging, splitting, fixing]
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/kvm-s390.c

index 797b4031ed4d2a854cad52d7f490a640c399cf15..1c7bbc2497a2697d2f790a6627bfa83f7e771f7a 100644 (file)
@@ -3502,14 +3502,21 @@ static void kvm_arch_vcpu_ioctl_initial_reset(struct kvm_vcpu *vcpu)
        kvm_s390_set_prefix(vcpu, 0);
        kvm_s390_set_cpu_timer(vcpu, 0);
        vcpu->arch.sie_block->ckc = 0;
-       vcpu->arch.sie_block->todpr = 0;
        memset(vcpu->arch.sie_block->gcr, 0, sizeof(vcpu->arch.sie_block->gcr));
        vcpu->arch.sie_block->gcr[0] = CR0_INITIAL_MASK;
        vcpu->arch.sie_block->gcr[14] = CR14_INITIAL_MASK;
        vcpu->run->s.regs.fpc = 0;
-       vcpu->arch.sie_block->gbea = 1;
-       vcpu->arch.sie_block->pp = 0;
-       vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
+       /*
+        * Do not reset these registers in the protected case, as some of
+        * them are overlayed and they are not accessible in this case
+        * anyway.
+        */
+       if (!kvm_s390_pv_cpu_is_protected(vcpu)) {
+               vcpu->arch.sie_block->gbea = 1;
+               vcpu->arch.sie_block->pp = 0;
+               vcpu->arch.sie_block->fpf &= ~FPF_BPBC;
+               vcpu->arch.sie_block->todpr = 0;
+       }
 }
 
 static void kvm_arch_vcpu_ioctl_clear_reset(struct kvm_vcpu *vcpu)