Lines Matching +full:- +full:kvm

4  * PAPR Virtualized Interrupt System, aka ICS/ICP aka xics, in-kernel emulation
31 #include "system/kvm.h"
37 #include "qemu/config-file.h"
38 #include "qemu/error-report.h"
42 static int kernel_xics_fd = -1;
63 * ICP-KVM
70 /* The KVM XICS device is not in use */ in icp_get_kvm_state()
71 if (kernel_xics_fd == -1) { in icp_get_kvm_state()
76 if (!icp->cs) { in icp_get_kvm_state()
80 ret = kvm_get_one_reg(icp->cs, KVM_REG_PPC_ICP_STATE, &state); in icp_get_kvm_state()
82 error_report("Unable to retrieve KVM interrupt controller state" in icp_get_kvm_state()
83 " for CPU %ld: %s", kvm_arch_vcpu_id(icp->cs), strerror(errno)); in icp_get_kvm_state()
87 icp->xirr = state >> KVM_REG_PPC_ICP_XISR_SHIFT; in icp_get_kvm_state()
88 icp->mfrr = (state >> KVM_REG_PPC_ICP_MFRR_SHIFT) in icp_get_kvm_state()
90 icp->pending_priority = (state >> KVM_REG_PPC_ICP_PPRI_SHIFT) in icp_get_kvm_state()
101 if (icp->cs) { in icp_synchronize_state()
102 run_on_cpu(icp->cs, do_icp_synchronize_state, RUN_ON_CPU_HOST_PTR(icp)); in icp_synchronize_state()
111 /* The KVM XICS device is not in use */ in icp_set_kvm_state()
112 if (kernel_xics_fd == -1) { in icp_set_kvm_state()
117 if (!icp->cs) { in icp_set_kvm_state()
121 state = ((uint64_t)icp->xirr << KVM_REG_PPC_ICP_XISR_SHIFT) in icp_set_kvm_state()
122 | ((uint64_t)icp->mfrr << KVM_REG_PPC_ICP_MFRR_SHIFT) in icp_set_kvm_state()
123 | ((uint64_t)icp->pending_priority << KVM_REG_PPC_ICP_PPRI_SHIFT); in icp_set_kvm_state()
125 ret = kvm_set_one_reg(icp->cs, KVM_REG_PPC_ICP_STATE, &state); in icp_set_kvm_state()
127 error_setg_errno(errp, -ret, in icp_set_kvm_state()
128 "Unable to restore KVM interrupt controller state (0x%" in icp_set_kvm_state()
130 kvm_arch_vcpu_id(icp->cs)); in icp_set_kvm_state()
145 /* The KVM XICS device is not in use */ in icp_kvm_realize()
146 if (kernel_xics_fd == -1) { in icp_kvm_realize()
150 cs = icp->cs; in icp_kvm_realize()
155 * which was hot-removed earlier we don't have to renable in icp_kvm_realize()
159 if (enabled_icp->vcpu_id == vcpu_id) { in icp_kvm_realize()
171 error_append_hint(&local_err, "Try -smp maxcpus=N with N < %u\n", in icp_kvm_realize()
172 MACHINE(qdev_get_machine())->smp.max_cpus); in icp_kvm_realize()
178 enabled_icp->vcpu_id = vcpu_id; in icp_kvm_realize()
183 * ICS-KVM
190 /* The KVM XICS device is not in use */ in ics_get_kvm_state()
191 if (kernel_xics_fd == -1) { in ics_get_kvm_state()
195 for (i = 0; i < ics->nr_irqs; i++) { in ics_get_kvm_state()
196 ICSIRQState *irq = &ics->irqs[i]; in ics_get_kvm_state()
203 i + ics->offset, &state, false, &error_fatal); in ics_get_kvm_state()
205 irq->server = state & KVM_XICS_DESTINATION_MASK; in ics_get_kvm_state()
206 irq->saved_priority = (state >> KVM_XICS_PRIORITY_SHIFT) in ics_get_kvm_state()
214 * are done with the ibm,int-off and ibm,int-on RTAS calls. in ics_get_kvm_state()
217 irq->priority = 0xff; in ics_get_kvm_state()
219 irq->priority = irq->saved_priority; in ics_get_kvm_state()
222 irq->status = 0; in ics_get_kvm_state()
225 irq->status |= XICS_STATUS_ASSERTED; in ics_get_kvm_state()
228 * A pending edge-triggered interrupt (or MSI) in ics_get_kvm_state()
234 irq->status |= XICS_STATUS_MASKED_PENDING in ics_get_kvm_state()
239 irq->status |= XICS_STATUS_PRESENTED; in ics_get_kvm_state()
242 irq->status |= XICS_STATUS_QUEUED; in ics_get_kvm_state()
255 ICSIRQState *irq = &ics->irqs[srcno]; in ics_set_kvm_state_one()
258 /* The KVM XICS device is not in use */ in ics_set_kvm_state_one()
259 if (kernel_xics_fd == -1) { in ics_set_kvm_state_one()
263 state = irq->server; in ics_set_kvm_state_one()
264 state |= (uint64_t)(irq->saved_priority & KVM_XICS_PRIORITY_MASK) in ics_set_kvm_state_one()
266 if (irq->priority != irq->saved_priority) { in ics_set_kvm_state_one()
267 assert(irq->priority == 0xff); in ics_set_kvm_state_one()
270 if (irq->priority == 0xff) { in ics_set_kvm_state_one()
274 if (irq->flags & XICS_FLAGS_IRQ_LSI) { in ics_set_kvm_state_one()
276 if (irq->status & XICS_STATUS_ASSERTED) { in ics_set_kvm_state_one()
280 if (irq->status & XICS_STATUS_MASKED_PENDING) { in ics_set_kvm_state_one()
284 if (irq->status & XICS_STATUS_PRESENTED) { in ics_set_kvm_state_one()
287 if (irq->status & XICS_STATUS_QUEUED) { in ics_set_kvm_state_one()
292 srcno + ics->offset, &state, true, errp); in ics_set_kvm_state_one()
304 /* The KVM XICS device is not in use */ in ics_set_kvm_state()
305 if (kernel_xics_fd == -1) { in ics_set_kvm_state()
309 for (i = 0; i < ics->nr_irqs; i++) { in ics_set_kvm_state()
330 /* The KVM XICS device should be in use */ in ics_kvm_set_irq()
331 assert(kernel_xics_fd != -1); in ics_kvm_set_irq()
333 args.irq = srcno + ics->offset; in ics_kvm_set_irq()
334 if (ics->irqs[srcno].flags & XICS_FLAGS_IRQ_MSI) { in ics_kvm_set_irq()
357 * The KVM XICS device already in use. This is the case when in xics_kvm_connect()
358 * rebooting under the XICS-only interrupt mode. in xics_kvm_connect()
360 if (kernel_xics_fd != -1) { in xics_kvm_connect()
366 "KVM and IRQ_XICS capability must be present for in-kernel XICS"); in xics_kvm_connect()
367 return -1; in xics_kvm_connect()
370 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_SET_XIVE, "ibm,set-xive"); in xics_kvm_connect()
372 error_setg_errno(&local_err, -rc, in xics_kvm_connect()
373 "kvmppc_define_rtas_kernel_token: ibm,set-xive"); in xics_kvm_connect()
377 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_GET_XIVE, "ibm,get-xive"); in xics_kvm_connect()
379 error_setg_errno(&local_err, -rc, in xics_kvm_connect()
380 "kvmppc_define_rtas_kernel_token: ibm,get-xive"); in xics_kvm_connect()
384 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_ON, "ibm,int-on"); in xics_kvm_connect()
386 error_setg_errno(&local_err, -rc, in xics_kvm_connect()
387 "kvmppc_define_rtas_kernel_token: ibm,int-on"); in xics_kvm_connect()
391 rc = kvmppc_define_rtas_kernel_token(RTAS_IBM_INT_OFF, "ibm,int-off"); in xics_kvm_connect()
393 error_setg_errno(&local_err, -rc, in xics_kvm_connect()
394 "kvmppc_define_rtas_kernel_token: ibm,int-off"); in xics_kvm_connect()
398 /* Create the KVM XICS device */ in xics_kvm_connect()
401 error_setg_errno(&local_err, -rc, "Error on KVM_CREATE_DEVICE for XICS"); in xics_kvm_connect()
405 /* Tell KVM about the # of VCPUs we may have (POWER9 and newer only) */ in xics_kvm_connect()
424 icp_kvm_realize(DEVICE(spapr_cpu_state(cpu)->icp), &local_err); in xics_kvm_connect()
430 /* Update the KVM sources */ in xics_kvm_connect()
439 icp_set_kvm_state(spapr_cpu_state(cpu)->icp, &local_err); in xics_kvm_connect()
450 return -1; in xics_kvm_connect()
456 * Only on P9 using the XICS-on XIVE KVM device: in xics_kvm_disconnect()
458 * When the KVM device fd is closed, the device is destroyed and in xics_kvm_disconnect()
462 if (kernel_xics_fd != -1) { in xics_kvm_disconnect()
464 kernel_xics_fd = -1; in xics_kvm_disconnect()
467 kvmppc_define_rtas_kernel_token(0, "ibm,set-xive"); in xics_kvm_disconnect()
468 kvmppc_define_rtas_kernel_token(0, "ibm,get-xive"); in xics_kvm_disconnect()
469 kvmppc_define_rtas_kernel_token(0, "ibm,int-on"); in xics_kvm_disconnect()
470 kvmppc_define_rtas_kernel_token(0, "ibm,int-off"); in xics_kvm_disconnect()
482 * support destruction of a KVM XICS device while the VM is running.
483 * Required to start a spapr machine with ic-mode=dual,kernel-irqchip=on.
492 * The error is ignored on purpose. The KVM XICS setup code in xics_kvm_has_broken_disconnect()