aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/irq.c
diff options
context:
space:
mode:
authorWei Liu <liuw@liuw.name>2011-05-26 14:58:28 +0100
committerWei Liu <liuw@liuw.name>2011-05-26 14:58:28 +0100
commit080bc640708f40ade856a4eba67f47781415d754 (patch)
tree54ec765a82f05eef8aff728d2c90b98a7c1f733f /xen/arch/x86/hvm/irq.c
parenteadf449efd7518d8f5789c90aaa93c487b88fb98 (diff)
downloadxen-080bc640708f40ade856a4eba67f47781415d754.tar.gz
xen-080bc640708f40ade856a4eba67f47781415d754.tar.bz2
xen-080bc640708f40ade856a4eba67f47781415d754.zip
x86: Add a new operation in HVMOP to inject emulated MSI.
The original vmsi_deliver is renamed to vmsi_deliver_pirq. New vmsi_deliver is dedicated to the actually delivering. Original HVMOP number is unchanged. New operation is numbered 16 and enclosed by (__XEN__) and (__XEN_TOOLS__). Signed-off-by: Wei Liu <liuw@liuw.name> Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/irq.c')
-rw-r--r--xen/arch/x86/hvm/irq.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c
index f560e392e6..f6f2613e21 100644
--- a/xen/arch/x86/hvm/irq.c
+++ b/xen/arch/x86/hvm/irq.c
@@ -26,6 +26,7 @@
#include <xen/irq.h>
#include <asm/hvm/domain.h>
#include <asm/hvm/support.h>
+#include <asm/msi.h>
/* Must be called with hvm_domain->irq_lock hold */
static void assert_irq(struct domain *d, unsigned ioapic_gsi, unsigned pic_irq)
@@ -259,6 +260,20 @@ void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq)
d->domain_id, link, old_isa_irq, isa_irq);
}
+void hvm_inj_msi(struct domain *d, uint64_t addr, uint32_t data)
+{
+ uint32_t tmp = (uint32_t) addr;
+ uint8_t dest = (tmp & MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
+ uint8_t dest_mode = !!(tmp & MSI_ADDR_DESTMODE_MASK);
+ uint8_t delivery_mode = (data & MSI_DATA_DELIVERY_MODE_MASK)
+ >> MSI_DATA_DELIVERY_MODE_SHIFT;
+ uint8_t trig_mode = (data & MSI_DATA_TRIGGER_MASK)
+ >> MSI_DATA_TRIGGER_SHIFT;
+ uint8_t vector = data & MSI_DATA_VECTOR_MASK;
+
+ vmsi_deliver(d, vector, dest, dest_mode, delivery_mode, trig_mode);
+}
+
void hvm_set_callback_via(struct domain *d, uint64_t via)
{
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;