struct IRQState {
Object parent_obj;
+ bool printed;
qemu_irq_ack_fn ack_cb;
void *ack_opaque;
void qemu_set_irq_ack_callback(qemu_irq irq, qemu_irq_ack_fn cb, void *opaque)
{
if (irq) {
+ printf("Set ack callback on %p to %p/%p\n", irq, cb, opaque);
irq->ack_cb = cb;
irq->ack_opaque = opaque;
- }
+ irq->printed = false;
+ } else printf("no irq!\n");
}
bool qemu_notify_irq_ack(qemu_irq irq)
{
if (irq && irq->ack_cb) {
+ if (!irq->printed) {
+ printf("Calling ack callback on %p\n", irq);
+ irq->printed = true;
+ }
return irq->ack_cb(irq, irq->ack_opaque);
}
+ if (irq && !irq->printed) {
+ printf("No ack callback on %p\n", irq);
+ irq->printed = true;
+ }
return false;
}
EvtchnInfoList *qmp_xen_event_list(Error **errp)
{
- error_setg(errp, "Xen event channel emulation not enabled");
+ error_setg(errp, "Xen event channel emulation not enabled\n");
return NULL;
}
void qmp_xen_event_inject(uint32_t port, Error **errp)
{
- error_setg(errp, "Xen event channel emulation not enabled");
+ error_setg(errp, "Xen event channel emulation not enabled\n");
}
for (i = 0; i < GSI_NUM_PINS; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(s), i, system_gsis[i]);
+ printf("Xen connect gsi %p to system gsi %p\n",
+ s->gsis[i], system_gsis[i]);
}
}
XenEvtchnState *s = xen_evtchn_singleton;
if (s && s->callback_gsi && s->callback_gsi < GSI_NUM_PINS) {
+ printf("set level on %p(%d) to %d\n", s->gsis[s->callback_gsi], s->callback_gsi, level);
qemu_set_irq(s->gsis[s->callback_gsi], level);
}
}
struct vcpu_info *vi = kvm_xen_get_vcpu_info_hva(0);
if (vi && !vi->evtchn_upcall_pending) {
+ printf("resample turns evtchn irq off\n");
return true;
}
+ printf("no turn off\n");
return false;
}
-
int xen_evtchn_set_callback_param(uint64_t param)
{
XenEvtchnState *s = xen_evtchn_singleton;
for (size_t i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i];
+ printf("Set ack on %p (i8259 %zd) to %p\n",
+ gsi_state->i8259_irq[i], i, gsi_state->gsi_irq[i]);
qemu_set_irq_ack_callback(gsi_state->i8259_irq[i], gsi_ack_handler,
gsi_state->gsi_irq[i]);
* opaque pointer that was registered is the GSI irq. Propagate
* the notifiation.
*/
+ printf("Passing on ack from %p to %p\n", irq, opaque);
return qemu_notify_irq_ack(opaque);
}
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
gsi_state->ioapic_irq[i] = qdev_get_gpio_in(dev, i);
+ printf("Set ack on %p (ioapic %d) to %p\n",
+ gsi_state->ioapic_irq[i], i, gsi_state->gsi_irq[i]);
qemu_set_irq_ack_callback(gsi_state->ioapic_irq[i], gsi_ack_handler,
gsi_state->gsi_irq[i]);
}
for (i = 0; i < IOAPIC_NUM_PINS; i++) {
gsi_state->ioapic2_irq[i] = qdev_get_gpio_in(dev, i);
+ printf("Set ack on %p (ioapic %d) to %p\n",
+ gsi_state->ioapic2_irq[i], i, gsi_state->gsi_irq[IO_APIC_SECONDARY_IRQBASE + i]);
qemu_set_irq_ack_callback(gsi_state->ioapic2_irq[i], gsi_ack_handler,
gsi_state->gsi_irq[IO_APIC_SECONDARY_IRQBASE + i]);
}
if (!(s->elcr & (1 << irq))) {
s->irr &= ~(1 << irq);
} else if (qemu_notify_irq_ack(qdev_get_gpio_in(DEVICE(s), irq))) {
+ printf("i8259 ack notify returned true\n");
s->irr &= ~(1 << irq);
s->last_irr &= ~(1 << irq);
}
kvm_resample_fd_notify(n);
#endif
if (qemu_notify_irq_ack(qdev_get_gpio_in(DEVICE(s), n))) {
+ printf("clearing pin %d for notifier\n", n);
s->irr &= ~(1 << n);
}
if (!(entry & IOAPIC_LVT_REMOTE_IRR)) {
/*
* Allows a callback to be invoked when an IRQ is acked at the irqchip,
- * allowing it to be resampled and reasserted as appropriate. If the
- * callback function returns true, the interrupt is deasserted at the
- * irqchip.
+ * allowing it to be resampled and reasserted as appropriate.
*/
typedef bool (*qemu_irq_ack_fn)(qemu_irq irq, void *opaque);
void qemu_set_irq_ack_callback(qemu_irq irq, qemu_irq_ack_fn cb, void *opaque);
/* If the evtchn_upcall_pending flag is cleared, turn the GSI off. */
if (!vi->evtchn_upcall_pending) {
env->xen_callback_asserted = false;
- //xen_evtchn_set_callback_level(0);
+ printf("already off?\n");
+// xen_evtchn_set_callback_level(0);
}
}
case HVM_PARAM_CALLBACK_TYPE_PCI_INTX:
if (vcpu_id == 0) {
xen_evtchn_set_callback_level(1);
- //X86_CPU(cs)->env.xen_callback_asserted = true;
+ X86_CPU(cs)->env.xen_callback_asserted = true;
}
break;
}