From: Peter Dinda Date: Fri, 4 Feb 2011 23:37:47 +0000 (-0600) Subject: Corrected APIC IPI and IRQ dispatch routines X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=11799589ba31ee388d35ec764cd69e837880ba08;p=palacios.git Corrected APIC IPI and IRQ dispatch routines Noted assumption in vcore startup --- diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index 7f70d9c..1872bb3 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -227,6 +227,8 @@ struct apic_dev_state { + + static int apic_read(struct guest_info * core, addr_t guest_addr, void * dst, uint_t length, void * priv_data); static int apic_write(struct guest_info * core, addr_t guest_addr, void * src, uint_t length, void * priv_data); @@ -704,14 +706,15 @@ static int route_ipi(struct apic_dev_state * apic_dev, dest_apic = &(apic_dev->apics[icr->dst]); - PrintDebug("route_ipi: IPI %s %u from apic %p to %s %s %u (icr=0x%llx)\n", + PrintDebug("route_ipi: IPI %s %u from apic %p to %s %s %u (icr=0x%llx) (destapic=%p\n", deliverymode_str[icr->del_mode], icr->vec, src_apic, (icr->dst_mode == 0) ? "(physical)" : "(logical)", shorthand_str[icr->dst_shorthand], icr->dst, - icr->val); + icr->val, + dest_apic); switch (icr->dst_shorthand) { @@ -729,7 +732,6 @@ static int route_ipi(struct apic_dev_state * apic_dev, // logical delivery int i; uint8_t mda = icr->dst; - for (i = 0; i < apic_dev->num_apics; i++) { dest_apic = &(apic_dev->apics[i]); int del_flag = should_deliver_ipi(dest_apic->core, dest_apic, mda); @@ -1297,13 +1299,13 @@ static int apic_get_intr_number(struct guest_info * core, void * private_data) { int v3_apic_send_ipi(struct v3_vm_info * vm, struct v3_gen_ipi * ipi, void * dev_data) { - struct apic_dev_state * apic_dev = (struct apic_dev_state *)dev_data; + struct apic_dev_state * apic_dev = (struct apic_dev_state *) + (((struct vm_device *)dev_data)->private_data); struct int_cmd_reg tmp_icr; // zero out all the fields tmp_icr.val = 0; - tmp_icr.vec = ipi->vector; tmp_icr.del_mode = ipi->mode; tmp_icr.dst_mode = ipi->logical; @@ -1317,7 +1319,8 @@ int v3_apic_send_ipi(struct v3_vm_info * vm, struct v3_gen_ipi * ipi, void * dev int v3_apic_raise_intr(struct v3_vm_info * vm, uint32_t irq, uint32_t dst, void * dev_data) { - struct apic_dev_state * apic_dev = (struct apic_dev_state *)(dev_data); + struct apic_dev_state * apic_dev = (struct apic_dev_state *) + (((struct vm_device*)dev_data)->private_data); struct apic_state * apic = &(apic_dev->apics[dst]); PrintDebug("apic %u core ?: raising interrupt IRQ %u (dst = %u).\n", apic->lapic_id.val, irq, dst); @@ -1554,8 +1557,8 @@ static int apic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { #ifdef CONFIG_DEBUG_APIC for (i = 0; i < vm->num_cores; i++) { struct apic_state * apic = &(apic_dev->apics[i]); - PrintDebug("apic: sanity check: apic %u (at %p) has id %u and msr value %llx\n", - i, apic, apic->lapic_id.val, apic->base_addr_msr.value); + PrintDebug("apic: sanity check: apic %u (at %p) has id %u and msr value %llx and core at %p\n", + i, apic, apic->lapic_id.val, apic->base_addr_msr.value,apic->core); } #endif diff --git a/palacios/src/devices/io_apic.c b/palacios/src/devices/io_apic.c index a1d3d9f..010f4ab 100644 --- a/palacios/src/devices/io_apic.c +++ b/palacios/src/devices/io_apic.c @@ -277,7 +277,7 @@ static int ioapic_raise_irq(struct v3_vm_info * vm, void * private_data, int irq if (irq_entry->mask == 0) { struct v3_gen_ipi ipi; - PrintDebug("ioapic %u: IOAPIC Signalling APIC to raise INTR %d\n", + PrintDebug("ioapic %u: IOAPIC Signaling APIC to raise INTR %d\n", ioapic->ioapic_id.id, irq_entry->vec); diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 0060bc2..dca1018 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -279,6 +279,7 @@ int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) { void * core_thread = NULL; struct guest_info * core = &(vm->cores[vcore_id]); + /* This assumes that the core 0 thread has been mapped to physical core 0 */ if (i == V3_Get_CPU()) { // We skip the local CPU, because it is reserved for vcore 0 continue;