X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fdevices%2Fapic.c;fp=palacios%2Fsrc%2Fdevices%2Fapic.c;h=348fff7b971000b0d2ebbee2a2aad119ed0a2639;hb=cd89b672b4f7e1b64c86ff0234a9935946533590;hp=f240957a9d93fc321791de9a9e1c34a17703d4fd;hpb=f40945e5a406b48b7b5ee678a3d8d8f0b56f7d74;p=palacios-OLD.git diff --git a/palacios/src/devices/apic.c b/palacios/src/devices/apic.c index f240957..348fff7 100644 --- a/palacios/src/devices/apic.c +++ b/palacios/src/devices/apic.c @@ -32,6 +32,25 @@ #define PrintDebug(fmt, args...) #endif +#ifdef CONFIG_DEBUG_APIC +static char *shorthand_str[] = { + "(no shorthand)", + "(self)", + "(all)", + "(all-but-me)", +}; + +static char *deliverymode_str[] = { + "(fixed)", + "(lowest priority)", + "(SMI)", + "(reserved)", + "(NMI)", + "(INIT)", + "(Start Up)", + "(ExtInt)", +}; +#endif typedef enum { APIC_TMR_INT, APIC_THERM_INT, APIC_PERF_INT, APIC_LINT0_INT, APIC_LINT1_INT, APIC_ERR_INT } apic_irq_type_t; @@ -329,7 +348,7 @@ 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 ?: Attempting to raise an invalid interrupt: %d\n", apic->lapic_id.val,irq_num); return -1; } @@ -502,7 +521,7 @@ static inline int should_deliver_cluster_ipi(struct guest_info * dst_core, return 1; } else { PrintDebug("apic %u core %u: rejecting clustered IRQ (mda 0x%x != log_dst 0x%x)\n", - dst_apic->lapic_id.val, dst_core->cpu_id, mda, dst_ + dst_apic->lapic_id.val, dst_core->cpu_id, mda, dst_apic->log_dst.dst_log_id); return 0; } @@ -633,7 +652,7 @@ static int deliver_ipi(struct apic_state * src_apic, dst_core->segments.cs.base = vector << 12; PrintDebug(" SIPI delivery (0x%x -> 0x%x:0x0) to core %u\n", - vec, dst_core->segments.cs.selector, dst_core->cpu_id); + vector, dst_core->segments.cs.selector, dst_core->cpu_id); // Maybe need to adjust the APIC? // We transition the target core to SIPI state @@ -665,12 +684,12 @@ static int route_ipi(struct apic_dev_state * apic_dev, struct int_cmd_reg * icr) { struct apic_state * dest_apic = NULL; - PrintDebug("icc_bus: icc_bus=%p, src_apic=%u, icr_data=%llx, extirq=%u\n", - icc_bus, src_apic, icr_data, extirq); + PrintDebug("route_ipi: src_apic=%p, icr_data=%x", + src_apic, icr_val); if ((icr->dst_mode == 0) && (icr->dst >= apic_dev->num_apics)) { - PrintError("icc_bus: Attempted send to unregistered apic id=%u\n", + PrintError("route_ipi: Attempted send to unregistered apic id=%u\n", icr->dst); return -1; } @@ -678,15 +697,14 @@ static int route_ipi(struct apic_dev_state * apic_dev, dest_apic = &(apic_dev->apics[icr->dst]); - PrintDebug("icc_bus: IPI %s %u from %s %u to %s %s %u (icr=0x%llx, extirq=%u)\n", + PrintDebug("route_ipi: IPI %s %u from apic %p to %s %s %u (icr=0x%llx)\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, - extirq); + icr->val); switch (icr->dst_shorthand) { @@ -1299,6 +1317,8 @@ int v3_apic_raise_intr(struct v3_vm_info * vm, struct vm_device * dev, struct apic_dev_state * apic_dev = (struct apic_dev_state *)(dev->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); + activate_apic_irq(apic, irq); if (V3_Get_CPU() != dst) { @@ -1326,8 +1346,8 @@ static int apic_begin_irq(struct guest_info * core, void * private_data, int irq *req_location &= ~flag; } else { // do nothing... - PrintDebug("apic %u: core %u: begin irq for %d ignored since I don't own it\n", - apic->lapic_id.val, info->cpu_id, irq); + //PrintDebug("apic %u: core %u: begin irq for %d ignored since I don't own it\n", + // apic->lapic_id.val, core->cpu_id, irq); } return 0; @@ -1407,13 +1427,13 @@ static void apic_update_time(struct guest_info * core, // raise irq PrintDebug("apic %u: core %u: Raising APIC Timer interrupt (periodic=%d) (icnt=%d) (div=%d)\n", - apic->lapic_id.val, info->cpu_id, + apic->lapic_id.val, core->cpu_id, apic->tmr_vec_tbl.tmr_mode, apic->tmr_init_cnt, shift_num); if (apic_intr_pending(core, priv_data)) { PrintDebug("apic %u: core %u: Overriding pending IRQ %d\n", - apic->lapic_id.val, info->cpu_id, - apic_get_intr_number(info, priv_data)); + apic->lapic_id.val, core->cpu_id, + apic_get_intr_number(core, priv_data)); } if (activate_internal_irq(apic, APIC_TMR_INT) == -1) {