// Mask all interrupts until they are enabled....
ioapic->redir_tbl[i].mask = 1;
}
+
+ // special case redir_tbl[0] for pin 0 as ExtInt for Virtual Wire Mode
+ ioapic->redir_tbl[0].del_mode=EXTINT;
+ ioapic->redir_tbl[0].mask=0;
}
}
}
+ PrintDebug("ioapic %u: IOAPIC Read at %p gave value 0x%x\n", ioapic->ioapic_id.val, (void *)guest_addr, *op_val);
+
return length;
}
irq_entry = &(ioapic->redir_tbl[irq]);
if (irq_entry->mask == 0) {
+
PrintDebug("ioapic %u: IOAPIC Signalling APIC to raise INTR %d\n", ioapic->ioapic_id.val, irq_entry->vec);
+
// the format of the redirection table entry is just slightly
// different than that of the lapic's cmd register, which is the other
// way an IPI is initiated. So we will translate
icr.dst_shorthand=0; // no shorthand
icr.rsvd2=0;
- v3_icc_send_ipi(ioapic->icc_bus, ioapic->ioapic_id.val,icr.val);
+ v3_icc_send_ipi(ioapic->icc_bus, ioapic->ioapic_id.val,icr.val, irq);
}
return 0;
static int ioapic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
struct vm_device * icc_bus = v3_find_dev(vm, v3_cfg_val(cfg, "bus"));
- char * name = v3_cfg_val(cfg, "name");
+ char * dev_id = v3_cfg_val(cfg, "ID");
if (!icc_bus) {
PrintError("ioapic: Could not locate ICC BUS device (%s)\n", v3_cfg_val(cfg, "bus"));
ioapic->icc_bus = icc_bus;
- struct vm_device * dev = v3_allocate_device(name, &dev_ops, ioapic);
+ struct vm_device * dev = v3_allocate_device(dev_id, &dev_ops, ioapic);
if (v3_attach_device(vm, dev) == -1) {
- PrintError("ioapic: Could not attach device %s\n", name);
+ PrintError("ioapic: Could not attach device %s\n", dev_id);
return -1;
}