aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2012-03-30 17:19:18 +0100
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>2012-03-30 17:19:18 +0100
commit1d0c9fbb140cdb9c5aeb52c2d66dd0df0e1d725a (patch)
tree21c61ec28fb5743217db5febb3f36788f25210c2
parent8c240452b9851b8c546cc62777a39f177cf565d9 (diff)
downloadxen-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.c1
-rw-r--r--xen/arch/ia64/xen/hypercall.c7
-rw-r--r--xen/arch/x86/domain.c1
-rw-r--r--xen/arch/x86/physdev.c7
-rw-r--r--xen/include/asm-ia64/domain.h3
-rw-r--r--xen/include/asm-x86/domain.h3
-rw-r--r--xen/include/public/physdev.h12
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__ */
/*