#include <palacios/vmm_types.h>
-//
-// MUST DO APIC SCAN FOR PHYSICAL DELIVERY
-//
-
#ifndef CONFIG_DEBUG_APIC
#define PrintDebug(fmt, args...)
#endif
+
+#ifdef CONFIG_DEBUG_APIC
static char * shorthand_str[] = {
"(no shorthand)",
"(self)",
"(Start Up)",
"(ExtInt)",
};
-#ifdef CONFIG_DEBUG_APIC
#endif
-
+// Temporary removal of locking
#define v3_lock(p) p=p
#define v3_unlock(p) p=p
// We transition the target core to SIPI state
dst_core->core_run_state = CORE_RUNNING; // note: locking should not be needed here
dst_apic->ipi_state = STARTED;
-
+
// As with INIT, we should not need to do anything else
-
+
PrintDebug(" SIPI delivery done\n");
-
+
break;
}
case APIC_SMI_DELIVERY:
PrintError("IPI %d delivery is unsupported\n", del_mode);
return -1;
}
-
+
return 0;
+
+}
+
+static struct apic_state * find_physical_apic(struct apic_dev_state *apic_dev, struct int_cmd_reg *icr)
+{
+ int i;
+
+ if (icr->dst >0 && icr->dst < apic_dev->num_apics) {
+ // see if it simply is the core id
+ if (apic_dev->apics[icr->dst].lapic_id.val == icr->dst) {
+ return &(apic_dev->apics[icr->dst]);
+ }
+ }
+
+ for (i=0;i<apic_dev->num_apics;i++) {
+ if (apic_dev->apics[i].lapic_id.val == icr->dst) {
+ return &(apic_dev->apics[i]);
+ }
+ }
+
+ return NULL;
}
icr->dst,
icr->val);
-#if 1
+#if 0
if (icr->vec!=48) {
V3_Print("apic: IPI %s %u from apic %p to %s %s %u (icr=0x%llx)\n",
deliverymode_str[icr->del_mode],
case APIC_SHORTHAND_NONE: // no shorthand
if (icr->dst_mode == APIC_DEST_PHYSICAL) {
- if (icr->dst >= apic_dev->num_apics) {
+ dest_apic=find_physical_apic(apic_dev,icr);
+
+ if (dest_apic==NULL) {
PrintError("apic: Attempted send to unregistered apic id=%u\n", icr->dst);
goto route_ipi_out_bad;
}
- dest_apic = &(apic_dev->apics[icr->dst]);
-
- V3_Print("apic: phsyical destination of %u (apic %u at 0x%p)\n", icr->dst,dest_apic->lapic_id.val,dest_apic);
+
+ //V3_Print("apic: phsyical destination of %u (apic %u at 0x%p)\n", icr->dst,dest_apic->lapic_id.val,dest_apic);
v3_lock(dest_apic->lock);
v3_unlock(dest_apic->lock);
- V3_Print("apic: done\n");
+ //V3_Print("apic: done\n");
} else if (icr->dst_mode == APIC_DEST_LOGICAL) {
// Data registers
case APIC_ID_OFFSET:
- V3_Print("apic %u: core %u: my id is being changed to %u\n",
- apic->lapic_id.val, core->cpu_id, op_val);
+ //V3_Print("apic %u: core %u: my id is being changed to %u\n",
+ // apic->lapic_id.val, core->cpu_id, op_val);
apic->lapic_id.val = op_val;
break;