Skip to contentSkip to conversation

MSI: Fix msi delivery for hvm guest

PATCH New Wei Wang2 1 participant 1 message Jun 11, 2008

lore
Share & tools
lore

Wei Wang2

author
#0 lore raw

PATCH 1/1 MSI: Fix msi delivery for hvm guest

Some parameters like "dest_mode", "delivery_mode" and "trig_mode" seem to have been miscalculated before delivering MSI interrupt into hvm passthru guest. This will cause guest driver to roll back to legacy interrupt mode. Attached patch fixes this issue.

-Wei

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy 
xen/arch/x86/hvm/vmsi.c +10 -4
diff -r 7c771f0a24f3 xen/arch/x86/hvm/vmsi.c
@@ -110,15 +110,21 @@ static void vmsi_inj_irq(
 #define VMSI_DELIV_MASK   0x7000
 #define VMSI_TRIG_MODE    0x8000
 
+#define GFLAGS_SHIFT_DEST_ID        0
+#define GFLAGS_SHIFT_RH             8
+#define GFLAGS_SHIFT_DM             9
+#define GLFAGS_SHIFT_DELIV_MODE     12
+#define GLFAGS_SHIFT_TRG_MODE       15
+
 int vmsi_deliver(struct domain *d, int pirq)
 {
     struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
     uint32_t flags = hvm_irq_dpci->mirq[pirq].gmsi.gflags;
     int vector = hvm_irq_dpci->mirq[pirq].gmsi.gvec;
-    uint16_t dest = flags & VMSI_DEST_ID_MASK;
-    uint8_t dest_mode = flags & VMSI_DM_MASK;
-    uint8_t delivery_mode = flags & VMSI_DELIV_MASK;
-    uint8_t trig_mode = flags & VMSI_TRIG_MODE;
+    uint16_t dest = (flags & VMSI_DEST_ID_MASK) >> GFLAGS_SHIFT_DEST_ID;
+    uint8_t dest_mode = (flags & VMSI_DM_MASK) >> GFLAGS_SHIFT_DM;
+    uint8_t delivery_mode = (flags & VMSI_DELIV_MASK) >> GLFAGS_SHIFT_DELIV_MODE;
+    uint8_t trig_mode = (flags & VMSI_TRIG_MODE) >> GLFAGS_SHIFT_TRG_MODE;
     uint32_t deliver_bitmask;
     struct vlapic *target;
     struct vcpu *v;

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel