VMM: Use the I_POKE_CORE IRQ for posted IRQs
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 5 Feb 2016 19:19:48 +0000 (14:19 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 11 Feb 2016 15:39:30 +0000 (10:39 -0500)
Posting IRQs is a lot like poking a core, especially when you try and think
about it in an architecture independent manner.  I_POKE_CORE is normally a
way to make sure a core isn't halted.  For VMs, it's now also a way to poke
the VMX hardware to inject an IRQ if necessary.

Note that if we want to post an IRQ and send an I_POKE_CORE, but the VM
exits before the IRQ gets there, we just run the regular POKE_ handler,
which does nothing.

This also makes our life a little easier, in that handle_vmexit_ext_irq()
doesn't need to think about getting an I_POKE.  Poke's aren't full-up IRQs
(requiring a registered handler) regardless of whether they are sent to a
core running a VM or a 'regular' core.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/trap.h
kern/arch/x86/trapentry64.S
kern/arch/x86/vmm/intel/vmx.c
kern/arch/x86/vmm/vmm.c

index c7107be..c121744 100644 (file)
@@ -61,7 +61,6 @@
 #define I_SMP_CALL3                            (I_SMP_CALL0 + 3)
 #define I_SMP_CALL4                            (I_SMP_CALL0 + 4)
 #define I_SMP_CALL_LAST                        I_SMP_CALL4
-#define I_VMMCP_POSTED                         (I_SMP_CALL_LAST + 1)
 #define I_TESTING                              237     /* Testing IPI (used in testing.c) */
 #define I_POKE_CORE                            238
 #define I_KERNEL_MSG                   239
index 4723314..5cda655 100644 (file)
@@ -312,7 +312,7 @@ IRQ_HANDLER(IRQ193, I_SMP_CALL1)
 IRQ_HANDLER(IRQ194, I_SMP_CALL2)
 IRQ_HANDLER(IRQ195, I_SMP_CALL3)
 IRQ_HANDLER(IRQ196, I_SMP_CALL4)
-IRQ_HANDLER(IRQ197, I_VMMCP_POSTED)
+IRQ_HANDLER(IRQ197, 229)
 IRQ_HANDLER(IRQ198, 230)
 IRQ_HANDLER(IRQ199, 231)
 IRQ_HANDLER(IRQ200, 232)
index efa6892..132bb16 100644 (file)
@@ -929,7 +929,7 @@ static int vmx_setup_initial_guest_state(struct proc *p,
        vmcs_write32(VM_ENTRY_INTR_INFO_FIELD, 0);      /* 22.2.1 */
 
        /* Initialize posted interrupt notification vector */
-       vmcs_write16(POSTED_NOTIFICATION_VEC, I_VMMCP_POSTED);
+       vmcs_write16(POSTED_NOTIFICATION_VEC, I_POKE_CORE);
 
        /* Clear the EOI exit bitmap */
        vmcs_writel(EOI_EXIT_BITMAP0, 0);
@@ -1160,7 +1160,7 @@ int vmx_interrupt_notify(struct vmctl *v)
        /* Assume we want to IPI guest pcore 0 (which vmctl controlled). */
        int vm_core = current->vmm.guest_pcores[0]->cpu;
 
-       send_ipi(vm_core, I_VMMCP_POSTED);
+       send_ipi(vm_core, I_POKE_CORE);
        return 0;
 }
 
index 128fc68..6d183aa 100644 (file)
@@ -23,8 +23,6 @@
 /* TODO: have better cpuid info storage and checks */
 bool x86_supports_vmx = FALSE;
 
-static void vmmcp_posted_handler(struct hw_trapframe *hw_tf, void *data);
-
 /* Figure out what kind of CPU we are on, and if it supports any reasonable
  * virtualization. For now, if we're not some sort of newer intel, don't
  * bother. This does all cores. Again, note, we make these decisions at runtime,
@@ -39,11 +37,6 @@ void vmm_init(void)
         */
        ret = intel_vmm_init();
        if (! ret) {
-               printd("intel_vmm_init worked\n");
-
-               //Register I_VMMCP_POSTED IRQ
-               //register_irq(I_VMMCP_POSTED, vmmcp_posted_handler, NULL,
-               //              MKBUS(BusLAPIC, 0, 0, 0));
                x86_supports_vmx = TRUE;
                return;
        }
@@ -53,11 +46,6 @@ void vmm_init(void)
        return;
 }
 
-static void vmmcp_posted_handler(struct hw_trapframe *hw_tf, void *data)
-{
-       printk("%s\n", __func__);
-}
-
 void vmm_pcpu_init(void)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];