Lines Matching +full:- +full:- +full:disable +full:- +full:attr
4 * Copyright Christoffer Dall 2009-2010
5 * Copyright Mian-M. Hamayun 2013, Virtual Open Systems
9 * See the COPYING file in the top-level directory.
19 #include "qemu/error-report.h"
20 #include "qemu/main-loop.h"
33 #include "system/address-spaces.h"
80 init.target = cpu->kvm_target; in kvm_arm_vcpu_init()
81 memcpy(init.features, cpu->kvm_init_features, sizeof(init.features)); in kvm_arm_vcpu_init()
106 int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1; in kvm_arm_create_scratch_host_vcpu()
119 } while (vmfd == -1 && errno == EINTR); in kvm_arm_create_scratch_host_vcpu()
148 if (init->target == -1) { in kvm_arm_create_scratch_host_vcpu()
155 init->target = preferred.target; in kvm_arm_create_scratch_host_vcpu()
187 for (i = 2; i >= 0; i--) { in kvm_arm_destroy_scratch_host_vcpu()
201 return -1; in read_sys_reg32()
235 * target = -1 informs kvm_arm_create_scratch_host_vcpu() in kvm_arm_get_host_cpu_features()
238 struct kvm_vcpu_init init = { .target = -1, }; in kvm_arm_get_host_cpu_features()
268 ahcf->target = init.target; in kvm_arm_get_host_cpu_features()
269 ahcf->dtb_compatible = "arm,arm-v8"; in kvm_arm_get_host_cpu_features()
271 err = read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64pfr0, in kvm_arm_get_host_cpu_features()
285 * run the tiniest of hand-crafted kernels to extract in kvm_arm_get_host_cpu_features()
290 ahcf->isar.id_aa64pfr0 = 0x00000011; /* EL1&0, AArch64 only */ in kvm_arm_get_host_cpu_features()
293 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64pfr1, in kvm_arm_get_host_cpu_features()
295 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64smfr0, in kvm_arm_get_host_cpu_features()
297 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64dfr0, in kvm_arm_get_host_cpu_features()
299 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64dfr1, in kvm_arm_get_host_cpu_features()
301 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar0, in kvm_arm_get_host_cpu_features()
303 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar1, in kvm_arm_get_host_cpu_features()
305 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar2, in kvm_arm_get_host_cpu_features()
307 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr0, in kvm_arm_get_host_cpu_features()
309 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1, in kvm_arm_get_host_cpu_features()
311 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr2, in kvm_arm_get_host_cpu_features()
313 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr3, in kvm_arm_get_host_cpu_features()
323 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr0, in kvm_arm_get_host_cpu_features()
325 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr1, in kvm_arm_get_host_cpu_features()
327 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_dfr0, in kvm_arm_get_host_cpu_features()
329 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0, in kvm_arm_get_host_cpu_features()
331 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr1, in kvm_arm_get_host_cpu_features()
333 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr2, in kvm_arm_get_host_cpu_features()
335 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr3, in kvm_arm_get_host_cpu_features()
337 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar0, in kvm_arm_get_host_cpu_features()
339 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar1, in kvm_arm_get_host_cpu_features()
341 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar2, in kvm_arm_get_host_cpu_features()
343 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar3, in kvm_arm_get_host_cpu_features()
345 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar4, in kvm_arm_get_host_cpu_features()
347 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar5, in kvm_arm_get_host_cpu_features()
349 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr4, in kvm_arm_get_host_cpu_features()
351 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar6, in kvm_arm_get_host_cpu_features()
354 err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr0, in kvm_arm_get_host_cpu_features()
356 err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr1, in kvm_arm_get_host_cpu_features()
358 err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr2, in kvm_arm_get_host_cpu_features()
360 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr2, in kvm_arm_get_host_cpu_features()
362 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_dfr1, in kvm_arm_get_host_cpu_features()
364 err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr5, in kvm_arm_get_host_cpu_features()
369 * provide an accessor for it in 64-bit mode, which is what this in kvm_arm_get_host_cpu_features()
370 * scratch VM is in, and there's no architected "64-bit sysreg in kvm_arm_get_host_cpu_features()
371 * which reads the same as the 32-bit register" the way there is in kvm_arm_get_host_cpu_features()
377 if (FIELD_EX32(ahcf->isar.id_aa64pfr0, ID_AA64PFR0, EL1) >= 2) { in kvm_arm_get_host_cpu_features()
378 int wrps = FIELD_EX64(ahcf->isar.id_aa64dfr0, ID_AA64DFR0, WRPS); in kvm_arm_get_host_cpu_features()
379 int brps = FIELD_EX64(ahcf->isar.id_aa64dfr0, ID_AA64DFR0, BRPS); in kvm_arm_get_host_cpu_features()
381 FIELD_EX64(ahcf->isar.id_aa64dfr0, ID_AA64DFR0, CTX_CMPS); in kvm_arm_get_host_cpu_features()
384 !!FIELD_EX32(ahcf->isar.id_aa64pfr0, ID_AA64PFR0, EL3); in kvm_arm_get_host_cpu_features()
394 ahcf->isar.dbgdidr = dbgdidr; in kvm_arm_get_host_cpu_features()
399 err |= read_sys_reg64(fdarray[2], &ahcf->isar.reset_pmcr_el0, in kvm_arm_get_host_cpu_features()
411 err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64zfr0, in kvm_arm_get_host_cpu_features()
432 ahcf->features = features; in kvm_arm_get_host_cpu_features()
439 CPUARMState *env = &cpu->env; in kvm_arm_set_cpu_features_from_host()
447 cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE; in kvm_arm_set_cpu_features_from_host()
448 cpu->host_cpu_probe_failed = true; in kvm_arm_set_cpu_features_from_host()
453 cpu->kvm_target = arm_host_cpu_features.target; in kvm_arm_set_cpu_features_from_host()
454 cpu->dtb_compatible = arm_host_cpu_features.dtb_compatible; in kvm_arm_set_cpu_features_from_host()
455 cpu->isar = arm_host_cpu_features.isar; in kvm_arm_set_cpu_features_from_host()
456 env->features = arm_host_cpu_features.features; in kvm_arm_set_cpu_features_from_host()
461 return !ARM_CPU(obj)->kvm_adjvtime; in kvm_no_adjvtime_get()
466 ARM_CPU(obj)->kvm_adjvtime = !value; in kvm_no_adjvtime_set()
471 return ARM_CPU(obj)->kvm_steal_time != ON_OFF_AUTO_OFF; in kvm_steal_time_get()
476 ARM_CPU(obj)->kvm_steal_time = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in kvm_steal_time_set()
479 /* KVM VCPU properties should be prefixed with "kvm-". */
482 CPUARMState *env = &cpu->env; in kvm_arm_add_vcpu_properties()
486 cpu->kvm_adjvtime = true; in kvm_arm_add_vcpu_properties()
487 object_property_add_bool(obj, "kvm-no-adjvtime", kvm_no_adjvtime_get, in kvm_arm_add_vcpu_properties()
489 object_property_set_description(obj, "kvm-no-adjvtime", in kvm_arm_add_vcpu_properties()
490 "Set on to disable the adjustment of " in kvm_arm_add_vcpu_properties()
495 cpu->kvm_steal_time = ON_OFF_AUTO_AUTO; in kvm_arm_add_vcpu_properties()
496 object_property_add_bool(obj, "kvm-steal-time", kvm_steal_time_get, in kvm_arm_add_vcpu_properties()
498 object_property_set_description(obj, "kvm-steal-time", in kvm_arm_add_vcpu_properties()
499 "Set off to disable KVM steal time."); in kvm_arm_add_vcpu_properties()
509 KVMState *s = KVM_STATE(ms->accelerator); in kvm_arm_get_max_vm_ipa_size()
529 * whether we are using an in-kernel VGIC or not. in kvm_arch_init()
545 if (ms->smp.cpus > 256 && in kvm_arch_init()
549 ret = -EINVAL; in kvm_arch_init()
562 if (s->kvm_eager_split_size) { in kvm_arch_init()
567 s->kvm_eager_split_size = 0; in kvm_arch_init()
569 } else if (!(s->kvm_eager_split_size & sizes)) { in kvm_arch_init()
571 ret = -EINVAL; in kvm_arch_init()
574 s->kvm_eager_split_size); in kvm_arch_init()
577 strerror(-ret)); in kvm_arch_init()
595 return cpu->cpu_index; in kvm_arch_vcpu_id()
627 if (section->mr == kd->mr) { in kvm_arm_devlistener_add()
628 kd->kda.addr = section->offset_within_address_space; in kvm_arm_devlistener_add()
639 if (section->mr == kd->mr) { in kvm_arm_devlistener_del()
640 kd->kda.addr = -1; in kvm_arm_devlistener_del()
646 .name = "kvm-arm",
654 struct kvm_device_attr *attr = &kd->kdattr; in kvm_arm_set_device_addr() local
656 uint64_t addr = kd->kda.addr; in kvm_arm_set_device_addr()
658 addr |= kd->kda_addr_ormask; in kvm_arm_set_device_addr()
659 attr->addr = (uintptr_t)&addr; in kvm_arm_set_device_addr()
660 ret = kvm_device_ioctl(kd->dev_fd, KVM_SET_DEVICE_ATTR, attr); in kvm_arm_set_device_addr()
664 strerror(-ret)); in kvm_arm_set_device_addr()
674 if (kd->kda.addr != -1) { in kvm_arm_machine_init_done()
677 memory_region_unref(kd->mr); in kvm_arm_machine_init_done()
689 uint64_t attr, int dev_fd, uint64_t addr_ormask) in kvm_arm_register_device() argument
702 kd->mr = mr; in kvm_arm_register_device()
703 kd->kda.id = devid; in kvm_arm_register_device()
704 kd->kda.addr = -1; in kvm_arm_register_device()
705 kd->kdattr.flags = 0; in kvm_arm_register_device()
706 kd->kdattr.group = group; in kvm_arm_register_device()
707 kd->kdattr.attr = attr; in kvm_arm_register_device()
708 kd->dev_fd = dev_fd; in kvm_arm_register_device()
709 kd->kda_addr_ormask = addr_ormask; in kvm_arm_register_device()
711 memory_region_ref(kd->mr); in kvm_arm_register_device()
720 return -1; in compare_u64()
734 res = bsearch(®idx, cpu->cpreg_indexes, cpu->cpreg_array_len, in kvm_arm_get_cpreg_ptr()
738 return &cpu->cpreg_values[res - cpu->cpreg_indexes]; in kvm_arm_get_cpreg_ptr()
766 * the previous TCG-created cpreg list).
779 if (ret != -E2BIG) { in kvm_arm_init_cpreg_list()
783 rlp->n = rl.n; in kvm_arm_init_cpreg_list()
791 qsort(&rlp->reg, rlp->n, sizeof(rlp->reg[0]), compare_u64); in kvm_arm_init_cpreg_list()
793 for (i = 0, arraylen = 0; i < rlp->n; i++) { in kvm_arm_init_cpreg_list()
794 if (!kvm_arm_reg_syncs_via_cpreg_list(rlp->reg[i])) { in kvm_arm_init_cpreg_list()
797 switch (rlp->reg[i] & KVM_REG_SIZE_MASK) { in kvm_arm_init_cpreg_list()
803 ret = -EINVAL; in kvm_arm_init_cpreg_list()
810 cpu->cpreg_indexes = g_renew(uint64_t, cpu->cpreg_indexes, arraylen); in kvm_arm_init_cpreg_list()
811 cpu->cpreg_values = g_renew(uint64_t, cpu->cpreg_values, arraylen); in kvm_arm_init_cpreg_list()
812 cpu->cpreg_vmstate_indexes = g_renew(uint64_t, cpu->cpreg_vmstate_indexes, in kvm_arm_init_cpreg_list()
814 cpu->cpreg_vmstate_values = g_renew(uint64_t, cpu->cpreg_vmstate_values, in kvm_arm_init_cpreg_list()
816 cpu->cpreg_array_len = arraylen; in kvm_arm_init_cpreg_list()
817 cpu->cpreg_vmstate_array_len = arraylen; in kvm_arm_init_cpreg_list()
819 for (i = 0, arraylen = 0; i < rlp->n; i++) { in kvm_arm_init_cpreg_list()
820 uint64_t regidx = rlp->reg[i]; in kvm_arm_init_cpreg_list()
824 cpu->cpreg_indexes[arraylen] = regidx; in kvm_arm_init_cpreg_list()
827 assert(cpu->cpreg_array_len == arraylen); in kvm_arm_init_cpreg_list()
834 ret = -EINVAL; in kvm_arm_init_cpreg_list()
871 for (i = 0; i < cpu->cpreg_array_len; i++) { in write_kvmstate_to_list()
872 uint64_t regidx = cpu->cpreg_indexes[i]; in write_kvmstate_to_list()
880 cpu->cpreg_values[i] = v32; in write_kvmstate_to_list()
884 ret = kvm_get_one_reg(cs, regidx, cpu->cpreg_values + i); in write_kvmstate_to_list()
902 for (i = 0; i < cpu->cpreg_array_len; i++) { in write_list_to_kvmstate()
903 uint64_t regidx = cpu->cpreg_indexes[i]; in write_list_to_kvmstate()
913 v32 = cpu->cpreg_values[i]; in write_list_to_kvmstate()
917 ret = kvm_set_one_reg(cs, regidx, cpu->cpreg_values + i); in write_list_to_kvmstate()
936 if (cpu->kvm_vtime_dirty) { in kvm_arm_cpu_pre_save()
937 *kvm_arm_get_cpreg_ptr(cpu, KVM_REG_ARM_TIMER_CNT) = cpu->kvm_vtime; in kvm_arm_cpu_pre_save()
953 if (cpu->kvm_adjvtime) { in kvm_arm_cpu_post_load()
954 cpu->kvm_vtime = *kvm_arm_get_cpreg_ptr(cpu, KVM_REG_ARM_TIMER_CNT); in kvm_arm_cpu_post_load()
955 cpu->kvm_vtime_dirty = true; in kvm_arm_cpu_post_load()
965 /* Re-init VCPU so that all registers are set to in kvm_arm_reset_vcpu()
970 fprintf(stderr, "kvm_arm_vcpu_init failed: %s\n", strerror(-ret)); in kvm_arm_reset_vcpu()
994 .mp_state = (cpu->power_state == PSCI_OFF) ? in kvm_arm_sync_mpstate_to_kvm()
1013 cpu->power_state = (mp_state.mp_state == KVM_MP_STATE_STOPPED) ? in kvm_arm_sync_mpstate_to_qemu()
1029 if (cpu->kvm_vtime_dirty) { in kvm_arm_get_virtual_time()
1033 ret = kvm_get_one_reg(CPU(cpu), KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime); in kvm_arm_get_virtual_time()
1039 cpu->kvm_vtime_dirty = true; in kvm_arm_get_virtual_time()
1052 if (!cpu->kvm_vtime_dirty) { in kvm_arm_put_virtual_time()
1056 ret = kvm_set_one_reg(CPU(cpu), KVM_REG_ARM_TIMER_CNT, &cpu->kvm_vtime); in kvm_arm_put_virtual_time()
1062 cpu->kvm_vtime_dirty = false; in kvm_arm_put_virtual_time()
1075 CPUARMState *env = &cpu->env; in kvm_put_vcpu_events()
1084 events.exception.serror_pending = env->serror.pending; in kvm_put_vcpu_events()
1090 events.exception.serror_has_esr = env->serror.has_esr; in kvm_put_vcpu_events()
1091 events.exception.serror_esr = env->serror.esr; in kvm_put_vcpu_events()
1112 CPUARMState *env = &cpu->env; in kvm_get_vcpu_events()
1127 env->serror.pending = events.exception.serror_pending; in kvm_get_vcpu_events()
1128 env->serror.has_esr = events.exception.serror_has_esr; in kvm_get_vcpu_events()
1129 env->serror.esr = events.exception.serror_esr; in kvm_get_vcpu_events()
1143 * FS[4] - DFSR[10]
1144 * FS[3:0] - DFSR[3:0]
1169 CPUARMState *env = &cpu->env; in kvm_arm_verify_ext_dabt_pending()
1194 CPUARMState *env = &cpu->env; in kvm_arch_pre_run()
1196 if (unlikely(env->ext_dabt_raised)) { in kvm_arch_pre_run()
1199 * otherwise risking indefinitely re-running the faulting instruction in kvm_arch_pre_run()
1202 * an IMPLEMENTATION DEFINED exception (for 32-bit EL1) in kvm_arch_pre_run()
1214 env->ext_dabt_raised = 0; in kvm_arch_pre_run()
1225 * We only need to sync timer states with user-space interrupt in kvm_arch_post_run()
1233 /* Synchronize our shadowed in-kernel device irq lines with the kvm ones */ in kvm_arch_post_run()
1234 if (run->s.regs.device_irq_level != cpu->device_irq_level) { in kvm_arch_post_run()
1235 switched_level = cpu->device_irq_level ^ run->s.regs.device_irq_level; in kvm_arch_post_run()
1240 qemu_set_irq(cpu->gt_timer_outputs[GTIMER_VIRT], in kvm_arch_post_run()
1241 !!(run->s.regs.device_irq_level & in kvm_arch_post_run()
1247 qemu_set_irq(cpu->gt_timer_outputs[GTIMER_PHYS], in kvm_arch_post_run()
1248 !!(run->s.regs.device_irq_level & in kvm_arch_post_run()
1254 qemu_set_irq(cpu->pmu_interrupt, in kvm_arch_post_run()
1255 !!(run->s.regs.device_irq_level & KVM_ARM_DEV_PMU)); in kvm_arch_post_run()
1260 qemu_log_mask(LOG_UNIMP, "%s: unhandled in-kernel device IRQ %x\n", in kvm_arch_post_run()
1265 cpu->device_irq_level = run->s.regs.device_irq_level; in kvm_arch_post_run()
1277 if (cpu->kvm_adjvtime) { in kvm_arm_vm_state_change()
1281 if (cpu->kvm_adjvtime) { in kvm_arm_vm_state_change()
1291 * ISV bit set to '0b0' -> no valid instruction syndrome
1299 CPUARMState *env = &cpu->env; in kvm_arm_handle_dabt_nisv()
1315 env->ext_dabt_raised = 1; in kvm_arm_handle_dabt_nisv()
1324 return -1; in kvm_arm_handle_dabt_nisv()
1336 * To minimise translating between kernel and user-space the kernel
1337 * ABI just provides user-space with the full exception syndrome
1343 int hsr_ec = syn_get_ec(debug_exit->hsr); in kvm_arm_handle_debug()
1345 CPUARMState *env = &cpu->env; in kvm_arm_handle_debug()
1352 if (cs->singlestep_enabled) { in kvm_arm_handle_debug()
1359 error_report("%s: guest single-step while debugging unsupported" in kvm_arm_handle_debug()
1361 __func__, env->pc, debug_exit->hsr); in kvm_arm_handle_debug()
1366 if (kvm_find_sw_breakpoint(cs, env->pc)) { in kvm_arm_handle_debug()
1371 if (find_hw_breakpoint(cs, env->pc)) { in kvm_arm_handle_debug()
1377 CPUWatchpoint *wp = find_hw_watchpoint(cs, debug_exit->far); in kvm_arm_handle_debug()
1379 cs->watchpoint_hit = wp; in kvm_arm_handle_debug()
1386 __func__, debug_exit->hsr, env->pc); in kvm_arm_handle_debug()
1390 * the guest. Let's re-use the existing TCG interrupt code to set in kvm_arm_handle_debug()
1393 cs->exception_index = EXCP_BKPT; in kvm_arm_handle_debug()
1394 env->exception.syndrome = debug_exit->hsr; in kvm_arm_handle_debug()
1395 env->exception.vaddress = debug_exit->far; in kvm_arm_handle_debug()
1396 env->exception.target_el = 1; in kvm_arm_handle_debug()
1409 switch (run->exit_reason) { in kvm_arch_handle_exit()
1411 if (kvm_arm_handle_debug(cpu, &run->debug.arch)) { in kvm_arch_handle_exit()
1417 ret = kvm_arm_handle_dabt_nisv(cpu, run->arm_nisv.esr_iss, in kvm_arch_handle_exit()
1418 run->arm_nisv.fault_ipa); in kvm_arch_handle_exit()
1421 qemu_log_mask(LOG_UNIMP, "%s: un-handled exit reason %d\n", in kvm_arch_handle_exit()
1422 __func__, run->exit_reason); in kvm_arch_handle_exit()
1463 ptr->dbg_wcr[i] = wp->wcr; in kvm_arm_copy_hw_debug_data()
1464 ptr->dbg_wvr[i] = wp->wvr; in kvm_arm_copy_hw_debug_data()
1468 ptr->dbg_bcr[i] = bp->bcr; in kvm_arm_copy_hw_debug_data()
1469 ptr->dbg_bvr[i] = bp->bvr; in kvm_arm_copy_hw_debug_data()
1476 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP; in kvm_arch_update_guest_debug()
1479 dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW; in kvm_arch_update_guest_debug()
1480 kvm_arm_copy_hw_debug_data(&dbg->arch); in kvm_arch_update_guest_debug()
1491 error_report("-machine kernel_irqchip=split is not supported on ARM."); in kvm_arch_irqchip_create()
1560 route->u.msi.address_lo = doorbell_gpa; in kvm_arch_fixup_msi_route()
1561 route->u.msi.address_hi = doorbell_gpa >> 32; in kvm_arch_fixup_msi_route()
1581 return (data - 32) & 0xffff; in kvm_arch_msi_data_to_gsi()
1589 uint64_t value = s->kvm_eager_split_size; in kvm_arch_get_eager_split_size()
1601 if (s->fd != -1) { in kvm_arch_set_eager_split_size()
1602 error_setg(errp, "Unable to set early-split-size after KVM has been initialized"); in kvm_arch_set_eager_split_size()
1611 error_setg(errp, "early-split-size must be a power of two"); in kvm_arch_set_eager_split_size()
1615 s->kvm_eager_split_size = value; in kvm_arch_set_eager_split_size()
1620 object_class_property_add(oc, "eager-split-size", "size", in kvm_arch_accel_class_init()
1624 object_class_property_set_description(oc, "eager-split-size", in kvm_arch_accel_class_init()
1639 return -ENOSYS; in kvm_arch_insert_hw_breakpoint()
1653 return -ENOSYS; in kvm_arch_remove_hw_breakpoint()
1667 static bool kvm_arm_set_device_attr(ARMCPU *cpu, struct kvm_device_attr *attr, in kvm_arm_set_device_attr() argument
1672 err = kvm_vcpu_ioctl(CPU(cpu), KVM_HAS_DEVICE_ATTR, attr); in kvm_arm_set_device_attr()
1674 error_report("%s: KVM_HAS_DEVICE_ATTR: %s", name, strerror(-err)); in kvm_arm_set_device_attr()
1678 err = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_DEVICE_ATTR, attr); in kvm_arm_set_device_attr()
1680 error_report("%s: KVM_SET_DEVICE_ATTR: %s", name, strerror(-err)); in kvm_arm_set_device_attr()
1689 struct kvm_device_attr attr = { in kvm_arm_pmu_init() local
1691 .attr = KVM_ARM_VCPU_PMU_V3_INIT, in kvm_arm_pmu_init()
1694 if (!cpu->has_pmu) { in kvm_arm_pmu_init()
1697 if (!kvm_arm_set_device_attr(cpu, &attr, "PMU")) { in kvm_arm_pmu_init()
1705 struct kvm_device_attr attr = { in kvm_arm_pmu_set_irq() local
1708 .attr = KVM_ARM_VCPU_PMU_V3_IRQ, in kvm_arm_pmu_set_irq()
1711 if (!cpu->has_pmu) { in kvm_arm_pmu_set_irq()
1714 if (!kvm_arm_set_device_attr(cpu, &attr, "PMU")) { in kvm_arm_pmu_set_irq()
1722 struct kvm_device_attr attr = { in kvm_arm_pvtime_init() local
1724 .attr = KVM_ARM_VCPU_PVTIME_IPA, in kvm_arm_pvtime_init()
1728 if (cpu->kvm_steal_time == ON_OFF_AUTO_OFF) { in kvm_arm_pvtime_init()
1731 if (!kvm_arm_set_device_attr(cpu, &attr, "PVTIME IPA")) { in kvm_arm_pvtime_init()
1741 if (cpu->kvm_steal_time == ON_OFF_AUTO_AUTO) { in kvm_arm_steal_time_finalize()
1742 if (!has_steal_time || !arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { in kvm_arm_steal_time_finalize()
1743 cpu->kvm_steal_time = ON_OFF_AUTO_OFF; in kvm_arm_steal_time_finalize()
1745 cpu->kvm_steal_time = ON_OFF_AUTO_ON; in kvm_arm_steal_time_finalize()
1747 } else if (cpu->kvm_steal_time == ON_OFF_AUTO_ON) { in kvm_arm_steal_time_finalize()
1749 error_setg(errp, "'kvm-steal-time' cannot be enabled " in kvm_arm_steal_time_finalize()
1752 } else if (!arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) { in kvm_arm_steal_time_finalize()
1760 error_setg(errp, "'kvm-steal-time' cannot be enabled " in kvm_arm_steal_time_finalize()
1799 .target = -1, in kvm_arm_sve_get_vls()
1822 for (i = KVM_ARM64_SVE_VLS_WORDS - 1; i >= 0; --i) { in kvm_arm_sve_get_vls()
1824 vq = 64 - clz64(vls[i]) + i * 64; in kvm_arm_sve_get_vls()
1840 uint64_t vls[KVM_ARM64_SVE_VLS_WORDS] = { cpu->sve_vq.map }; in kvm_arm_sve_set_vls()
1842 assert(cpu->sve_max_vq <= KVM_ARM64_SVE_VQ_MAX); in kvm_arm_sve_set_vls()
1859 CPUARMState *env = &cpu->env; in kvm_arch_init_vcpu()
1862 if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { in kvm_arch_init_vcpu()
1864 return -EINVAL; in kvm_arch_init_vcpu()
1870 memset(cpu->kvm_init_features, 0, sizeof(cpu->kvm_init_features)); in kvm_arch_init_vcpu()
1871 if (cs->start_powered_off) { in kvm_arch_init_vcpu()
1872 cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; in kvm_arch_init_vcpu()
1874 if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { in kvm_arch_init_vcpu()
1875 cpu->psci_version = QEMU_PSCI_VERSION_0_2; in kvm_arch_init_vcpu()
1876 cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; in kvm_arch_init_vcpu()
1879 cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_EL1_32BIT; in kvm_arch_init_vcpu()
1881 if (cpu->has_pmu) { in kvm_arch_init_vcpu()
1882 cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PMU_V3; in kvm_arch_init_vcpu()
1886 cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_SVE; in kvm_arch_init_vcpu()
1889 cpu->kvm_init_features[0] |= (1 << KVM_ARM_VCPU_PTRAUTH_ADDRESS | in kvm_arch_init_vcpu()
1914 * in the same 15-bits major 16-bits minor format that PSCI_VERSION in kvm_arch_init_vcpu()
1918 cpu->psci_version = psciver; in kvm_arch_init_vcpu()
1922 * When KVM is in use, PSCI is emulated in-kernel and not by qemu. in kvm_arch_init_vcpu()
1930 cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK; in kvm_arch_init_vcpu()
1944 CPUARMState *env = &cpu->env; in kvm_inject_arm_sea()
1948 c->exception_index = EXCP_DATA_ABORT; in kvm_inject_arm_sea()
1949 env->exception.target_el = 1; in kvm_inject_arm_sea()
1955 same_el = arm_current_el(env) == env->exception.target_el; in kvm_inject_arm_sea()
1958 env->exception.syndrome = esr; in kvm_inject_arm_sea()
1974 CPUARMState *env = &ARM_CPU(cs)->env; in kvm_arch_put_fpsimd()
2003 CPUARMState *env = &cpu->env; in kvm_arch_put_sve()
2009 r = sve_bswap64(tmp, &env->vfp.zregs[n].d[0], cpu->sve_max_vq * 2); in kvm_arch_put_sve()
2017 r = sve_bswap64(tmp, r = &env->vfp.pregs[n].p[0], in kvm_arch_put_sve()
2018 DIV_ROUND_UP(cpu->sve_max_vq * 2, 8)); in kvm_arch_put_sve()
2025 r = sve_bswap64(tmp, &env->vfp.pregs[FFR_PRED_NUM].p[0], in kvm_arch_put_sve()
2026 DIV_ROUND_UP(cpu->sve_max_vq * 2, 8)); in kvm_arch_put_sve()
2043 CPUARMState *env = &cpu->env; in kvm_arch_put_registers()
2046 * AArch64 registers before pushing them out to 64-bit KVM. in kvm_arch_put_registers()
2054 &env->xregs[i]); in kvm_arch_put_registers()
2065 ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]); in kvm_arch_put_registers()
2070 ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]); in kvm_arch_put_registers()
2086 ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc); in kvm_arch_put_registers()
2091 ret = kvm_set_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]); in kvm_arch_put_registers()
2099 * ensure that any modifications to env->spsr are correctly in kvm_arch_put_registers()
2104 i = bank_number(env->uncached_cpsr & CPSR_M); in kvm_arch_put_registers()
2105 env->banked_spsr[i] = env->spsr; in kvm_arch_put_registers()
2108 /* KVM 0-4 map to QEMU banks 1-5 */ in kvm_arch_put_registers()
2111 &env->banked_spsr[i + 1]); in kvm_arch_put_registers()
2141 return -EINVAL; in kvm_arch_put_registers()
2159 CPUARMState *env = &ARM_CPU(cs)->env; in kvm_arch_get_fpsimd()
2187 CPUARMState *env = &cpu->env; in kvm_arch_get_sve()
2192 r = &env->vfp.zregs[n].d[0]; in kvm_arch_get_sve()
2197 sve_bswap64(r, r, cpu->sve_max_vq * 2); in kvm_arch_get_sve()
2201 r = &env->vfp.pregs[n].p[0]; in kvm_arch_get_sve()
2206 sve_bswap64(r, r, DIV_ROUND_UP(cpu->sve_max_vq * 2, 8)); in kvm_arch_get_sve()
2209 r = &env->vfp.pregs[FFR_PRED_NUM].p[0]; in kvm_arch_get_sve()
2214 sve_bswap64(r, r, DIV_ROUND_UP(cpu->sve_max_vq * 2, 8)); in kvm_arch_get_sve()
2227 CPUARMState *env = &cpu->env; in kvm_arch_get_registers()
2231 &env->xregs[i]); in kvm_arch_get_registers()
2237 ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.sp), &env->sp_el[0]); in kvm_arch_get_registers()
2242 ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(sp_el1), &env->sp_el[1]); in kvm_arch_get_registers()
2252 env->aarch64 = ((val & PSTATE_nRW) == 0); in kvm_arch_get_registers()
2264 ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(regs.pc), &env->pc); in kvm_arch_get_registers()
2270 * incoming AArch64 regs received from 64-bit KVM. in kvm_arch_get_registers()
2278 ret = kvm_get_one_reg(cs, AARCH64_CORE_REG(elr_el1), &env->elr_el[1]); in kvm_arch_get_registers()
2285 * KVM SPSRs 0-4 map to QEMU banks 1-5 in kvm_arch_get_registers()
2289 &env->banked_spsr[i + 1]); in kvm_arch_get_registers()
2297 i = bank_number(env->uncached_cpsr & CPSR_M); in kvm_arch_get_registers()
2298 env->spsr = env->banked_spsr[i]; in kvm_arch_get_registers()
2328 return -EINVAL; in kvm_arch_get_registers()
2351 kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) { in kvm_arch_on_sigbus_vcpu()
2392 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) || in kvm_arch_insert_sw_breakpoint()
2393 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk_insn, 4, 1)) { in kvm_arch_insert_sw_breakpoint()
2394 return -EINVAL; in kvm_arch_insert_sw_breakpoint()
2403 if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk, 4, 0) || in kvm_arch_remove_sw_breakpoint()
2405 cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 1)) { in kvm_arch_remove_sw_breakpoint()
2406 return -EINVAL; in kvm_arch_remove_sw_breakpoint()
2421 * MTE on KVM is enabled on a per-VM basis (and retrying doesn't make in kvm_arm_enable_mte()
2428 error_setg_errno(errp, -ret, "Failed to enable KVM_CAP_ARM_MTE"); in kvm_arm_enable_mte()
2444 cpu->kvm_mte = true; in kvm_arm_enable_mte()
2451 CPUARMState *env = &cpu->env; in arm_cpu_kvm_set_irq()
2470 env->irq_line_state |= linestate_bit; in arm_cpu_kvm_set_irq()
2472 env->irq_line_state &= ~linestate_bit; in arm_cpu_kvm_set_irq()
2474 kvm_arm_set_irq(cs->cpu_index, KVM_ARM_IRQ_TYPE_CPU, irq_id, !!level); in arm_cpu_kvm_set_irq()