Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: s390: protvirt: Add UV cpu reset calls

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>

authored by

Janosch Frank and committed by
Christian Borntraeger
8a8378fa 72f21820

+26
+6
arch/s390/include/asm/uv.h
··· 36 36 #define UVC_CMD_SET_SEC_CONF_PARAMS 0x0300 37 37 #define UVC_CMD_UNPACK_IMG 0x0301 38 38 #define UVC_CMD_VERIFY_IMG 0x0302 39 + #define UVC_CMD_CPU_RESET 0x0310 40 + #define UVC_CMD_CPU_RESET_INITIAL 0x0311 39 41 #define UVC_CMD_PREPARE_RESET 0x0320 42 + #define UVC_CMD_CPU_RESET_CLEAR 0x0321 40 43 #define UVC_CMD_CPU_SET_STATE 0x0330 41 44 #define UVC_CMD_SET_UNSHARE_ALL 0x0340 42 45 #define UVC_CMD_PIN_PAGE_SHARED 0x0341 ··· 62 59 BIT_UVC_CMD_SET_SEC_PARMS = 11, 63 60 BIT_UVC_CMD_UNPACK_IMG = 13, 64 61 BIT_UVC_CMD_VERIFY_IMG = 14, 62 + BIT_UVC_CMD_CPU_RESET = 15, 63 + BIT_UVC_CMD_CPU_RESET_INITIAL = 16, 65 64 BIT_UVC_CMD_CPU_SET_STATE = 17, 66 65 BIT_UVC_CMD_PREPARE_RESET = 18, 66 + BIT_UVC_CMD_CPU_PERFORM_CLEAR_RESET = 19, 67 67 BIT_UVC_CMD_UNSHARE_ALL = 20, 68 68 BIT_UVC_CMD_PIN_PAGE_SHARED = 21, 69 69 BIT_UVC_CMD_UNPIN_PAGE_SHARED = 22,
+20
arch/s390/kvm/kvm-s390.c
··· 4748 4748 void __user *argp = (void __user *)arg; 4749 4749 int idx; 4750 4750 long r; 4751 + u16 rc, rrc; 4751 4752 4752 4753 vcpu_load(vcpu); 4753 4754 ··· 4770 4769 case KVM_S390_CLEAR_RESET: 4771 4770 r = 0; 4772 4771 kvm_arch_vcpu_ioctl_clear_reset(vcpu); 4772 + if (kvm_s390_pv_cpu_is_protected(vcpu)) { 4773 + r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu), 4774 + UVC_CMD_CPU_RESET_CLEAR, &rc, &rrc); 4775 + VCPU_EVENT(vcpu, 3, "PROTVIRT RESET CLEAR VCPU: rc %x rrc %x", 4776 + rc, rrc); 4777 + } 4773 4778 break; 4774 4779 case KVM_S390_INITIAL_RESET: 4775 4780 r = 0; 4776 4781 kvm_arch_vcpu_ioctl_initial_reset(vcpu); 4782 + if (kvm_s390_pv_cpu_is_protected(vcpu)) { 4783 + r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu), 4784 + UVC_CMD_CPU_RESET_INITIAL, 4785 + &rc, &rrc); 4786 + VCPU_EVENT(vcpu, 3, "PROTVIRT RESET INITIAL VCPU: rc %x rrc %x", 4787 + rc, rrc); 4788 + } 4777 4789 break; 4778 4790 case KVM_S390_NORMAL_RESET: 4779 4791 r = 0; 4780 4792 kvm_arch_vcpu_ioctl_normal_reset(vcpu); 4793 + if (kvm_s390_pv_cpu_is_protected(vcpu)) { 4794 + r = uv_cmd_nodata(kvm_s390_pv_cpu_get_handle(vcpu), 4795 + UVC_CMD_CPU_RESET, &rc, &rrc); 4796 + VCPU_EVENT(vcpu, 3, "PROTVIRT RESET NORMAL VCPU: rc %x rrc %x", 4797 + rc, rrc); 4798 + } 4781 4799 break; 4782 4800 case KVM_SET_ONE_REG: 4783 4801 case KVM_GET_ONE_REG: {