1c3347ed0SJanosch Frank /* 2c3347ed0SJanosch Frank * Protected Virtualization functions 3c3347ed0SJanosch Frank * 4c3347ed0SJanosch Frank * Copyright IBM Corp. 2020 5c3347ed0SJanosch Frank * Author(s): 6c3347ed0SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 7c3347ed0SJanosch Frank * 8c3347ed0SJanosch Frank * This work is licensed under the terms of the GNU GPL, version 2 or (at 9c3347ed0SJanosch Frank * your option) any later version. See the COPYING file in the top-level 10c3347ed0SJanosch Frank * directory. 11c3347ed0SJanosch Frank */ 12c3347ed0SJanosch Frank #include "qemu/osdep.h" 13c3347ed0SJanosch Frank 14c3347ed0SJanosch Frank #include <linux/kvm.h> 15c3347ed0SJanosch Frank 16c3347ed0SJanosch Frank #include "qemu/error-report.h" 17c3347ed0SJanosch Frank #include "sysemu/kvm.h" 18c3347ed0SJanosch Frank #include "hw/s390x/pv.h" 19c3347ed0SJanosch Frank 20c3347ed0SJanosch Frank static int __s390_pv_cmd(uint32_t cmd, const char *cmdname, void *data) 21c3347ed0SJanosch Frank { 22c3347ed0SJanosch Frank struct kvm_pv_cmd pv_cmd = { 23c3347ed0SJanosch Frank .cmd = cmd, 24c3347ed0SJanosch Frank .data = (uint64_t)data, 25c3347ed0SJanosch Frank }; 26c3347ed0SJanosch Frank int rc = kvm_vm_ioctl(kvm_state, KVM_S390_PV_COMMAND, &pv_cmd); 27c3347ed0SJanosch Frank 28c3347ed0SJanosch Frank if (rc) { 29c3347ed0SJanosch Frank error_report("KVM PV command %d (%s) failed: header rc %x rrc %x " 30c3347ed0SJanosch Frank "IOCTL rc: %d", cmd, cmdname, pv_cmd.rc, pv_cmd.rrc, 31c3347ed0SJanosch Frank rc); 32c3347ed0SJanosch Frank } 33c3347ed0SJanosch Frank return rc; 34c3347ed0SJanosch Frank } 35c3347ed0SJanosch Frank 36c3347ed0SJanosch Frank /* 37c3347ed0SJanosch Frank * This macro lets us pass the command as a string to the function so 38c3347ed0SJanosch Frank * we can print it on an error. 39c3347ed0SJanosch Frank */ 40c3347ed0SJanosch Frank #define s390_pv_cmd(cmd, data) __s390_pv_cmd(cmd, #cmd, data); 41c3347ed0SJanosch Frank #define s390_pv_cmd_exit(cmd, data) \ 42c3347ed0SJanosch Frank { \ 43c3347ed0SJanosch Frank int rc; \ 44c3347ed0SJanosch Frank \ 45c3347ed0SJanosch Frank rc = __s390_pv_cmd(cmd, #cmd, data);\ 46c3347ed0SJanosch Frank if (rc) { \ 47c3347ed0SJanosch Frank exit(1); \ 48c3347ed0SJanosch Frank } \ 49c3347ed0SJanosch Frank } 50c3347ed0SJanosch Frank 51c3347ed0SJanosch Frank int s390_pv_vm_enable(void) 52c3347ed0SJanosch Frank { 53c3347ed0SJanosch Frank return s390_pv_cmd(KVM_PV_ENABLE, NULL); 54c3347ed0SJanosch Frank } 55c3347ed0SJanosch Frank 56c3347ed0SJanosch Frank void s390_pv_vm_disable(void) 57c3347ed0SJanosch Frank { 58c3347ed0SJanosch Frank s390_pv_cmd_exit(KVM_PV_DISABLE, NULL); 59c3347ed0SJanosch Frank } 60c3347ed0SJanosch Frank 61c3347ed0SJanosch Frank int s390_pv_set_sec_parms(uint64_t origin, uint64_t length) 62c3347ed0SJanosch Frank { 63c3347ed0SJanosch Frank struct kvm_s390_pv_sec_parm args = { 64c3347ed0SJanosch Frank .origin = origin, 65c3347ed0SJanosch Frank .length = length, 66c3347ed0SJanosch Frank }; 67c3347ed0SJanosch Frank 68c3347ed0SJanosch Frank return s390_pv_cmd(KVM_PV_SET_SEC_PARMS, &args); 69c3347ed0SJanosch Frank } 70c3347ed0SJanosch Frank 71c3347ed0SJanosch Frank /* 72c3347ed0SJanosch Frank * Called for each component in the SE type IPL parameter block 0. 73c3347ed0SJanosch Frank */ 74c3347ed0SJanosch Frank int s390_pv_unpack(uint64_t addr, uint64_t size, uint64_t tweak) 75c3347ed0SJanosch Frank { 76c3347ed0SJanosch Frank struct kvm_s390_pv_unp args = { 77c3347ed0SJanosch Frank .addr = addr, 78c3347ed0SJanosch Frank .size = size, 79c3347ed0SJanosch Frank .tweak = tweak, 80c3347ed0SJanosch Frank }; 81c3347ed0SJanosch Frank 82c3347ed0SJanosch Frank return s390_pv_cmd(KVM_PV_UNPACK, &args); 83c3347ed0SJanosch Frank } 84c3347ed0SJanosch Frank 85c3347ed0SJanosch Frank void s390_pv_perf_clear_reset(void) 86c3347ed0SJanosch Frank { 87c3347ed0SJanosch Frank s390_pv_cmd_exit(KVM_PV_PREP_RESET, NULL); 88c3347ed0SJanosch Frank } 89c3347ed0SJanosch Frank 90c3347ed0SJanosch Frank int s390_pv_verify(void) 91c3347ed0SJanosch Frank { 92c3347ed0SJanosch Frank return s390_pv_cmd(KVM_PV_VERIFY, NULL); 93c3347ed0SJanosch Frank } 94c3347ed0SJanosch Frank 95c3347ed0SJanosch Frank void s390_pv_unshare(void) 96c3347ed0SJanosch Frank { 97c3347ed0SJanosch Frank s390_pv_cmd_exit(KVM_PV_UNSHARE_ALL, NULL); 98c3347ed0SJanosch Frank } 99