Lines Matching +full:- +full:kvm
2 * RISC-V implementation of KVM hooks
23 #include <linux/kvm.h>
27 #include "qemu/error-report.h"
28 #include "qemu/main-loop.h"
31 #include "system/kvm.h"
35 #include "accel/accel-cpu-target.h"
38 #include "system/address-spaces.h"
46 #include "chardev/char-fe.h"
89 size_b = cpu->cfg.vlenb; in kvm_riscv_vector_reg_id()
146 /* KVM ISA extensions */
163 target_ulong misa_bit = misa_ext_cfg->offset; in kvm_cpu_get_misa_ext_cfg()
165 CPURISCVState *env = &cpu->env; in kvm_cpu_get_misa_ext_cfg()
166 bool value = env->misa_ext_mask & misa_bit; in kvm_cpu_get_misa_ext_cfg()
176 target_ulong misa_bit = misa_ext_cfg->offset; in kvm_cpu_set_misa_ext_cfg()
178 CPURISCVState *env = &cpu->env; in kvm_cpu_set_misa_ext_cfg()
185 host_bit = env->misa_ext_mask & misa_bit; in kvm_cpu_set_misa_ext_cfg()
192 misa_ext_cfg->user_set = true; in kvm_cpu_set_misa_ext_cfg()
201 "enabled in the host", misa_ext_cfg->name); in kvm_cpu_set_misa_ext_cfg()
206 CPURISCVState *env = &cpu->env; in kvm_riscv_update_cpu_misa_ext()
212 target_ulong misa_bit = misa_cfg->offset; in kvm_riscv_update_cpu_misa_ext()
214 if (!misa_cfg->user_set) { in kvm_riscv_update_cpu_misa_ext()
221 misa_cfg->kvm_reg_id); in kvm_riscv_update_cpu_misa_ext()
225 * We're not checking for -EINVAL because if the bit is about in kvm_riscv_update_cpu_misa_ext()
227 * KVM. We determined that by fetching the 'isa' register in kvm_riscv_update_cpu_misa_ext()
231 error_report("Unable to set KVM reg %s, error %d", in kvm_riscv_update_cpu_misa_ext()
232 misa_cfg->name, ret); in kvm_riscv_update_cpu_misa_ext()
235 env->misa_ext &= ~misa_bit; in kvm_riscv_update_cpu_misa_ext()
241 .prop_size = sizeof(((CPURISCVState *)0)->_env_prop), \
260 return (void *)&cpu->env + csr_cfg->offset; in kvmconfig_get_env_addr()
359 return (void *)&cpu->cfg + kvmcfg->offset; in kvmconfig_get_cfg_addr()
411 if (!multi_ext_cfg->supported) { in kvm_cpu_set_multi_ext_cfg()
414 * extension that KVM doesn't support. Ignore in kvm_cpu_set_multi_ext_cfg()
418 error_setg(errp, "KVM does not support disabling extension %s", in kvm_cpu_set_multi_ext_cfg()
419 multi_ext_cfg->name); in kvm_cpu_set_multi_ext_cfg()
425 multi_ext_cfg->user_set = true; in kvm_cpu_set_multi_ext_cfg()
462 if (!multi_ext_cfg->user_set) { in kvm_riscv_update_cpu_cfg_isa_ext()
467 multi_ext_cfg->kvm_reg_id); in kvm_riscv_update_cpu_cfg_isa_ext()
471 if (!reg && ret == -EINVAL) { in kvm_riscv_update_cpu_cfg_isa_ext()
472 warn_report("KVM cannot disable extension %s", in kvm_riscv_update_cpu_cfg_isa_ext()
473 multi_ext_cfg->name); in kvm_riscv_update_cpu_cfg_isa_ext()
475 error_report("Unable to enable extension %s in KVM, error %d", in kvm_riscv_update_cpu_cfg_isa_ext()
476 multi_ext_cfg->name, ret); in kvm_riscv_update_cpu_cfg_isa_ext()
504 error_setg(errp, "'%s' is not available with KVM", in cpu_set_cfg_unavailable()
511 /* Check if KVM created the property already */ in riscv_cpu_add_kvm_unavail_prop()
518 * unknown to KVM and error out if the user attempts in riscv_cpu_add_kvm_unavail_prop()
534 for (prop = array; prop && prop->name; prop++) { in riscv_cpu_add_kvm_unavail_prop_array()
535 riscv_cpu_add_kvm_unavail_prop(obj, prop->name); in riscv_cpu_add_kvm_unavail_prop_array()
547 int bit = misa_cfg->offset; in kvm_riscv_add_cpu_user_properties()
549 misa_cfg->name = riscv_get_misa_ext_name(bit); in kvm_riscv_add_cpu_user_properties()
550 misa_cfg->description = riscv_get_misa_ext_description(bit); in kvm_riscv_add_cpu_user_properties()
552 object_property_add(cpu_obj, misa_cfg->name, "bool", in kvm_riscv_add_cpu_user_properties()
556 object_property_set_description(cpu_obj, misa_cfg->name, in kvm_riscv_add_cpu_user_properties()
557 misa_cfg->description); in kvm_riscv_add_cpu_user_properties()
568 object_property_add(cpu_obj, multi_cfg->name, "bool", in kvm_riscv_add_cpu_user_properties()
578 /* We don't have the needed KVM support for profiles */ in kvm_riscv_add_cpu_user_properties()
580 riscv_cpu_add_kvm_unavail_prop(cpu_obj, riscv_profiles[i]->name); in kvm_riscv_add_cpu_user_properties()
589 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_get_regs_core()
595 env->pc = reg; in kvm_riscv_get_regs_core()
603 env->gpr[i] = reg; in kvm_riscv_get_regs_core()
614 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_put_regs_core()
616 reg = env->pc; in kvm_riscv_put_regs_core()
624 reg = env->gpr[i]; in kvm_riscv_put_regs_core()
643 if (!csr_cfg->supported) { in kvm_riscv_get_regs_csr()
647 ret = kvm_get_one_reg(cs, csr_cfg->kvm_reg_id, ®); in kvm_riscv_get_regs_csr()
652 if (csr_cfg->prop_size == sizeof(uint32_t)) { in kvm_riscv_get_regs_csr()
654 } else if (csr_cfg->prop_size == sizeof(uint64_t)) { in kvm_riscv_get_regs_csr()
673 if (!csr_cfg->supported) { in kvm_riscv_put_regs_csr()
677 if (csr_cfg->prop_size == sizeof(uint32_t)) { in kvm_riscv_put_regs_csr()
679 } else if (csr_cfg->prop_size == sizeof(uint64_t)) { in kvm_riscv_put_regs_csr()
685 ret = kvm_set_one_reg(cs, csr_cfg->kvm_reg_id, ®); in kvm_riscv_put_regs_csr()
696 env->mstatus = 0; in kvm_riscv_reset_regs_csr()
697 env->mie = 0; in kvm_riscv_reset_regs_csr()
698 env->stvec = 0; in kvm_riscv_reset_regs_csr()
699 env->sscratch = 0; in kvm_riscv_reset_regs_csr()
700 env->sepc = 0; in kvm_riscv_reset_regs_csr()
701 env->scause = 0; in kvm_riscv_reset_regs_csr()
702 env->stval = 0; in kvm_riscv_reset_regs_csr()
703 env->mip = 0; in kvm_riscv_reset_regs_csr()
704 env->satp = 0; in kvm_riscv_reset_regs_csr()
705 env->scounteren = 0; in kvm_riscv_reset_regs_csr()
706 env->senvcfg = 0; in kvm_riscv_reset_regs_csr()
713 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_get_regs_fp()
722 env->fpr[i] = reg; in kvm_riscv_get_regs_fp()
734 env->fpr[i] = reg; in kvm_riscv_get_regs_fp()
746 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_put_regs_fp()
751 reg = env->fpr[i]; in kvm_riscv_put_regs_fp()
763 reg = env->fpr[i]; in kvm_riscv_put_regs_fp()
777 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_get_regs_timer()
779 if (env->kvm_timer_dirty) { in kvm_riscv_get_regs_timer()
783 KVM_RISCV_GET_TIMER(cs, time, env->kvm_timer_time); in kvm_riscv_get_regs_timer()
784 KVM_RISCV_GET_TIMER(cs, compare, env->kvm_timer_compare); in kvm_riscv_get_regs_timer()
785 KVM_RISCV_GET_TIMER(cs, state, env->kvm_timer_state); in kvm_riscv_get_regs_timer()
786 KVM_RISCV_GET_TIMER(cs, frequency, env->kvm_timer_frequency); in kvm_riscv_get_regs_timer()
788 env->kvm_timer_dirty = true; in kvm_riscv_get_regs_timer()
794 CPURISCVState *env = &RISCV_CPU(cs)->env; in kvm_riscv_put_regs_timer()
796 if (!env->kvm_timer_dirty) { in kvm_riscv_put_regs_timer()
800 KVM_RISCV_SET_TIMER(cs, time, env->kvm_timer_time); in kvm_riscv_put_regs_timer()
801 KVM_RISCV_SET_TIMER(cs, compare, env->kvm_timer_compare); in kvm_riscv_put_regs_timer()
804 * To set register of RISCV_TIMER_REG(state) will occur a error from KVM in kvm_riscv_put_regs_timer()
805 * on env->kvm_timer_state == 0, It's better to adapt in KVM, but it in kvm_riscv_put_regs_timer()
807 * TODO If KVM changes, adapt here. in kvm_riscv_put_regs_timer()
809 if (env->kvm_timer_state) { in kvm_riscv_put_regs_timer()
810 KVM_RISCV_SET_TIMER(cs, state, env->kvm_timer_state); in kvm_riscv_put_regs_timer()
820 if (reg != env->kvm_timer_frequency) { in kvm_riscv_put_regs_timer()
825 env->kvm_timer_dirty = false; in kvm_riscv_put_regs_timer()
840 CPURISCVState *env = &cpu->env; in kvm_riscv_get_regs_vector()
853 env->vstart = reg; in kvm_riscv_get_regs_vector()
859 env->vl = reg; in kvm_riscv_get_regs_vector()
865 env->vtype = reg; in kvm_riscv_get_regs_vector()
872 cpu->cfg.vlenb = reg; in kvm_riscv_get_regs_vector()
883 ret = kvm_get_one_reg(cs, vreg_id, &env->vreg[vreg_idx]); in kvm_riscv_get_regs_vector()
896 CPURISCVState *env = &cpu->env; in kvm_riscv_put_regs_vector()
905 reg = env->vstart; in kvm_riscv_put_regs_vector()
911 reg = env->vl; in kvm_riscv_put_regs_vector()
917 reg = env->vtype; in kvm_riscv_put_regs_vector()
924 reg = cpu->cfg.vlenb; in kvm_riscv_put_regs_vector()
936 ret = kvm_set_one_reg(cs, vreg_id, &env->vreg[vreg_idx]); in kvm_riscv_put_regs_vector()
954 * from target/arm/kvm.c.
958 int kvmfd = -1, vmfd = -1, cpufd = -1; in kvm_riscv_create_scratch_vcpu()
960 kvmfd = qemu_open_old("/dev/kvm", O_RDWR); in kvm_riscv_create_scratch_vcpu()
966 } while (vmfd == -1 && errno == EINTR); in kvm_riscv_create_scratch_vcpu()
975 scratch->kvmfd = kvmfd; in kvm_riscv_create_scratch_vcpu()
976 scratch->vmfd = vmfd; in kvm_riscv_create_scratch_vcpu()
977 scratch->cpufd = cpufd; in kvm_riscv_create_scratch_vcpu()
997 close(scratch->cpufd); in kvm_riscv_destroy_scratch_vcpu()
998 close(scratch->vmfd); in kvm_riscv_destroy_scratch_vcpu()
999 close(scratch->kvmfd); in kvm_riscv_destroy_scratch_vcpu()
1008 reg.addr = (uint64_t)&cpu->cfg.mvendorid; in kvm_riscv_init_machine_ids()
1009 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_init_machine_ids()
1015 reg.addr = (uint64_t)&cpu->cfg.marchid; in kvm_riscv_init_machine_ids()
1016 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_init_machine_ids()
1022 reg.addr = (uint64_t)&cpu->cfg.mimpid; in kvm_riscv_init_machine_ids()
1023 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_init_machine_ids()
1032 CPURISCVState *env = &cpu->env; in kvm_riscv_init_misa_ext_mask()
1037 reg.addr = (uint64_t)&env->misa_ext_mask; in kvm_riscv_init_misa_ext_mask()
1038 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_init_misa_ext_mask()
1041 error_report("Unable to fetch ISA register from KVM, " in kvm_riscv_init_misa_ext_mask()
1047 env->misa_ext = env->misa_ext_mask; in kvm_riscv_init_misa_ext_mask()
1057 cbomz_cfg->kvm_reg_id); in kvm_riscv_read_cbomz_blksize()
1059 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_read_cbomz_blksize()
1061 error_report("Unable to read KVM reg %s, error %d", in kvm_riscv_read_cbomz_blksize()
1062 cbomz_cfg->name, ret); in kvm_riscv_read_cbomz_blksize()
1078 multi_ext_cfg->kvm_reg_id); in kvm_riscv_read_multiext_legacy()
1080 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_read_multiext_legacy()
1083 /* Silently default to 'false' if KVM does not support it. */ in kvm_riscv_read_multiext_legacy()
1084 multi_ext_cfg->supported = false; in kvm_riscv_read_multiext_legacy()
1087 error_report("Unable to read ISA_EXT KVM register %s: %s", in kvm_riscv_read_multiext_legacy()
1088 multi_ext_cfg->name, strerror(errno)); in kvm_riscv_read_multiext_legacy()
1092 multi_ext_cfg->supported = true; in kvm_riscv_read_multiext_legacy()
1098 if (cpu->cfg.ext_zicbom) { in kvm_riscv_read_multiext_legacy()
1102 if (cpu->cfg.ext_zicboz) { in kvm_riscv_read_multiext_legacy()
1116 reg.id = csr_cfg->kvm_reg_id; in kvm_riscv_read_csr_cfg_legacy()
1118 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_read_csr_cfg_legacy()
1121 csr_cfg->supported = false; in kvm_riscv_read_csr_cfg_legacy()
1123 error_report("Unable to read KVM CSR %s: %s", in kvm_riscv_read_csr_cfg_legacy()
1124 csr_cfg->name, strerror(errno)); in kvm_riscv_read_csr_cfg_legacy()
1128 csr_cfg->supported = true; in kvm_riscv_read_csr_cfg_legacy()
1139 return -1; in uint64_cmp()
1154 reg_search = bsearch(&kvm_sbi_dbcn.kvm_reg_id, reglist->reg, reglist->n, in kvm_riscv_check_sbi_dbcn_support()
1170 reg_search = bsearch(&kvm_v_vlenb.kvm_reg_id, reglist->reg, reglist->n, in kvm_riscv_read_vlenb()
1177 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_read_vlenb()
1185 cpu->cfg.vlenb = val; in kvm_riscv_read_vlenb()
1197 reg_id = csr_cfg->kvm_reg_id; in kvm_riscv_read_csr_cfg()
1198 reg_search = bsearch(®_id, reglist->reg, reglist->n, in kvm_riscv_read_csr_cfg()
1204 csr_cfg->supported = true; in kvm_riscv_read_csr_cfg()
1218 ret = ioctl(kvmcpu->cpufd, KVM_GET_REG_LIST, &rl_struct); in kvm_riscv_init_cfg()
1236 error_report("Error when accessing get-reg-list: %s", in kvm_riscv_init_cfg()
1243 reglist->n = rl_struct.n; in kvm_riscv_init_cfg()
1244 ret = ioctl(kvmcpu->cpufd, KVM_GET_REG_LIST, reglist); in kvm_riscv_init_cfg()
1252 qsort(®list->reg, reglist->n, sizeof(uint64_t), uint64_cmp); in kvm_riscv_init_cfg()
1257 multi_ext_cfg->kvm_reg_id); in kvm_riscv_init_cfg()
1258 reg_search = bsearch(®_id, reglist->reg, reglist->n, in kvm_riscv_init_cfg()
1266 ret = ioctl(kvmcpu->cpufd, KVM_GET_ONE_REG, ®); in kvm_riscv_init_cfg()
1268 error_report("Unable to read ISA_EXT KVM register %s: %s", in kvm_riscv_init_cfg()
1269 multi_ext_cfg->name, strerror(errno)); in kvm_riscv_init_cfg()
1273 multi_ext_cfg->supported = true; in kvm_riscv_init_cfg()
1277 if (cpu->cfg.ext_zicbom) { in kvm_riscv_init_cfg()
1281 if (cpu->cfg.ext_zicboz) { in kvm_riscv_init_cfg()
1285 if (riscv_has_ext(&cpu->env, RVV)) { in kvm_riscv_init_cfg()
1350 __func__, ret, strerror(-ret)); in kvm_riscv_sync_mpstate_to_kvm()
1351 return -1; in kvm_riscv_sync_mpstate_to_kvm()
1384 if (cs->cpu_index == 0) { in kvm_arch_put_registers()
1415 return cpu->cpu_index; in kvm_arch_vcpu_id()
1444 * writing pieces of other cpu->cfg fields in the reg. in kvm_vcpu_set_machine_ids()
1446 reg = cpu->cfg.mvendorid; in kvm_vcpu_set_machine_ids()
1453 ret = kvm_set_one_reg(cs, id, &cpu->cfg.marchid); in kvm_vcpu_set_machine_ids()
1459 ret = kvm_set_one_reg(cs, id, &cpu->cfg.mimpid); in kvm_vcpu_set_machine_ids()
1560 switch (run->riscv_sbi.function_id) { in kvm_riscv_handle_sbi_dbcn()
1563 num_bytes = run->riscv_sbi.args[0]; in kvm_riscv_handle_sbi_dbcn()
1566 run->riscv_sbi.ret[0] = SBI_SUCCESS; in kvm_riscv_handle_sbi_dbcn()
1567 run->riscv_sbi.ret[1] = 0; in kvm_riscv_handle_sbi_dbcn()
1571 addr = run->riscv_sbi.args[1]; in kvm_riscv_handle_sbi_dbcn()
1577 if (riscv_cpu_mxl(&cpu->env) == MXL_RV32) { in kvm_riscv_handle_sbi_dbcn()
1578 addr |= (uint64_t)run->riscv_sbi.args[2] << 32; in kvm_riscv_handle_sbi_dbcn()
1583 if (run->riscv_sbi.function_id == SBI_EXT_DBCN_CONSOLE_READ) { in kvm_riscv_handle_sbi_dbcn()
1584 ret = qemu_chr_fe_read_all(serial_hd(0)->be, buf, num_bytes); in kvm_riscv_handle_sbi_dbcn()
1595 ret = qemu_chr_fe_write_all(serial_hd(0)->be, buf, num_bytes); in kvm_riscv_handle_sbi_dbcn()
1603 run->riscv_sbi.ret[0] = SBI_SUCCESS; in kvm_riscv_handle_sbi_dbcn()
1604 run->riscv_sbi.ret[1] = ret; in kvm_riscv_handle_sbi_dbcn()
1607 ch = run->riscv_sbi.args[0]; in kvm_riscv_handle_sbi_dbcn()
1608 ret = qemu_chr_fe_write(serial_hd(0)->be, &ch, sizeof(ch)); in kvm_riscv_handle_sbi_dbcn()
1616 run->riscv_sbi.ret[0] = SBI_SUCCESS; in kvm_riscv_handle_sbi_dbcn()
1617 run->riscv_sbi.ret[1] = 0; in kvm_riscv_handle_sbi_dbcn()
1620 run->riscv_sbi.ret[0] = SBI_ERR_NOT_SUPPORTED; in kvm_riscv_handle_sbi_dbcn()
1628 switch (run->riscv_sbi.extension_id) { in kvm_riscv_handle_sbi()
1630 ch = run->riscv_sbi.args[0]; in kvm_riscv_handle_sbi()
1631 qemu_chr_fe_write(serial_hd(0)->be, &ch, sizeof(ch)); in kvm_riscv_handle_sbi()
1634 ret = qemu_chr_fe_read_all(serial_hd(0)->be, &ch, sizeof(ch)); in kvm_riscv_handle_sbi()
1636 run->riscv_sbi.ret[0] = ch; in kvm_riscv_handle_sbi()
1638 run->riscv_sbi.ret[0] = -1; in kvm_riscv_handle_sbi()
1647 "%s: un-handled SBI EXIT, specific reasons is %lu\n", in kvm_riscv_handle_sbi()
1648 __func__, run->riscv_sbi.extension_id); in kvm_riscv_handle_sbi()
1649 ret = -1; in kvm_riscv_handle_sbi()
1657 target_ulong csr_num = run->riscv_csr.csr_num; in kvm_riscv_handle_csr()
1658 target_ulong new_value = run->riscv_csr.new_value; in kvm_riscv_handle_csr()
1659 target_ulong write_mask = run->riscv_csr.write_mask; in kvm_riscv_handle_csr()
1664 run->riscv_csr.ret_value = riscv_new_csr_seed(new_value, write_mask); in kvm_riscv_handle_csr()
1668 "%s: un-handled CSR EXIT for CSR %lx\n", in kvm_riscv_handle_csr()
1670 ret = -1; in kvm_riscv_handle_csr()
1680 CPURISCVState *env = &cpu->env; in kvm_riscv_handle_debug()
1685 if (kvm_find_sw_breakpoint(cs, env->pc)) { in kvm_riscv_handle_debug()
1695 switch (run->exit_reason) { in kvm_arch_handle_exit()
1708 qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n", in kvm_arch_handle_exit()
1709 __func__, run->exit_reason); in kvm_arch_handle_exit()
1710 ret = -1; in kvm_arch_handle_exit()
1718 CPURISCVState *env = &cpu->env; in kvm_riscv_reset_vcpu()
1722 env->gpr[i] = 0; in kvm_riscv_reset_vcpu()
1724 env->pc = cpu->env.kernel_addr; in kvm_riscv_reset_vcpu()
1725 env->gpr[10] = kvm_arch_vcpu_id(CPU(cpu)); /* a0 */ in kvm_riscv_reset_vcpu()
1726 env->gpr[11] = cpu->env.fdt_addr; /* a1 */ in kvm_riscv_reset_vcpu()
1737 perror("kvm riscv set irq != IRQ_S_EXT\n"); in kvm_riscv_set_irq()
1777 error_setg(errp, "Invalid KVM AIA mode"); in riscv_set_kvm_aia()
1784 object_class_property_add_str(oc, "riscv-aia", riscv_get_kvm_aia, in kvm_arch_accel_class_init()
1786 object_class_property_set_description(oc, "riscv-aia", in kvm_arch_accel_class_init()
1787 "Set KVM AIA mode. Valid values are 'emul', 'hwaccel' and 'auto'. " in kvm_arch_accel_class_init()
1788 "Changing KVM AIA modes relies on host support. Defaults to 'auto' " in kvm_arch_accel_class_init()
1790 object_property_set_default_str(object_class_property_find(oc, "riscv-aia"), in kvm_arch_accel_class_init()
1800 int aia_fd = -1; in kvm_riscv_aia_create()
1811 error_report("Unable to create in-kernel irqchip"); in kvm_riscv_aia_create()
1819 error_report("KVM AIA: failed to get current KVM AIA mode"); in kvm_riscv_aia_create()
1828 warn_report("KVM AIA: failed to set KVM AIA mode '%s', using " in kvm_riscv_aia_create()
1839 * Skip APLIC creation in KVM if we're running split mode. in kvm_riscv_aia_create()
1842 * since KVM won't be using it. in kvm_riscv_aia_create()
1849 error_report("KVM AIA: failed to set number of input irq lines"); in kvm_riscv_aia_create()
1857 error_report("KVM AIA: failed to set the base address of APLIC"); in kvm_riscv_aia_create()
1866 error_report("KVM AIA: failed to set number of msi"); in kvm_riscv_aia_create()
1872 max_group_id = socket_count - 1; in kvm_riscv_aia_create()
1878 error_report("KVM AIA: failed to set group_bits"); in kvm_riscv_aia_create()
1886 error_report("KVM AIA: failed to set group_shift"); in kvm_riscv_aia_create()
1897 error_report("KVM AIA: failed to set guest_bits"); in kvm_riscv_aia_create()
1916 error_report("KVM AIA: failed to set the IMSIC address for hart %d", i); in kvm_riscv_aia_create()
1924 max_hart_per_socket--; in kvm_riscv_aia_create()
1934 error_report("KVM AIA: failed to set hart_bits"); in kvm_riscv_aia_create()
1940 /* KVM AIA only has one APLIC instance */ in kvm_riscv_aia_create()
1951 error_report("KVM AIA: initialized fail"); in kvm_riscv_aia_create()
1971 * -> cpu_exec_realizefn()
1972 * -> kvm_cpu_realize() (via accel_cpu_common_realize())
1979 if (riscv_has_ext(&cpu->env, RVV)) { in kvm_cpu_realize()
1993 CPURISCVState *env = &cpu->env; in riscv_kvm_cpu_finalize_features()
1999 /* short-circuit without spinning the scratch CPU */ in riscv_kvm_cpu_finalize_features()
2000 if (!cpu->cfg.ext_zicbom && !cpu->cfg.ext_zicboz && in riscv_kvm_cpu_finalize_features()
2006 error_setg(errp, "Unable to create scratch KVM cpu"); in riscv_kvm_cpu_finalize_features()
2010 if (cpu->cfg.ext_zicbom && in riscv_kvm_cpu_finalize_features()
2022 if (cpu->cfg.cbom_blocksize != val) { in riscv_kvm_cpu_finalize_features()
2029 if (cpu->cfg.ext_zicboz && in riscv_kvm_cpu_finalize_features()
2041 if (cpu->cfg.cboz_blocksize != val) { in riscv_kvm_cpu_finalize_features()
2063 if (cpu->cfg.vlenb != val) { in riscv_kvm_cpu_finalize_features()
2077 acc->cpu_instance_init = kvm_cpu_instance_init; in kvm_cpu_accel_class_init()
2078 acc->cpu_target_realize = kvm_cpu_realize; in kvm_cpu_accel_class_init()
2082 .name = ACCEL_CPU_NAME("kvm"),
2103 .cfg.max_satp_mode = -1,
2110 .cfg.max_satp_mode = -1,
2123 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 2, 0)) { in kvm_arch_insert_sw_breakpoint()
2124 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
2127 if ((bp->saved_insn & 0x3) == 0x3) { in kvm_arch_insert_sw_breakpoint()
2128 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) in kvm_arch_insert_sw_breakpoint()
2129 || cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&ebreak_insn, 4, 1)) { in kvm_arch_insert_sw_breakpoint()
2130 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
2133 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&c_ebreak_insn, 2, 1)) { in kvm_arch_insert_sw_breakpoint()
2134 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
2146 if ((bp->saved_insn & 0x3) == 0x3) { in kvm_arch_remove_sw_breakpoint()
2147 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&ebreak, 4, 0) || in kvm_arch_remove_sw_breakpoint()
2149 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 1)) { in kvm_arch_remove_sw_breakpoint()
2150 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
2153 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&c_ebreak, 2, 0) || in kvm_arch_remove_sw_breakpoint()
2155 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 2, 1)) { in kvm_arch_remove_sw_breakpoint()
2156 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
2166 return -EINVAL; in kvm_arch_insert_hw_breakpoint()
2172 return -EINVAL; in kvm_arch_remove_hw_breakpoint()
2183 dbg->control |= KVM_GUESTDBG_ENABLE; in kvm_arch_update_guest_debug()