diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-03-30 17:19:18 +0100 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-03-30 17:19:18 +0100 |
commit | 1d0c9fbb140cdb9c5aeb52c2d66dd0df0e1d725a (patch) | |
tree | 21c61ec28fb5743217db5febb3f36788f25210c2 | |
parent | 8c240452b9851b8c546cc62777a39f177cf565d9 (diff) | |
download | xen-1d0c9fbb140cdb9c5aeb52c2d66dd0df0e1d725a.tar.gz xen-1d0c9fbb140cdb9c5aeb52c2d66dd0df0e1d725a.tar.bz2 xen-1d0c9fbb140cdb9c5aeb52c2d66dd0df0e1d725a.zip |
xen: introduce PHYSDEVOP_pirq_eoi_gmfn_v2
PHYSDEVOP_pirq_eoi_gmfn changes the semantics of PHYSDEVOP_eoi.
In order to improve the interface this patch:
- renames PHYSDEVOP_pirq_eoi_gmfn to PHYSDEVOP_pirq_eoi_gmfn_v1;
- introduces PHYSDEVOP_pirq_eoi_gmfn_v2, that is like
PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't modify the behaviour of
another hypercall;
- #define PHYSDEVOP_pirq_eoi_gmfn to PHYSDEVOP_pirq_eoi_gmfn_v1
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
xen-unstable changeset: 24616:3bd3949854ef
xen-unstable date: Sat Jan 28 13:45:13 2012 +0000
-rw-r--r-- | xen/arch/ia64/xen/domain.c | 1 | ||||
-rw-r--r-- | xen/arch/ia64/xen/hypercall.c | 7 | ||||
-rw-r--r-- | xen/arch/x86/domain.c | 1 | ||||
-rw-r--r-- | xen/arch/x86/physdev.c | 7 | ||||
-rw-r--r-- | xen/include/asm-ia64/domain.h | 3 | ||||
-rw-r--r-- | xen/include/asm-x86/domain.h | 3 | ||||
-rw-r--r-- | xen/include/public/physdev.h | 12 |
7 files changed, 29 insertions, 5 deletions
diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index e81e039513..c00f6bc3c9 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -1729,6 +1729,7 @@ int domain_relinquish_resources(struct domain *d) if (d->arch.pirq_eoi_map != NULL) { put_page(virt_to_page(d->arch.pirq_eoi_map)); d->arch.pirq_eoi_map = NULL; + d->arch.auto_unmask = 0; } /* Tear down shadow mode stuff. */ diff --git a/xen/arch/ia64/xen/hypercall.c b/xen/arch/ia64/xen/hypercall.c index 6e98289530..e6a4bc404b 100644 --- a/xen/arch/ia64/xen/hypercall.c +++ b/xen/arch/ia64/xen/hypercall.c @@ -65,7 +65,7 @@ static long __do_pirq_guest_eoi(struct domain *d, int pirq) { if ( pirq < 0 || pirq >= NR_IRQS ) return -EINVAL; - if ( d->arch.pirq_eoi_map ) + if ( d->arch.auto_unmask ) { evtchn_unmask(d->pirq_to_evtchn[pirq]); return pirq_guest_eoi(d, pirq); } @@ -504,7 +504,8 @@ long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) break; } - case PHYSDEVOP_pirq_eoi_gmfn: { + case PHYSDEVOP_pirq_eoi_gmfn_v1: + case PHYSDEVOP_pirq_eoi_gmfn_v2: { struct physdev_pirq_eoi_gmfn info; unsigned long mfn; @@ -527,6 +528,8 @@ long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) } current->domain->arch.pirq_eoi_map = mfn_to_virt(mfn); + if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 ) + current->domain->arch.auto_unmask = 1; ret = 0; break; } diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 6afbf0e076..83549ae9b6 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1981,6 +1981,7 @@ int domain_relinquish_resources(struct domain *d) unmap_domain_page_global(d->arch.pirq_eoi_map); put_page_and_type(mfn_to_page(d->arch.pirq_eoi_map_mfn)); d->arch.pirq_eoi_map = NULL; + d->arch.auto_unmask = 0; } d->arch.relmem = RELMEM_xen; diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c index 40c72ee70b..8c24559452 100644 --- a/xen/arch/x86/physdev.c +++ b/xen/arch/x86/physdev.c @@ -271,7 +271,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) ret = -EINVAL; if ( eoi.irq >= v->domain->nr_pirqs ) break; - if ( v->domain->arch.pirq_eoi_map ) + if ( v->domain->arch.auto_unmask ) evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]); if ( !is_hvm_domain(v->domain) || domain_pirq_to_irq(v->domain, eoi.irq) > 0 ) @@ -295,7 +295,8 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) break; } - case PHYSDEVOP_pirq_eoi_gmfn: { + case PHYSDEVOP_pirq_eoi_gmfn_v2: + case PHYSDEVOP_pirq_eoi_gmfn_v1: { struct physdev_pirq_eoi_gmfn info; unsigned long mfn; @@ -325,6 +326,8 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg) ret = -ENOSPC; break; } + if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 ) + v->domain->arch.auto_unmask = 1; ret = 0; break; diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h index 14064ce247..fc7b34f0a8 100644 --- a/xen/include/asm-ia64/domain.h +++ b/xen/include/asm-ia64/domain.h @@ -182,6 +182,9 @@ struct arch_domain { /* Shared page for notifying that explicit PIRQ EOI is required. */ unsigned long *pirq_eoi_map; unsigned long pirq_eoi_map_mfn; + /* set auto_unmask to 1 if you want PHYSDEVOP_eoi to automatically + * unmask the event channel */ + bool_t auto_unmask; /* Address of efi_runtime_services_t (placed in domain memory) */ void *efi_runtime; diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index f16628aa70..fe1459d50c 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -268,6 +268,9 @@ struct arch_domain /* Shared page for notifying that explicit PIRQ EOI is required. */ unsigned long *pirq_eoi_map; unsigned long pirq_eoi_map_mfn; + /* set auto_unmask to 1 if you want PHYSDEVOP_eoi to automatically + * unmask the event channel */ + bool_t auto_unmask; /* Pseudophysical e820 map (XENMEM_memory_map). */ spinlock_t e820_lock; diff --git a/xen/include/public/physdev.h b/xen/include/public/physdev.h index 82602ca6dc..6f792ee92f 100644 --- a/xen/include/public/physdev.h +++ b/xen/include/public/physdev.h @@ -49,7 +49,15 @@ DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); * will automatically get unmasked. The page registered is used as a bit * array indexed by Xen's PIRQ value. */ -#define PHYSDEVOP_pirq_eoi_gmfn 17 +#define PHYSDEVOP_pirq_eoi_gmfn_v1 17 +/* + * Register a shared page for the hypervisor to indicate whether the + * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to + * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of + * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by + * Xen's PIRQ value. + */ +#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 struct physdev_pirq_eoi_gmfn { /* IN */ xen_pfn_t gmfn; @@ -276,6 +284,8 @@ DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t); #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi #define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared +#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1 + #endif /* __XEN_PUBLIC_PHYSDEV_H__ */ /* |