Lines Matching +full:- +full:- +full:without +full:- +full:default +full:- +full:features
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 #include "s390x-internal.h"
33 #include "qemu/error-report.h"
36 #include "qemu/main-loop.h"
37 #include "qemu/mmap-alloc.h"
46 #include "hw/s390x/s390-pci-inst.h"
47 #include "hw/s390x/s390-pci-bus.h"
51 #include "hw/s390x/s390-virtio-ccw.h"
52 #include "hw/s390x/s390-hypercall.h"
187 return -E2BIG; in kvm_s390_set_mem_limit()
255 attr, strerror(-ret)); in kvm_s390_set_crypto_attr()
263 if (object_property_get_bool(OBJECT(qdev_get_machine()), "aes-key-wrap", in kvm_s390_init_aes_kw()
277 if (object_property_get_bool(OBJECT(qdev_get_machine()), "dea-key-wrap", in kvm_s390_init_dea_kw()
325 mc->default_cpu_type = S390_CPU_TYPE_NAME("host"); in ccw_machine_class_foreach()
342 error_report("KVM is missing capability #%d - " in kvm_arch_init()
344 return -1; in kvm_arch_init()
352 error_report("KVM is missing capability KVM_CAP_S390_COW - " in kvm_arch_init()
354 return -1; in kvm_arch_init()
398 return cpu->cpu_index; in kvm_arch_vcpu_id()
408 unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus; in kvm_arch_init_vcpu()
410 kvm_s390_set_cpu_state(cpu, cpu->env.cpu_state); in kvm_arch_init_vcpu()
411 cpu->irqstate = g_malloc0(VCPU_IRQ_BUF_SIZE(max_cpus)); in kvm_arch_init_vcpu()
419 g_free(cpu->irqstate); in kvm_arch_destroy_vcpu()
420 cpu->irqstate = NULL; in kvm_arch_destroy_vcpu()
430 * The reset call is needed here to reset in-kernel vcpu data that in kvm_s390_reset_vcpu()
434 * (kvm-all). in kvm_s390_reset_vcpu()
438 cs->cpu_index, type); in kvm_s390_reset_vcpu()
465 return (cs->kvm_run->kvm_valid_regs & regs) == regs; in can_sync_regs()
481 cs->kvm_run->psw_addr = env->psw.addr; in kvm_arch_put_registers()
482 cs->kvm_run->psw_mask = env->psw.mask; in kvm_arch_put_registers()
484 memcpy(cs->kvm_run->s.regs.gprs, env->regs, sizeof(cs->kvm_run->s.regs.gprs)); in kvm_arch_put_registers()
485 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GPRS; in kvm_arch_put_registers()
489 cs->kvm_run->s.regs.vrs[i][0] = env->vregs[i][0]; in kvm_arch_put_registers()
490 cs->kvm_run->s.regs.vrs[i][1] = env->vregs[i][1]; in kvm_arch_put_registers()
492 cs->kvm_run->s.regs.fpc = env->fpc; in kvm_arch_put_registers()
493 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_VRS; in kvm_arch_put_registers()
496 cs->kvm_run->s.regs.fprs[i] = *get_freg(env, i); in kvm_arch_put_registers()
498 cs->kvm_run->s.regs.fpc = env->fpc; in kvm_arch_put_registers()
499 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_FPRS; in kvm_arch_put_registers()
505 fpu.fpc = env->fpc; in kvm_arch_put_registers()
519 * Access registers, control registers and the prefix - these are in kvm_arch_put_registers()
522 memcpy(cs->kvm_run->s.regs.acrs, env->aregs, sizeof(cs->kvm_run->s.regs.acrs)); in kvm_arch_put_registers()
523 memcpy(cs->kvm_run->s.regs.crs, env->cregs, sizeof(cs->kvm_run->s.regs.crs)); in kvm_arch_put_registers()
524 cs->kvm_run->s.regs.prefix = env->psa; in kvm_arch_put_registers()
525 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ACRS | KVM_SYNC_CRS | KVM_SYNC_PREFIX; in kvm_arch_put_registers()
528 cs->kvm_run->s.regs.cputm = env->cputm; in kvm_arch_put_registers()
529 cs->kvm_run->s.regs.ckc = env->ckc; in kvm_arch_put_registers()
530 cs->kvm_run->s.regs.todpr = env->todpr; in kvm_arch_put_registers()
531 cs->kvm_run->s.regs.gbea = env->gbea; in kvm_arch_put_registers()
532 cs->kvm_run->s.regs.pp = env->pp; in kvm_arch_put_registers()
533 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ARCH0; in kvm_arch_put_registers()
540 kvm_set_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm); in kvm_arch_put_registers()
541 kvm_set_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc); in kvm_arch_put_registers()
542 kvm_set_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr); in kvm_arch_put_registers()
543 kvm_set_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea); in kvm_arch_put_registers()
544 kvm_set_one_reg(cs, KVM_REG_S390_PP, &env->pp); in kvm_arch_put_registers()
548 memcpy(cs->kvm_run->s.regs.riccb, env->riccb, 64); in kvm_arch_put_registers()
549 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_RICCB; in kvm_arch_put_registers()
554 cs->kvm_run->s.regs.pft = env->pfault_token; in kvm_arch_put_registers()
555 cs->kvm_run->s.regs.pfs = env->pfault_select; in kvm_arch_put_registers()
556 cs->kvm_run->s.regs.pfc = env->pfault_compare; in kvm_arch_put_registers()
557 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_PFAULT; in kvm_arch_put_registers()
559 r = kvm_set_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token); in kvm_arch_put_registers()
563 r = kvm_set_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare); in kvm_arch_put_registers()
567 r = kvm_set_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select); in kvm_arch_put_registers()
574 memcpy(cs->kvm_run->s.regs.gscb, env->gscb, 32); in kvm_arch_put_registers()
575 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_GSCB; in kvm_arch_put_registers()
579 cs->kvm_run->s.regs.bpbc = env->bpbc; in kvm_arch_put_registers()
580 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_BPBC; in kvm_arch_put_registers()
584 cs->kvm_run->s.regs.etoken = env->etoken; in kvm_arch_put_registers()
585 cs->kvm_run->s.regs.etoken_extension = env->etoken_extension; in kvm_arch_put_registers()
586 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_ETOKEN; in kvm_arch_put_registers()
590 cs->kvm_run->s.regs.diag318 = env->diag318_info; in kvm_arch_put_registers()
591 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_DIAG318; in kvm_arch_put_registers()
604 env->psw.addr = cs->kvm_run->psw_addr; in kvm_arch_get_registers()
605 env->psw.mask = cs->kvm_run->psw_mask; in kvm_arch_get_registers()
609 memcpy(env->regs, cs->kvm_run->s.regs.gprs, sizeof(env->regs)); in kvm_arch_get_registers()
610 memcpy(env->aregs, cs->kvm_run->s.regs.acrs, sizeof(env->aregs)); in kvm_arch_get_registers()
611 memcpy(env->cregs, cs->kvm_run->s.regs.crs, sizeof(env->cregs)); in kvm_arch_get_registers()
614 env->psa = cs->kvm_run->s.regs.prefix; in kvm_arch_get_registers()
619 env->vregs[i][0] = cs->kvm_run->s.regs.vrs[i][0]; in kvm_arch_get_registers()
620 env->vregs[i][1] = cs->kvm_run->s.regs.vrs[i][1]; in kvm_arch_get_registers()
622 env->fpc = cs->kvm_run->s.regs.fpc; in kvm_arch_get_registers()
625 *get_freg(env, i) = cs->kvm_run->s.regs.fprs[i]; in kvm_arch_get_registers()
627 env->fpc = cs->kvm_run->s.regs.fpc; in kvm_arch_get_registers()
636 env->fpc = fpu.fpc; in kvm_arch_get_registers()
640 env->cputm = cs->kvm_run->s.regs.cputm; in kvm_arch_get_registers()
641 env->ckc = cs->kvm_run->s.regs.ckc; in kvm_arch_get_registers()
642 env->todpr = cs->kvm_run->s.regs.todpr; in kvm_arch_get_registers()
643 env->gbea = cs->kvm_run->s.regs.gbea; in kvm_arch_get_registers()
644 env->pp = cs->kvm_run->s.regs.pp; in kvm_arch_get_registers()
651 kvm_get_one_reg(cs, KVM_REG_S390_CPU_TIMER, &env->cputm); in kvm_arch_get_registers()
652 kvm_get_one_reg(cs, KVM_REG_S390_CLOCK_COMP, &env->ckc); in kvm_arch_get_registers()
653 kvm_get_one_reg(cs, KVM_REG_S390_TODPR, &env->todpr); in kvm_arch_get_registers()
654 kvm_get_one_reg(cs, KVM_REG_S390_GBEA, &env->gbea); in kvm_arch_get_registers()
655 kvm_get_one_reg(cs, KVM_REG_S390_PP, &env->pp); in kvm_arch_get_registers()
659 memcpy(env->riccb, cs->kvm_run->s.regs.riccb, 64); in kvm_arch_get_registers()
663 memcpy(env->gscb, cs->kvm_run->s.regs.gscb, 32); in kvm_arch_get_registers()
667 env->bpbc = cs->kvm_run->s.regs.bpbc; in kvm_arch_get_registers()
671 env->etoken = cs->kvm_run->s.regs.etoken; in kvm_arch_get_registers()
672 env->etoken_extension = cs->kvm_run->s.regs.etoken_extension; in kvm_arch_get_registers()
677 env->pfault_token = cs->kvm_run->s.regs.pft; in kvm_arch_get_registers()
678 env->pfault_select = cs->kvm_run->s.regs.pfs; in kvm_arch_get_registers()
679 env->pfault_compare = cs->kvm_run->s.regs.pfc; in kvm_arch_get_registers()
681 r = kvm_get_one_reg(cs, KVM_REG_S390_PFTOKEN, &env->pfault_token); in kvm_arch_get_registers()
685 r = kvm_get_one_reg(cs, KVM_REG_S390_PFCOMPARE, &env->pfault_compare); in kvm_arch_get_registers()
689 r = kvm_get_one_reg(cs, KVM_REG_S390_PFSELECT, &env->pfault_select); in kvm_arch_get_registers()
696 env->diag318_info = cs->kvm_run->s.regs.diag318; in kvm_arch_get_registers()
779 * Returns: 0 on success, non-zero if an exception or error occurred
795 .key = (cpu->env.psw.mask & PSW_MASK_KEY) >> PSW_SHIFT_KEY, in kvm_s390_mem_op()
800 return -ENOSYS; in kvm_s390_mem_op()
811 warn_report("KVM_S390_MEM_OP failed: %s", strerror(-ret)); in kvm_s390_mem_op()
829 return -ENOSYS; in kvm_s390_mem_op_pv()
834 error_report("KVM_S390_MEM_OP failed: %s", strerror(-ret)); in kvm_s390_mem_op_pv()
868 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, in kvm_arch_insert_sw_breakpoint()
870 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)sw_bp_inst, sw_bp_ilen, 1)) { in kvm_arch_insert_sw_breakpoint()
871 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
880 if (cpu_memory_rw_debug(cs, bp->pc, t, sw_bp_ilen, 0)) { in kvm_arch_remove_sw_breakpoint()
881 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
883 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
884 } else if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, in kvm_arch_remove_sw_breakpoint()
886 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
899 (hw_breakpoints[n].len == len || len == -1)) { in find_hw_breakpoint()
912 return -EEXIST; in insert_hw_breakpoint()
927 return -ENOMEM; in insert_hw_breakpoint()
947 return -EINVAL; in kvm_arch_insert_hw_breakpoint()
951 default: in kvm_arch_insert_hw_breakpoint()
952 return -ENOSYS; in kvm_arch_insert_hw_breakpoint()
963 return -ENOENT; in kvm_arch_remove_hw_breakpoint()
966 nb_hw_breakpoints--; in kvm_arch_remove_hw_breakpoint()
970 * be removed - if necessary. in kvm_arch_remove_hw_breakpoint()
998 dbg->arch.nr_hw_bp = nb_hw_breakpoints; in kvm_arch_update_guest_debug()
999 dbg->arch.hw_bp = hw_breakpoints; in kvm_arch_update_guest_debug()
1005 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP; in kvm_arch_update_guest_debug()
1007 dbg->arch.nr_hw_bp = 0; in kvm_arch_update_guest_debug()
1008 dbg->arch.hw_bp = NULL; in kvm_arch_update_guest_debug()
1023 return cs->halted; in kvm_arch_process_async_events()
1031 interrupt->type = irq->type; in s390_kvm_irq_to_interrupt()
1032 switch (irq->type) { in s390_kvm_irq_to_interrupt()
1034 interrupt->parm = irq->u.ext.ext_params; in s390_kvm_irq_to_interrupt()
1038 interrupt->parm64 = irq->u.ext.ext_params2; in s390_kvm_irq_to_interrupt()
1041 interrupt->parm = irq->u.pgm.code; in s390_kvm_irq_to_interrupt()
1044 interrupt->parm = irq->u.prefix.address; in s390_kvm_irq_to_interrupt()
1047 interrupt->parm = irq->u.ext.ext_params; in s390_kvm_irq_to_interrupt()
1050 interrupt->parm = irq->u.mchk.cr14; in s390_kvm_irq_to_interrupt()
1051 interrupt->parm64 = irq->u.mchk.mcic; in s390_kvm_irq_to_interrupt()
1054 interrupt->parm = irq->u.extcall.code; in s390_kvm_irq_to_interrupt()
1057 interrupt->parm = irq->u.emerg.code; in s390_kvm_irq_to_interrupt()
1063 interrupt->parm = irq->u.io.subchannel_id << 16; in s390_kvm_irq_to_interrupt()
1064 interrupt->parm |= irq->u.io.subchannel_nr; in s390_kvm_irq_to_interrupt()
1065 interrupt->parm64 = (uint64_t)irq->u.io.io_int_parm << 32; in s390_kvm_irq_to_interrupt()
1066 interrupt->parm64 |= irq->u.io.io_int_word; in s390_kvm_irq_to_interrupt()
1068 default: in s390_kvm_irq_to_interrupt()
1069 r = -EINVAL; in s390_kvm_irq_to_interrupt()
1103 error_report("KVM failed to inject interrupt %llx", irq->type); in kvm_s390_vcpu_interrupt()
1135 cpu->env.psw.addr); in kvm_s390_program_interrupt()
1154 CPUS390XState *env = &cpu->env; in kvm_sclp_service_call()
1159 sccb = env->regs[ipbh0 & 0xf]; in kvm_sclp_service_call()
1160 code = env->regs[(ipbh0 & 0xf0) >> 4]; in kvm_sclp_service_call()
1162 switch (run->s390_sieic.icptcode) { in kvm_sclp_service_call()
1178 kvm_s390_program_interrupt(cpu, -r); in kvm_sclp_service_call()
1187 CPUS390XState *env = &cpu->env; in handle_b2()
1189 uint16_t ipbh0 = (run->s390_sieic.ipb & 0xffff0000) >> 16; in handle_b2()
1193 ioinst_handle_xsch(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1196 ioinst_handle_csch(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1199 ioinst_handle_hsch(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1202 ioinst_handle_msch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1205 ioinst_handle_ssch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1208 ioinst_handle_stcrw(cpu, run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1211 ioinst_handle_stsch(cpu, env->regs[1], run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1218 ioinst_handle_chsc(cpu, run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1225 ioinst_handle_schm(cpu, env->regs[1], env->regs[2], in handle_b2()
1226 run->s390_sieic.ipb, RA_IGNORED); in handle_b2()
1229 ioinst_handle_rsch(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1232 ioinst_handle_rchp(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1238 ioinst_handle_sal(cpu, env->regs[1], RA_IGNORED); in handle_b2()
1247 default: in handle_b2()
1248 rc = -1; in handle_b2()
1259 CPUS390XState *env = &cpu->env; in get_base_disp_rxy()
1260 uint32_t x2 = (run->s390_sieic.ipa & 0x000f); in get_base_disp_rxy()
1261 uint32_t base2 = run->s390_sieic.ipb >> 28; in get_base_disp_rxy()
1262 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) + in get_base_disp_rxy()
1263 ((run->s390_sieic.ipb & 0xff00) << 4); in get_base_disp_rxy()
1272 return (base2 ? env->regs[base2] : 0) + in get_base_disp_rxy()
1273 (x2 ? env->regs[x2] : 0) + (long)(int)disp2; in get_base_disp_rxy()
1279 CPUS390XState *env = &cpu->env; in get_base_disp_rsy()
1280 uint32_t base2 = run->s390_sieic.ipb >> 28; in get_base_disp_rsy()
1281 uint32_t disp2 = ((run->s390_sieic.ipb & 0x0fff0000) >> 16) + in get_base_disp_rsy()
1282 ((run->s390_sieic.ipb & 0xff00) << 4); in get_base_disp_rsy()
1291 return (base2 ? env->regs[base2] : 0) + (long)(int)disp2; in get_base_disp_rsy()
1296 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16; in kvm_clp_service_call()
1301 return -1; in kvm_clp_service_call()
1307 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20; in kvm_pcilg_service_call()
1308 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16; in kvm_pcilg_service_call()
1313 return -1; in kvm_pcilg_service_call()
1319 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20; in kvm_pcistg_service_call()
1320 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16; in kvm_pcistg_service_call()
1325 return -1; in kvm_pcistg_service_call()
1331 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_stpcifc_service_call()
1340 return -1; in kvm_stpcifc_service_call()
1346 CPUS390XState *env = &cpu->env; in kvm_sic_service_call()
1347 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_sic_service_call()
1348 uint8_t r3 = run->s390_sieic.ipa & 0x000f; in kvm_sic_service_call()
1353 mode = env->regs[r1] & 0xffff; in kvm_sic_service_call()
1354 isc = (env->regs[r3] >> 27) & 0x7; in kvm_sic_service_call()
1357 kvm_s390_program_interrupt(cpu, -r); in kvm_sic_service_call()
1365 uint8_t r1 = (run->s390_sieic.ipb & 0x00f00000) >> 20; in kvm_rpcit_service_call()
1366 uint8_t r2 = (run->s390_sieic.ipb & 0x000f0000) >> 16; in kvm_rpcit_service_call()
1371 return -1; in kvm_rpcit_service_call()
1377 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_pcistb_service_call()
1378 uint8_t r3 = run->s390_sieic.ipa & 0x000f; in kvm_pcistb_service_call()
1387 return -1; in kvm_pcistb_service_call()
1393 uint8_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_mpcifc_service_call()
1402 return -1; in kvm_mpcifc_service_call()
1408 uint8_t r1 = (run->s390_sieic.ipb >> 20) & 0x0f; in kvm_handle_ptf()
1435 r = -1; in handle_b9()
1437 default: in handle_b9()
1438 r = -1; in handle_b9()
1459 r = -1; in handle_eb()
1461 default: in handle_eb()
1462 r = -1; in handle_eb()
1481 default: in handle_e3()
1482 r = -1; in handle_e3()
1495 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_handle_diag_288()
1496 r3 = run->s390_sieic.ipa & 0x000f; in kvm_handle_diag_288()
1497 rc = handle_diag_288(&cpu->env, r1, r3); in kvm_handle_diag_288()
1507 r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; in kvm_handle_diag_308()
1508 r3 = run->s390_sieic.ipa & 0x000f; in kvm_handle_diag_308()
1509 handle_diag_308(&cpu->env, r1, r3, RA_IGNORED); in kvm_handle_diag_308()
1514 CPUS390XState *env = &cpu->env; in handle_sw_breakpoint()
1517 pc = env->psw.addr - sw_bp_ilen; in handle_sw_breakpoint()
1519 env->psw.addr = pc; in handle_sw_breakpoint()
1523 return -ENOENT; in handle_sw_breakpoint()
1528 CPUS390XState *env = &S390_CPU(cs)->env; in kvm_s390_set_diag318()
1532 env->diag318_info = diag318_info; in kvm_s390_set_diag318()
1533 cs->kvm_run->s.regs.diag318 = diag318_info; in kvm_s390_set_diag318()
1534 cs->kvm_run->kvm_dirty_regs |= KVM_SYNC_DIAG318; in kvm_s390_set_diag318()
1544 uint64_t reg = (run->s390_sieic.ipa & 0x00f0) >> 4; in handle_diag_318()
1545 uint64_t diag318_info = run->s.regs.gprs[reg]; in handle_diag_318()
1571 * For any diagnose call we support, bits 48-63 of the resulting in handle_diag()
1574 func_code = decode_basedisp_rs(&cpu->env, ipb, NULL) & DIAG_KVM_CODE_MASK; in handle_diag()
1593 default: in handle_diag()
1604 CPUS390XState *env = &cpu->env; in kvm_s390_handle_sigp()
1620 unsigned int ipa0 = (run->s390_sieic.ipa & 0xff00); in handle_instruction()
1621 uint8_t ipa1 = run->s390_sieic.ipa & 0x00ff; in handle_instruction()
1622 int r = -1; in handle_instruction()
1624 trace_kvm_insn(run->s390_sieic.ipa, run->s390_sieic.ipb); in handle_instruction()
1633 r = handle_eb(cpu, run, run->s390_sieic.ipb & 0xff); in handle_instruction()
1636 r = handle_e3(cpu, run, run->s390_sieic.ipb & 0xff); in handle_instruction()
1639 r = handle_diag(cpu, run, run->s390_sieic.ipb); in handle_instruction()
1642 r = kvm_s390_handle_sigp(cpu, ipa1, run->s390_sieic.ipb); in handle_instruction()
1660 cpu->env.crash_reason = reason; in unmanageable_intercept()
1670 newpsw.mask = ldq_phys(cs->as, cpu->env.psa + in handle_oper_loop()
1672 newpsw.addr = ldq_phys(cs->as, cpu->env.psa + in handle_oper_loop()
1674 oldpsw.mask = run->psw_mask; in handle_oper_loop()
1675 oldpsw.addr = run->psw_addr; in handle_oper_loop()
1685 if (oldpsw.addr - newpsw.addr <= 6 && in handle_oper_loop()
1700 struct kvm_run *run = cs->kvm_run; in handle_intercept()
1701 int icpt_code = run->s390_sieic.icptcode; in handle_intercept()
1704 trace_kvm_intercept(icpt_code, (long)run->psw_addr); in handle_intercept()
1727 do_stop_interrupt(&cpu->env); in handle_intercept()
1733 if (r == -ENOENT) { in handle_intercept()
1749 default: in handle_intercept()
1761 struct kvm_run *run = cs->kvm_run; in handle_tsch()
1764 ret = ioinst_handle_tsch(cpu, cpu->env.regs[1], run->s390_tsch.ipb, in handle_tsch()
1771 if (run->s390_tsch.dequeued) { in handle_tsch()
1772 s390_io_interrupt(run->s390_tsch.subchannel_id, in handle_tsch()
1773 run->s390_tsch.subchannel_nr, in handle_tsch()
1774 run->s390_tsch.io_int_parm, in handle_tsch()
1775 run->s390_tsch.io_int_word); in handle_tsch()
1796 sizeof(sysib.ext_names[0]) * (sysib.count - 1)); in insert_stsi_3_2_2()
1807 sizeof(sysib.ext_names[0]) * (sysib.count - del)); in insert_stsi_3_2_2()
1811 for (i = 0; i < ms->possible_cpus->len; i++) { in insert_stsi_3_2_2()
1812 if (ms->possible_cpus->cpus[i].cpu) { in insert_stsi_3_2_2()
1828 sysib.vm[0].ext_name_encoding = 2; /* 2 = UTF-8 */ in insert_stsi_3_2_2()
1832 * same "KVMguest" default, which KVM has filled into short name field. in insert_stsi_3_2_2()
1851 struct kvm_run *run = cs->kvm_run; in handle_stsi()
1853 switch (run->s390_stsi.fc) { in handle_stsi()
1855 if (run->s390_stsi.sel1 != 2 || run->s390_stsi.sel2 != 2) { in handle_stsi()
1858 insert_stsi_3_2_2(cpu, run->s390_stsi.addr, run->s390_stsi.ar); in handle_stsi()
1861 insert_stsi_15_1_x(cpu, run->s390_stsi.sel2, run->s390_stsi.addr, in handle_stsi()
1862 run->s390_stsi.ar, RA_IGNORED); in handle_stsi()
1864 default: in handle_stsi()
1872 struct kvm_run *run = cs->kvm_run; in kvm_arch_handle_debug_exit()
1875 struct kvm_debug_exit_arch *arch_info = &run->debug.arch; in kvm_arch_handle_debug_exit()
1877 switch (arch_info->type) { in kvm_arch_handle_debug_exit()
1879 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) { in kvm_arch_handle_debug_exit()
1880 cs->watchpoint_hit = &hw_watchpoint; in kvm_arch_handle_debug_exit()
1881 hw_watchpoint.vaddr = arch_info->addr; in kvm_arch_handle_debug_exit()
1887 if (find_hw_breakpoint(arch_info->addr, -1, arch_info->type)) { in kvm_arch_handle_debug_exit()
1892 if (cs->singlestep_enabled) { in kvm_arch_handle_debug_exit()
1896 default: in kvm_arch_handle_debug_exit()
1897 ret = -ENOSYS; in kvm_arch_handle_debug_exit()
1912 switch (run->exit_reason) { in kvm_arch_handle_exit()
1928 default: in kvm_arch_handle_exit()
1929 fprintf(stderr, "Unknown KVM exit: %d\n", run->exit_reason); in kvm_arch_handle_exit()
1958 * are handled in-kernel, it is not true for s390 (yet); therefore, we in kvm_arch_init_irq_routing()
1981 return -ENOSYS; in kvm_s390_assign_subch_ioeventfd()
2005 if (CPU(cpu)->kvm_state == NULL) { in kvm_s390_set_cpu_state()
2022 default: in kvm_s390_set_cpu_state()
2030 trace_kvm_failed_cpu_state_set(CPU(cpu)->cpu_index, cpu_state, in kvm_s390_set_cpu_state()
2031 strerror(-ret)); in kvm_s390_set_cpu_state()
2039 unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus; in kvm_s390_vcpu_interrupt_pre_save()
2041 .buf = (uint64_t) cpu->irqstate, in kvm_s390_vcpu_interrupt_pre_save()
2053 cpu->irqstate_saved_size = 0; in kvm_s390_vcpu_interrupt_pre_save()
2058 cpu->irqstate_saved_size = bytes; in kvm_s390_vcpu_interrupt_pre_save()
2065 .buf = (uint64_t) cpu->irqstate, in kvm_s390_vcpu_interrupt_post_load()
2066 .len = cpu->irqstate_saved_size, in kvm_s390_vcpu_interrupt_post_load()
2070 if (cpu->irqstate_saved_size == 0) { in kvm_s390_vcpu_interrupt_post_load()
2075 return -ENOSYS; in kvm_s390_vcpu_interrupt_post_load()
2093 return -ENODEV; in kvm_arch_fixup_msi_route()
2096 pbdev = s390_pci_find_dev_by_target(s390_get_phb(), DEVICE(dev)->id); in kvm_arch_fixup_msi_route()
2099 return -ENODEV; in kvm_arch_fixup_msi_route()
2102 route->type = KVM_IRQ_ROUTING_S390_ADAPTER; in kvm_arch_fixup_msi_route()
2103 route->flags = 0; in kvm_arch_fixup_msi_route()
2104 route->u.adapter.summary_addr = pbdev->routes.adapter.summary_addr; in kvm_arch_fixup_msi_route()
2105 route->u.adapter.ind_addr = pbdev->routes.adapter.ind_addr; in kvm_arch_fixup_msi_route()
2106 route->u.adapter.summary_offset = pbdev->routes.adapter.summary_offset; in kvm_arch_fixup_msi_route()
2107 route->u.adapter.ind_offset = pbdev->routes.adapter.ind_offset + vec; in kvm_arch_fixup_msi_route()
2108 route->u.adapter.adapter_id = pbdev->routes.adapter.adapter_id; in kvm_arch_fixup_msi_route()
2128 static int query_cpu_subfunc(S390FeatBitmap features) in query_cpu_subfunc() argument
2147 s390_add_from_feat_block(features, S390_FEAT_TYPE_PLO, prop.plo); in query_cpu_subfunc()
2148 if (test_bit(S390_FEAT_TOD_CLOCK_STEERING, features)) { in query_cpu_subfunc()
2149 s390_add_from_feat_block(features, S390_FEAT_TYPE_PTFF, prop.ptff); in query_cpu_subfunc()
2151 if (test_bit(S390_FEAT_MSA, features)) { in query_cpu_subfunc()
2152 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMAC, prop.kmac); in query_cpu_subfunc()
2153 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMC, prop.kmc); in query_cpu_subfunc()
2154 s390_add_from_feat_block(features, S390_FEAT_TYPE_KM, prop.km); in query_cpu_subfunc()
2155 s390_add_from_feat_block(features, S390_FEAT_TYPE_KIMD, prop.kimd); in query_cpu_subfunc()
2156 s390_add_from_feat_block(features, S390_FEAT_TYPE_KLMD, prop.klmd); in query_cpu_subfunc()
2158 if (test_bit(S390_FEAT_MSA_EXT_3, features)) { in query_cpu_subfunc()
2159 s390_add_from_feat_block(features, S390_FEAT_TYPE_PCKMO, prop.pckmo); in query_cpu_subfunc()
2161 if (test_bit(S390_FEAT_MSA_EXT_4, features)) { in query_cpu_subfunc()
2162 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMCTR, prop.kmctr); in query_cpu_subfunc()
2163 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMF, prop.kmf); in query_cpu_subfunc()
2164 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMO, prop.kmo); in query_cpu_subfunc()
2165 s390_add_from_feat_block(features, S390_FEAT_TYPE_PCC, prop.pcc); in query_cpu_subfunc()
2167 if (test_bit(S390_FEAT_MSA_EXT_5, features)) { in query_cpu_subfunc()
2168 s390_add_from_feat_block(features, S390_FEAT_TYPE_PPNO, prop.ppno); in query_cpu_subfunc()
2170 if (test_bit(S390_FEAT_MSA_EXT_8, features)) { in query_cpu_subfunc()
2171 s390_add_from_feat_block(features, S390_FEAT_TYPE_KMA, prop.kma); in query_cpu_subfunc()
2173 if (test_bit(S390_FEAT_MSA_EXT_9, features)) { in query_cpu_subfunc()
2174 s390_add_from_feat_block(features, S390_FEAT_TYPE_KDSA, prop.kdsa); in query_cpu_subfunc()
2176 if (test_bit(S390_FEAT_ESORT_BASE, features)) { in query_cpu_subfunc()
2177 s390_add_from_feat_block(features, S390_FEAT_TYPE_SORTL, prop.sortl); in query_cpu_subfunc()
2179 if (test_bit(S390_FEAT_DEFLATE_BASE, features)) { in query_cpu_subfunc()
2180 s390_add_from_feat_block(features, S390_FEAT_TYPE_DFLTCC, prop.dfltcc); in query_cpu_subfunc()
2182 if (test_bit(S390_FEAT_CCF_BASE, features)) { in query_cpu_subfunc()
2183 s390_add_from_feat_block(features, S390_FEAT_TYPE_PFCR, prop.pfcr); in query_cpu_subfunc()
2188 static int configure_cpu_subfunc(const S390FeatBitmap features) in configure_cpu_subfunc() argument
2203 s390_fill_feat_block(features, S390_FEAT_TYPE_PLO, prop.plo); in configure_cpu_subfunc()
2204 if (test_bit(S390_FEAT_TOD_CLOCK_STEERING, features)) { in configure_cpu_subfunc()
2205 s390_fill_feat_block(features, S390_FEAT_TYPE_PTFF, prop.ptff); in configure_cpu_subfunc()
2207 if (test_bit(S390_FEAT_MSA, features)) { in configure_cpu_subfunc()
2208 s390_fill_feat_block(features, S390_FEAT_TYPE_KMAC, prop.kmac); in configure_cpu_subfunc()
2209 s390_fill_feat_block(features, S390_FEAT_TYPE_KMC, prop.kmc); in configure_cpu_subfunc()
2210 s390_fill_feat_block(features, S390_FEAT_TYPE_KM, prop.km); in configure_cpu_subfunc()
2211 s390_fill_feat_block(features, S390_FEAT_TYPE_KIMD, prop.kimd); in configure_cpu_subfunc()
2212 s390_fill_feat_block(features, S390_FEAT_TYPE_KLMD, prop.klmd); in configure_cpu_subfunc()
2214 if (test_bit(S390_FEAT_MSA_EXT_3, features)) { in configure_cpu_subfunc()
2215 s390_fill_feat_block(features, S390_FEAT_TYPE_PCKMO, prop.pckmo); in configure_cpu_subfunc()
2217 if (test_bit(S390_FEAT_MSA_EXT_4, features)) { in configure_cpu_subfunc()
2218 s390_fill_feat_block(features, S390_FEAT_TYPE_KMCTR, prop.kmctr); in configure_cpu_subfunc()
2219 s390_fill_feat_block(features, S390_FEAT_TYPE_KMF, prop.kmf); in configure_cpu_subfunc()
2220 s390_fill_feat_block(features, S390_FEAT_TYPE_KMO, prop.kmo); in configure_cpu_subfunc()
2221 s390_fill_feat_block(features, S390_FEAT_TYPE_PCC, prop.pcc); in configure_cpu_subfunc()
2223 if (test_bit(S390_FEAT_MSA_EXT_5, features)) { in configure_cpu_subfunc()
2224 s390_fill_feat_block(features, S390_FEAT_TYPE_PPNO, prop.ppno); in configure_cpu_subfunc()
2226 if (test_bit(S390_FEAT_MSA_EXT_8, features)) { in configure_cpu_subfunc()
2227 s390_fill_feat_block(features, S390_FEAT_TYPE_KMA, prop.kma); in configure_cpu_subfunc()
2229 if (test_bit(S390_FEAT_MSA_EXT_9, features)) { in configure_cpu_subfunc()
2230 s390_fill_feat_block(features, S390_FEAT_TYPE_KDSA, prop.kdsa); in configure_cpu_subfunc()
2232 if (test_bit(S390_FEAT_ESORT_BASE, features)) { in configure_cpu_subfunc()
2233 s390_fill_feat_block(features, S390_FEAT_TYPE_SORTL, prop.sortl); in configure_cpu_subfunc()
2235 if (test_bit(S390_FEAT_DEFLATE_BASE, features)) { in configure_cpu_subfunc()
2236 s390_fill_feat_block(features, S390_FEAT_TYPE_DFLTCC, prop.dfltcc); in configure_cpu_subfunc()
2238 if (test_bit(S390_FEAT_CCF_BASE, features)) { in configure_cpu_subfunc()
2239 s390_fill_feat_block(features, S390_FEAT_TYPE_PFCR, prop.pfcr); in configure_cpu_subfunc()
2250 static bool ap_enabled(const S390FeatBitmap features) in ap_enabled() argument
2252 return test_bit(S390_FEAT_AP, features); in ap_enabled()
2261 static int query_uv_feat_guest(S390FeatBitmap features) in query_uv_feat_guest() argument
2282 set_bit(S390_FEAT_UV_FEAT_AP, features); in query_uv_feat_guest()
2285 set_bit(S390_FEAT_UV_FEAT_AP_INTR, features); in query_uv_feat_guest()
2308 static int query_cpu_feat(S390FeatBitmap features) in query_cpu_feat() argument
2326 set_bit(kvm_to_feat[i][1], features); in query_cpu_feat()
2332 static int configure_cpu_feat(const S390FeatBitmap features) in configure_cpu_feat() argument
2343 if (test_bit(kvm_to_feat[i][1], features)) { in configure_cpu_feat()
2391 model->lowest_ibc = lowest_ibc(prop.ibc); in kvm_s390_get_host_cpu_model()
2394 model->cpu_id = cpuid_id(prop.cpuid); in kvm_s390_get_host_cpu_model()
2395 model->cpu_id_format = cpuid_format(prop.cpuid); in kvm_s390_get_host_cpu_model()
2396 model->cpu_ver = 0xff; in kvm_s390_get_host_cpu_model()
2398 /* get supported cpu features indicated via STFL(E) */ in kvm_s390_get_host_cpu_model()
2399 s390_add_from_feat_block(model->features, S390_FEAT_TYPE_STFL, in kvm_s390_get_host_cpu_model()
2401 /* dat-enhancement facility 2 has no bit but was introduced with stfle */ in kvm_s390_get_host_cpu_model()
2402 if (test_bit(S390_FEAT_STFLE, model->features)) { in kvm_s390_get_host_cpu_model()
2403 set_bit(S390_FEAT_DAT_ENH_2, model->features); in kvm_s390_get_host_cpu_model()
2405 /* get supported cpu features indicated e.g. via SCLP */ in kvm_s390_get_host_cpu_model()
2406 rc = query_cpu_feat(model->features); in kvm_s390_get_host_cpu_model()
2408 error_setg(errp, "KVM: Error querying CPU features: %d", rc); in kvm_s390_get_host_cpu_model()
2412 rc = query_cpu_subfunc(model->features); in kvm_s390_get_host_cpu_model()
2419 if (!test_bit(S390_FEAT_MULTIPLE_EPOCH, model->features)) { in kvm_s390_get_host_cpu_model()
2420 clear_bit(S390_FEAT_PTFF_QSIE, model->features); in kvm_s390_get_host_cpu_model()
2421 clear_bit(S390_FEAT_PTFF_QTOUE, model->features); in kvm_s390_get_host_cpu_model()
2422 clear_bit(S390_FEAT_PTFF_STOE, model->features); in kvm_s390_get_host_cpu_model()
2423 clear_bit(S390_FEAT_PTFF_STOUE, model->features); in kvm_s390_get_host_cpu_model()
2428 set_bit(S390_FEAT_CMM, model->features); in kvm_s390_get_host_cpu_model()
2430 /* no cmm -> no cmm nt */ in kvm_s390_get_host_cpu_model()
2431 clear_bit(S390_FEAT_CMM_NT, model->features); in kvm_s390_get_host_cpu_model()
2436 clear_bit(S390_FEAT_BPB, model->features); in kvm_s390_get_host_cpu_model()
2444 set_bit(S390_FEAT_UNPACK, model->features); in kvm_s390_get_host_cpu_model()
2449 * configuration-topology facility. in kvm_s390_get_host_cpu_model()
2452 set_bit(S390_FEAT_CONFIGURATION_TOPOLOGY, model->features); in kvm_s390_get_host_cpu_model()
2456 set_bit(S390_FEAT_ZPCI, model->features); in kvm_s390_get_host_cpu_model()
2457 set_bit(S390_FEAT_ADAPTER_EVENT_NOTIFICATION, model->features); in kvm_s390_get_host_cpu_model()
2460 /* we want the exact model, even if some features are missing */ in kvm_s390_get_host_cpu_model()
2461 model->def = s390_find_cpu_def(cpu_type, ibc_gen(unblocked_ibc), in kvm_s390_get_host_cpu_model()
2464 /* model unknown, e.g. too new - search using features */ in kvm_s390_get_host_cpu_model()
2465 model->def = s390_find_cpu_def(0, ibc_gen(unblocked_ibc), in kvm_s390_get_host_cpu_model()
2467 model->features); in kvm_s390_get_host_cpu_model()
2469 if (!model->def) { in kvm_s390_get_host_cpu_model()
2475 set_bit(S390_FEAT_AP, model->features); in kvm_s390_get_host_cpu_model()
2479 * Extended-Length SCCB is handled entirely within QEMU. in kvm_s390_get_host_cpu_model()
2483 set_bit(S390_FEAT_EXTENDED_LENGTH_SCCB, model->features); in kvm_s390_get_host_cpu_model()
2486 set_bit(S390_FEAT_DIAG_318, model->features); in kvm_s390_get_host_cpu_model()
2489 /* Test for Ultravisor features that influence secure guest behavior */ in kvm_s390_get_host_cpu_model()
2490 query_uv_feat_guest(model->features); in kvm_s390_get_host_cpu_model()
2492 /* strip of features that are not part of the maximum model */ in kvm_s390_get_host_cpu_model()
2493 bitmap_and(model->features, model->features, model->def->full_feat, in kvm_s390_get_host_cpu_model()
2498 static int configure_uv_feat_guest(const S390FeatBitmap features) in configure_uv_feat_guest() argument
2508 if (!(uv_feat_supported() && ap_enabled(features))) { in configure_uv_feat_guest()
2512 if (test_bit(S390_FEAT_UV_FEAT_AP, features)) { in configure_uv_feat_guest()
2515 if (test_bit(S390_FEAT_UV_FEAT_AP_INTR, features)) { in configure_uv_feat_guest()
2557 /* configure cpu features indicated via STFL(e) */ in kvm_s390_apply_cpu_model()
2558 s390_fill_feat_block(model->features, S390_FEAT_TYPE_STFL, in kvm_s390_apply_cpu_model()
2565 /* configure cpu features indicated e.g. via SCLP */ in kvm_s390_apply_cpu_model()
2566 rc = configure_cpu_feat(model->features); in kvm_s390_apply_cpu_model()
2568 error_setg(errp, "KVM: Error configuring CPU features: %d", rc); in kvm_s390_apply_cpu_model()
2572 rc = configure_cpu_subfunc(model->features); in kvm_s390_apply_cpu_model()
2578 if (test_bit(S390_FEAT_CMM, model->features)) { in kvm_s390_apply_cpu_model()
2582 if (ap_enabled(model->features)) { in kvm_s390_apply_cpu_model()
2586 /* configure UV-features for the guest indicated via query / test_bit */ in kvm_s390_apply_cpu_model()
2587 rc = configure_uv_feat_guest(model->features); in kvm_s390_apply_cpu_model()
2589 error_setg(errp, "KVM: Error configuring CPU UV features %d", rc); in kvm_s390_apply_cpu_model()
2629 return -ENOTSUP; in kvm_s390_topology_set_mtcr()