X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fapic.c;h=c051bc87a91249972dbbef80bd60852c4d0bbf4e;hb=35a7784f058e9f6948e1ec455ce2c6c3d467330b;hp=348fff7b971000b0d2ebbee2a2aad119ed0a2639;hpb=cd89b672b4f7e1b64c86ff0234a9935946533590;p=palacios.git diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index 348fff7..c051bc8 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -135,10 +135,6 @@ typedef enum { APIC_TMR_INT, APIC_THERM_INT, APIC_PERF_INT, #define EXT_INT_LOC_VEC_TBL_OFFSET2 0x520 // 0x500 - 0x530 #define EXT_INT_LOC_VEC_TBL_OFFSET3 0x530 // 0x500 - 0x530 - - - - struct apic_msr { union { uint64_t value; @@ -155,7 +151,9 @@ struct apic_msr { -typedef enum {INIT_ST, SIPI, STARTED} ipi_state_t; +typedef enum {INIT_ST, + SIPI, + STARTED} ipi_state_t; struct apic_dev_state; @@ -348,22 +346,23 @@ static int activate_apic_irq(struct apic_state * apic, uint32_t irq_num) { if (irq_num <= 15) { - PrintError("apic %u: core ?: Attempting to raise an invalid interrupt: %d\n", apic->lapic_id.val,irq_num); + PrintError("apic %u: core %d: Attempting to raise an invalid interrupt: %d\n", + apic->lapic_id.val, apic->core->cpu_id, irq_num); return -1; } - PrintDebug("apic %u: core ?: Raising APIC IRQ %d\n", apic->lapic_id.val, irq_num); + PrintDebug("apic %u: core %d: Raising APIC IRQ %d\n", apic->lapic_id.val, apic->core->cpu_id, irq_num); if (*req_location & flag) { - //V3_Print("Interrupts coallescing\n"); + PrintDebug("Interrupt %d coallescing\n", irq_num); } if (*en_location & flag) { *req_location |= flag; } else { - PrintDebug("apic %u: core ?: Interrupt not enabled... %.2x\n", - apic->lapic_id.val, *en_location); + PrintDebug("apic %u: core %d: Interrupt not enabled... %.2x\n", + apic->lapic_id.val, apic->core->cpu_id,*en_location); return 0; } @@ -557,7 +556,7 @@ static int should_deliver_ipi(struct guest_info * dst_core, return 1; } - return should_deliver_cluster_ipi(dst_core, dst_apic, mda); + return should_deliver_flat_ipi(dst_core, dst_apic, mda); } else if (dst_apic->dst_fmt.model == 0x0) { if (mda == 0xff) { @@ -565,7 +564,7 @@ static int should_deliver_ipi(struct guest_info * dst_core, return 1; } - return should_deliver_flat_ipi(dst_core, dst_apic, mda); + return should_deliver_cluster_ipi(dst_core, dst_apic, mda); } else { PrintError("apic %u core %u: invalid destination format register value 0x%x for logical mode delivery.\n", dst_apic->lapic_id.val, dst_core->cpu_id, dst_apic->dst_fmt.model); @@ -584,7 +583,7 @@ static int deliver_ipi(struct apic_state * src_apic, case 0: //fixed case 1: // lowest priority - PrintDebug(" delivering IRQ to core %u\n", dst_core->cpu_id); + PrintDebug("delivering IRQ %d to core %u\n", vector, dst_core->cpu_id); activate_apic_irq(dst_apic, vector); @@ -596,7 +595,7 @@ static int deliver_ipi(struct apic_state * src_apic, // host maitains logical proc->phsysical proc PrintDebug(" non-local core, forcing it to exit\n"); - v3_interrupt_cpu(core->vm_info, dst_core->cpu_id, 0); + v3_interrupt_cpu(dst_core->vm_info, dst_core->cpu_id, 0); } break; @@ -609,7 +608,7 @@ static int deliver_ipi(struct apic_state * src_apic, // Sanity check if (dst_apic->ipi_state != INIT_ST) { PrintError(" Warning: core %u is not in INIT state (mode = %d), ignored\n", - dst_core->cpu_id, dst_core->cpu_mode); + dst_core->cpu_id, dst_apic->ipi_state); // Only a warning, since INIT INIT SIPI is common break; } @@ -632,7 +631,7 @@ static int deliver_ipi(struct apic_state * src_apic, // Sanity check if (dst_apic->ipi_state != SIPI) { PrintError(" core %u is not in SIPI state (mode = %d), ignored!\n", - dst_core->cpu_id, dst_core->cpu_mode); + dst_core->cpu_id, dst_apic->ipi_state); break; } @@ -684,8 +683,8 @@ static int route_ipi(struct apic_dev_state * apic_dev, struct int_cmd_reg * icr) { struct apic_state * dest_apic = NULL; - PrintDebug("route_ipi: src_apic=%p, icr_data=%x", - src_apic, icr_val); + PrintDebug("route_ipi: src_apic=%p, icr_data=%p\n", + src_apic, (void *)(addr_t)icr->val); if ((icr->dst_mode == 0) && (icr->dst >= apic_dev->num_apics)) { @@ -757,7 +756,7 @@ static int route_ipi(struct apic_dev_state * apic_dev, } } else { // logical delivery - PrintError("icc_bus: use of logical delivery in self is not yet supported.\n"); + PrintError("use of logical delivery in self is not yet supported.\n"); return -1; } break; @@ -1307,8 +1306,7 @@ int v3_apic_send_ipi(struct v3_vm_info * vm, struct vm_device * dev, tmp_icr.dst = ipi->dst; - route_ipi(apic_dev, NULL, &tmp_icr); - return -1; + return route_ipi(apic_dev, NULL, &tmp_icr); }