diff options
author | Wei Liu <liuw@liuw.name> | 2011-05-26 14:58:28 +0100 |
---|---|---|
committer | Wei Liu <liuw@liuw.name> | 2011-05-26 14:58:28 +0100 |
commit | 080bc640708f40ade856a4eba67f47781415d754 (patch) | |
tree | 54ec765a82f05eef8aff728d2c90b98a7c1f733f /xen/arch/x86/hvm/irq.c | |
parent | eadf449efd7518d8f5789c90aaa93c487b88fb98 (diff) | |
download | xen-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.c | 15 |
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; |