#include <devices/apic_regs.h>
#include <palacios/vmm.h>
#include <palacios/vmm_msr.h>
+#include <palacios/vmm_sprintf.h>
#include <palacios/vm_guest.h>
#ifndef CONFIG_DEBUG_APIC
struct guest_info * core;
};
+static void apic_incoming_ipi(void *val);
static int apic_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data);
static int apic_write(addr_t guest_addr, void * src, uint_t length, void * priv_data);
PrintDebug("Raising APIC IRQ %d\n", irq_num);
if (*req_location & flag) {
- V3_Print("Interrupts coallescing\n");
+ //V3_Print("Interrupts coallescing\n");
}
if (*en_location & flag) {
}
#endif
} else {
- PrintError("Spurious EOI...\n");
+ //PrintError("Spurious EOI...\n");
}
return 0;
break;
case INT_CMD_LO_OFFSET:
+ apic->int_cmd.lo = op_val;
+ V3_Call_On_CPU(apic->int_cmd.dst, apic_incoming_ipi, (void *)apic->int_cmd.val);
+
+ break;
case INT_CMD_HI_OFFSET:
+ apic->int_cmd.hi = op_val;
+ break;
// Unhandled Registers
case EXT_APIC_CMD_OFFSET:
}
+static void apic_incoming_ipi(void *val)
+{
+PrintError("In apic_incoming_ipi, val=%p\n", val);
+ struct int_cmd_reg int_cmd;
+ char *type = NULL, *dest;
+ char foo[8];
+ int_cmd.val = (uint64_t)val;
+ switch (int_cmd.dst_shorthand)
+ {
+ case 0x0:
+ sprintf(foo, "%d", int_cmd.dst);
+ dest = foo;
+ break;
+ case 0x1:
+ dest = "(self)";
+ break;
+ case 0x2:
+ dest = "(broadcast inclusive)";
+ break;
+ case 0x3:
+ dest = "(broadcast)";
+ break;
+ }
+ switch (int_cmd.msg_type)
+ {
+ case 0x0:
+ type = "";
+ break;
+ case 0x4:
+ type = "(NMI)";
+ break;
+ case 0x5:
+ type = "(INIT)";
+ break;
+ case 0x6:
+ type = "(Startup)";
+ break;
+ }
+ PrintError("Receieved IPI on CPU %d type=%s dest=%s\n",
+ V3_Get_CPU(), type, dest);
+//%p %s to CPU %d on CPU %d.\n", val, foo, type, dest, (int)V3_Get_CPU());
+ return;
+}
static struct intr_ctrl_ops intr_ops = {