X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fio_apic.c;h=94c8ce979fc743a43e6325835dcfd890ed96d982;hb=e5e029575affad90c19ca038a3b780820535d421;hp=263f94064d15bef1ba410d26b756dc03a97350cf;hpb=300810f123725663d5f7ae638ff6cb93d0a89ae5;p=palacios-OLD.git diff --git a/palacios/src/devices/io_apic.c b/palacios/src/devices/io_apic.c index 263f940..94c8ce9 100644 --- a/palacios/src/devices/io_apic.c +++ b/palacios/src/devices/io_apic.c @@ -155,6 +155,10 @@ static void init_ioapic_state(struct io_apic_state * ioapic, uint32_t id) { // 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; } @@ -198,6 +202,8 @@ static int ioapic_read(struct guest_info * core, addr_t guest_addr, void * dst, } } + PrintDebug("ioapic %u: IOAPIC Read at %p gave value 0x%x\n", ioapic->ioapic_id.val, (void *)guest_addr, *op_val); + return length; } @@ -267,8 +273,10 @@ static int ioapic_raise_irq(struct v3_vm_info * vm, void * private_data, int irq 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 @@ -283,7 +291,7 @@ static int ioapic_raise_irq(struct v3_vm_info * vm, void * private_data, int irq 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; @@ -320,7 +328,7 @@ static struct v3_device_ops dev_ops = { 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")); @@ -333,11 +341,11 @@ static int ioapic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { 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; }