xref: /qemu/target/s390x/kvm/pv.c (revision c3347ed0d2ee42a7dcf7bfe7f9c3884a9596727a)
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