Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


moved software interrupt injection to core interrupt code
Jack Lange [Thu, 23 Jun 2011 02:09:31 +0000 (21:09 -0500)]
palacios/include/interfaces/sw_intr.h
palacios/include/palacios/vmm_intr.h
palacios/src/extensions/ext_sw_intr.c
palacios/src/extensions/ext_syscall_hijack.c
palacios/src/palacios/svm.c
palacios/src/palacios/vmm_intr.c

index 5eedb3f..f09bfd0 100644 (file)
@@ -25,7 +25,7 @@
 
 
 int v3_handle_swintr (struct guest_info * core);
-int v3_signal_swintr (struct guest_info * core, uint8_t vector);
+
 int v3_hook_swintr (struct guest_info * core,
         uint8_t vector,
         int (*handler)(struct guest_info * core, uint8_t vector, void * priv_data),
index 0ae7da1..adf2aa4 100644 (file)
@@ -83,6 +83,8 @@ int v3_raise_irq(struct v3_vm_info * vm, int irq);
 int v3_lower_irq(struct v3_vm_info * vm, int irq);
 
 
+int v3_raise_swintr(struct guest_info * core, uint8_t vector);
+
 
 struct intr_ctrl_ops {
     int (*intr_pending)(struct guest_info * info, void * private_data);
index 8264260..5fbb72f 100644 (file)
@@ -23,6 +23,7 @@
 #include <palacios/vm_guest_mem.h>
 #include <palacios/vmm_decoder.h>
 #include <palacios/vmm_extensions.h>
+#include <palacios/vmm_intr.h>
 
 #include <interfaces/sw_intr.h>
 
@@ -110,7 +111,7 @@ int v3_handle_swintr (struct guest_info * core) {
         hook = swintr_hooks[vector];
 #else
         core->rip += instr.instr_length;
-        return v3_signal_swintr(core, vector);
+        return v3_raise_swintr(core, vector);
 #endif
     }   
 
@@ -124,19 +125,9 @@ int v3_handle_swintr (struct guest_info * core) {
        so that they finish in time for the next
        instruction... */
     core->rip += instr.instr_length;
-    return v3_signal_swintr(core, vector);
+    return v3_raise_swintr(core, vector);
 }
 
-int v3_signal_swintr (struct guest_info * core, uint8_t vector) {
-    struct v3_intr_core_state * intr_state = &(core->intr_core_state);
-
-    PrintDebug("Signaling software interrupt in v3_signal_swintr()\n");
-    PrintDebug("\tINT vector: %d\n", vector);
-    
-    intr_state->swintr_posted = 1;
-    intr_state->swintr_vector = vector;
-    return 0;
-}
 
 
 int v3_hook_swintr (struct guest_info * core,
index 59ea961..0bd0b08 100644 (file)
@@ -25,6 +25,7 @@
 #include <palacios/vmm_string.h>
 #include <palacios/vmm_shadow_paging.h>
 #include <palacios/vmm_extensions.h>
+#include <palacios/vmm_intr.h>
 
 #include <interfaces/syscall_hijack.h>
 #include <interfaces/sw_intr.h>
@@ -66,7 +67,7 @@ static int v3_syscall_handler (struct guest_info * core, uint8_t vector, void *
         }
         hook = syscall_hooks[syscall_nr];
 #else
-        return v3_signal_swintr(core, vector);
+        return v3_raise_swintr(core, vector);
 #endif
     }
     
index 824f7d2..bdb9862 100644 (file)
@@ -424,20 +424,20 @@ static int update_irq_entry_state(struct guest_info * info) {
                guest_ctrl->EVENTINJ.type = SVM_INJECTION_NMI;
                break;
            case V3_SOFTWARE_INTR:
-            guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR;
-#ifdef V3_CONFIG_EXT_SW_INTERRUPTS
-#ifdef V3_CONFIG_DEBUG_EXT_SW_INTERRUPTS
-            PrintDebug("Caught an injected software interrupt\n");
-            PrintDebug("\ttype: %d, vector: %d\n", SVM_INJECTION_SOFT_INTR, info->intr_core_state.swintr_vector);
+               guest_ctrl->EVENTINJ.type = SVM_INJECTION_SOFT_INTR;
+
+#ifdef V3_CONFIG_DEBUG_INTERRUPTS
+               PrintDebug("Injecting software interrupt --  type: %d, vector: %d\n", 
+                          SVM_INJECTION_SOFT_INTR, info->intr_core_state.swintr_vector);
 #endif
-            guest_ctrl->EVENTINJ.vector = info->intr_core_state.swintr_vector;
-            guest_ctrl->EVENTINJ.valid = 1;
+               guest_ctrl->EVENTINJ.vector = info->intr_core_state.swintr_vector;
+               guest_ctrl->EVENTINJ.valid = 1;
             
-            /* reset swintr state */
-            info->intr_core_state.swintr_posted = 0;
-            info->intr_core_state.swintr_vector = 0;
-#endif
-            break;
+               /* reset swintr state */
+               info->intr_core_state.swintr_posted = 0;
+               info->intr_core_state.swintr_vector = 0;
+               
+               break;
            case V3_VIRTUAL_IRQ:
                guest_ctrl->EVENTINJ.type = SVM_INJECTION_IRQ;
                break;
index a30659f..9010a4c 100644 (file)
@@ -239,6 +239,18 @@ int v3_deliver_irq(struct v3_vm_info * vm, struct v3_interrupt * intr) {
 
 
 
+int v3_raise_swintr (struct guest_info * core, uint8_t vector) {
+    struct v3_intr_core_state * intr_state = &(core->intr_core_state);
+
+    PrintDebug("Signaling software interrupt in v3_signal_swintr()\n");
+    PrintDebug("\tINT vector: %d\n", vector);
+    
+    intr_state->swintr_posted = 1;
+    intr_state->swintr_vector = vector;
+    return 0;
+}
+
+
 
 int v3_raise_virq(struct guest_info * info, int irq) {
     struct v3_intr_core_state * intr_state = &(info->intr_core_state);
@@ -294,6 +306,8 @@ int v3_raise_irq(struct v3_vm_info * vm, int irq) {
 }
 
 
+
+
 void v3_clear_pending_intr(struct guest_info * core) {
     struct v3_intr_core_state * intr_state = &(core->intr_core_state);