1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "qemu/osdep.h"
25#include <sys/ioctl.h>
26
27#include <linux/kvm.h>
28#include <asm/ptrace.h>
29
30#include "qemu-common.h"
31#include "cpu.h"
32#include "qemu/error-report.h"
33#include "qemu/timer.h"
34#include "sysemu/sysemu.h"
35#include "sysemu/kvm.h"
36#include "hw/hw.h"
37#include "sysemu/device_tree.h"
38#include "qapi/qmp/qjson.h"
39#include "exec/gdbstub.h"
40#include "exec/address-spaces.h"
41#include "trace.h"
42#include "qapi-event.h"
43#include "hw/s390x/s390-pci-inst.h"
44#include "hw/s390x/s390-pci-bus.h"
45#include "hw/s390x/ipl.h"
46#include "hw/s390x/ebcdic.h"
47#include "exec/memattrs.h"
48#include "hw/s390x/s390-virtio-ccw.h"
49
50
51
52#ifdef DEBUG_KVM
53#define DPRINTF(fmt, ...) \
54 do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
55#else
56#define DPRINTF(fmt, ...) \
57 do { } while (0)
58#endif
59
60#define kvm_vm_check_mem_attr(s, attr) \
61 kvm_vm_check_attr(s, KVM_S390_VM_MEM_CTRL, attr)
62
63#define IPA0_DIAG 0x8300
64#define IPA0_SIGP 0xae00
65#define IPA0_B2 0xb200
66#define IPA0_B9 0xb900
67#define IPA0_EB 0xeb00
68#define IPA0_E3 0xe300
69
70#define PRIV_B2_SCLP_CALL 0x20
71#define PRIV_B2_CSCH 0x30
72#define PRIV_B2_HSCH 0x31
73#define PRIV_B2_MSCH 0x32
74#define PRIV_B2_SSCH 0x33
75#define PRIV_B2_STSCH 0x34
76#define PRIV_B2_TSCH 0x35
77#define PRIV_B2_TPI 0x36
78#define PRIV_B2_SAL 0x37
79#define PRIV_B2_RSCH 0x38
80#define PRIV_B2_STCRW 0x39
81#define PRIV_B2_STCPS 0x3a
82#define PRIV_B2_RCHP 0x3b
83#define PRIV_B2_SCHM 0x3c
84#define PRIV_B2_CHSC 0x5f
85#define PRIV_B2_SIGA 0x74
86#define PRIV_B2_XSCH 0x76
87
88#define PRIV_EB_SQBS 0x8a
89#define PRIV_EB_PCISTB 0xd0
90#define PRIV_EB_SIC 0xd1
91
92#define PRIV_B9_EQBS 0x9c
93#define PRIV_B9_CLP 0xa0
94#define PRIV_B9_PCISTG 0xd0
95#define PRIV_B9_PCILG 0xd2
96#define PRIV_B9_RPCIT 0xd3
97
98#define PRIV_E3_MPCIFC 0xd0
99#define PRIV_E3_STPCIFC 0xd4
100
101#define DIAG_TIMEREVENT 0x288
102#define DIAG_IPL 0x308
103#define DIAG_KVM_HYPERCALL 0x500
104#define DIAG_KVM_BREAKPOINT 0x501
105
106#define ICPT_INSTRUCTION 0x04
107#define ICPT_PROGRAM 0x08
108#define ICPT_EXT_INT 0x14
109#define ICPT_WAITPSW 0x1c
110#define ICPT_SOFT_INTERCEPT 0x24
111#define ICPT_CPU_STOP 0x28
112#define ICPT_IO 0x40
113
114#define NR_LOCAL_IRQS 32
115
116
117
118
119#define VCPU_IRQ_BUF_SIZE (sizeof(struct kvm_s390_irq) * \
120 (max_cpus + NR_LOCAL_IRQS))
121
122static CPUWatchpoint hw_watchpoint;
123
124
125
126
127static struct kvm_hw_breakpoint *hw_breakpoints;
128static int nb_hw_breakpoints;
129
130const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
131 KVM_CAP_LAST_INFO
132};
133
134static int cap_sync_regs;
135static int cap_async_pf;
136static int cap_mem_op;
137static int cap_s390_irq;
138static int cap_ri;
139
140static void *legacy_s390_alloc(size_t size, uint64_t *align);
141
142static int kvm_s390_query_mem_limit(KVMState *s, uint64_t *memory_limit)
143{
144 struct kvm_device_attr attr = {
145 .group = KVM_S390_VM_MEM_CTRL,
146 .attr = KVM_S390_VM_MEM_LIMIT_SIZE,
147 .addr = (uint64_t) memory_limit,
148 };
149
150 return kvm_vm_ioctl(s, KVM_GET_DEVICE_ATTR, &attr);
151}
152
153int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit, uint64_t *hw_limit)
154{
155 int rc;
156
157 struct kvm_device_attr attr = {
158 .group = KVM_S390_VM_MEM_CTRL,
159 .attr = KVM_S390_VM_MEM_LIMIT_SIZE,
160 .addr = (uint64_t) &new_limit,
161 };
162
163 if (!kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_LIMIT_SIZE)) {
164 return 0;
165 }
166
167 rc = kvm_s390_query_mem_limit(s, hw_limit);
168 if (rc) {
169 return rc;
170 } else if (*hw_limit < new_limit) {
171 return -E2BIG;
172 }
173
174 return kvm_vm_ioctl(s, KVM_SET_DEVICE_ATTR, &attr);
175}
176
177void kvm_s390_cmma_reset(void)
178{
179 int rc;
180 struct kvm_device_attr attr = {
181 .group = KVM_S390_VM_MEM_CTRL,
182 .attr = KVM_S390_VM_MEM_CLR_CMMA,
183 };
184
185 rc = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
186 trace_kvm_clear_cmma(rc);
187}
188
189static void kvm_s390_enable_cmma(KVMState *s)
190{
191 int rc;
192 struct kvm_device_attr attr = {
193 .group = KVM_S390_VM_MEM_CTRL,
194 .attr = KVM_S390_VM_MEM_ENABLE_CMMA,
195 };
196
197 if (!kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_ENABLE_CMMA) ||
198 !kvm_vm_check_mem_attr(s, KVM_S390_VM_MEM_CLR_CMMA)) {
199 return;
200 }
201
202 rc = kvm_vm_ioctl(s, KVM_SET_DEVICE_ATTR, &attr);
203 trace_kvm_enable_cmma(rc);
204}
205
206static void kvm_s390_set_attr(uint64_t attr)
207{
208 struct kvm_device_attr attribute = {
209 .group = KVM_S390_VM_CRYPTO,
210 .attr = attr,
211 };
212
213 int ret = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attribute);
214
215 if (ret) {
216 error_report("Failed to set crypto device attribute %lu: %s",
217 attr, strerror(-ret));
218 }
219}
220
221static void kvm_s390_init_aes_kw(void)
222{
223 uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_AES_KW;
224
225 if (object_property_get_bool(OBJECT(qdev_get_machine()), "aes-key-wrap",
226 NULL)) {
227 attr = KVM_S390_VM_CRYPTO_ENABLE_AES_KW;
228 }
229
230 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
231 kvm_s390_set_attr(attr);
232 }
233}
234
235static void kvm_s390_init_dea_kw(void)
236{
237 uint64_t attr = KVM_S390_VM_CRYPTO_DISABLE_DEA_KW;
238
239 if (object_property_get_bool(OBJECT(qdev_get_machine()), "dea-key-wrap",
240 NULL)) {
241 attr = KVM_S390_VM_CRYPTO_ENABLE_DEA_KW;
242 }
243
244 if (kvm_vm_check_attr(kvm_state, KVM_S390_VM_CRYPTO, attr)) {
245 kvm_s390_set_attr(attr);
246 }
247}
248
249void kvm_s390_crypto_reset(void)
250{
251 kvm_s390_init_aes_kw();
252 kvm_s390_init_dea_kw();
253}
254
255int kvm_arch_init(MachineState *ms, KVMState *s)
256{
257 cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
258 cap_async_pf = kvm_check_extension(s, KVM_CAP_ASYNC_PF);
259 cap_mem_op = kvm_check_extension(s, KVM_CAP_S390_MEM_OP);
260 cap_s390_irq = kvm_check_extension(s, KVM_CAP_S390_INJECT_IRQ);
261
262 if (!mem_path) {
263 kvm_s390_enable_cmma(s);
264 }
265
266 if (!kvm_check_extension(s, KVM_CAP_S390_GMAP)
267 || !kvm_check_extension(s, KVM_CAP_S390_COW)) {
268 phys_mem_set_alloc(legacy_s390_alloc);
269 }
270
271 kvm_vm_enable_cap(s, KVM_CAP_S390_USER_SIGP, 0);
272 kvm_vm_enable_cap(s, KVM_CAP_S390_VECTOR_REGISTERS, 0);
273 kvm_vm_enable_cap(s, KVM_CAP_S390_USER_STSI, 0);
274 if (ri_allowed()) {
275 if (kvm_vm_enable_cap(s, KVM_CAP_S390_RI, 0) == 0) {
276 cap_ri = 1;
277 }
278 }
279
280 return 0;
281}
282
283unsigned long kvm_arch_vcpu_id(CPUState *cpu)
284{
285 return cpu->cpu_index;
286}
287
288int kvm_arch_init_vcpu(CPUState *cs)
289{
290 S390CPU *cpu = S390_CPU(cs);
291 kvm_s390_set_cpu_state(cpu, cpu->env.cpu_state);
292 cpu->irqstate = g_malloc0(VCPU_IRQ_BUF_SIZE);
293 return 0;
294}
295
296void kvm_s390_reset_vcpu(S390CPU *cpu)
297{
298 CPUState *cs = CPU(cpu);
299
300
301
302
303
304
305 if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL)) {
306 error_report("Initial CPU reset failed on CPU %i", cs->cpu_index);
307 }
308}
309
310static int can_sync_regs(CPUState *cs, int regs)
311{
312 return cap_sync_regs && (cs->kvm_run->kvm_valid_regs & regs) == regs;
313}
314
315int kvm_arch_put_registers(CPUState *cs, int level)
316{
317 S390CPU *cpu = S390_CPU(cs);
318 CPUS390XState *env = &cpu->env;
319 struct kvm_sregs sregs;
320 struct kvm_regs regs;
321 struct kvm_fpu fpu = {};
322 int r;
323 int i;
324
325
326 cs->kvm_run->psw_addr = env->psw.addr;
327 cs->kvm_run->psw_mask = env->psw.mask;
328
329 if (can_sync_regs(cs, KVM_SYNC_GPRS)) {
330 for (i = 0; i < 16; i++) {
331 cs->kvm_run->s.regs.gprs[i] = env->regs[i];
332 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS;
333 }
334 } else {
335 for (i = 0; i < 16; i++) {
336 regs.gprs[i] = env->regs[i];
337 }
338 r = kvm_vcpu_ioctl(cs, KVM_SET_REGS, ®s);
339 if (r < 0) {
340 return r;
341 }
342 }
343
344 if (can_sync_regs(cs, KVM_SYNC_VRS)) {
345 for (i = 0; i < 32; i++) {
346 cs->kvm_run->s.regs.vrs[i][0] = env->vregs[i][0].ll;
347 cs->kvm_run->s.regs.vrs[i][1] = env->vregs[i][1].ll;
348 }
349 cs->kvm_run->s.regs.fpc = env->fpc;
350 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_VRS;
351 } else if (can_sync_regs(cs, KVM_SYNC_FPRS)) {
352 for (i = 0; i < 16; i++) {
353 cs->kvm_run->s.regs.fprs[i] = get_freg(env, i)->ll;
354 }
355 cs->kvm_run->s.regs.fpc = env->fpc;
356 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_FPRS;
357 } else {
358
359 for (i = 0; i < 16; i++) {
360 fpu.fprs[i] = get_freg(env, i)->ll;
361 }
362 fpu.fpc = env->fpc;
363
364 r = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu);
365 if (r < 0) {
366 return r;
367 }
368 }
369
370
371 if (level == KVM_PUT_RUNTIME_STATE) {
372 return 0;
373 }
374
375 if (can_sync_regs(cs, KVM_SYNC_ARCH0)) {
376 cs->kvm_run->s.regs.cputm = env->cputm;
377 cs->kvm_run->s.regs.ckc = env->ckc;
378 cs->kvm_run->s.regs.todpr = env->todpr;
379 cs->kvm_run->s.regs.gbea = env->gbea;
380 cs->kvm_run->s.regs.pp = env->pp;
381 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ARCH0;
382 } else {
383
384
385
386
387
388 kvm_set_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
389 kvm_set_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
390 kvm_set_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
391 kvm_set_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
392 kvm_set_one_reg(cs, KVM_REG_S390_PP, &env->pp);
393 }
394
395 if (can_sync_regs(cs, KVM_SYNC_RICCB)) {
396 memcpy(cs->kvm_run->s.regs.riccb, env->riccb, 64);
397 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_RICCB;
398 }
399
400
401 if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
402 cs->kvm_run->s.regs.pft = env->pfault_token;
403 cs->kvm_run->s.regs.pfs = env->pfault_select;
404 cs->kvm_run->s.regs.pfc = env->pfault_compare;
405 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PFAULT;
406 } else if (cap_async_pf) {
407 r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
408 if (r < 0) {
409 return r;
410 }
411 r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
412 if (r < 0) {
413 return r;
414 }
415 r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
416 if (r < 0) {
417 return r;
418 }
419 }
420
421
422 if (can_sync_regs(cs, KVM_SYNC_ACRS | KVM_SYNC_CRS)) {
423 for (i = 0; i < 16; i++) {
424 cs->kvm_run->s.regs.acrs[i] = env->aregs[i];
425 cs->kvm_run->s.regs.crs[i] = env->cregs[i];
426 }
427 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS;
428 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_CRS;
429 } else {
430 for (i = 0; i < 16; i++) {
431 sregs.acrs[i] = env->aregs[i];
432 sregs.crs[i] = env->cregs[i];
433 }
434 r = kvm_vcpu_ioctl(cs, KVM_SET_SREGS, &sregs);
435 if (r < 0) {
436 return r;
437 }
438 }
439
440
441 if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
442 cs->kvm_run->s.regs.prefix = env->psa;
443 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PREFIX;
444 } else {
445
446 }
447 return 0;
448}
449
450int kvm_arch_get_registers(CPUState *cs)
451{
452 S390CPU *cpu = S390_CPU(cs);
453 CPUS390XState *env = &cpu->env;
454 struct kvm_sregs sregs;
455 struct kvm_regs regs;
456 struct kvm_fpu fpu;
457 int i, r;
458
459
460 env->psw.addr = cs->kvm_run->psw_addr;
461 env->psw.mask = cs->kvm_run->psw_mask;
462
463
464 if (can_sync_regs(cs, KVM_SYNC_GPRS)) {
465 for (i = 0; i < 16; i++) {
466 env->regs[i] = cs->kvm_run->s.regs.gprs[i];
467 }
468 } else {
469 r = kvm_vcpu_ioctl(cs, KVM_GET_REGS, ®s);
470 if (r < 0) {
471 return r;
472 }
473 for (i = 0; i < 16; i++) {
474 env->regs[i] = regs.gprs[i];
475 }
476 }
477
478
479 if (can_sync_regs(cs, KVM_SYNC_ACRS | KVM_SYNC_CRS)) {
480 for (i = 0; i < 16; i++) {
481 env->aregs[i] = cs->kvm_run->s.regs.acrs[i];
482 env->cregs[i] = cs->kvm_run->s.regs.crs[i];
483 }
484 } else {
485 r = kvm_vcpu_ioctl(cs, KVM_GET_SREGS, &sregs);
486 if (r < 0) {
487 return r;
488 }
489 for (i = 0; i < 16; i++) {
490 env->aregs[i] = sregs.acrs[i];
491 env->cregs[i] = sregs.crs[i];
492 }
493 }
494
495
496 if (can_sync_regs(cs, KVM_SYNC_VRS)) {
497 for (i = 0; i < 32; i++) {
498 env->vregs[i][0].ll = cs->kvm_run->s.regs.vrs[i][0];
499 env->vregs[i][1].ll = cs->kvm_run->s.regs.vrs[i][1];
500 }
501 env->fpc = cs->kvm_run->s.regs.fpc;
502 } else if (can_sync_regs(cs, KVM_SYNC_FPRS)) {
503 for (i = 0; i < 16; i++) {
504 get_freg(env, i)->ll = cs->kvm_run->s.regs.fprs[i];
505 }
506 env->fpc = cs->kvm_run->s.regs.fpc;
507 } else {
508 r = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu);
509 if (r < 0) {
510 return r;
511 }
512 for (i = 0; i < 16; i++) {
513 get_freg(env, i)->ll = fpu.fprs[i];
514 }
515 env->fpc = fpu.fpc;
516 }
517
518
519 if (can_sync_regs(cs, KVM_SYNC_PREFIX)) {
520 env->psa = cs->kvm_run->s.regs.prefix;
521 }
522
523 if (can_sync_regs(cs, KVM_SYNC_ARCH0)) {
524 env->cputm = cs->kvm_run->s.regs.cputm;
525 env->ckc = cs->kvm_run->s.regs.ckc;
526 env->todpr = cs->kvm_run->s.regs.todpr;
527 env->gbea = cs->kvm_run->s.regs.gbea;
528 env->pp = cs->kvm_run->s.regs.pp;
529 } else {
530
531
532
533
534
535 kvm_get_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm);
536 kvm_get_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc);
537 kvm_get_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr);
538 kvm_get_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea);
539 kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp);
540 }
541
542 if (can_sync_regs(cs, KVM_SYNC_RICCB)) {
543 memcpy(env->riccb, cs->kvm_run->s.regs.riccb, 64);
544 }
545
546
547 if (can_sync_regs(cs, KVM_SYNC_PFAULT)) {
548 env->pfault_token = cs->kvm_run->s.regs.pft;
549 env->pfault_select = cs->kvm_run->s.regs.pfs;
550 env->pfault_compare = cs->kvm_run->s.regs.pfc;
551 } else if (cap_async_pf) {
552 r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token);
553 if (r < 0) {
554 return r;
555 }
556 r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare);
557 if (r < 0) {
558 return r;
559 }
560 r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select);
561 if (r < 0) {
562 return r;
563 }
564 }
565
566 return 0;
567}
568
569int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
570{
571 int r;
572 struct kvm_device_attr attr = {
573 .group = KVM_S390_VM_TOD,
574 .attr = KVM_S390_VM_TOD_LOW,
575 .addr = (uint64_t)tod_low,
576 };
577
578 r = kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
579 if (r) {
580 return r;
581 }
582
583 attr.attr = KVM_S390_VM_TOD_HIGH;
584 attr.addr = (uint64_t)tod_high;
585 return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
586}
587
588int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
589{
590 int r;
591
592 struct kvm_device_attr attr = {
593 .group = KVM_S390_VM_TOD,
594 .attr = KVM_S390_VM_TOD_LOW,
595 .addr = (uint64_t)tod_low,
596 };
597
598 r = kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
599 if (r) {
600 return r;
601 }
602
603 attr.attr = KVM_S390_VM_TOD_HIGH;
604 attr.addr = (uint64_t)tod_high;
605 return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
606}
607
608
609
610
611
612
613
614
615
616
617
618
619
620int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
621 int len, bool is_write)
622{
623 struct kvm_s390_mem_op mem_op = {
624 .gaddr = addr,
625 .flags = KVM_S390_MEMOP_F_INJECT_EXCEPTION,
626 .size = len,
627 .op = is_write ? KVM_S390_MEMOP_LOGICAL_WRITE
628 : KVM_S390_MEMOP_LOGICAL_READ,
629 .buf = (uint64_t)hostbuf,
630 .ar = ar,
631 };
632 int ret;
633
634 if (!cap_mem_op) {
635 return -ENOSYS;
636 }
637 if (!hostbuf) {
638 mem_op.flags |= KVM_S390_MEMOP_F_CHECK_ONLY;
639 }
640
641 ret = kvm_vcpu_ioctl(CPU(cpu), KVM_S390_MEM_OP, &mem_op);
642 if (ret < 0) {
643 error_printf("KVM_S390_MEM_OP failed: %s\n", strerror(-ret));
644 }
645 return ret;
646}
647
648
649
650
651
652
653
654
655
656
657
658static void *legacy_s390_alloc(size_t size, uint64_t *align)
659{
660 void *mem;
661
662 mem = mmap((void *) 0x800000000ULL, size,
663 PROT_EXEC|PROT_READ|PROT_WRITE,
664 MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
665 return mem == MAP_FAILED ? NULL : mem;
666}
667
668
669static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};
670
671int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
672{
673
674 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn,
675 sizeof(diag_501), 0) ||
676 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)diag_501,
677 sizeof(diag_501), 1)) {
678 return -EINVAL;
679 }
680 return 0;
681}
682
683int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
684{
685 uint8_t t[sizeof(diag_501)];
686
687 if (cpu_memory_rw_debug(cs, bp->pc, t, sizeof(diag_501), 0)) {
688 return -EINVAL;
689 } else if (memcmp(t, diag_501, sizeof(diag_501))) {
690 return -EINVAL;
691 } else if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn,
692 sizeof(diag_501), 1)) {
693 return -EINVAL;
694 }
695
696 return 0;
697}
698
699static struct kvm_hw_breakpoint *find_hw_breakpoint(target_ulong addr,
700 int len, int type)
701{
702 int n;
703
704 for (n = 0; n < nb_hw_breakpoints; n++) {
705 if (hw_breakpoints[n].addr == addr && hw_breakpoints[n].type == type &&
706 (hw_breakpoints[n].len == len || len == -1)) {
707 return &hw_breakpoints[n];
708 }
709 }
710
711 return NULL;
712}
713
714static int insert_hw_breakpoint(target_ulong addr, int len, int type)
715{
716 int size;
717
718 if (find_hw_breakpoint(addr, len, type)) {
719 return -EEXIST;
720 }
721
722 size = (nb_hw_breakpoints + 1) * sizeof(struct kvm_hw_breakpoint);
723
724 if (!hw_breakpoints) {
725 nb_hw_breakpoints = 0;
726 hw_breakpoints = (struct kvm_hw_breakpoint *)g_try_malloc(size);
727 } else {
728 hw_breakpoints =
729 (struct kvm_hw_breakpoint *)g_try_realloc(hw_breakpoints, size);
730 }
731
732 if (!hw_breakpoints) {
733 nb_hw_breakpoints = 0;
734 return -ENOMEM;
735 }
736
737 hw_breakpoints[nb_hw_breakpoints].addr = addr;
738 hw_breakpoints[nb_hw_breakpoints].len = len;
739 hw_breakpoints[nb_hw_breakpoints].type = type;
740
741 nb_hw_breakpoints++;
742
743 return 0;
744}
745
746int kvm_arch_insert_hw_breakpoint(target_ulong addr,
747 target_ulong len, int type)
748{
749 switch (type) {
750 case GDB_BREAKPOINT_HW:
751 type = KVM_HW_BP;
752 break;
753 case GDB_WATCHPOINT_WRITE:
754 if (len < 1) {
755 return -EINVAL;
756 }
757 type = KVM_HW_WP_WRITE;
758 break;
759 default:
760 return -ENOSYS;
761 }
762 return insert_hw_breakpoint(addr, len, type);
763}
764
765int kvm_arch_remove_hw_breakpoint(target_ulong addr,
766 target_ulong len, int type)
767{
768 int size;
769 struct kvm_hw_breakpoint *bp = find_hw_breakpoint(addr, len, type);
770
771 if (bp == NULL) {
772 return -ENOENT;
773 }
774
775 nb_hw_breakpoints--;
776 if (nb_hw_breakpoints > 0) {
777
778
779
780
781 if (bp != &hw_breakpoints[nb_hw_breakpoints]) {
782 *bp = hw_breakpoints[nb_hw_breakpoints];
783 }
784 size = nb_hw_breakpoints * sizeof(struct kvm_hw_breakpoint);
785 hw_breakpoints =
786 (struct kvm_hw_breakpoint *)g_realloc(hw_breakpoints, size);
787 } else {
788 g_free(hw_breakpoints);
789 hw_breakpoints = NULL;
790 }
791
792 return 0;
793}
794
795void kvm_arch_remove_all_hw_breakpoints(void)
796{
797 nb_hw_breakpoints = 0;
798 g_free(hw_breakpoints);
799 hw_breakpoints = NULL;
800}
801
802void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
803{
804 int i;
805
806 if (nb_hw_breakpoints > 0) {
807 dbg->arch.nr_hw_bp = nb_hw_breakpoints;
808 dbg->arch.hw_bp = hw_breakpoints;
809
810 for (i = 0; i < nb_hw_breakpoints; ++i) {
811 hw_breakpoints[i].phys_addr = s390_cpu_get_phys_addr_debug(cpu,
812 hw_breakpoints[i].addr);
813 }
814 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP;
815 } else {
816 dbg->arch.nr_hw_bp = 0;
817 dbg->arch.hw_bp = NULL;
818 }
819}
820
821void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
822{
823}
824
825MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
826{
827 return MEMTXATTRS_UNSPECIFIED;
828}
829
830int kvm_arch_process_async_events(CPUState *cs)
831{
832 return cs->halted;
833}
834
835static int s390_kvm_irq_to_interrupt(struct kvm_s390_irq *irq,
836 struct kvm_s390_interrupt *interrupt)
837{
838 int r = 0;
839
840 interrupt->type = irq->type;
841 switch (irq->type) {
842 case KVM_S390_INT_VIRTIO:
843 interrupt->parm = irq->u.ext.ext_params;
844
845 case KVM_S390_INT_PFAULT_INIT:
846 case KVM_S390_INT_PFAULT_DONE:
847 interrupt->parm64 = irq->u.ext.ext_params2;
848 break;
849 case KVM_S390_PROGRAM_INT:
850 interrupt->parm = irq->u.pgm.code;
851 break;
852 case KVM_S390_SIGP_SET_PREFIX:
853 interrupt->parm = irq->u.prefix.address;
854 break;
855 case KVM_S390_INT_SERVICE:
856 interrupt->parm = irq->u.ext.ext_params;
857 break;
858 case KVM_S390_MCHK:
859 interrupt->parm = irq->u.mchk.cr14;
860 interrupt->parm64 = irq->u.mchk.mcic;
861 break;
862 case KVM_S390_INT_EXTERNAL_CALL:
863 interrupt->parm = irq->u.extcall.code;
864 break;
865 case KVM_S390_INT_EMERGENCY:
866 interrupt->parm = irq->u.emerg.code;
867 break;
868 case KVM_S390_SIGP_STOP:
869 case KVM_S390_RESTART:
870 break;
871 case KVM_S390_INT_IO_MIN...KVM_S390_INT_IO_MAX:
872 interrupt->parm = irq->u.io.subchannel_id << 16;
873 interrupt->parm |= irq->u.io.subchannel_nr;
874 interrupt->parm64 = (uint64_t)irq->u.io.io_int_parm << 32;
875 interrupt->parm64 |= irq->u.io.io_int_word;
876 break;
877 default:
878 r = -EINVAL;
879 break;
880 }
881 return r;
882}
883
884static void inject_vcpu_irq_legacy(CPUState *cs, struct kvm_s390_irq *irq)
885{
886 struct kvm_s390_interrupt kvmint = {};
887 int r;
888
889 r = s390_kvm_irq_to_interrupt(irq, &kvmint);
890 if (r < 0) {
891 fprintf(stderr, "%s called with bogus interrupt\n", __func__);
892 exit(1);
893 }
894
895 r = kvm_vcpu_ioctl(cs, KVM_S390_INTERRUPT, &kvmint);
896 if (r < 0) {
897 fprintf(stderr, "KVM failed to inject interrupt\n");
898 exit(1);
899 }
900}
901
902void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq)
903{
904 CPUState *cs = CPU(cpu);
905 int r;
906
907 if (cap_s390_irq) {
908 r = kvm_vcpu_ioctl(cs, KVM_S390_IRQ, irq);
909 if (!r) {
910 return;
911 }
912 error_report("KVM failed to inject interrupt %llx", irq->type);
913 exit(1);
914 }
915
916 inject_vcpu_irq_legacy(cs, irq);
917}
918
919static void __kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
920{
921 struct kvm_s390_interrupt kvmint = {};
922 int r;
923
924 r = s390_kvm_irq_to_interrupt(irq, &kvmint);
925 if (r < 0) {
926 fprintf(stderr, "%s called with bogus interrupt\n", __func__);
927 exit(1);
928 }
929
930 r = kvm_vm_ioctl(kvm_state, KVM_S390_INTERRUPT, &kvmint);
931 if (r < 0) {
932 fprintf(stderr, "KVM failed to inject interrupt\n");
933 exit(1);
934 }
935}
936
937void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq)
938{
939 static bool use_flic = true;
940 int r;
941
942 if (use_flic) {
943 r = kvm_s390_inject_flic(irq);
944 if (r == -ENOSYS) {
945 use_flic = false;
946 }
947 if (!r) {
948 return;
949 }
950 }
951 __kvm_s390_floating_interrupt(irq);
952}
953
954void kvm_s390_service_interrupt(uint32_t parm)
955{
956 struct kvm_s390_irq irq = {
957 .type = KVM_S390_INT_SERVICE,
958 .u.ext.ext_params = parm,
959 };
960
961 kvm_s390_floating_interrupt(&irq);
962}
963
964static void enter_pgmcheck(S390CPU *cpu, uint16_t code)
965{
966 struct kvm_s390_irq irq = {
967 .type = KVM_S390_PROGRAM_INT,
968 .u.pgm.code = code,
969 };
970
971 kvm_s390_vcpu_interrupt(cpu, &irq);
972}
973
974void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code)
975{
976 struct kvm_s390_irq irq = {
977 .type = KVM_S390_PROGRAM_INT,
978 .u.pgm.code = code,
979 .u.pgm.trans_exc_code = te_code,
980 .u.pgm.exc_access_id = te_code & 3,
981 };
982
983 kvm_s390_vcpu_interrupt(cpu, &irq);
984}
985
986static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run,
987 uint16_t ipbh0)
988{
989 CPUS390XState *env = &cpu->env;
990 uint64_t sccb;
991 uint32_t code;
992 int r = 0;
993
994 cpu_synchronize_state(CPU(cpu));
995 sccb = env->regs[ipbh0 & 0xf];
996 code = env->regs[(ipbh0 & 0xf0) >> 4];
997
998 r = sclp_service_call(env, sccb, code);
999 if (r < 0) {
1000 enter_pgmcheck(cpu, -r);
1001 } else {
1002 setcc(cpu, r);
1003 }
1004
1005 return 0;
1006}
1007
1008static int handle_b2(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
1009{
1010 CPUS390XState *env = &cpu->env;
1011 int rc = 0;
1012 uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16;
1013
1014 cpu_synchronize_state(CPU(cpu));
1015
1016 switch (ipa1) {
1017 case PRIV_B2_XSCH:
1018 ioinst_handle_xsch(cpu, env->regs[1]);
1019 break;
1020 case PRIV_B2_CSCH:
1021 ioinst_handle_csch(cpu, env->regs[1]);
1022 break;
1023 case PRIV_B2_HSCH:
1024 ioinst_handle_hsch(cpu, env->regs[1]);
1025 break;
1026 case PRIV_B2_MSCH:
1027 ioinst_handle_msch(cpu, env->regs[1], run->s390_sieic.ipb);
1028 break;
1029 case PRIV_B2_SSCH:
1030 ioinst_handle_ssch(cpu, env->regs[1], run->s390_sieic.ipb);
1031 break;
1032 case PRIV_B2_STCRW:
1033 ioinst_handle_stcrw(cpu, run->s390_sieic.ipb);
1034 break;
1035 case PRIV_B2_STSCH:
1036 ioinst_handle_stsch(cpu, env->regs[1], run->s390_sieic.ipb);
1037 break;
1038 case PRIV_B2_TSCH:
1039
1040 fprintf(stderr, "Spurious tsch intercept\n");
1041 break;
1042 case PRIV_B2_CHSC:
1043 ioinst_handle_chsc(cpu, run->s390_sieic.ipb);
1044 break;
1045 case PRIV_B2_TPI:
1046
1047 fprintf(stderr, "Spurious tpi intercept\n");
1048 break;
1049 case PRIV_B2_SCHM:
1050 ioinst_handle_schm(cpu, env->regs[1], env->regs[2],
1051 run->s390_sieic.ipb);
1052 break;
1053 case PRIV_B2_RSCH:
1054 ioinst_handle_rsch(cpu, env->regs[1]);
1055 break;
1056 case PRIV_B2_RCHP:
1057 ioinst_handle_rchp(cpu, env->regs[1]);
1058 break;
1059 case PRIV_B2_STCPS:
1060
1061 break;
1062 case PRIV_B2_SAL:
1063 ioinst_handle_sal(cpu, env->regs[1]);
1064 break;
1065 case PRIV_B2_SIGA:
1066
1067 setcc(cpu, 3);
1068 break;
1069 case PRIV_B2_SCLP_CALL:
1070 rc = kvm_sclp_service_call(cpu, run, ipbh0);
1071 break;
1072 default:
1073 rc = -1;
1074 DPRINTF("KVM: unhandled PRIV: 0xb2%x\n", ipa1);
1075 break;
1076 }
1077
1078 return rc;
1079}
1080
1081static uint64_t get_base_disp_rxy(S390CPU *cpu, struct kvm_run *run,
1082 uint8_t *ar)
1083{
1084 CPUS390XState *env = &cpu->env;
1085 uint32_t x2 = (run->s390_sieic.ipa & 0x000f);
1086 uint32_t base2 = run->s390_sieic.ipb >> 28;
1087 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) +
1088 ((run->s390_sieic.ipb & 0xff00) << 4);
1089
1090 if (disp2 & 0x80000) {
1091 disp2 += 0xfff00000;
1092 }
1093 if (ar) {
1094 *ar = base2;
1095 }
1096
1097 return (base2 ? env->regs[base2] : 0) +
1098 (x2 ? env->regs[x2] : 0) + (long)(int)disp2;
1099}
1100
1101static uint64_t get_base_disp_rsy(S390CPU *cpu, struct kvm_run *run,
1102 uint8_t *ar)
1103{
1104 CPUS390XState *env = &cpu->env;
1105 uint32_t base2 = run->s390_sieic.ipb >> 28;
1106 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) +
1107 ((run->s390_sieic.ipb & 0xff00) << 4);
1108
1109 if (disp2 & 0x80000) {
1110 disp2 += 0xfff00000;
1111 }
1112 if (ar) {
1113 *ar = base2;
1114 }
1115
1116 return (base2 ? env->regs[base2] : 0) + (long)(int)disp2;
1117}
1118
1119static int kvm_clp_service_call(S390CPU *cpu, struct kvm_run *run)
1120{
1121 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1122
1123 return clp_service_call(cpu, r2);
1124}
1125
1126static int kvm_pcilg_service_call(S390CPU *cpu, struct kvm_run *run)
1127{
1128 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1129 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1130
1131 return pcilg_service_call(cpu, r1, r2);
1132}
1133
1134static int kvm_pcistg_service_call(S390CPU *cpu, struct kvm_run *run)
1135{
1136 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1137 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1138
1139 return pcistg_service_call(cpu, r1, r2);
1140}
1141
1142static int kvm_stpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
1143{
1144 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1145 uint64_t fiba;
1146 uint8_t ar;
1147
1148 cpu_synchronize_state(CPU(cpu));
1149 fiba = get_base_disp_rxy(cpu, run, &ar);
1150
1151 return stpcifc_service_call(cpu, r1, fiba, ar);
1152}
1153
1154static int kvm_sic_service_call(S390CPU *cpu, struct kvm_run *run)
1155{
1156
1157 return 0;
1158}
1159
1160static int kvm_rpcit_service_call(S390CPU *cpu, struct kvm_run *run)
1161{
1162 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20;
1163 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16;
1164
1165 return rpcit_service_call(cpu, r1, r2);
1166}
1167
1168static int kvm_pcistb_service_call(S390CPU *cpu, struct kvm_run *run)
1169{
1170 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1171 uint8_t r3 = run->s390_sieic.ipa & 0x000f;
1172 uint64_t gaddr;
1173 uint8_t ar;
1174
1175 cpu_synchronize_state(CPU(cpu));
1176 gaddr = get_base_disp_rsy(cpu, run, &ar);
1177
1178 return pcistb_service_call(cpu, r1, r3, gaddr, ar);
1179}
1180
1181static int kvm_mpcifc_service_call(S390CPU *cpu, struct kvm_run *run)
1182{
1183 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1184 uint64_t fiba;
1185 uint8_t ar;
1186
1187 cpu_synchronize_state(CPU(cpu));
1188 fiba = get_base_disp_rxy(cpu, run, &ar);
1189
1190 return mpcifc_service_call(cpu, r1, fiba, ar);
1191}
1192
1193static int handle_b9(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
1194{
1195 int r = 0;
1196
1197 switch (ipa1) {
1198 case PRIV_B9_CLP:
1199 r = kvm_clp_service_call(cpu, run);
1200 break;
1201 case PRIV_B9_PCISTG:
1202 r = kvm_pcistg_service_call(cpu, run);
1203 break;
1204 case PRIV_B9_PCILG:
1205 r = kvm_pcilg_service_call(cpu, run);
1206 break;
1207 case PRIV_B9_RPCIT:
1208 r = kvm_rpcit_service_call(cpu, run);
1209 break;
1210 case PRIV_B9_EQBS:
1211
1212 r = -1;
1213 break;
1214 default:
1215 r = -1;
1216 DPRINTF("KVM: unhandled PRIV: 0xb9%x\n", ipa1);
1217 break;
1218 }
1219
1220 return r;
1221}
1222
1223static int handle_eb(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl)
1224{
1225 int r = 0;
1226
1227 switch (ipbl) {
1228 case PRIV_EB_PCISTB:
1229 r = kvm_pcistb_service_call(cpu, run);
1230 break;
1231 case PRIV_EB_SIC:
1232 r = kvm_sic_service_call(cpu, run);
1233 break;
1234 case PRIV_EB_SQBS:
1235
1236 r = -1;
1237 break;
1238 default:
1239 r = -1;
1240 DPRINTF("KVM: unhandled PRIV: 0xeb%x\n", ipbl);
1241 break;
1242 }
1243
1244 return r;
1245}
1246
1247static int handle_e3(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl)
1248{
1249 int r = 0;
1250
1251 switch (ipbl) {
1252 case PRIV_E3_MPCIFC:
1253 r = kvm_mpcifc_service_call(cpu, run);
1254 break;
1255 case PRIV_E3_STPCIFC:
1256 r = kvm_stpcifc_service_call(cpu, run);
1257 break;
1258 default:
1259 r = -1;
1260 DPRINTF("KVM: unhandled PRIV: 0xe3%x\n", ipbl);
1261 break;
1262 }
1263
1264 return r;
1265}
1266
1267static int handle_hypercall(S390CPU *cpu, struct kvm_run *run)
1268{
1269 CPUS390XState *env = &cpu->env;
1270 int ret;
1271
1272 cpu_synchronize_state(CPU(cpu));
1273 ret = s390_virtio_hypercall(env);
1274 if (ret == -EINVAL) {
1275 enter_pgmcheck(cpu, PGM_SPECIFICATION);
1276 return 0;
1277 }
1278
1279 return ret;
1280}
1281
1282static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run)
1283{
1284 uint64_t r1, r3;
1285 int rc;
1286
1287 cpu_synchronize_state(CPU(cpu));
1288 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1289 r3 = run->s390_sieic.ipa & 0x000f;
1290 rc = handle_diag_288(&cpu->env, r1, r3);
1291 if (rc) {
1292 enter_pgmcheck(cpu, PGM_SPECIFICATION);
1293 }
1294}
1295
1296static void kvm_handle_diag_308(S390CPU *cpu, struct kvm_run *run)
1297{
1298 uint64_t r1, r3;
1299
1300 cpu_synchronize_state(CPU(cpu));
1301 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4;
1302 r3 = run->s390_sieic.ipa & 0x000f;
1303 handle_diag_308(&cpu->env, r1, r3);
1304}
1305
1306static int handle_sw_breakpoint(S390CPU *cpu, struct kvm_run *run)
1307{
1308 CPUS390XState *env = &cpu->env;
1309 unsigned long pc;
1310
1311 cpu_synchronize_state(CPU(cpu));
1312
1313 pc = env->psw.addr - 4;
1314 if (kvm_find_sw_breakpoint(CPU(cpu), pc)) {
1315 env->psw.addr = pc;
1316 return EXCP_DEBUG;
1317 }
1318
1319 return -ENOENT;
1320}
1321
1322#define DIAG_KVM_CODE_MASK 0x000000000000ffff
1323
1324static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb)
1325{
1326 int r = 0;
1327 uint16_t func_code;
1328
1329
1330
1331
1332
1333 func_code = decode_basedisp_rs(&cpu->env, ipb, NULL) & DIAG_KVM_CODE_MASK;
1334 switch (func_code) {
1335 case DIAG_TIMEREVENT:
1336 kvm_handle_diag_288(cpu, run);
1337 break;
1338 case DIAG_IPL:
1339 kvm_handle_diag_308(cpu, run);
1340 break;
1341 case DIAG_KVM_HYPERCALL:
1342 r = handle_hypercall(cpu, run);
1343 break;
1344 case DIAG_KVM_BREAKPOINT:
1345 r = handle_sw_breakpoint(cpu, run);
1346 break;
1347 default:
1348 DPRINTF("KVM: unknown DIAG: 0x%x\n", func_code);
1349 enter_pgmcheck(cpu, PGM_SPECIFICATION);
1350 break;
1351 }
1352
1353 return r;
1354}
1355
1356typedef struct SigpInfo {
1357 S390CPU *cpu;
1358 uint64_t param;
1359 int cc;
1360 uint64_t *status_reg;
1361} SigpInfo;
1362
1363static void set_sigp_status(SigpInfo *si, uint64_t status)
1364{
1365 *si->status_reg &= 0xffffffff00000000ULL;
1366 *si->status_reg |= status;
1367 si->cc = SIGP_CC_STATUS_STORED;
1368}
1369
1370static void sigp_start(void *arg)
1371{
1372 SigpInfo *si = arg;
1373
1374 if (s390_cpu_get_state(si->cpu) != CPU_STATE_STOPPED) {
1375 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1376 return;
1377 }
1378
1379 s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu);
1380 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1381}
1382
1383static void sigp_stop(void *arg)
1384{
1385 SigpInfo *si = arg;
1386 struct kvm_s390_irq irq = {
1387 .type = KVM_S390_SIGP_STOP,
1388 };
1389
1390 if (s390_cpu_get_state(si->cpu) != CPU_STATE_OPERATING) {
1391 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1392 return;
1393 }
1394
1395
1396 if (CPU(si->cpu)->halted) {
1397 s390_cpu_set_state(CPU_STATE_STOPPED, si->cpu);
1398 } else {
1399
1400 si->cpu->env.sigp_order = SIGP_STOP;
1401 kvm_s390_vcpu_interrupt(si->cpu, &irq);
1402 }
1403 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1404}
1405
1406#define ADTL_SAVE_AREA_SIZE 1024
1407static int kvm_s390_store_adtl_status(S390CPU *cpu, hwaddr addr)
1408{
1409 void *mem;
1410 hwaddr len = ADTL_SAVE_AREA_SIZE;
1411
1412 mem = cpu_physical_memory_map(addr, &len, 1);
1413 if (!mem) {
1414 return -EFAULT;
1415 }
1416 if (len != ADTL_SAVE_AREA_SIZE) {
1417 cpu_physical_memory_unmap(mem, len, 1, 0);
1418 return -EFAULT;
1419 }
1420
1421 memcpy(mem, &cpu->env.vregs, 512);
1422
1423 cpu_physical_memory_unmap(mem, len, 1, len);
1424
1425 return 0;
1426}
1427
1428#define KVM_S390_STORE_STATUS_DEF_ADDR offsetof(LowCore, floating_pt_save_area)
1429#define SAVE_AREA_SIZE 512
1430static int kvm_s390_store_status(S390CPU *cpu, hwaddr addr, bool store_arch)
1431{
1432 static const uint8_t ar_id = 1;
1433 uint64_t ckc = cpu->env.ckc >> 8;
1434 void *mem;
1435 int i;
1436 hwaddr len = SAVE_AREA_SIZE;
1437
1438 mem = cpu_physical_memory_map(addr, &len, 1);
1439 if (!mem) {
1440 return -EFAULT;
1441 }
1442 if (len != SAVE_AREA_SIZE) {
1443 cpu_physical_memory_unmap(mem, len, 1, 0);
1444 return -EFAULT;
1445 }
1446
1447 if (store_arch) {
1448 cpu_physical_memory_write(offsetof(LowCore, ar_access_id), &ar_id, 1);
1449 }
1450 for (i = 0; i < 16; ++i) {
1451 *((uint64_t *)mem + i) = get_freg(&cpu->env, i)->ll;
1452 }
1453 memcpy(mem + 128, &cpu->env.regs, 128);
1454 memcpy(mem + 256, &cpu->env.psw, 16);
1455 memcpy(mem + 280, &cpu->env.psa, 4);
1456 memcpy(mem + 284, &cpu->env.fpc, 4);
1457 memcpy(mem + 292, &cpu->env.todpr, 4);
1458 memcpy(mem + 296, &cpu->env.cputm, 8);
1459 memcpy(mem + 304, &ckc, 8);
1460 memcpy(mem + 320, &cpu->env.aregs, 64);
1461 memcpy(mem + 384, &cpu->env.cregs, 128);
1462
1463 cpu_physical_memory_unmap(mem, len, 1, len);
1464
1465 return 0;
1466}
1467
1468static void sigp_stop_and_store_status(void *arg)
1469{
1470 SigpInfo *si = arg;
1471 struct kvm_s390_irq irq = {
1472 .type = KVM_S390_SIGP_STOP,
1473 };
1474
1475
1476 if (s390_cpu_get_state(si->cpu) == CPU_STATE_OPERATING &&
1477 CPU(si->cpu)->halted) {
1478 s390_cpu_set_state(CPU_STATE_STOPPED, si->cpu);
1479 }
1480
1481 switch (s390_cpu_get_state(si->cpu)) {
1482 case CPU_STATE_OPERATING:
1483 si->cpu->env.sigp_order = SIGP_STOP_STORE_STATUS;
1484 kvm_s390_vcpu_interrupt(si->cpu, &irq);
1485
1486 break;
1487 case CPU_STATE_STOPPED:
1488
1489 cpu_synchronize_state(CPU(si->cpu));
1490 kvm_s390_store_status(si->cpu, KVM_S390_STORE_STATUS_DEF_ADDR, true);
1491 break;
1492 }
1493 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1494}
1495
1496static void sigp_store_status_at_address(void *arg)
1497{
1498 SigpInfo *si = arg;
1499 uint32_t address = si->param & 0x7ffffe00u;
1500
1501
1502 if (s390_cpu_get_state(si->cpu) != CPU_STATE_STOPPED) {
1503 set_sigp_status(si, SIGP_STAT_INCORRECT_STATE);
1504 return;
1505 }
1506
1507 cpu_synchronize_state(CPU(si->cpu));
1508
1509 if (kvm_s390_store_status(si->cpu, address, false)) {
1510 set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
1511 return;
1512 }
1513 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1514}
1515
1516static void sigp_store_adtl_status(void *arg)
1517{
1518 SigpInfo *si = arg;
1519
1520 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
1521 set_sigp_status(si, SIGP_STAT_INVALID_ORDER);
1522 return;
1523 }
1524
1525
1526 if (s390_cpu_get_state(si->cpu) != CPU_STATE_STOPPED) {
1527 set_sigp_status(si, SIGP_STAT_INCORRECT_STATE);
1528 return;
1529 }
1530
1531
1532 if (si->param & 0x3ff) {
1533 set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
1534 return;
1535 }
1536
1537 cpu_synchronize_state(CPU(si->cpu));
1538
1539 if (kvm_s390_store_adtl_status(si->cpu, si->param)) {
1540 set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
1541 return;
1542 }
1543 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1544}
1545
1546static void sigp_restart(void *arg)
1547{
1548 SigpInfo *si = arg;
1549 struct kvm_s390_irq irq = {
1550 .type = KVM_S390_RESTART,
1551 };
1552
1553 switch (s390_cpu_get_state(si->cpu)) {
1554 case CPU_STATE_STOPPED:
1555
1556 cpu_synchronize_state(CPU(si->cpu));
1557 do_restart_interrupt(&si->cpu->env);
1558 s390_cpu_set_state(CPU_STATE_OPERATING, si->cpu);
1559 break;
1560 case CPU_STATE_OPERATING:
1561 kvm_s390_vcpu_interrupt(si->cpu, &irq);
1562 break;
1563 }
1564 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1565}
1566
1567int kvm_s390_cpu_restart(S390CPU *cpu)
1568{
1569 SigpInfo si = {
1570 .cpu = cpu,
1571 };
1572
1573 run_on_cpu(CPU(cpu), sigp_restart, &si);
1574 DPRINTF("DONE: KVM cpu restart: %p\n", &cpu->env);
1575 return 0;
1576}
1577
1578static void sigp_initial_cpu_reset(void *arg)
1579{
1580 SigpInfo *si = arg;
1581 CPUState *cs = CPU(si->cpu);
1582 S390CPUClass *scc = S390_CPU_GET_CLASS(si->cpu);
1583
1584 cpu_synchronize_state(cs);
1585 scc->initial_cpu_reset(cs);
1586 cpu_synchronize_post_reset(cs);
1587 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1588}
1589
1590static void sigp_cpu_reset(void *arg)
1591{
1592 SigpInfo *si = arg;
1593 CPUState *cs = CPU(si->cpu);
1594 S390CPUClass *scc = S390_CPU_GET_CLASS(si->cpu);
1595
1596 cpu_synchronize_state(cs);
1597 scc->cpu_reset(cs);
1598 cpu_synchronize_post_reset(cs);
1599 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1600}
1601
1602static void sigp_set_prefix(void *arg)
1603{
1604 SigpInfo *si = arg;
1605 uint32_t addr = si->param & 0x7fffe000u;
1606
1607 cpu_synchronize_state(CPU(si->cpu));
1608
1609 if (!address_space_access_valid(&address_space_memory, addr,
1610 sizeof(struct LowCore), false)) {
1611 set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
1612 return;
1613 }
1614
1615
1616 if (s390_cpu_get_state(si->cpu) != CPU_STATE_STOPPED) {
1617 set_sigp_status(si, SIGP_STAT_INCORRECT_STATE);
1618 return;
1619 }
1620
1621 si->cpu->env.psa = addr;
1622 cpu_synchronize_post_init(CPU(si->cpu));
1623 si->cc = SIGP_CC_ORDER_CODE_ACCEPTED;
1624}
1625
1626static int handle_sigp_single_dst(S390CPU *dst_cpu, uint8_t order,
1627 uint64_t param, uint64_t *status_reg)
1628{
1629 SigpInfo si = {
1630 .cpu = dst_cpu,
1631 .param = param,
1632 .status_reg = status_reg,
1633 };
1634
1635
1636 if (dst_cpu == NULL) {
1637 return SIGP_CC_NOT_OPERATIONAL;
1638 }
1639
1640
1641 if (dst_cpu->env.sigp_order != 0 &&
1642 order != SIGP_CPU_RESET &&
1643 order != SIGP_INITIAL_CPU_RESET) {
1644 return SIGP_CC_BUSY;
1645 }
1646
1647 switch (order) {
1648 case SIGP_START:
1649 run_on_cpu(CPU(dst_cpu), sigp_start, &si);
1650 break;
1651 case SIGP_STOP:
1652 run_on_cpu(CPU(dst_cpu), sigp_stop, &si);
1653 break;
1654 case SIGP_RESTART:
1655 run_on_cpu(CPU(dst_cpu), sigp_restart, &si);
1656 break;
1657 case SIGP_STOP_STORE_STATUS:
1658 run_on_cpu(CPU(dst_cpu), sigp_stop_and_store_status, &si);
1659 break;
1660 case SIGP_STORE_STATUS_ADDR:
1661 run_on_cpu(CPU(dst_cpu), sigp_store_status_at_address, &si);
1662 break;
1663 case SIGP_STORE_ADTL_STATUS:
1664 run_on_cpu(CPU(dst_cpu), sigp_store_adtl_status, &si);
1665 break;
1666 case SIGP_SET_PREFIX:
1667 run_on_cpu(CPU(dst_cpu), sigp_set_prefix, &si);
1668 break;
1669 case SIGP_INITIAL_CPU_RESET:
1670 run_on_cpu(CPU(dst_cpu), sigp_initial_cpu_reset, &si);
1671 break;
1672 case SIGP_CPU_RESET:
1673 run_on_cpu(CPU(dst_cpu), sigp_cpu_reset, &si);
1674 break;
1675 default:
1676 DPRINTF("KVM: unknown SIGP: 0x%x\n", order);
1677 set_sigp_status(&si, SIGP_STAT_INVALID_ORDER);
1678 }
1679
1680 return si.cc;
1681}
1682
1683static int sigp_set_architecture(S390CPU *cpu, uint32_t param,
1684 uint64_t *status_reg)
1685{
1686 CPUState *cur_cs;
1687 S390CPU *cur_cpu;
1688
1689
1690 CPU_FOREACH(cur_cs) {
1691 cur_cpu = S390_CPU(cur_cs);
1692 if (cur_cpu->env.sigp_order != 0) {
1693 return SIGP_CC_BUSY;
1694 }
1695 cpu_synchronize_state(cur_cs);
1696
1697 if (cur_cpu != cpu &&
1698 s390_cpu_get_state(cur_cpu) != CPU_STATE_STOPPED) {
1699 *status_reg &= 0xffffffff00000000ULL;
1700 *status_reg |= SIGP_STAT_INCORRECT_STATE;
1701 return SIGP_CC_STATUS_STORED;
1702 }
1703 }
1704
1705 switch (param & 0xff) {
1706 case SIGP_MODE_ESA_S390:
1707
1708 return SIGP_CC_NOT_OPERATIONAL;
1709 case SIGP_MODE_Z_ARCH_TRANS_ALL_PSW:
1710 case SIGP_MODE_Z_ARCH_TRANS_CUR_PSW:
1711 CPU_FOREACH(cur_cs) {
1712 cur_cpu = S390_CPU(cur_cs);
1713 cur_cpu->env.pfault_token = -1UL;
1714 }
1715 break;
1716 default:
1717 *status_reg &= 0xffffffff00000000ULL;
1718 *status_reg |= SIGP_STAT_INVALID_PARAMETER;
1719 return SIGP_CC_STATUS_STORED;
1720 }
1721
1722 return SIGP_CC_ORDER_CODE_ACCEPTED;
1723}
1724
1725#define SIGP_ORDER_MASK 0x000000ff
1726
1727static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
1728{
1729 CPUS390XState *env = &cpu->env;
1730 const uint8_t r1 = ipa1 >> 4;
1731 const uint8_t r3 = ipa1 & 0x0f;
1732 int ret;
1733 uint8_t order;
1734 uint64_t *status_reg;
1735 uint64_t param;
1736 S390CPU *dst_cpu = NULL;
1737
1738 cpu_synchronize_state(CPU(cpu));
1739
1740
1741 order = decode_basedisp_rs(env, run->s390_sieic.ipb, NULL)
1742 & SIGP_ORDER_MASK;
1743 status_reg = &env->regs[r1];
1744 param = (r1 % 2) ? env->regs[r1] : env->regs[r1 + 1];
1745
1746 switch (order) {
1747 case SIGP_SET_ARCH:
1748 ret = sigp_set_architecture(cpu, param, status_reg);
1749 break;
1750 default:
1751
1752 dst_cpu = s390_cpu_addr2state(env->regs[r3]);
1753 ret = handle_sigp_single_dst(dst_cpu, order, param, status_reg);
1754 }
1755
1756 trace_kvm_sigp_finished(order, CPU(cpu)->cpu_index,
1757 dst_cpu ? CPU(dst_cpu)->cpu_index : -1, ret);
1758
1759 if (ret >= 0) {
1760 setcc(cpu, ret);
1761 return 0;
1762 }
1763
1764 return ret;
1765}
1766
1767static int handle_instruction(S390CPU *cpu, struct kvm_run *run)
1768{
1769 unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00);
1770 uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff;
1771 int r = -1;
1772
1773 DPRINTF("handle_instruction 0x%x 0x%x\n",
1774 run->s390_sieic.ipa, run->s390_sieic.ipb);
1775 switch (ipa0) {
1776 case IPA0_B2:
1777 r = handle_b2(cpu, run, ipa1);
1778 break;
1779 case IPA0_B9:
1780 r = handle_b9(cpu, run, ipa1);
1781 break;
1782 case IPA0_EB:
1783 r = handle_eb(cpu, run, run->s390_sieic.ipb & 0xff);
1784 break;
1785 case IPA0_E3:
1786 r = handle_e3(cpu, run, run->s390_sieic.ipb & 0xff);
1787 break;
1788 case IPA0_DIAG:
1789 r = handle_diag(cpu, run, run->s390_sieic.ipb);
1790 break;
1791 case IPA0_SIGP:
1792 r = handle_sigp(cpu, run, ipa1);
1793 break;
1794 }
1795
1796 if (r < 0) {
1797 r = 0;
1798 enter_pgmcheck(cpu, 0x0001);
1799 }
1800
1801 return r;
1802}
1803
1804static bool is_special_wait_psw(CPUState *cs)
1805{
1806
1807 return cs->kvm_run->psw_addr == 0xfffUL;
1808}
1809
1810static void unmanageable_intercept(S390CPU *cpu, const char *str, int pswoffset)
1811{
1812 CPUState *cs = CPU(cpu);
1813
1814 error_report("Unmanageable %s! CPU%i new PSW: 0x%016lx:%016lx",
1815 str, cs->cpu_index, ldq_phys(cs->as, cpu->env.psa + pswoffset),
1816 ldq_phys(cs->as, cpu->env.psa + pswoffset + 8));
1817 s390_cpu_halt(cpu);
1818 qemu_system_guest_panicked();
1819}
1820
1821static int handle_intercept(S390CPU *cpu)
1822{
1823 CPUState *cs = CPU(cpu);
1824 struct kvm_run *run = cs->kvm_run;
1825 int icpt_code = run->s390_sieic.icptcode;
1826 int r = 0;
1827
1828 DPRINTF("intercept: 0x%x (at 0x%lx)\n", icpt_code,
1829 (long)cs->kvm_run->psw_addr);
1830 switch (icpt_code) {
1831 case ICPT_INSTRUCTION:
1832 r = handle_instruction(cpu, run);
1833 break;
1834 case ICPT_PROGRAM:
1835 unmanageable_intercept(cpu, "program interrupt",
1836 offsetof(LowCore, program_new_psw));
1837 r = EXCP_HALTED;
1838 break;
1839 case ICPT_EXT_INT:
1840 unmanageable_intercept(cpu, "external interrupt",
1841 offsetof(LowCore, external_new_psw));
1842 r = EXCP_HALTED;
1843 break;
1844 case ICPT_WAITPSW:
1845
1846 cpu_synchronize_state(cs);
1847 if (s390_cpu_halt(cpu) == 0) {
1848 if (is_special_wait_psw(cs)) {
1849 qemu_system_shutdown_request();
1850 } else {
1851 qemu_system_guest_panicked();
1852 }
1853 }
1854 r = EXCP_HALTED;
1855 break;
1856 case ICPT_CPU_STOP:
1857 if (s390_cpu_set_state(CPU_STATE_STOPPED, cpu) == 0) {
1858 qemu_system_shutdown_request();
1859 }
1860 if (cpu->env.sigp_order == SIGP_STOP_STORE_STATUS) {
1861 kvm_s390_store_status(cpu, KVM_S390_STORE_STATUS_DEF_ADDR,
1862 true);
1863 }
1864 cpu->env.sigp_order = 0;
1865 r = EXCP_HALTED;
1866 break;
1867 case ICPT_SOFT_INTERCEPT:
1868 fprintf(stderr, "KVM unimplemented icpt SOFT\n");
1869 exit(1);
1870 break;
1871 case ICPT_IO:
1872 fprintf(stderr, "KVM unimplemented icpt IO\n");
1873 exit(1);
1874 break;
1875 default:
1876 fprintf(stderr, "Unknown intercept code: %d\n", icpt_code);
1877 exit(1);
1878 break;
1879 }
1880
1881 return r;
1882}
1883
1884static int handle_tsch(S390CPU *cpu)
1885{
1886 CPUState *cs = CPU(cpu);
1887 struct kvm_run *run = cs->kvm_run;
1888 int ret;
1889
1890 cpu_synchronize_state(cs);
1891
1892 ret = ioinst_handle_tsch(cpu, cpu->env.regs[1], run->s390_tsch.ipb);
1893 if (ret < 0) {
1894
1895
1896
1897
1898 if (run->s390_tsch.dequeued) {
1899 kvm_s390_io_interrupt(run->s390_tsch.subchannel_id,
1900 run->s390_tsch.subchannel_nr,
1901 run->s390_tsch.io_int_parm,
1902 run->s390_tsch.io_int_word);
1903 }
1904 ret = 0;
1905 }
1906 return ret;
1907}
1908
1909static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
1910{
1911 struct sysib_322 sysib;
1912 int del;
1913
1914 if (s390_cpu_virt_mem_read(cpu, addr, ar, &sysib, sizeof(sysib))) {
1915 return;
1916 }
1917
1918 memmove(&sysib.ext_names[1], &sysib.ext_names[0],
1919 sizeof(sysib.ext_names[0]) * (sysib.count - 1));
1920
1921
1922
1923 for (del = 1; del < sysib.count; del++) {
1924 if (!sysib.vm[del].ext_name_encoding || !sysib.ext_names[del][0]) {
1925 break;
1926 }
1927 }
1928 if (del < sysib.count) {
1929 memset(sysib.ext_names[del], 0,
1930 sizeof(sysib.ext_names[0]) * (sysib.count - del));
1931 }
1932
1933 if (qemu_name) {
1934 memset(sysib.vm[0].name, 0x40, sizeof(sysib.vm[0].name));
1935 ebcdic_put(sysib.vm[0].name, qemu_name, MIN(sizeof(sysib.vm[0].name),
1936 strlen(qemu_name)));
1937 }
1938 sysib.vm[0].ext_name_encoding = 2;
1939 memset(sysib.ext_names[0], 0, sizeof(sysib.ext_names[0]));
1940
1941
1942
1943
1944
1945 if (qemu_name) {
1946 strncpy((char *)sysib.ext_names[0], qemu_name,
1947 sizeof(sysib.ext_names[0]));
1948 } else {
1949 strcpy((char *)sysib.ext_names[0], "KVMguest");
1950 }
1951
1952 memcpy(sysib.vm[0].uuid, qemu_uuid, sizeof(sysib.vm[0].uuid));
1953
1954 s390_cpu_virt_mem_write(cpu, addr, ar, &sysib, sizeof(sysib));
1955}
1956
1957static int handle_stsi(S390CPU *cpu)
1958{
1959 CPUState *cs = CPU(cpu);
1960 struct kvm_run *run = cs->kvm_run;
1961
1962 switch (run->s390_stsi.fc) {
1963 case 3:
1964 if (run->s390_stsi.sel1 != 2 || run->s390_stsi.sel2 != 2) {
1965 return 0;
1966 }
1967
1968 insert_stsi_3_2_2(cpu, run->s390_stsi.addr, run->s390_stsi.ar);
1969 return 0;
1970 default:
1971 return 0;
1972 }
1973}
1974
1975static int kvm_arch_handle_debug_exit(S390CPU *cpu)
1976{
1977 CPUState *cs = CPU(cpu);
1978 struct kvm_run *run = cs->kvm_run;
1979
1980 int ret = 0;
1981 struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
1982
1983 switch (arch_info->type) {
1984 case KVM_HW_WP_WRITE:
1985 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) {
1986 cs->watchpoint_hit = &hw_watchpoint;
1987 hw_watchpoint.vaddr = arch_info->addr;
1988 hw_watchpoint.flags = BP_MEM_WRITE;
1989 ret = EXCP_DEBUG;
1990 }
1991 break;
1992 case KVM_HW_BP:
1993 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) {
1994 ret = EXCP_DEBUG;
1995 }
1996 break;
1997 case KVM_SINGLESTEP:
1998 if (cs->singlestep_enabled) {
1999 ret = EXCP_DEBUG;
2000 }
2001 break;
2002 default:
2003 ret = -ENOSYS;
2004 }
2005
2006 return ret;
2007}
2008
2009int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
2010{
2011 S390CPU *cpu = S390_CPU(cs);
2012 int ret = 0;
2013
2014 qemu_mutex_lock_iothread();
2015
2016 switch (run->exit_reason) {
2017 case KVM_EXIT_S390_SIEIC:
2018 ret = handle_intercept(cpu);
2019 break;
2020 case KVM_EXIT_S390_RESET:
2021 s390_reipl_request();
2022 break;
2023 case KVM_EXIT_S390_TSCH:
2024 ret = handle_tsch(cpu);
2025 break;
2026 case KVM_EXIT_S390_STSI:
2027 ret = handle_stsi(cpu);
2028 break;
2029 case KVM_EXIT_DEBUG:
2030 ret = kvm_arch_handle_debug_exit(cpu);
2031 break;
2032 default:
2033 fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason);
2034 break;
2035 }
2036 qemu_mutex_unlock_iothread();
2037
2038 if (ret == 0) {
2039 ret = EXCP_INTERRUPT;
2040 }
2041 return ret;
2042}
2043
2044bool kvm_arch_stop_on_emulation_error(CPUState *cpu)
2045{
2046 return true;
2047}
2048
2049int kvm_arch_on_sigbus_vcpu(CPUState *cpu, int code, void *addr)
2050{
2051 return 1;
2052}
2053
2054int kvm_arch_on_sigbus(int code, void *addr)
2055{
2056 return 1;
2057}
2058
2059void kvm_s390_io_interrupt(uint16_t subchannel_id,
2060 uint16_t subchannel_nr, uint32_t io_int_parm,
2061 uint32_t io_int_word)
2062{
2063 struct kvm_s390_irq irq = {
2064 .u.io.subchannel_id = subchannel_id,
2065 .u.io.subchannel_nr = subchannel_nr,
2066 .u.io.io_int_parm = io_int_parm,
2067 .u.io.io_int_word = io_int_word,
2068 };
2069
2070 if (io_int_word & IO_INT_WORD_AI) {
2071 irq.type = KVM_S390_INT_IO(1, 0, 0, 0);
2072 } else {
2073 irq.type = KVM_S390_INT_IO(0, (subchannel_id & 0xff00) >> 8,
2074 (subchannel_id & 0x0006),
2075 subchannel_nr);
2076 }
2077 kvm_s390_floating_interrupt(&irq);
2078}
2079
2080static uint64_t build_channel_report_mcic(void)
2081{
2082 uint64_t mcic;
2083
2084
2085 mcic = MCIC_SC_CP |
2086
2087
2088
2089 MCIC_VB_WP | MCIC_VB_MS | MCIC_VB_PM | MCIC_VB_IA | MCIC_VB_FP |
2090 MCIC_VB_GR | MCIC_VB_CR | MCIC_VB_ST | MCIC_VB_AR | MCIC_VB_PR |
2091 MCIC_VB_FC | MCIC_VB_CT | MCIC_VB_CC;
2092 if (kvm_check_extension(kvm_state, KVM_CAP_S390_VECTOR_REGISTERS)) {
2093 mcic |= MCIC_VB_VR;
2094 }
2095 return mcic;
2096}
2097
2098void kvm_s390_crw_mchk(void)
2099{
2100 struct kvm_s390_irq irq = {
2101 .type = KVM_S390_MCHK,
2102 .u.mchk.cr14 = 1 << 28,
2103 .u.mchk.mcic = build_channel_report_mcic(),
2104 };
2105 kvm_s390_floating_interrupt(&irq);
2106}
2107
2108void kvm_s390_enable_css_support(S390CPU *cpu)
2109{
2110 int r;
2111
2112
2113 r = kvm_vcpu_enable_cap(CPU(cpu), KVM_CAP_S390_CSS_SUPPORT, 0);
2114 assert(r == 0);
2115}
2116
2117void kvm_arch_init_irq_routing(KVMState *s)
2118{
2119
2120
2121
2122
2123
2124 if (kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
2125 kvm_gsi_routing_allowed = true;
2126 kvm_halt_in_kernel_allowed = false;
2127 }
2128}
2129
2130int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
2131 int vq, bool assign)
2132{
2133 struct kvm_ioeventfd kick = {
2134 .flags = KVM_IOEVENTFD_FLAG_VIRTIO_CCW_NOTIFY |
2135 KVM_IOEVENTFD_FLAG_DATAMATCH,
2136 .fd = event_notifier_get_fd(notifier),
2137 .datamatch = vq,
2138 .addr = sch,
2139 .len = 8,
2140 };
2141 if (!kvm_check_extension(kvm_state, KVM_CAP_IOEVENTFD)) {
2142 return -ENOSYS;
2143 }
2144 if (!assign) {
2145 kick.flags |= KVM_IOEVENTFD_FLAG_DEASSIGN;
2146 }
2147 return kvm_vm_ioctl(kvm_state, KVM_IOEVENTFD, &kick);
2148}
2149
2150int kvm_s390_get_memslot_count(KVMState *s)
2151{
2152 return kvm_check_extension(s, KVM_CAP_NR_MEMSLOTS);
2153}
2154
2155int kvm_s390_get_ri(void)
2156{
2157 return cap_ri;
2158}
2159
2160int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
2161{
2162 struct kvm_mp_state mp_state = {};
2163 int ret;
2164
2165
2166 if (CPU(cpu)->kvm_state == NULL) {
2167 return 0;
2168 }
2169
2170 switch (cpu_state) {
2171 case CPU_STATE_STOPPED:
2172 mp_state.mp_state = KVM_MP_STATE_STOPPED;
2173 break;
2174 case CPU_STATE_CHECK_STOP:
2175 mp_state.mp_state = KVM_MP_STATE_CHECK_STOP;
2176 break;
2177 case CPU_STATE_OPERATING:
2178 mp_state.mp_state = KVM_MP_STATE_OPERATING;
2179 break;
2180 case CPU_STATE_LOAD:
2181 mp_state.mp_state = KVM_MP_STATE_LOAD;
2182 break;
2183 default:
2184 error_report("Requested CPU state is not a valid S390 CPU state: %u",
2185 cpu_state);
2186 exit(1);
2187 }
2188
2189 ret = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MP_STATE, &mp_state);
2190 if (ret) {
2191 trace_kvm_failed_cpu_state_set(CPU(cpu)->cpu_index, cpu_state,
2192 strerror(-ret));
2193 }
2194
2195 return ret;
2196}
2197
2198void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu)
2199{
2200 struct kvm_s390_irq_state irq_state;
2201 CPUState *cs = CPU(cpu);
2202 int32_t bytes;
2203
2204 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_IRQ_STATE)) {
2205 return;
2206 }
2207
2208 irq_state.buf = (uint64_t) cpu->irqstate;
2209 irq_state.len = VCPU_IRQ_BUF_SIZE;
2210
2211 bytes = kvm_vcpu_ioctl(cs, KVM_S390_GET_IRQ_STATE, &irq_state);
2212 if (bytes < 0) {
2213 cpu->irqstate_saved_size = 0;
2214 error_report("Migration of interrupt state failed");
2215 return;
2216 }
2217
2218 cpu->irqstate_saved_size = bytes;
2219}
2220
2221int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
2222{
2223 CPUState *cs = CPU(cpu);
2224 struct kvm_s390_irq_state irq_state;
2225 int r;
2226
2227 if (cpu->irqstate_saved_size == 0) {
2228 return 0;
2229 }
2230
2231 if (!kvm_check_extension(kvm_state, KVM_CAP_S390_IRQ_STATE)) {
2232 return -ENOSYS;
2233 }
2234
2235 irq_state.buf = (uint64_t) cpu->irqstate;
2236 irq_state.len = cpu->irqstate_saved_size;
2237
2238 r = kvm_vcpu_ioctl(cs, KVM_S390_SET_IRQ_STATE, &irq_state);
2239 if (r) {
2240 error_report("Setting interrupt state failed %d", r);
2241 }
2242 return r;
2243}
2244
2245int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
2246 uint64_t address, uint32_t data, PCIDevice *dev)
2247{
2248 S390PCIBusDevice *pbdev;
2249 uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
2250 uint32_t vec = data & ZPCI_MSI_VEC_MASK;
2251
2252 pbdev = s390_pci_find_dev_by_idx(idx);
2253 if (!pbdev) {
2254 DPRINTF("add_msi_route no dev\n");
2255 return -ENODEV;
2256 }
2257
2258 pbdev->routes.adapter.ind_offset = vec;
2259
2260 route->type = KVM_IRQ_ROUTING_S390_ADAPTER;
2261 route->flags = 0;
2262 route->u.adapter.summary_addr = pbdev->routes.adapter.summary_addr;
2263 route->u.adapter.ind_addr = pbdev->routes.adapter.ind_addr;
2264 route->u.adapter.summary_offset = pbdev->routes.adapter.summary_offset;
2265 route->u.adapter.ind_offset = pbdev->routes.adapter.ind_offset;
2266 route->u.adapter.adapter_id = pbdev->routes.adapter.adapter_id;
2267 return 0;
2268}
2269
2270int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
2271 int vector, PCIDevice *dev)
2272{
2273 return 0;
2274}
2275
2276int kvm_arch_release_virq_post(int virq)
2277{
2278 return 0;
2279}
2280
2281int kvm_arch_msi_data_to_gsi(uint32_t data)
2282{
2283 abort();
2284}
2285