KVM: s390: protvirt: Add UV cpu reset calls
authorJanosch Frank <frankja@linux.ibm.com>
Thu, 9 Jan 2020 09:37:50 +0000 (04:37 -0500)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 27 Feb 2020 18:47:12 +0000 (19:47 +0100)
For protected VMs, the VCPU resets are done by the Ultravisor, as KVM
has no access to the VCPU registers.

Note that the ultravisor will only accept a call for the exact reset
that has been requested.

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

index e55727b..cff4b4c 100644 (file)
 #define UVC_CMD_SET_SEC_CONF_PARAMS    0x0300
 #define UVC_CMD_UNPACK_IMG             0x0301
 #define UVC_CMD_VERIFY_IMG             0x0302
+#define UVC_CMD_CPU_RESET              0x0310
+#define UVC_CMD_CPU_RESET_INITIAL      0x0311
 #define UVC_CMD_PREPARE_RESET          0x0320
+#define UVC_CMD_CPU_RESET_CLEAR                0x0321
 #define UVC_CMD_CPU_SET_STATE          0x0330
 #define UVC_CMD_SET_UNSHARE_ALL                0x0340
 #define UVC_CMD_PIN_PAGE_SHARED                0x0341
@@ -59,8 +62,11 @@ enum uv_cmds_inst {
        BIT_UVC_CMD_SET_SEC_PARMS = 11,
        BIT_UVC_CMD_UNPACK_IMG = 13,
        BIT_UVC_CMD_VERIFY_IMG = 14,
+       BIT_UVC_CMD_CPU_RESET = 15,
+       BIT_UVC_CMD_CPU_RESET_INITIAL = 16,
        BIT_UVC_CMD_CPU_SET_STATE = 17,
        BIT_UVC_CMD_PREPARE_RESET = 18,
+       BIT_UVC_CMD_CPU_PERFORM_CLEAR_RESET = 19,
        BIT_UVC_CMD_UNSHARE_ALL = 20,
        BIT_UVC_CMD_PIN_PAGE_SHARED = 21,
        BIT_UVC_CMD_UNPIN_PAGE_SHARED = 22,
index fed025e..bb06006 100644 (file)
@@ -4748,6 +4748,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        void __user *argp = (void __user *)arg;
        int idx;
        long r;
+       u16 rc, rrc;
 
        vcpu_load(vcpu);
 
@@ -4769,14 +4770,33 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        case KVM_S390_CLEAR_RESET:
                r = 0;
                kvm_arch_vcpu_ioctl_clear_reset(vcpu);
+               if (kvm_s390_pv_cpu_is_protected(vcpu)) {
+                       r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
+                                         UVC_CMD_CPU_RESET_CLEAR, &rc, &rrc);
+                       VCPU_EVENT(vcpu, 3, "PROTVIRT RESET CLEAR VCPU: rc %x rrc %x",
+                                  rc, rrc);
+               }
                break;
        case KVM_S390_INITIAL_RESET:
                r = 0;
                kvm_arch_vcpu_ioctl_initial_reset(vcpu);
+               if (kvm_s390_pv_cpu_is_protected(vcpu)) {
+                       r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
+                                         UVC_CMD_CPU_RESET_INITIAL,
+                                         &rc, &rrc);
+                       VCPU_EVENT(vcpu, 3, "PROTVIRT RESET INITIAL VCPU: rc %x rrc %x",
+                                  rc, rrc);
+               }
                break;
        case KVM_S390_NORMAL_RESET:
                r = 0;
                kvm_arch_vcpu_ioctl_normal_reset(vcpu);
+               if (kvm_s390_pv_cpu_is_protected(vcpu)) {
+                       r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu),
+                                         UVC_CMD_CPU_RESET, &rc, &rrc);
+                       VCPU_EVENT(vcpu, 3, "PROTVIRT RESET NORMAL VCPU: rc %x rrc %x",
+                                  rc, rrc);
+               }
                break;
        case KVM_SET_ONE_REG:
        case KVM_GET_ONE_REG: {