aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/vmsi.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-06-11 15:19:42 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-06-11 15:19:42 +0100
commit12030c7882b5046ddf3f73480599567b94a2f79e (patch)
tree38fc78bbad30802ade3af85556ee713e1f0e7d3d /xen/arch/x86/hvm/vmsi.c
parent5c587a04013b0708d0ac1b2eb86053ad9bd45159 (diff)
downloadxen-12030c7882b5046ddf3f73480599567b94a2f79e.tar.gz
xen-12030c7882b5046ddf3f73480599567b94a2f79e.tar.bz2
xen-12030c7882b5046ddf3f73480599567b94a2f79e.zip
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. Signed-off-by: Wei Wang <wei.wang2@amd.com>
Diffstat (limited to 'xen/arch/x86/hvm/vmsi.c')
-rw-r--r--xen/arch/x86/hvm/vmsi.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/xen/arch/x86/hvm/vmsi.c b/xen/arch/x86/hvm/vmsi.c
index 60497e4b10..d6ad008f4a 100644
--- a/xen/arch/x86/hvm/vmsi.c
+++ b/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;