1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "qemu/osdep.h"
22#include <sys/ioctl.h>
23
24#include <linux/kvm.h>
25#include <asm/ptrace.h>
26
27#include "cpu.h"
28#include "s390x-internal.h"
29#include "kvm_s390x.h"
30#include "sysemu/kvm_int.h"
31#include "qemu/cutils.h"
32#include "qapi/error.h"
33#include "qemu/error-report.h"
34#include "qemu/timer.h"
35#include "qemu/units.h"
36#include "qemu/main-loop.h"
37#include "qemu/mmap-alloc.h"
38#include "qemu/log.h"
39#include "sysemu/sysemu.h"
40#include "sysemu/hw_accel.h"
41#include "sysemu/runstate.h"
42#include "sysemu/device_tree.h"
43#include "exec/gdbstub.h"
44#include "exec/ram_addr.h"
45#include "trace.h"
46#include "hw/s390x/s390-pci-inst.h"
47#include "hw/s390x/s390-pci-bus.h"
48#include "hw/s390x/ipl.h"
49#include "hw/s390x/ebcdic.h"
50#include "exec/memattrs.h"
51#include "hw/s390x/s390-virtio-ccw.h"
52#include "hw/s390x/s390-virtio-hcall.h"
53#include "hw/s390x/pv.h"
54
55#ifndef DEBUG_KVM
56#define DEBUG_KVM 0
57#endif
58
59#define DPRINTF(fmt, ...) do { \
60 if (DEBUG_KVM) { \
61 fprintf(stderr, fmt, ## __VA_ARGS__); \
62 } \
63} while (0)
64
65#define kvm_vm_check_mem_attr(s, attr) \
66 kvm_vm_check_attr(s, KVM_S390_VM_MEM_CTRL, attr)
67
68#define IPA0_DIAG 0x8300
69#define IPA0_SIGP 0xae00
70#define IPA0_B2 0xb200
71#define IPA0_B9 0xb900
72#define IPA0_EB 0xeb00
73#define IPA0_E3 0xe300
74
75#define PRIV_B2_SCLP_CALL 0x20
76#define PRIV_B2_CSCH 0x30
77#define PRIV_B2_HSCH 0x31
78#define PRIV_B2_MSCH 0x32
79#define PRIV_B2_SSCH 0x33
80#define PRIV_B2_STSCH 0x34
81#define PRIV_B2_TSCH 0x35
82#define PRIV_B2_TPI 0x36
83#define PRIV_B2_SAL 0x37
84#define PRIV_B2_RSCH 0x38
85#define PRIV_B2_STCRW 0x39
86#define PRIV_B2_STCPS 0x3a
87#define PRIV_B2_RCHP 0x3b
88#define PRIV_B2_SCHM 0x3c
89#define PRIV_B2_CHSC 0x5f
90#define PRIV_B2_SIGA 0x74
91#define PRIV_B2_XSCH 0x76
92
93#define PRIV_EB_SQBS 0x8a
94#define PRIV_EB_PCISTB 0xd0
95#define PRIV_EB_SIC 0xd1
96
97#define PRIV_B9_EQBS 0x9c
98#define PRIV_B9_CLP 0xa0
99#define PRIV_B9_PCISTG 0xd0
100#define PRIV_B9_PCILG 0xd2
101#define PRIV_B9_RPCIT 0xd3
102
103#define PRIV_E3_MPCIFC 0xd0
104#define PRIV_E3_STPCIFC 0xd4
105
106#define DIAG_TIMEREVENT 0x288
107#define DIAG_IPL 0x308
108#define DIAG_SET_CONTROL_PROGRAM_CODES 0x318
109#define DIAG_KVM_HYPERCALL 0x500
110#define DIAG_KVM_BREAKPOINT 0x501
111
112#define ICPT_INSTRUCTION 0x04
113#define ICPT_PROGRAM 0x08
114#define ICPT_EXT_INT 0x14
115#define ICPT_WAITPSW 0x1c
116#define ICPT_SOFT_INTERCEPT 0x24
117#define ICPT_CPU_STOP 0x28
118#define ICPT_OPEREXC 0x2c
119#define ICPT_IO 0x40
120#define ICPT_PV_INSTR 0x68
121#define ICPT_PV_INSTR_NOTIFICATION 0x6c
122
123#define NR_LOCAL_IRQS 32
124
125
126
127
128#define VCPU_IRQ_BUF_SIZE(max_cpus) (sizeof(struct kvm_s390_irq) * \
129 (max_cpus + NR_LOCAL_IRQS))
130
131
132
133
134
135
136
137#define KVM_SLOT_MAX_BYTES (4UL * TiB)
138
139static CPUWatchpoint hw_watchpoint;
140
141
142
143
144static struct kvm_hw_breakpoint *hw_breakpoints;
145static int nb_hw_breakpoints;
146
147const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
148 KVM_CAP_LAST_INFO
149};
150
151static int cap_sync_regs;
152static int cap_async_pf;
153static int cap_mem_op;
154static int cap_mem_op_extension;
155static int cap_s390_irq;
156static int cap_ri;
157static int cap_hpage_1m;
158static int cap_vcpu_resets;
159static int cap_protected;
160static int cap_zpci_op;
161static int cap_protected_dump;
162
163static bool mem_op_storage_key_support;
164
165static int active_cmma;
166
167static int kvm_s390_query_mem_limit(uint64_t *memory_limit)
168{
169 struct kvm_device_attr attr = {
170 .group = KVM_S390_VM_MEM_CTRL,
171 .attr = KVM_S390_VM_MEM_LIMIT_SIZE,
172 .addr = (uint64_t) memory_limit,
173 };
174
175 return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
176}
177
178int kvm_s390_set_mem_limit(uint64_t new_limit, uint64_t *hw_limit)
179{
180 int rc;
181
182 struct kvm_device_attr attr = {
183 .group = KVM_S390_VM_MEM_CTRL,
184 .attr = KVM_S390_VM_MEM_LIMIT_SIZE,
185 .addr = (uint64_t) &new_limit,
186 };
187
188 if (!kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_LIMIT_SIZE)) {
189 return 0;
190 }
191
192 rc = kvm_s390_query_mem_limit(hw_limit);
193 if (rc) {
194 return rc;
195 } else if (*hw_limit < new_limit) {
196 return -E2BIG;
197 }
198
199 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
200}
201
202int kvm_s390_cmma_active(void)
203{
204 return active_cmma;
205}
206
207static bool kvm_s390_cmma_available(void)
208{
209 static bool initialized, value;
210
211 if (!initialized) {
212 initialized = true;
213 value = kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_ENABLE_CMMA) &&
214 kvm_vm_check_mem_attr(kvm_state, KVM_S390_VM_MEM_CLR_CMMA);
215 }
216 return value;
217}
218
219void kvm_s390_cmma_reset(void)
220{
221 int rc;
222 struct kvm_device_attr attr = {
223 .group = KVM_S390_VM_MEM_CTRL,
224 .attr = KVM_S390_VM_MEM_CLR_CMMA,
225 };
226
227 if (!kvm_s390_cmma_active()) {
228 return;
229 }
230
231 rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
232 trace_kvm_clear_cmma(rc);
233}
234
235static void kvm_s390_enable_cmma(void)
236{
237 int rc;
238 struct kvm_device_attr attr = {
239 .group = KVM_S390_VM_MEM_CTRL,
240 .attr = KVM_S390_VM_MEM_ENABLE_CMMA,
241 };
242
243 if (cap_hpage_1m) {
244 warn_report("CMM will not be enabled because it is not "
245 "compatible with huge memory backings.");
246 return;
247 }
248 rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
249 active_cmma = !rc;
250 trace_kvm_enable_cmma(rc);
251}
252
253static void kvm_s390_set_attr(uint64_t attr)
254{
255 struct kvm_device_attr attribute = {
256 .group = KVM_S390_VM_CRYPTO,
257 .attr = attr,
258 };
259
260 int ret = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attribute);
261
262 if (ret) {
263 error_report("Failed to set crypto device attribute %lu: %s",
264 attr, strerror(-ret));
265 }
266}
267
268static void kvm_s390_init_aes_kw(void)
269{
270 uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_AES_KW;
271
272 if (object_property_get_bool(OBJECT(qdev_get_machine()), "aes-key-wrap",
273 NULL)) {
274 attr = KVM_S390_VM_CRYPTO_ENABLE_AES_KW;
275 }
276
277 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
278 kvm_s390_set_attr(attr);
279 }
280}
281
282static void kvm_s390_init_dea_kw(void)
283{
284 uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_DEA_KW;
285
286 if (object_property_get_bool(OBJECT(qdev_get_machine()), "dea-key-wrap",
287 NULL)) {
288 attr = KVM_S390_VM_CRYPTO_ENABLE_DEA_KW;
289 }
290
291 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
292 kvm_s390_set_attr(attr);
293 }
294}
295
296void kvm_s390_crypto_reset(void)
297{
298 if (s390_has_feat(S390_FEAT_MSA_EXT_3)) {
299 kvm_s390_init_aes_kw();
300 kvm_s390_init_dea_kw();
301 }
302}
303
304void kvm_s390_set_max_pagesize(uint64_t pagesize, Error **errp)
305{
306 if (pagesize == 4 * KiB) {
307 return;
308 }
309
310 if (!hpage_1m_allowed()) {
311 error_setg(errp, "This QEMU machine does not support huge page "
312 "mappings");
313 return;
314 }
315
316 if (pagesize != 1 * MiB) {
317 error_setg(errp, "Memory backing with 2G pages was specified, "
318 "but KVM does not support this memory backing");
319 return;
320 }
321
322 if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_HPAGE_1M, 0)) {
323 error_setg(errp, "Memory backing with 1M pages was specified, "
324 "but KVM does not support this memory backing");
325 return;
326 }
327
328 cap_hpage_1m = 1;
329}
330
331int kvm_s390_get_hpage_1m(void)
332{
333 return cap_hpage_1m;
334}
335
336static void ccw_machine_class_foreach(ObjectClass *oc, void *opaque)
337{
338 MachineClass *mc = MACHINE_CLASS(oc);
339
340 mc->default_cpu_type = S390_CPU_TYPE_NAME("host");
341}
342
343int kvm_arch_init(MachineState *ms, KVMState *s)
344{
345 object_class_foreach(ccw_machine_class_foreach, TYPE_S390_CCW_MACHINE,
346 false, NULL);
347
348 if (!kvm_check_extension(kvm_state, KVM_CAP_DEVICE_CTRL)) {
349 error_report("KVM is missing capability KVM_CAP_DEVICE_CTRL - "
350 "please use kernel 3.15 or newer");
351 return -1;
352 }
353 if (!kvm_check_extension(s, KVM_CAP_S390_COW)) {
354 error_report("KVM is missing capability KVM_CAP_S390_COW - "
355 "unsupported environment");
356 return -1;
357 }
358
359 cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
360 cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
361 cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
362 cap_mem_op_extension = kvm_check_extension(s, KVM_CAP_S390_MEM_OP_EXTENSION);
363 mem_op_storage_key_support = cap_mem_op_extension > 0;
364 cap_s390_irq = kvm_check_extension(s, KVM_CAP_S390_INJECT_IRQ);
365 cap_vcpu_resets = kvm_check_extension(s, KVM_CAP_S390_VCPU_RESETS);
366 cap_protected = kvm_check_extension(s, KVM_CAP_S390_PROTECTED);
367 cap_zpci_op = kvm_check_extension(s, KVM_CAP_S390_ZPCI_OP);
368 cap_protected_dump = kvm_check_extension(s, KVM_CAP_S390_PROTECTED_DUMP);
369
370 kvm_vm_enable_cap(s, KVM_CAP_S390_USER_SIGP, 0);
371 kvm_vm_enable_cap(s, KVM_CAP_S390_VECTOR_REGISTERS, 0);
372 kvm_vm_enable_cap(s, KVM_CAP_S390_USER_STSI, 0);
373 if (ri_allowed()) {
374 if (kvm_vm_enable_cap(s, KVM_CAP_S390_RI, 0) == 0) {
375 cap_ri = 1;
376 }
377 }
378 if (cpu_model_allowed()) {
379 kvm_vm_enable_cap(s, KVM_CAP_S390_GS, 0);
380 }
381
382
383
384
385
386
387
388 if (cpu_model_allowed() && kvm_kernel_irqchip_allowed() &&
389 kvm_check_extension(s, KVM_CAP_S390_AIS_MIGRATION)) {
390 kvm_vm_enable_cap(s, KVM_CAP_S390_AIS, 0);
391 }
392
393 kvm_set_max_memslot_size(KVM_SLOT_MAX_BYTES);
394 return 0;
395}
396
397int kvm_arch_irqchip_create(KVMState *s)
398{
399 return 0;
400}
401
402unsigned long kvm_arch_vcpu_id(CPUState *cpu)
403{
404 return cpu->cpu_index;
405}
406
407int kvm_arch_init_vcpu(CPUState *cs)
408{
409 unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus;
410 S390CPU *cpu = S390_CPU(cs);
411 kvm_s390_set_cpu_state(cpu, cpu->env.cpu_state);
412 cpu->irqstate = g_malloc0(VCPU_IRQ_BUF_SIZE(max_cpus));
413 return 0;
414}
415
416int kvm_arch_destroy_vcpu(CPUState *cs)
417{
418 S390CPU *cpu = S390_CPU(cs);
419
420 g_free(cpu->irqstate);
421 cpu->irqstate = NULL;
422
423 return 0;
424}
425
426static void kvm_s390_reset_vcpu(S390CPU *cpu, unsigned long type)
427{
428 CPUState *cs = CPU(cpu);
429
430
431
432
433
434
435
436
437 if (kvm_vcpu_ioctl(cs, type)) {
438 error_report("CPU reset failed on CPU %i type %lx",
439 cs->cpu_index, type);
440 }
441}
442
443void kvm_s390_reset_vcpu_initial(S390CPU *cpu)
444{
445 kvm_s390_reset_vcpu(cpu, KVM_S390_INITIAL_RESET);
446}
447
448void kvm_s390_reset_vcpu_clear(S390CPU *cpu)
449{
450 if (cap_vcpu_resets) {
451 kvm_s390_reset_vcpu(cpu, KVM_S390_CLEAR_RESET);
452 } else {
453 kvm_s390_reset_vcpu(cpu, KVM_S390_INITIAL_RESET);
454 }
455}
456
457void kvm_s390_reset_vcpu_normal(S390CPU *cpu)
458{
459 if (cap_vcpu_resets) {
460 kvm_s390_reset_vcpu(cpu, KVM_S390_NORMAL_RESET);
461 }
462}
463
464static int can_sync_regs(CPUState *cs, int regs)
465{
466 return cap_sync_regs && (cs->kvm_run->kvm_valid_regs & regs) == regs;
467}
468
469int kvm_arch_put_registers(CPUState *cs, int level)
470{
471 S390CPU *cpu = S390_CPU(cs);
472 CPUS390XState *env = &cpu->env;
473 struct kvm_sregs sregs;
474 struct kvm_regs regs;
475 struct kvm_fpu fpu = {};
476 int r;
477 int i;
478
479
480 cs->kvm_run->psw_addr = env->psw.addr;
481 cs->kvm_run->psw_mask = env->psw.mask;
482
483 if (can_sync_regs(cs, KVM_SYNC_GPRS)) {
484 for (i = 0; i < 16; i++) {
485 cs->kvm_run->s.regs.gprs[i] = env->regs[i];
486 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS;
487 }
488 } else {
489 for (i = 0; i < 16; i++) {
490 regs.gprs[i] = env->regs[i];
491 }
492 r = kvm_vcpu_ioctl(cs, KVM_SET_REGS, ®s);
493 if (r < 0) {
494 return r;
495 }
496 }
497
498 if (can_sync_regs(cs, KVM_SYNC_VRS)) {
499 for (i = 0; i < 32; i++) {
500 cs->kvm_run->s.regs.vrs[i][0] = env->vregs[i][0];
501 cs->kvm_run->s.regs.vrs[i][1] = env->vregs[i][1];
502 }
503 cs->kvm_run->s.regs.fpc = env->fpc;
504 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_VRS;
505 } else if (can_sync_regs(cs, KVM_SYNC_FPRS)) {
506 for (i = 0; i < 16; i++) {
507 cs->kvm_run->s.regs.fprs[i] = *get_freg(env, i);
508 }
509 cs->kvm_run->s.regs.fpc = env->fpc;
510 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_FPRS;
511 } else {
512
513 for (i = 0; i < 16; i++) {
514 fpu.fprs[i] = *get_freg(env, i);
515 }
516 fpu.fpc = env->fpc;
517
518 r = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu);
519 if (r < 0) {
520 return r;
521 }
522 }
523
524
525 if (level == KVM_PUT_RUNTIME_STATE) {
526 return 0;
527 }
528
529 if (can_sync_regs(cs, KVM_SYNC_ARCH0)) {
530 cs->kvm_run->s.regs.cputm = env->cputm;
531 cs->kvm_run->s.regs.ckc = env->ckc;
532 cs->kvm_run->s.regs.todpr = env->todpr;
533 cs->kvm_run->s.regs.gbea = env->gbea;
534 cs->kvm_run->s.regs.pp = env->pp;
535 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ARCH0;
536 } else {
537
538
539
540
541
542 kvm_set_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
543 kvm_set_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
544 kvm_set_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
545 kvm_set_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
546 kvm_set_one_reg(cs, KVM_REG_S390_PP, &env->pp);
547 }
548
549 if (can_sync_regs(cs, KVM_SYNC_RICCB)) {
550 memcpy(cs->kvm_run->s.regs.riccb, env->riccb, 64);
551 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_RICCB;
552 }
553
554
555 if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
556 cs->kvm_run->s.regs.pft = env->pfault_token;
557 cs->kvm_run->s.regs.pfs = env->pfault_select;
558 cs->kvm_run->s.regs.pfc = env->pfault_compare;
559 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PFAULT;
560 } else if (cap_async_pf) {
561 r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
562 if (r < 0) {
563 return r;
564 }
565 r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
566 if (r < 0) {
567 return r;
568 }
569 r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
570 if (r < 0) {
571 return r;
572 }
573 }
574
575
576 if (can_sync_regs(cs, KVM_SYNC_ACRS | KVM_SYNC_CRS)) {
577 for (i = 0; i < 16; i++) {
578 cs->kvm_run->s.regs.acrs[i] = env->aregs[i];
579 cs->kvm_run->s.regs.crs[i] = env->cregs[i];
580 }
581 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS;
582 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_CRS;
583 } else {
584 for (i = 0; i < 16; i++) {
585 sregs.acrs[i] = env->aregs[i];
586 sregs.crs[i] = env->cregs[i];
587 }
588 r = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs);
589 if (r < 0) {
590 return r;
591 }
592 }
593
594 if (can_sync_regs(cs, KVM_SYNC_GSCB)) {
595 memcpy(cs->kvm_run->s.regs.gscb, env->gscb, 32);
596 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB;
597 }
598
599 if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
600 cs->kvm_run->s.regs.bpbc = env->bpbc;
601 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC;
602 }
603
604 if (can_sync_regs(cs, KVM_SYNC_ETOKEN)) {
605 cs->kvm_run->s.regs.etoken = env->etoken;
606 cs->kvm_run->s.regs.etoken_extension = env->etoken_extension;
607 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ETOKEN;
608 }
609
610 if (can_sync_regs(cs, KVM_SYNC_DIAG318)) {
611 cs->kvm_run->s.regs.diag318 = env->diag318_info;
612 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_DIAG318;
613 }
614
615
616 if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
617 cs->kvm_run->s.regs.prefix = env->psa;
618 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PREFIX;
619 } else {
620
621 }
622 return 0;
623}
624
625int kvm_arch_get_registers(CPUState *cs)
626{
627 S390CPU *cpu = S390_CPU(cs);
628 CPUS390XState *env = &cpu->env;
629 struct kvm_sregs sregs;
630 struct kvm_regs regs;
631 struct kvm_fpu fpu;
632 int i, r;
633
634
635 env->psw.addr = cs->kvm_run->psw_addr;
636 env->psw.mask = cs->kvm_run->psw_mask;
637
638
639 if (can_sync_regs(cs, KVM_SYNC_GPRS)) {
640 for (i = 0; i < 16; i++) {
641 env->regs[i] = cs->kvm_run->s.regs.gprs[i];
642 }
643 } else {
644 r = kvm_vcpu_ioctl(cs, KVM_GET_REGS, ®s);
645 if (r < 0) {
646 return r;
647 }
648 for (i = 0; i < 16; i++) {
649 env->regs[i] = regs.gprs[i];
650 }
651 }
652
653
654 if (can_sync_regs(cs, KVM_SYNC_ACRS | KVM_SYNC_CRS)) {
655 for (i = 0; i < 16; i++) {
656 env->aregs[i] = cs->kvm_run->s.regs.acrs[i];
657 env->cregs[i] = cs->kvm_run->s.regs.crs[i];
658 }
659 } else {
660 r = kvm_vcpu_ioctl(cs, KVM_GET_SREGS, &sregs);
661 if (r < 0) {
662 return r;
663 }
664 for (i = 0; i < 16; i++) {
665 env->aregs[i] = sregs.acrs[i];
666 env->cregs[i] = sregs.crs[i];
667 }
668 }
669
670
671 if (can_sync_regs(cs, KVM_SYNC_VRS)) {
672 for (i = 0; i < 32; i++) {
673 env->vregs[i][0] = cs->kvm_run->s.regs.vrs[i][0];
674 env->vregs[i][1] = cs->kvm_run->s.regs.vrs[i][1];
675 }
676 env->fpc = cs->kvm_run->s.regs.fpc;
677 } else if (can_sync_regs(cs, KVM_SYNC_FPRS)) {
678 for (i = 0; i < 16; i++) {
679 *get_freg(env, i) = cs->kvm_run->s.regs.fprs[i];
680 }
681 env->fpc = cs->kvm_run->s.regs.fpc;
682 } else {
683 r = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu);
684 if (r < 0) {
685 return r;
686 }
687 for (i = 0; i < 16; i++) {
688 *get_freg(env, i) = fpu.fprs[i];
689 }
690 env->fpc = fpu.fpc;
691 }
692
693
694 if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
695 env->psa = cs->kvm_run->s.regs.prefix;
696 }
697
698 if (can_sync_regs(cs, KVM_SYNC_ARCH0)) {
699 env->cputm = cs->kvm_run->s.regs.cputm;
700 env->ckc = cs->kvm_run->s.regs.ckc;
701 env->todpr = cs->kvm_run->s.regs.todpr;
702 env->gbea = cs->kvm_run->s.regs.gbea;
703 env->pp = cs->kvm_run->s.regs.pp;
704 } else {
705
706
707
708
709
710 kvm_get_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
711 kvm_get_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
712 kvm_get_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
713 kvm_get_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
714 kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp);
715 }
716
717 if (can_sync_regs(cs, KVM_SYNC_RICCB)) {
718 memcpy(env->riccb, cs->kvm_run->s.regs.riccb, 64);
719 }
720
721 if (can_sync_regs(cs, KVM_SYNC_GSCB)) {
722 memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32);
723 }
724
725 if (can_sync_regs(cs, KVM_SYNC_BPBC)) {
726 env->bpbc = cs->kvm_run->s.regs.bpbc;
727 }
728
729 if (can_sync_regs(cs, KVM_SYNC_ETOKEN)) {
730 env->etoken = cs->kvm_run->s.regs.etoken;
731 env->etoken_extension = cs->kvm_run->s.regs.etoken_extension;
732 }
733
734
735 if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
736 env->pfault_token = cs->kvm_run->s.regs.pft;
737 env->pfault_select = cs->kvm_run->s.regs.pfs;
738 env->pfault_compare = cs->kvm_run->s.regs.pfc;
739 } else if (cap_async_pf) {
740 r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
741 if (r < 0) {
742 return r;
743 }
744 r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
745 if (r < 0) {
746 return r;
747 }
748 r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
749 if (r < 0) {
750 return r;
751 }
752 }
753
754 if (can_sync_regs(cs, KVM_SYNC_DIAG318)) {
755 env->diag318_info = cs->kvm_run->s.regs.diag318;
756 }
757
758 return 0;
759}
760
761int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
762{
763 int r;
764 struct kvm_device_attr attr = {
765 .group = KVM_S390_VM_TOD,
766 .attr = KVM_S390_VM_TOD_LOW,
767 .addr = (uint64_t)tod_low,
768 };
769
770 r = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
771 if (r) {
772 return r;
773 }
774
775 attr.attr = KVM_S390_VM_TOD_HIGH;
776 attr.addr = (uint64_t)tod_high;
777 return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
778}
779
780int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_low)
781{
782 int r;
783 struct kvm_s390_vm_tod_clock gtod;
784 struct kvm_device_attr attr = {
785 .group = KVM_S390_VM_TOD,
786 .attr = KVM_S390_VM_TOD_EXT,
787 .addr = (uint64_t)>od,
788 };
789
790 r = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
791 *tod_high = gtod.epoch_idx;
792 *tod_low = gtod.tod;
793
794 return r;
795}
796
797int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_low)
798{
799 int r;
800 struct kvm_device_attr attr = {
801 .group = KVM_S390_VM_TOD,
802 .attr = KVM_S390_VM_TOD_LOW,
803 .addr = (uint64_t)&tod_low,
804 };
805
806 r = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
807 if (r) {
808 return r;
809 }
810
811 attr.attr = KVM_S390_VM_TOD_HIGH;
812 attr.addr = (uint64_t)&tod_high;
813 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
814}
815
816int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
817{
818 struct kvm_s390_vm_tod_clock gtod = {
819 .epoch_idx = tod_high,
820 .tod = tod_low,
821 };
822 struct kvm_device_attr attr = {
823 .group = KVM_S390_VM_TOD,
824 .attr = KVM_S390_VM_TOD_EXT,
825 .addr = (uint64_t)>od,
826 };
827
828 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
829}
830
831
832
833
834
835
836
837
838
839
840
841
842
843int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
844 int len, bool is_write)
845{
846 struct kvm_s390_mem_op mem_op = {
847 .gaddr = addr,
848 .flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION,
849 .size = len,
850 .op = is_write ? KVM_S390_MEMOP_LOGICAL_WRITE
851 : KVM_S390_MEMOP_LOGICAL_READ,
852 .buf = (uint64_t)hostbuf,
853 .ar = ar,
854 .key = (cpu->env.psw.mask & PSW_MASK_KEY) >> PSW_SHIFT_KEY,
855 };
856 int ret;
857
858 if (!cap_mem_op) {
859 return -ENOSYS;
860 }
861 if (!hostbuf) {
862 mem_op.flags |= KVM_S390_MEMOP_F_CHECK_ONLY;
863 }
864 if (mem_op_storage_key_support) {
865 mem_op.flags |= KVM_S390_MEMOP_F_SKEY_PROTECTION;
866 }
867
868 ret = kvm_vcpu_ioctl(CPU(cpu), KVM_S390_MEM_OP, &mem_op);
869 if (ret < 0) {
870 warn_report("KVM_S390_MEM_OP failed: %s", strerror(-ret));
871 }
872 return ret;
873}
874
875int kvm_s390_mem_op_pv(S390CPU *cpu, uint64_t offset, void *hostbuf,
876 int len, bool is_write)
877{
878 struct kvm_s390_mem_op mem_op = {
879 .sida_offset = offset,
880 .size = len,
881 .op = is_write ? KVM_S390_MEMOP_SIDA_WRITE
882 : KVM_S390_MEMOP_SIDA_READ,
883 .buf = (uint64_t)hostbuf,
884 };
885 int ret;
886
887 if (!cap_mem_op || !cap_protected) {
888 return -ENOSYS;
889 }
890
891 ret = kvm_vcpu_ioctl(CPU(cpu), KVM_S390_MEM_OP, &mem_op);
892 if (ret < 0) {
893 error_report("KVM_S390_MEM_OP failed: %s", strerror(-ret));
894 abort();
895 }
896 return ret;
897}
898
899static uint8_t const *sw_bp_inst;
900static uint8_t sw_bp_ilen;
901
902static void determine_sw_breakpoint_instr(void)
903{
904
905 static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};
906
907 static const uint8_t instr_0x0000[] = {0x00, 0x00};
908
909 if (sw_bp_inst) {
910 return;
911 }
912 if (kvm_vm_enable_cap(kvm_state, KVM_CAP_S390_USER_INSTR0, 0)) {
913 sw_bp_inst = diag_501;
914 sw_bp_ilen = sizeof(diag_501);
915 DPRINTF("KVM: will use 4-byte sw breakpoints.\n");
916 } else {
917 sw_bp_inst = instr_0x0000;
918 sw_bp_ilen = sizeof(instr_0x0000);
919 DPRINTF("KVM: will use 2-byte sw breakpoints.\n");
920 }
921}
922
923int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
924{
925 determine_sw_breakpoint_instr();
926
927 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn,
928 sw_bp_ilen, 0) ||
929 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)sw_bp_inst, sw_bp_ilen, 1)) {
930 return -EINVAL;
931 }
932 return 0;
933}
934
935int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
936{
937 uint8_t t[MAX_ILEN];
938
939 if (cpu_memory_rw_debug(cs, bp->pc, t, sw_bp_ilen, 0)) {
940 return -EINVAL;
941 } else if (memcmp(t, sw_bp_inst, sw_bp_ilen)) {
942 return -EINVAL;
943 } else if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn,
944 sw_bp_ilen, 1)) {
945 return -EINVAL;
946 }
947
948 return 0;
949}
950
951static struct kvm_hw_breakpoint *find_hw_breakpoint(target_ulong addr,
952 int len, int type)
953{
954 int n;
955
956 for (n = 0; n < nb_hw_breakpoints; n++) {
957 if (hw_breakpoints[n].addr == addr && hw_breakpoints[n].type == type &&
958 (hw_breakpoints[n].len == len || len == -1)) {
959 return &hw_breakpoints[n];
960 }
961 }
962
963 return NULL;
964}
965
966static int insert_hw_breakpoint(target_ulong addr, int len, int type)
967{
968 int size;
969
970 if (find_hw_breakpoint(addr, len, type)) {
971 return -EEXIST;
972 }
973
974 size = (nb_hw_breakpoints + 1) * sizeof(struct kvm_hw_breakpoint);
975
976 if (!hw_breakpoints) {
977 nb_hw_breakpoints = 0;
978 hw_breakpoints = (struct kvm_hw_breakpoint *)g_try_malloc(size);
979 } else {
980 hw_breakpoints =
981 (struct kvm_hw_breakpoint *)g_try_realloc(hw_breakpoints, size);
982 }
983
984 if (!hw_breakpoints) {
985 nb_hw_breakpoints = 0;
986 return -ENOMEM;
987 }
988
989 hw_breakpoints[nb_hw_breakpoints].addr = addr;
990 hw_breakpoints[nb_hw_breakpoints].len = len;
991 hw_breakpoints[nb_hw_breakpoints].type = type;
992
993 nb_hw_breakpoints++;
994
995 return 0;
996}
997
998int kvm_arch_insert_hw_breakpoint(target_ulong addr,
999 target_ulong len, int type)
1000{
1001 switch (type) {
1002 case GDB_BREAKPOINT_HW:
1003 type = KVM_HW_BP;
1004 break;
1005 case GDB_WATCHPOINT_WRITE:
1006 if (len < 1) {
1007 return -EINVAL;
1008 }
1009 type = KVM_HW_WP_WRITE;
1010 break;
1011 default:
1012 return -ENOSYS;
1013 }
1014 return insert_hw_breakpoint(addr, len, type);
1015}
1016
1017int kvm_arch_remove_hw_breakpoint(target_ulong addr,
1018 target_ulong len, int type)
1019{
1020 int size;
1021 struct kvm_hw_breakpoint *bp = find_hw_breakpoint(addr, len, type);
1022
1023 if (bp == NULL) {
1024 return -ENOENT;
1025 }
1026
1027 nb_hw_breakpoints--;
1028 if (nb_hw_breakpoints > 0) {
1029
1030
1031
1032
1033 if (bp != &hw_breakpoints[nb_hw_breakpoints]) {
1034 *bp = hw_breakpoints[nb_hw_breakpoints];
1035 }
1036 size = nb_hw_breakpoints * sizeof(struct kvm_hw_breakpoint);
1037 hw_breakpoints =
1038 g_realloc(hw_breakpoints, size);
1039 } else {
1040 g_free(hw_breakpoints);
1041 hw_breakpoints = NULL;
1042 }
1043
1044 return 0;
1045}
1046
1047void kvm_arch_remove_all_hw_breakpoints(void)
1048{
1049 nb_hw_breakpoints = 0;
1050 g_free(hw_breakpoints);
1051 hw_breakpoints = NULL;
1052}
1053
1054void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
1055{
1056 int i;
1057
1058 if (nb_hw_breakpoints > 0) {
1059 dbg->arch.nr_hw_bp = nb_hw_breakpoints;
1060 dbg->arch.hw_bp = hw_breakpoints;
1061
1062 for (i = 0; i < nb_hw_breakpoints; ++i) {
1063 hw_breakpoints[i].phys_addr = s390_cpu_get_phys_addr_debug(cpu,
1064 hw_breakpoints[i].addr);
1065 }
1066 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP;
1067 } else {
1068 dbg->arch.nr_hw_bp = 0;
1069 dbg->arch.hw_bp = NULL;
1070 }
1071}
1072
1073void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
1074{
1075}
1076
1077MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
1078{
1079 return MEMTXATTRS_UNSPECIFIED;
1080}
1081
1082int kvm_arch_process_async_events(CPUState *cs)
1083{
1084 return cs->halted;
1085}
1086
1087static int s390_kvm_irq_to_interrupt(struct kvm_s390_irq *irq,
1088 struct kvm_s390_interrupt *interrupt)
1089{
1090 int r = 0;
1091
1092 interrupt->type = irq->type;
1093 switch (irq->type) {
1094 case KVM_S390_INT_VIRTIO:
1095 interrupt->parm = irq->u.ext.ext_params;
1096
1097 case KVM_S390_INT_PFAULT_INIT:
1098 case KVM_S390_INT_PFAULT_DONE:
1099 interrupt->parm64 = irq->u.ext.ext_params2;
1100 break;
1101 case KVM_S390_PROGRAM_INT:
1102 interrupt->parm = irq->u.pgm.code;
1103 break;
1104 case KVM_S390_SIGP_SET_PREFIX:
1105 interrupt->parm = irq->u.prefix.address;
1106 break;
1107 case KVM_S390_INT_SERVICE:
1108 interrupt->parm = irq->u.ext.ext_params;
1109 break;
1110 case KVM_S390_MCHK:
1111 interrupt->parm = irq->u.mchk.cr14;
1112 interrupt->parm64 = irq->u.mchk.mcic;
1113 break;
1114 case KVM_S390_INT_EXTERNAL_CALL:
1115 interrupt->parm = irq->u.extcall.code;
1116 break;
1117 case KVM_S390_INT_EMERGENCY:
1118 interrupt->parm = irq->u.emerg.code;
1119 break;
1120 case KVM_S390_SIGP_STOP:
1121 case KVM_S390_RESTART:
1122 break;
1123 case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX:
1124 interrupt->parm = irq->u.io.subchannel_id << 16;
1125 interrupt->parm |= irq->u.io.subchannel_nr;
1126 interrupt->parm64 = (uint64_t)irq->u.io.io_int_parm << 32;
1127 interrupt->parm64 |= irq->u.io.io_int_word;
1128 break;
1129 default:
1130 r = -EINVAL;
1131 break;
1132 }
1133 return r;
1134}
1135
1136static void inject_vcpu_irq_legacy(CPUState *cs, struct kvm_s390_irq *irq)
1137{
1138 struct kvm_s390_interrupt kvmint = {};
1139 int r;
1140
1141 r = s390_kvm_irq_to_interrupt(irq, &kvmint);
1142 if (r < 0) {
1143 fprintf(stderr, "%s called with bogus interrupt\n", __func__);
1144 exit(1);
1145 }
1146
1147 r = kvm_vcpu_ioctl(cs, KVM_S390_INTERRUPT, &kvmint);
1148 if (r < 0) {
1149 fprintf(stderr, "KVM failed to inject interrupt\n");
1150 exit(1);
1151 }
1152}
1153
1154void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq)
1155{
1156 CPUState *cs = CPU(cpu);
1157 int r;
1158
1159 if (cap_s390_irq) {
1160 r = kvm_vcpu_ioctl(cs, KVM_S390_IRQ, irq);
1161 if (!r) {
1162 return;
1163 }
1164 error_report("KVM failed to inject interrupt %llx", irq->type);
1165 exit(1);
1166 }
1167
1168 inject_vcpu_irq_legacy(cs, irq);
1169}
1170
1171void kvm_s390_floating_interrupt_legacy(struct kvm_s390_irq *irq)
1172{
1173 struct kvm_s390_interrupt kvmint = {};
1174 int r;
1175
1176 r = s390_kvm_irq_to_interrupt(irq, &kvmint);
1177 if (r < 0) {
1178 fprintf(stderr, "%s called with bogus interrupt\n", __func__);
1179 exit(1);
1180 }
1181
1182 r = kvm_vm_ioctl(kvm_state, KVM_S390_INTERRUPT, &kvmint);
1183 if (r < 0) {
1184 fprintf(stderr, "KVM failed to inject interrupt\n");
1185 exit(1);
1186 }
1187}
1188
1189void kvm_s390_program_interrupt(S390CPU *cpu, uint16_t code)
1190{
1191 struct kvm_s390_irq irq = {
1192 .type = KVM_S390_PROGRAM_INT,
1193 .u.pgm.code = code,
1194 };
1195 qemu_log_mask(CPU_LOG_INT, "program interrupt at %#" PRIx64 "\n",
1196 cpu->env.psw.addr);
1197 kvm_s390_vcpu_interrupt(cpu, &irq);
1198}
1199
1200void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code)
1201{
1202 struct kvm_s390_irq irq = {
1203 .type = KVM_S390_PROGRAM_INT,
1204 .u.pgm.code = code,
1205 .u.pgm.trans_exc_code = te_code,
1206 .u.pgm.exc_access_id = te_code & 3,
1207 };
1208
1209 kvm_s390_vcpu_interrupt(cpu, &irq);
1210}
1211
1212static void kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run,
1213 uint16_t ipbh0)
1214{
1215 CPUS390XState *env = &cpu->env;
1216 uint64_t sccb;
1217 uint32_t code;
1218 int r;
1219
1220 sccb = env->regs[ipbh0 & 0xf];
1221 code = env->regs[(ipbh0 & 0xf0) >> 4];
1222
1223 switch (run->s390_sieic.icptcode) {
1224 case ICPT_PV_INSTR_NOTIFICATION:
1225 g_assert(s390_is_pv());
1226
1227 error_report("unexpected SCLP PV notification");
1228 exit(1);
1229 break;
1230 case ICPT_PV_INSTR:
1231 g_assert(s390_is_pv());
1232 sclp_service_call_protected(env, sccb, code);
1233
1234 break;
1235 case ICPT_INSTRUCTION:
1236 g_assert(!s390_is_pv());
1237 r = sclp_service_call(env, sccb, code);
1238 if (r < 0) {
1239 kvm_s390_program_interrupt(cpu, -r);
1240 return;
1241 }
1242 setcc(cpu, r);
1243 }
1244}
1245
1246static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
1247{
1248 CPUS390XState *env = &cpu->env;
1249 int rc = 0;
1250 uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
1251
1252 switch (ipa1) {
1253 case PRIV_B2_XSCH:
1254 ioinst_handle_xsch(cpu, env->regs[1], RA_IGNORED);
1255 break;
1256 case PRIV_B2_CSCH:
1257 ioinst_handle_csch(cpu, env->regs[1], RA_IGNORED);
1258 break;
1259 case PRIV_B2_HSCH:
1260 ioinst_handle_hsch(cpu, env->regs[1], RA_IGNORED);
1261 break;
1262 case PRIV_B2_MSCH:
1263 ioinst_handle_msch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED);
1264 break;
1265 case PRIV_B2_SSCH:
1266 ioinst_handle_ssch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED);
1267 break;
1268 case PRIV_B2_STCRW:
1269 ioinst_handle_stcrw(cpu, run->s390_sieic.ipb, RA_IGNORED);
1270 break;
1271 case PRIV_B2_STSCH:
1272 ioinst_handle_stsch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED);
1273 break;
1274 case PRIV_B2_TSCH:
1275
1276 fprintf(stderr, "Spurious tsch intercept\n");
1277 break;
1278 case PRIV_B2_CHSC:
1279 ioinst_handle_chsc(cpu, run->s390_sieic.ipb, RA_IGNORED);
1280 break;
1281 case PRIV_B2_TPI:
1282
1283 fprintf(stderr, "Spurious tpi intercept\n");
1284 break;
1285 case PRIV_B2_SCHM:
1286 ioinst_handle_schm(cpu, env->regs[1], env->regs[2],
1287 run->s390_sieic.ipb, RA_IGNORED);
1288 break;
1289 case PRIV_B2_RSCH:
1290 ioinst_handle_rsch(cpu, env->regs[1], RA_IGNORED);
1291 break;
1292 case PRIV_B2_RCHP:
1293 ioinst_handle_rchp(cpu, env->regs[1], RA_IGNORED);
1294 break;
1295 case PRIV_B2_STCPS:
1296
1297 break;
1298 case PRIV_B2_SAL:
1299 ioinst_handle_sal(cpu, env->regs[1], RA_IGNORED);
1300 break;
1301 case PRIV_B2_SIGA:
1302
1303 setcc(cpu, 3);
1304 break;
1305 case PRIV_B2_SCLP_CALL:
1306 kvm_sclp_service_call(cpu, run, ipbh0);
1307 break;
1308 default:
1309 rc = -1;
1310 DPRINTF("KVM: unhandled PRIV: 0xb2%x\n", ipa1);
1311 break;
1312 }
1313
1314 return rc;
1315}
1316
1317static uint64_t get_base_disp_rxy(S390CPU *cpu, struct kvm_run *run,
1318 uint8_t *ar)
1319{
1320 CPUS390XState *env = &cpu->env;
1321 uint32_t x2 = (run->s390_sieic.ipa & 0x000f);
1322 uint32_t base2 = run->s390_sieic.ipb >> 28;
1323 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) +
1324 ((run->s390_sieic.ipb & 0xff00) << 4);
1325
1326 if (disp2 & 0x80000) {
1327 disp2 += 0xfff00000;
1328 }
1329 if (ar) {
1330 *ar = base2;
1331 }
1332
1333 return (base2 ? env->regs[base2] : 0) +
1334 (x2 ? env->regs[x2] : 0) + (long)(int)disp2;
1335}
1336
1337static uint64_t get_base_disp_rsy(S390CPU *cpu, struct kvm_run *run,
1338 uint8_t *ar)
1339{
1340 CPUS390XState *env = &cpu->env;
1341 uint32_t base2 = run->s390_sieic.ipb >> 28;
1342 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) +
1343 ((run->s390_sieic.ipb & 0xff00) << 4);
1344
1345 if (disp2 & 0x80000) {
1346 disp2 += 0xfff00000;
1347 }
1348 if (ar) {
1349 *ar = base2;
1350 }
1351
1352 return (base2 ? env->regs[base2] : 0) + (long)(int)disp2;
1353}
1354
1355static int kvm_clp_service_call(S390CPU *cpu, struct kvm_run *run)
1356{
1357 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1358
1359 if (s390_has_feat(S390_FEAT_ZPCI)) {
1360 return clp_service_call(cpu, r2, RA_IGNORED);
1361 } else {
1362 return -1;
1363 }
1364}
1365
1366static int kvm_pcilg_service_call(S390CPU *cpu, struct kvm_run *run)
1367{
1368 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1369 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1370
1371 if (s390_has_feat(S390_FEAT_ZPCI)) {
1372 return pcilg_service_call(cpu, r1, r2, RA_IGNORED);
1373 } else {
1374 return -1;
1375 }
1376}
1377
1378static int kvm_pcistg_service_call(S390CPU *cpu, struct kvm_run *run)
1379{
1380 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1381 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1382
1383 if (s390_has_feat(S390_FEAT_ZPCI)) {
1384 return pcistg_service_call(cpu, r1, r2, RA_IGNORED);
1385 } else {
1386 return -1;
1387 }
1388}
1389
1390static int kvm_stpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
1391{
1392 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1393 uint64_t fiba;
1394 uint8_t ar;
1395
1396 if (s390_has_feat(S390_FEAT_ZPCI)) {
1397 fiba = get_base_disp_rxy(cpu, run, &ar);
1398
1399 return stpcifc_service_call(cpu, r1, fiba, ar, RA_IGNORED);
1400 } else {
1401 return -1;
1402 }
1403}
1404
1405static int kvm_sic_service_call(S390CPU *cpu, struct kvm_run *run)
1406{
1407 CPUS390XState *env = &cpu->env;
1408 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1409 uint8_t r3 = run->s390_sieic.ipa & 0x000f;
1410 uint8_t isc;
1411 uint16_t mode;
1412 int r;
1413
1414 mode = env->regs[r1] & 0xffff;
1415 isc = (env->regs[r3] >> 27) & 0x7;
1416 r = css_do_sic(env, isc, mode);
1417 if (r) {
1418 kvm_s390_program_interrupt(cpu, -r);
1419 }
1420
1421 return 0;
1422}
1423
1424static int kvm_rpcit_service_call(S390CPU *cpu, struct kvm_run *run)
1425{
1426 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1427 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1428
1429 if (s390_has_feat(S390_FEAT_ZPCI)) {
1430 return rpcit_service_call(cpu, r1, r2, RA_IGNORED);
1431 } else {
1432 return -1;
1433 }
1434}
1435
1436static int kvm_pcistb_service_call(S390CPU *cpu, struct kvm_run *run)
1437{
1438 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1439 uint8_t r3 = run->s390_sieic.ipa & 0x000f;
1440 uint64_t gaddr;
1441 uint8_t ar;
1442
1443 if (s390_has_feat(S390_FEAT_ZPCI)) {
1444 gaddr = get_base_disp_rsy(cpu, run, &ar);
1445
1446 return pcistb_service_call(cpu, r1, r3, gaddr, ar, RA_IGNORED);
1447 } else {
1448 return -1;
1449 }
1450}
1451
1452static int kvm_mpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
1453{
1454 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1455 uint64_t fiba;
1456 uint8_t ar;
1457
1458 if (s390_has_feat(S390_FEAT_ZPCI)) {
1459 fiba = get_base_disp_rxy(cpu, run, &ar);
1460
1461 return mpcifc_service_call(cpu, r1, fiba, ar, RA_IGNORED);
1462 } else {
1463 return -1;
1464 }
1465}
1466
1467static int handle_b9(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
1468{
1469 int r = 0;
1470
1471 switch (ipa1) {
1472 case PRIV_B9_CLP:
1473 r = kvm_clp_service_call(cpu, run);
1474 break;
1475 case PRIV_B9_PCISTG:
1476 r = kvm_pcistg_service_call(cpu, run);
1477 break;
1478 case PRIV_B9_PCILG:
1479 r = kvm_pcilg_service_call(cpu, run);
1480 break;
1481 case PRIV_B9_RPCIT:
1482 r = kvm_rpcit_service_call(cpu, run);
1483 break;
1484 case PRIV_B9_EQBS:
1485
1486 r = -1;
1487 break;
1488 default:
1489 r = -1;
1490 DPRINTF("KVM: unhandled PRIV: 0xb9%x\n", ipa1);
1491 break;
1492 }
1493
1494 return r;
1495}
1496
1497static int handle_eb(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl)
1498{
1499 int r = 0;
1500
1501 switch (ipbl) {
1502 case PRIV_EB_PCISTB:
1503 r = kvm_pcistb_service_call(cpu, run);
1504 break;
1505 case PRIV_EB_SIC:
1506 r = kvm_sic_service_call(cpu, run);
1507 break;
1508 case PRIV_EB_SQBS:
1509
1510 r = -1;
1511 break;
1512 default:
1513 r = -1;
1514 DPRINTF("KVM: unhandled PRIV: 0xeb%x\n", ipbl);
1515 break;
1516 }
1517
1518 return r;
1519}
1520
1521static int handle_e3(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl)
1522{
1523 int r = 0;
1524
1525 switch (ipbl) {
1526 case PRIV_E3_MPCIFC:
1527 r = kvm_mpcifc_service_call(cpu, run);
1528 break;
1529 case PRIV_E3_STPCIFC:
1530 r = kvm_stpcifc_service_call(cpu, run);
1531 break;
1532 default:
1533 r = -1;
1534 DPRINTF("KVM: unhandled PRIV: 0xe3%x\n", ipbl);
1535 break;
1536 }
1537
1538 return r;
1539}
1540
1541static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
1542{
1543 CPUS390XState *env = &cpu->env;
1544 int ret;
1545
1546 ret = s390_virtio_hypercall(env);
1547 if (ret == -EINVAL) {
1548 kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
1549 return 0;
1550 }
1551
1552 return ret;
1553}
1554
1555static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run)
1556{
1557 uint64_t r1, r3;
1558 int rc;
1559
1560 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1561 r3 = run->s390_sieic.ipa & 0x000f;
1562 rc = handle_diag_288(&cpu->env, r1, r3);
1563 if (rc) {
1564 kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
1565 }
1566}
1567
1568static void kvm_handle_diag_308(S390CPU *cpu, struct kvm_run *run)
1569{
1570 uint64_t r1, r3;
1571
1572 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1573 r3 = run->s390_sieic.ipa & 0x000f;
1574 handle_diag_308(&cpu->env, r1, r3, RA_IGNORED);
1575}
1576
1577static int handle_sw_breakpoint(S390CPU *cpu, struct kvm_run *run)
1578{
1579 CPUS390XState *env = &cpu->env;
1580 unsigned long pc;
1581
1582 pc = env->psw.addr - sw_bp_ilen;
1583 if (kvm_find_sw_breakpoint(CPU(cpu), pc)) {
1584 env->psw.addr = pc;
1585 return EXCP_DEBUG;
1586 }
1587
1588 return -ENOENT;
1589}
1590
1591void kvm_s390_set_diag318(CPUState *cs, uint64_t diag318_info)
1592{
1593 CPUS390XState *env = &S390_CPU(cs)->env;
1594
1595
1596 if (s390_has_feat(S390_FEAT_DIAG_318)) {
1597 env->diag318_info = diag318_info;
1598 cs->kvm_run->s.regs.diag318 = diag318_info;
1599 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_DIAG318;
1600
1601
1602
1603
1604 }
1605}
1606
1607static void handle_diag_318(S390CPU *cpu, struct kvm_run *run)
1608{
1609 uint64_t reg = (run->s390_sieic.ipa & 0x00f0) >> 4;
1610 uint64_t diag318_info = run->s.regs.gprs[reg];
1611 CPUState *t;
1612
1613
1614
1615
1616
1617 if (!s390_has_feat(S390_FEAT_DIAG_318)) {
1618 kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
1619 return;
1620 }
1621
1622 CPU_FOREACH(t) {
1623 run_on_cpu(t, s390_do_cpu_set_diag318,
1624 RUN_ON_CPU_HOST_ULONG(diag318_info));
1625 }
1626}
1627
1628#define DIAG_KVM_CODE_MASK 0x000000000000ffff
1629
1630static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
1631{
1632 int r = 0;
1633 uint16_t func_code;
1634
1635
1636
1637
1638
1639 func_code = decode_basedisp_rs(&cpu->env, ipb, NULL) & DIAG_KVM_CODE_MASK;
1640 switch (func_code) {
1641 case DIAG_TIMEREVENT:
1642 kvm_handle_diag_288(cpu, run);
1643 break;
1644 case DIAG_IPL:
1645 kvm_handle_diag_308(cpu, run);
1646 break;
1647 case DIAG_SET_CONTROL_PROGRAM_CODES:
1648 handle_diag_318(cpu, run);
1649 break;
1650 case DIAG_KVM_HYPERCALL:
1651 r = handle_hypercall(cpu, run);
1652 break;
1653 case DIAG_KVM_BREAKPOINT:
1654 r = handle_sw_breakpoint(cpu, run);
1655 break;
1656 default:
1657 DPRINTF("KVM: unknown DIAG: 0x%x\n", func_code);
1658 kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION);
1659 break;
1660 }
1661
1662 return r;
1663}
1664
1665static int kvm_s390_handle_sigp(S390CPU *cpu, uint8_t ipa1, uint32_t ipb)
1666{
1667 CPUS390XState *env = &cpu->env;
1668 const uint8_t r1 = ipa1 >> 4;
1669 const uint8_t r3 = ipa1 & 0x0f;
1670 int ret;
1671 uint8_t order;
1672
1673
1674 order = decode_basedisp_rs(env, ipb, NULL) & SIGP_ORDER_MASK;
1675
1676 ret = handle_sigp(env, order, r1, r3);
1677 setcc(cpu, ret);
1678 return 0;
1679}
1680
1681static int handle_instruction(S390CPU *cpu, struct kvm_run *run)
1682{
1683 unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00);
1684 uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff;
1685 int r = -1;
1686
1687 DPRINTF("handle_instruction 0x%x 0x%x\n",
1688 run->s390_sieic.ipa, run->s390_sieic.ipb);
1689 switch (ipa0) {
1690 case IPA0_B2:
1691 r = handle_b2(cpu, run, ipa1);
1692 break;
1693 case IPA0_B9:
1694 r = handle_b9(cpu, run, ipa1);
1695 break;
1696 case IPA0_EB:
1697 r = handle_eb(cpu, run, run->s390_sieic.ipb & 0xff);
1698 break;
1699 case IPA0_E3:
1700 r = handle_e3(cpu, run, run->s390_sieic.ipb & 0xff);
1701 break;
1702 case IPA0_DIAG:
1703 r = handle_diag(cpu, run, run->s390_sieic.ipb);
1704 break;
1705 case IPA0_SIGP:
1706 r = kvm_s390_handle_sigp(cpu, ipa1, run->s390_sieic.ipb);
1707 break;
1708 }
1709
1710 if (r < 0) {
1711 r = 0;
1712 kvm_s390_program_interrupt(cpu, PGM_OPERATION);
1713 }
1714
1715 return r;
1716}
1717
1718static void unmanageable_intercept(S390CPU *cpu, S390CrashReason reason,
1719 int pswoffset)
1720{
1721 CPUState *cs = CPU(cpu);
1722
1723 s390_cpu_halt(cpu);
1724 cpu->env.crash_reason = reason;
1725 qemu_system_guest_panicked(cpu_get_crash_info(cs));
1726}
1727
1728
1729static int handle_oper_loop(S390CPU *cpu, struct kvm_run *run)
1730{
1731 CPUState *cs = CPU(cpu);
1732 PSW oldpsw, newpsw;
1733
1734 newpsw.mask = ldq_phys(cs->as, cpu->env.psa +
1735 offsetof(LowCore, program_new_psw));
1736 newpsw.addr = ldq_phys(cs->as, cpu->env.psa +
1737 offsetof(LowCore, program_new_psw) + 8);
1738 oldpsw.mask = run->psw_mask;
1739 oldpsw.addr = run->psw_addr;
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749 if (oldpsw.addr - newpsw.addr <= 6 &&
1750 !(newpsw.mask & PSW_MASK_WAIT) &&
1751 !(oldpsw.mask & PSW_MASK_PSTATE) &&
1752 (newpsw.mask & PSW_MASK_ASC) == (oldpsw.mask & PSW_MASK_ASC) &&
1753 (newpsw.mask & PSW_MASK_DAT) == (oldpsw.mask & PSW_MASK_DAT)) {
1754 unmanageable_intercept(cpu, S390_CRASH_REASON_OPINT_LOOP,
1755 offsetof(LowCore, program_new_psw));
1756 return EXCP_HALTED;
1757 }
1758 return 0;
1759}
1760
1761static int handle_intercept(S390CPU *cpu)
1762{
1763 CPUState *cs = CPU(cpu);
1764 struct kvm_run *run = cs->kvm_run;
1765 int icpt_code = run->s390_sieic.icptcode;
1766 int r = 0;
1767
1768 DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code, (long)run->psw_addr);
1769 switch (icpt_code) {
1770 case ICPT_INSTRUCTION:
1771 case ICPT_PV_INSTR:
1772 case ICPT_PV_INSTR_NOTIFICATION:
1773 r = handle_instruction(cpu, run);
1774 break;
1775 case ICPT_PROGRAM:
1776 unmanageable_intercept(cpu, S390_CRASH_REASON_PGMINT_LOOP,
1777 offsetof(LowCore, program_new_psw));
1778 r = EXCP_HALTED;
1779 break;
1780 case ICPT_EXT_INT:
1781 unmanageable_intercept(cpu, S390_CRASH_REASON_EXTINT_LOOP,
1782 offsetof(LowCore, external_new_psw));
1783 r = EXCP_HALTED;
1784 break;
1785 case ICPT_WAITPSW:
1786
1787 s390_handle_wait(cpu);
1788 r = EXCP_HALTED;
1789 break;
1790 case ICPT_CPU_STOP:
1791 do_stop_interrupt(&cpu->env);
1792 r = EXCP_HALTED;
1793 break;
1794 case ICPT_OPEREXC:
1795
1796 r = handle_sw_breakpoint(cpu, run);
1797 if (r == -ENOENT) {
1798
1799 r = handle_oper_loop(cpu, run);
1800 if (r == 0) {
1801 kvm_s390_program_interrupt(cpu, PGM_OPERATION);
1802 }
1803 }
1804 break;
1805 case ICPT_SOFT_INTERCEPT:
1806 fprintf(stderr, "KVM unimplemented icpt SOFT\n");
1807 exit(1);
1808 break;
1809 case ICPT_IO:
1810 fprintf(stderr, "KVM unimplemented icpt IO\n");
1811 exit(1);
1812 break;
1813 default:
1814 fprintf(stderr, "Unknown intercept code: %d\n", icpt_code);
1815 exit(1);
1816 break;
1817 }
1818
1819 return r;
1820}
1821
1822static int handle_tsch(S390CPU *cpu)
1823{
1824 CPUState *cs = CPU(cpu);
1825 struct kvm_run *run = cs->kvm_run;
1826 int ret;
1827
1828 ret = ioinst_handle_tsch(cpu, cpu->env.regs[1], run->s390_tsch.ipb,
1829 RA_IGNORED);
1830 if (ret < 0) {
1831
1832
1833
1834
1835 if (run->s390_tsch.dequeued) {
1836 s390_io_interrupt(run->s390_tsch.subchannel_id,
1837 run->s390_tsch.subchannel_nr,
1838 run->s390_tsch.io_int_parm,
1839 run->s390_tsch.io_int_word);
1840 }
1841 ret = 0;
1842 }
1843 return ret;
1844}
1845
1846static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
1847{
1848 const MachineState *ms = MACHINE(qdev_get_machine());
1849 uint16_t conf_cpus = 0, reserved_cpus = 0;
1850 SysIB_322 sysib;
1851 int del, i;
1852
1853 if (s390_is_pv()) {
1854 s390_cpu_pv_mem_read(cpu, 0, &sysib, sizeof(sysib));
1855 } else if (s390_cpu_virt_mem_read(cpu, addr, ar, &sysib, sizeof(sysib))) {
1856 return;
1857 }
1858
1859 memmove(&sysib.ext_names[1], &sysib.ext_names[0],
1860 sizeof(sysib.ext_names[0]) * (sysib.count - 1));
1861
1862
1863
1864 for (del = 1; del < sysib.count; del++) {
1865 if (!sysib.vm[del].ext_name_encoding || !sysib.ext_names[del][0]) {
1866 break;
1867 }
1868 }
1869 if (del < sysib.count) {
1870 memset(sysib.ext_names[del], 0,
1871 sizeof(sysib.ext_names[0]) * (sysib.count - del));
1872 }
1873
1874
1875 for (i = 0; i < ms->possible_cpus->len; i++) {
1876 if (ms->possible_cpus->cpus[i].cpu) {
1877 conf_cpus++;
1878 } else {
1879 reserved_cpus++;
1880 }
1881 }
1882 sysib.vm[0].total_cpus = conf_cpus + reserved_cpus;
1883 sysib.vm[0].conf_cpus = conf_cpus;
1884 sysib.vm[0].reserved_cpus = reserved_cpus;
1885
1886
1887 if (qemu_name) {
1888 memset(sysib.vm[0].name, 0x40, sizeof(sysib.vm[0].name));
1889 ebcdic_put(sysib.vm[0].name, qemu_name, MIN(sizeof(sysib.vm[0].name),
1890 strlen(qemu_name)));
1891 }
1892 sysib.vm[0].ext_name_encoding = 2;
1893
1894
1895
1896
1897
1898 strpadcpy((char *)sysib.ext_names[0],
1899 sizeof(sysib.ext_names[0]),
1900 qemu_name ?: "KVMguest", '\0');
1901
1902
1903 memcpy(sysib.vm[0].uuid, &qemu_uuid, sizeof(sysib.vm[0].uuid));
1904
1905 if (s390_is_pv()) {
1906 s390_cpu_pv_mem_write(cpu, 0, &sysib, sizeof(sysib));
1907 } else {
1908 s390_cpu_virt_mem_write(cpu, addr, ar, &sysib, sizeof(sysib));
1909 }
1910}
1911
1912static int handle_stsi(S390CPU *cpu)
1913{
1914 CPUState *cs = CPU(cpu);
1915 struct kvm_run *run = cs->kvm_run;
1916
1917 switch (run->s390_stsi.fc) {
1918 case 3:
1919 if (run->s390_stsi.sel1 != 2 || run->s390_stsi.sel2 != 2) {
1920 return 0;
1921 }
1922
1923 insert_stsi_3_2_2(cpu, run->s390_stsi.addr, run->s390_stsi.ar);
1924 return 0;
1925 default:
1926 return 0;
1927 }
1928}
1929
1930static int kvm_arch_handle_debug_exit(S390CPU *cpu)
1931{
1932 CPUState *cs = CPU(cpu);
1933 struct kvm_run *run = cs->kvm_run;
1934
1935 int ret = 0;
1936 struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
1937
1938 switch (arch_info->type) {
1939 case KVM_HW_WP_WRITE:
1940 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) {
1941 cs->watchpoint_hit = &hw_watchpoint;
1942 hw_watchpoint.vaddr = arch_info->addr;
1943 hw_watchpoint.flags = BP_MEM_WRITE;
1944 ret = EXCP_DEBUG;
1945 }
1946 break;
1947 case KVM_HW_BP:
1948 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) {
1949 ret = EXCP_DEBUG;
1950 }
1951 break;
1952 case KVM_SINGLESTEP:
1953 if (cs->singlestep_enabled) {
1954 ret = EXCP_DEBUG;
1955 }
1956 break;
1957 default:
1958 ret = -ENOSYS;
1959 }
1960
1961 return ret;
1962}
1963
1964int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
1965{
1966 S390CPU *cpu = S390_CPU(cs);
1967 int ret = 0;
1968
1969 qemu_mutex_lock_iothread();
1970
1971 kvm_cpu_synchronize_state(cs);
1972
1973 switch (run->exit_reason) {
1974 case KVM_EXIT_S390_SIEIC:
1975 ret = handle_intercept(cpu);
1976 break;
1977 case KVM_EXIT_S390_RESET:
1978 s390_ipl_reset_request(cs, S390_RESET_REIPL);
1979 break;
1980 case KVM_EXIT_S390_TSCH:
1981 ret = handle_tsch(cpu);
1982 break;
1983 case KVM_EXIT_S390_STSI:
1984 ret = handle_stsi(cpu);
1985 break;
1986 case KVM_EXIT_DEBUG:
1987 ret = kvm_arch_handle_debug_exit(cpu);
1988 break;
1989 default:
1990 fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
1991 break;
1992 }
1993 qemu_mutex_unlock_iothread();
1994
1995 if (ret == 0) {
1996 ret = EXCP_INTERRUPT;
1997 }
1998 return ret;
1999}
2000
2001bool kvm_arch_stop_on_emulation_error(CPUState *cpu)
2002{
2003 return true;
2004}
2005
2006void kvm_s390_enable_css_support(S390CPU *cpu)
2007{
2008 int r;
2009
2010
2011 r = kvm_vcpu_enable_cap(CPU(cpu), KVM_CAP_S390_CSS_SUPPORT, 0);
2012 assert(r == 0);
2013}
2014
2015void kvm_arch_init_irq_routing(KVMState *s)
2016{
2017
2018
2019
2020
2021
2022 if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
2023 kvm_gsi_routing_allowed = true;
2024 kvm_halt_in_kernel_allowed = false;
2025 }
2026}
2027
2028int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
2029 int vq, bool assign)
2030{
2031 struct kvm_ioeventfd kick = {
2032 .flags = KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY |
2033 KVM_IOEVENTFD_FLAG_DATAMATCH,
2034 .fd = event_notifier_get_fd(notifier),
2035 .datamatch = vq,
2036 .addr = sch,
2037 .len = 8,
2038 };
2039 trace_kvm_assign_subch_ioeventfd(kick.fd, kick.addr, assign,
2040 kick.datamatch);
2041 if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) {
2042 return -ENOSYS;
2043 }
2044 if (!assign) {
2045 kick.flags |= KVM_IOEVENTFD_FLAG_DEASSIGN;
2046 }
2047 return kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
2048}
2049
2050int kvm_s390_get_protected_dump(void)
2051{
2052 return cap_protected_dump;
2053}
2054
2055int kvm_s390_get_ri(void)
2056{
2057 return cap_ri;
2058}
2059
2060int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
2061{
2062 struct kvm_mp_state mp_state = {};
2063 int ret;
2064
2065
2066 if (CPU(cpu)->kvm_state == NULL) {
2067 return 0;
2068 }
2069
2070 switch (cpu_state) {
2071 case S390_CPU_STATE_STOPPED:
2072 mp_state.mp_state = KVM_MP_STATE_STOPPED;
2073 break;
2074 case S390_CPU_STATE_CHECK_STOP:
2075 mp_state.mp_state = KVM_MP_STATE_CHECK_STOP;
2076 break;
2077 case S390_CPU_STATE_OPERATING:
2078 mp_state.mp_state = KVM_MP_STATE_OPERATING;
2079 break;
2080 case S390_CPU_STATE_LOAD:
2081 mp_state.mp_state = KVM_MP_STATE_LOAD;
2082 break;
2083 default:
2084 error_report("Requested CPU state is not a valid S390 CPU state: %u",
2085 cpu_state);
2086 exit(1);
2087 }
2088
2089 ret = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MP_STATE, &mp_state);
2090 if (ret) {
2091 trace_kvm_failed_cpu_state_set(CPU(cpu)->cpu_index, cpu_state,
2092 strerror(-ret));
2093 }
2094
2095 return ret;
2096}
2097
2098void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu)
2099{
2100 unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus;
2101 struct kvm_s390_irq_state irq_state = {
2102 .buf = (uint64_t) cpu->irqstate,
2103 .len = VCPU_IRQ_BUF_SIZE(max_cpus),
2104 };
2105 CPUState *cs = CPU(cpu);
2106 int32_t bytes;
2107
2108 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_IRQ_STATE)) {
2109 return;
2110 }
2111
2112 bytes = kvm_vcpu_ioctl(cs, KVM_S390_GET_IRQ_STATE, &irq_state);
2113 if (bytes < 0) {
2114 cpu->irqstate_saved_size = 0;
2115 error_report("Migration of interrupt state failed");
2116 return;
2117 }
2118
2119 cpu->irqstate_saved_size = bytes;
2120}
2121
2122int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
2123{
2124 CPUState *cs = CPU(cpu);
2125 struct kvm_s390_irq_state irq_state = {
2126 .buf = (uint64_t) cpu->irqstate,
2127 .len = cpu->irqstate_saved_size,
2128 };
2129 int r;
2130
2131 if (cpu->irqstate_saved_size == 0) {
2132 return 0;
2133 }
2134
2135 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_IRQ_STATE)) {
2136 return -ENOSYS;
2137 }
2138
2139 r = kvm_vcpu_ioctl(cs, KVM_S390_SET_IRQ_STATE, &irq_state);
2140 if (r) {
2141 error_report("Setting interrupt state failed %d", r);
2142 }
2143 return r;
2144}
2145
2146int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
2147 uint64_t address, uint32_t data, PCIDevice *dev)
2148{
2149 S390PCIBusDevice *pbdev;
2150 uint32_t vec = data & ZPCI_MSI_VEC_MASK;
2151
2152 if (!dev) {
2153 DPRINTF("add_msi_route no pci device\n");
2154 return -ENODEV;
2155 }
2156
2157 pbdev = s390_pci_find_dev_by_target(s390_get_phb(), DEVICE(dev)->id);
2158 if (!pbdev) {
2159 DPRINTF("add_msi_route no zpci device\n");
2160 return -ENODEV;
2161 }
2162
2163 route->type = KVM_IRQ_ROUTING_S390_ADAPTER;
2164 route->flags = 0;
2165 route->u.adapter.summary_addr = pbdev->routes.adapter.summary_addr;
2166 route->u.adapter.ind_addr = pbdev->routes.adapter.ind_addr;
2167 route->u.adapter.summary_offset = pbdev->routes.adapter.summary_offset;
2168 route->u.adapter.ind_offset = pbdev->routes.adapter.ind_offset + vec;
2169 route->u.adapter.adapter_id = pbdev->routes.adapter.adapter_id;
2170 return 0;
2171}
2172
2173int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
2174 int vector, PCIDevice *dev)
2175{
2176 return 0;
2177}
2178
2179int kvm_arch_release_virq_post(int virq)
2180{
2181 return 0;
2182}
2183
2184int kvm_arch_msi_data_to_gsi(uint32_t data)
2185{
2186 abort();
2187}
2188
2189static int query_cpu_subfunc(S390FeatBitmap features)
2190{
2191 struct kvm_s390_vm_cpu_subfunc prop = {};
2192 struct kvm_device_attr attr = {
2193 .group = KVM_S390_VM_CPU_MODEL,
2194 .attr = KVM_S390_VM_CPU_MACHINE_SUBFUNC,
2195 .addr = (uint64_t) &prop,
2196 };
2197 int rc;
2198
2199 rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
2200 if (rc) {
2201 return rc;
2202 }
2203
2204
2205
2206
2207
2208 s390_add_from_feat_block(features, S390_FEAT_TYPE_PLO, prop.plo);
2209 if (test_bit(S390_FEAT_TOD_CLOCK_STEERING, features)) {
2210 s390_add_from_feat_block(features, S390_FEAT_TYPE_PTFF, prop.ptff);
2211 }
2212 if (test_bit(S390_FEAT_MSA, features)) {
2213 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMAC, prop.kmac);
2214 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMC, prop.kmc);
2215 s390_add_from_feat_block(features, S390_FEAT_TYPE_KM, prop.km);
2216 s390_add_from_feat_block(features, S390_FEAT_TYPE_KIMD, prop.kimd);
2217 s390_add_from_feat_block(features, S390_FEAT_TYPE_KLMD, prop.klmd);
2218 }
2219 if (test_bit(S390_FEAT_MSA_EXT_3, features)) {
2220 s390_add_from_feat_block(features, S390_FEAT_TYPE_PCKMO, prop.pckmo);
2221 }
2222 if (test_bit(S390_FEAT_MSA_EXT_4, features)) {
2223 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMCTR, prop.kmctr);
2224 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMF, prop.kmf);
2225 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMO, prop.kmo);
2226 s390_add_from_feat_block(features, S390_FEAT_TYPE_PCC, prop.pcc);
2227 }
2228 if (test_bit(S390_FEAT_MSA_EXT_5, features)) {
2229 s390_add_from_feat_block(features, S390_FEAT_TYPE_PPNO, prop.ppno);
2230 }
2231 if (test_bit(S390_FEAT_MSA_EXT_8, features)) {
2232 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMA, prop.kma);
2233 }
2234 if (test_bit(S390_FEAT_MSA_EXT_9, features)) {
2235 s390_add_from_feat_block(features, S390_FEAT_TYPE_KDSA, prop.kdsa);
2236 }
2237 if (test_bit(S390_FEAT_ESORT_BASE, features)) {
2238 s390_add_from_feat_block(features, S390_FEAT_TYPE_SORTL, prop.sortl);
2239 }
2240 if (test_bit(S390_FEAT_DEFLATE_BASE, features)) {
2241 s390_add_from_feat_block(features, S390_FEAT_TYPE_DFLTCC, prop.dfltcc);
2242 }
2243 return 0;
2244}
2245
2246static int configure_cpu_subfunc(const S390FeatBitmap features)
2247{
2248 struct kvm_s390_vm_cpu_subfunc prop = {};
2249 struct kvm_device_attr attr = {
2250 .group = KVM_S390_VM_CPU_MODEL,
2251 .attr = KVM_S390_VM_CPU_PROCESSOR_SUBFUNC,
2252 .addr = (uint64_t) &prop,
2253 };
2254
2255 if (!kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2256 KVM_S390_VM_CPU_PROCESSOR_SUBFUNC)) {
2257
2258 return 0;
2259 }
2260
2261 s390_fill_feat_block(features, S390_FEAT_TYPE_PLO, prop.plo);
2262 if (test_bit(S390_FEAT_TOD_CLOCK_STEERING, features)) {
2263 s390_fill_feat_block(features, S390_FEAT_TYPE_PTFF, prop.ptff);
2264 }
2265 if (test_bit(S390_FEAT_MSA, features)) {
2266 s390_fill_feat_block(features, S390_FEAT_TYPE_KMAC, prop.kmac);
2267 s390_fill_feat_block(features, S390_FEAT_TYPE_KMC, prop.kmc);
2268 s390_fill_feat_block(features, S390_FEAT_TYPE_KM, prop.km);
2269 s390_fill_feat_block(features, S390_FEAT_TYPE_KIMD, prop.kimd);
2270 s390_fill_feat_block(features, S390_FEAT_TYPE_KLMD, prop.klmd);
2271 }
2272 if (test_bit(S390_FEAT_MSA_EXT_3, features)) {
2273 s390_fill_feat_block(features, S390_FEAT_TYPE_PCKMO, prop.pckmo);
2274 }
2275 if (test_bit(S390_FEAT_MSA_EXT_4, features)) {
2276 s390_fill_feat_block(features, S390_FEAT_TYPE_KMCTR, prop.kmctr);
2277 s390_fill_feat_block(features, S390_FEAT_TYPE_KMF, prop.kmf);
2278 s390_fill_feat_block(features, S390_FEAT_TYPE_KMO, prop.kmo);
2279 s390_fill_feat_block(features, S390_FEAT_TYPE_PCC, prop.pcc);
2280 }
2281 if (test_bit(S390_FEAT_MSA_EXT_5, features)) {
2282 s390_fill_feat_block(features, S390_FEAT_TYPE_PPNO, prop.ppno);
2283 }
2284 if (test_bit(S390_FEAT_MSA_EXT_8, features)) {
2285 s390_fill_feat_block(features, S390_FEAT_TYPE_KMA, prop.kma);
2286 }
2287 if (test_bit(S390_FEAT_MSA_EXT_9, features)) {
2288 s390_fill_feat_block(features, S390_FEAT_TYPE_KDSA, prop.kdsa);
2289 }
2290 if (test_bit(S390_FEAT_ESORT_BASE, features)) {
2291 s390_fill_feat_block(features, S390_FEAT_TYPE_SORTL, prop.sortl);
2292 }
2293 if (test_bit(S390_FEAT_DEFLATE_BASE, features)) {
2294 s390_fill_feat_block(features, S390_FEAT_TYPE_DFLTCC, prop.dfltcc);
2295 }
2296 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
2297}
2298
2299static int kvm_to_feat[][2] = {
2300 { KVM_S390_VM_CPU_FEAT_ESOP, S390_FEAT_ESOP },
2301 { KVM_S390_VM_CPU_FEAT_SIEF2, S390_FEAT_SIE_F2 },
2302 { KVM_S390_VM_CPU_FEAT_64BSCAO , S390_FEAT_SIE_64BSCAO },
2303 { KVM_S390_VM_CPU_FEAT_SIIF, S390_FEAT_SIE_SIIF },
2304 { KVM_S390_VM_CPU_FEAT_GPERE, S390_FEAT_SIE_GPERE },
2305 { KVM_S390_VM_CPU_FEAT_GSLS, S390_FEAT_SIE_GSLS },
2306 { KVM_S390_VM_CPU_FEAT_IB, S390_FEAT_SIE_IB },
2307 { KVM_S390_VM_CPU_FEAT_CEI, S390_FEAT_SIE_CEI },
2308 { KVM_S390_VM_CPU_FEAT_IBS, S390_FEAT_SIE_IBS },
2309 { KVM_S390_VM_CPU_FEAT_SKEY, S390_FEAT_SIE_SKEY },
2310 { KVM_S390_VM_CPU_FEAT_CMMA, S390_FEAT_SIE_CMMA },
2311 { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
2312 { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
2313 { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
2314};
2315
2316static int query_cpu_feat(S390FeatBitmap features)
2317{
2318 struct kvm_s390_vm_cpu_feat prop = {};
2319 struct kvm_device_attr attr = {
2320 .group = KVM_S390_VM_CPU_MODEL,
2321 .attr = KVM_S390_VM_CPU_MACHINE_FEAT,
2322 .addr = (uint64_t) &prop,
2323 };
2324 int rc;
2325 int i;
2326
2327 rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
2328 if (rc) {
2329 return rc;
2330 }
2331
2332 for (i = 0; i < ARRAY_SIZE(kvm_to_feat); i++) {
2333 if (test_be_bit(kvm_to_feat[i][0], (uint8_t *) prop.feat)) {
2334 set_bit(kvm_to_feat[i][1], features);
2335 }
2336 }
2337 return 0;
2338}
2339
2340static int configure_cpu_feat(const S390FeatBitmap features)
2341{
2342 struct kvm_s390_vm_cpu_feat prop = {};
2343 struct kvm_device_attr attr = {
2344 .group = KVM_S390_VM_CPU_MODEL,
2345 .attr = KVM_S390_VM_CPU_PROCESSOR_FEAT,
2346 .addr = (uint64_t) &prop,
2347 };
2348 int i;
2349
2350 for (i = 0; i < ARRAY_SIZE(kvm_to_feat); i++) {
2351 if (test_bit(kvm_to_feat[i][1], features)) {
2352 set_be_bit(kvm_to_feat[i][0], (uint8_t *) prop.feat);
2353 }
2354 }
2355 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
2356}
2357
2358bool kvm_s390_cpu_models_supported(void)
2359{
2360 if (!cpu_model_allowed()) {
2361
2362 return false;
2363 }
2364 return kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2365 KVM_S390_VM_CPU_MACHINE) &&
2366 kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2367 KVM_S390_VM_CPU_PROCESSOR) &&
2368 kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2369 KVM_S390_VM_CPU_MACHINE_FEAT) &&
2370 kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2371 KVM_S390_VM_CPU_PROCESSOR_FEAT) &&
2372 kvm_vm_check_attr(kvm_state, KVM_S390_VM_CPU_MODEL,
2373 KVM_S390_VM_CPU_MACHINE_SUBFUNC);
2374}
2375
2376void kvm_s390_get_host_cpu_model(S390CPUModel *model, Error **errp)
2377{
2378 struct kvm_s390_vm_cpu_machine prop = {};
2379 struct kvm_device_attr attr = {
2380 .group = KVM_S390_VM_CPU_MODEL,
2381 .attr = KVM_S390_VM_CPU_MACHINE,
2382 .addr = (uint64_t) &prop,
2383 };
2384 uint16_t unblocked_ibc = 0, cpu_type = 0;
2385 int rc;
2386
2387 memset(model, 0, sizeof(*model));
2388
2389 if (!kvm_s390_cpu_models_supported()) {
2390 error_setg(errp, "KVM doesn't support CPU models");
2391 return;
2392 }
2393
2394
2395 rc = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
2396 if (rc) {
2397 error_setg(errp, "KVM: Error querying host CPU model: %d", rc);
2398 return;
2399 }
2400
2401 cpu_type = cpuid_type(prop.cpuid);
2402 if (has_ibc(prop.ibc)) {
2403 model->lowest_ibc = lowest_ibc(prop.ibc);
2404 unblocked_ibc = unblocked_ibc(prop.ibc);
2405 }
2406 model->cpu_id = cpuid_id(prop.cpuid);
2407 model->cpu_id_format = cpuid_format(prop.cpuid);
2408 model->cpu_ver = 0xff;
2409
2410
2411 s390_add_from_feat_block(model->features, S390_FEAT_TYPE_STFL,
2412 (uint8_t *) prop.fac_mask);
2413
2414 if (test_bit(S390_FEAT_STFLE, model->features)) {
2415 set_bit(S390_FEAT_DAT_ENH_2, model->features);
2416 }
2417
2418 rc = query_cpu_feat(model->features);
2419 if (rc) {
2420 error_setg(errp, "KVM: Error querying CPU features: %d", rc);
2421 return;
2422 }
2423
2424 rc = query_cpu_subfunc(model->features);
2425 if (rc) {
2426 error_setg(errp, "KVM: Error querying CPU subfunctions: %d", rc);
2427 return;
2428 }
2429
2430
2431 if (!test_bit(S390_FEAT_MULTIPLE_EPOCH, model->features)) {
2432 clear_bit(S390_FEAT_PTFF_QSIE, model->features);
2433 clear_bit(S390_FEAT_PTFF_QTOUE, model->features);
2434 clear_bit(S390_FEAT_PTFF_STOE, model->features);
2435 clear_bit(S390_FEAT_PTFF_STOUE, model->features);
2436 }
2437
2438
2439 if (kvm_s390_cmma_available()) {
2440 set_bit(S390_FEAT_CMM, model->features);
2441 } else {
2442
2443 clear_bit(S390_FEAT_CMM_NT, model->features);
2444 }
2445
2446
2447 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_BPB)) {
2448 clear_bit(S390_FEAT_BPB, model->features);
2449 }
2450
2451
2452
2453
2454
2455 if (cap_protected) {
2456 set_bit(S390_FEAT_UNPACK, model->features);
2457 }
2458
2459
2460 set_bit(S390_FEAT_ZPCI, model->features);
2461 set_bit(S390_FEAT_ADAPTER_EVENT_NOTIFICATION, model->features);
2462
2463 if (s390_known_cpu_type(cpu_type)) {
2464
2465 model->def = s390_find_cpu_def(cpu_type, ibc_gen(unblocked_ibc),
2466 ibc_ec_ga(unblocked_ibc), NULL);
2467 } else {
2468
2469 model->def = s390_find_cpu_def(0, ibc_gen(unblocked_ibc),
2470 ibc_ec_ga(unblocked_ibc),
2471 model->features);
2472 }
2473 if (!model->def) {
2474 error_setg(errp, "KVM: host CPU model could not be identified");
2475 return;
2476 }
2477
2478 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO,
2479 KVM_S390_VM_CRYPTO_ENABLE_APIE)) {
2480 set_bit(S390_FEAT_AP, model->features);
2481 }
2482
2483
2484
2485
2486
2487
2488 set_bit(S390_FEAT_EXTENDED_LENGTH_SCCB, model->features);
2489
2490 if (kvm_check_extension(kvm_state, KVM_CAP_S390_DIAG318)) {
2491 set_bit(S390_FEAT_DIAG_318, model->features);
2492 }
2493
2494
2495 bitmap_and(model->features, model->features, model->def->full_feat,
2496 S390_FEAT_MAX);
2497}
2498
2499static void kvm_s390_configure_apie(bool interpret)
2500{
2501 uint64_t attr = interpret ? KVM_S390_VM_CRYPTO_ENABLE_APIE :
2502 KVM_S390_VM_CRYPTO_DISABLE_APIE;
2503
2504 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
2505 kvm_s390_set_attr(attr);
2506 }
2507}
2508
2509void kvm_s390_apply_cpu_model(const S390CPUModel *model, Error **errp)
2510{
2511 struct kvm_s390_vm_cpu_processor prop = {
2512 .fac_list = { 0 },
2513 };
2514 struct kvm_device_attr attr = {
2515 .group = KVM_S390_VM_CPU_MODEL,
2516 .attr = KVM_S390_VM_CPU_PROCESSOR,
2517 .addr = (uint64_t) &prop,
2518 };
2519 int rc;
2520
2521 if (!model) {
2522
2523 if (kvm_s390_cmma_available()) {
2524 kvm_s390_enable_cmma();
2525 }
2526 return;
2527 }
2528 if (!kvm_s390_cpu_models_supported()) {
2529 error_setg(errp, "KVM doesn't support CPU models");
2530 return;
2531 }
2532 prop.cpuid = s390_cpuid_from_cpu_model(model);
2533 prop.ibc = s390_ibc_from_cpu_model(model);
2534
2535 s390_fill_feat_block(model->features, S390_FEAT_TYPE_STFL,
2536 (uint8_t *) prop.fac_list);
2537 rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
2538 if (rc) {
2539 error_setg(errp, "KVM: Error configuring the CPU model: %d", rc);
2540 return;
2541 }
2542
2543 rc = configure_cpu_feat(model->features);
2544 if (rc) {
2545 error_setg(errp, "KVM: Error configuring CPU features: %d", rc);
2546 return;
2547 }
2548
2549 rc = configure_cpu_subfunc(model->features);
2550 if (rc) {
2551 error_setg(errp, "KVM: Error configuring CPU subfunctions: %d", rc);
2552 return;
2553 }
2554
2555 if (test_bit(S390_FEAT_CMM, model->features)) {
2556 kvm_s390_enable_cmma();
2557 }
2558
2559 if (test_bit(S390_FEAT_AP, model->features)) {
2560 kvm_s390_configure_apie(true);
2561 }
2562}
2563
2564void kvm_s390_restart_interrupt(S390CPU *cpu)
2565{
2566 struct kvm_s390_irq irq = {
2567 .type = KVM_S390_RESTART,
2568 };
2569
2570 kvm_s390_vcpu_interrupt(cpu, &irq);
2571}
2572
2573void kvm_s390_stop_interrupt(S390CPU *cpu)
2574{
2575 struct kvm_s390_irq irq = {
2576 .type = KVM_S390_SIGP_STOP,
2577 };
2578
2579 kvm_s390_vcpu_interrupt(cpu, &irq);
2580}
2581
2582bool kvm_arch_cpu_check_are_resettable(void)
2583{
2584 return true;
2585}
2586
2587int kvm_s390_get_zpci_op(void)
2588{
2589 return cap_zpci_op;
2590}
2591
2592void kvm_arch_accel_class_init(ObjectClass *oc)
2593{
2594}
2595