# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxxxx>
# Date 1310127713 -3600
# Node ID d1a2861b9caa1a428a531c0d68b372df872d5b0d
# Parent 6ba6b11c48e1bcba0e4ae15b1c4ed0906917548f
x86-64/physdevop: reduce generated code duplication
At least all the helper functions can be used by both the native and
the compat-mode implementations, requiring their parameters to be
adjusted.
Additionally, rather than having the compat mode wrapper source file
blindly define the native structures to be replaced by the compat mode
ones, replace unnecessary (un-)definitions by layout match checks.
In a second step, do_physdev_op() could be split into a part that
needs
re-compilation for compat mode handling and one that can be used for
native and compat mode.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
diff -r 6ba6b11c48e1 -r d1a2861b9caa xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c Fri Jul 08 13:20:09 2011 +0100
+++ b/xen/arch/x86/physdev.c Fri Jul 08 13:21:53 2011 +0100
@@ -17,17 +17,20 @@
#include <xsm/xsm.h>
#include <asm/p2m.h>
+int physdev_map_pirq(domid_t, int type, int *index, int *pirq_p,
+ struct msi_info *);
+int physdev_unmap_pirq(domid_t, int pirq);
+
#ifndef COMPAT
typedef long ret_t;
-#endif
static int physdev_hvm_map_pirq(
- struct domain *d, struct physdev_map_pirq *map)
+ struct domain *d, int type, int *index, int *pirq)
{
- int pirq, ret = 0;
+ int ret = 0;
spin_lock(&d->event_lock);
- switch ( map->type )
+ switch ( type )
{
case MAP_PIRQ_TYPE_GSI: {
struct hvm_irq_dpci *hvm_irq_dpci;
@@ -40,33 +43,31 @@
if ( hvm_irq_dpci )
{
list_for_each_entry ( girq,
- &hvm_irq_dpci->girq[map->index],
+ &hvm_irq_dpci->girq[*index],
list )
machine_gsi = girq->machine_gsi;
}
/* found one, this mean we are dealing with a pt device */
if ( machine_gsi )
{
- map->index = domain_pirq_to_irq(d, machine_gsi);
- pirq = machine_gsi;
- ret = (pirq > 0) ? 0 : pirq;
+ *index = domain_pirq_to_irq(d, machine_gsi);
+ *pirq = machine_gsi;
+ ret = (*pirq > 0) ? 0 : *pirq;
}
/* we didn't find any, this means we are dealing
* with an emulated device */
else
{
- pirq = map->pirq;
- if ( pirq < 0 )
- pirq = get_free_pirq(d, map->type, map->index);
- ret = map_domain_emuirq_pirq(d, pirq, map->index);
+ if ( *pirq < 0 )
+ *pirq = get_free_pirq(d, type, *index);
+ ret = map_domain_emuirq_pirq(d, *pirq, *index);
}
- map->pirq = pirq;
break;
}
default:
ret = -EINVAL;
- dprintk(XENLOG_G_WARNING, "map type %d not supported yet\n",
map->type);
+ dprintk(XENLOG_G_WARNING, "map type %d not supported yet\n", type);
break;
}
@@ -74,20 +75,20 @@
return ret;
}
-static int physdev_map_pirq(struct physdev_map_pirq *map)
+int physdev_map_pirq(domid_t domid, int type, int *index, int *pirq_p,
+ struct msi_info *msi)
{
struct domain *d;
int pirq, irq, ret = 0;
- struct msi_info _msi;
void *map_data = NULL;
- ret = rcu_lock_target_domain_by_id(map->domid, &d);
+ ret = rcu_lock_target_domain_by_id(domid, &d);
if ( ret )
return ret;
- if ( map->domid == DOMID_SELF && is_hvm_domain(d) )
+ if ( domid == DOMID_SELF && is_hvm_domain(d) )
{
- ret = physdev_hvm_map_pirq(d, map);
+ ret = physdev_hvm_map_pirq(d, type, index, pirq_p);
goto free_domain;
}
@@ -98,22 +99,22 @@
}
/* Verify or get irq. */
- switch ( map->type )
+ switch ( type )
{
case MAP_PIRQ_TYPE_GSI:
- if ( map->index < 0 || map->index >= nr_irqs_gsi )
+ if ( *index < 0 || *index >= nr_irqs_gsi )
{
dprintk(XENLOG_G_ERR, "dom%d: map invalid irq %d\n",
- d->domain_id, map->index);
+ d->domain_id, *index);
ret = -EINVAL;
goto free_domain;
}
- irq = domain_pirq_to_irq(current->domain, map->index);
+ irq = domain_pirq_to_irq(current->domain, *index);
if ( irq <= 0 )
{
if ( IS_PRIV(current->domain) )
- irq = map->index;
+ irq = *index;
else {
dprintk(XENLOG_G_ERR, "dom%d: map pirq with incorrect irq!\n",
d->domain_id);
@@ -124,7 +125,7 @@
break;
case MAP_PIRQ_TYPE_MSI:
- irq = map->index;
+ irq = *index;
if ( irq == -1 )
irq = create_irq();
@@ -136,17 +137,13 @@
goto free_domain;
}
- _msi.bus = map->bus;
- _msi.devfn = map->devfn;
- _msi.entry_nr = map->entry_nr;
- _msi.table_base = map->table_base;
- _msi.irq = irq;
- map_data = &_msi;
+ msi->irq = irq;
+ map_data = msi;
break;
default:
dprintk(XENLOG_G_ERR, "dom%d: wrong map_pirq type %x\n",
- d->domain_id, map->type);
+ d->domain_id, type);
ret = -EINVAL;
goto free_domain;
}
@@ -155,13 +152,12 @@
/* Verify or get pirq. */
spin_lock(&d->event_lock);
pirq = domain_irq_to_pirq(d, irq);
- if ( map->pirq < 0 )
+ if ( *pirq_p < 0 )
{
if ( pirq )
{
dprintk(XENLOG_G_ERR, "dom%d: %d:%d already mapped to %d\n",
- d->domain_id, map->index, map->pirq,
- pirq);
+ d->domain_id, *index, *pirq_p, pirq);
if ( pirq < 0 )
{
ret = -EBUSY;
@@ -170,7 +166,7 @@
}
else
{
- pirq = get_free_pirq(d, map->type, map->index);
+ pirq = get_free_pirq(d, type, *index);
if ( pirq < 0 )
{
dprintk(XENLOG_G_ERR, "dom%d: no free pirq\n", d->domain_id);
@@ -181,20 +177,20 @@
}
else
{
- if ( pirq && pirq != map->pirq )
+ if ( pirq && pirq != *pirq_p )
{
dprintk(XENLOG_G_ERR, "dom%d: pirq %d conflicts with irq %d\n",
- d->domain_id, map->index, map->pirq);
+ d->domain_id, *index, *pirq_p);
ret = -EEXIST;
goto done;
}
else
- pirq = map->pirq;
+ pirq = *pirq_p;
}
- ret = map_domain_pirq(d, pirq, irq, map->type, map_data);
+ ret = map_domain_pirq(d, pirq, irq, type, map_data);
if ( ret == 0 )
- map->pirq = pirq;
+ *pirq_p = pirq;
if ( !ret && is_hvm_domain(d) )
map_domain_emuirq_pirq(d, pirq, IRQ_PT);
@@ -202,28 +198,28 @@
done:
spin_unlock(&d->event_lock);
spin_unlock(&pcidevs_lock);
- if ( (ret != 0) && (map->type == MAP_PIRQ_TYPE_MSI) && (map->index == -1) )
+ if ( (ret != 0) && (type == MAP_PIRQ_TYPE_MSI) && (*index == -1) )
destroy_irq(irq);
free_domain:
rcu_unlock_domain(d);
return ret;
}
-static int physdev_unmap_pirq(struct physdev_unmap_pirq *unmap)
+int physdev_unmap_pirq(domid_t domid, int pirq)
{
struct domain *d;
int ret;
- ret = rcu_lock_target_domain_by_id(unmap->domid, &d);
+ ret = rcu_lock_target_domain_by_id(domid, &d);
if ( ret )
return ret;
if ( is_hvm_domain(d) )
{
spin_lock(&d->event_lock);
- ret = unmap_domain_pirq_emuirq(d, unmap->pirq);
+ ret = unmap_domain_pirq_emuirq(d, pirq);
spin_unlock(&d->event_lock);
- if ( unmap->domid == DOMID_SELF || ret )
+ if ( domid == DOMID_SELF || ret )
goto free_domain;
}
@@ -233,7 +229,7 @@
spin_lock(&pcidevs_lock);
spin_lock(&d->event_lock);
- ret = unmap_domain_pirq(d, unmap->pirq);
+ ret = unmap_domain_pirq(d, pirq);
spin_unlock(&d->event_lock);
spin_unlock(&pcidevs_lock);
@@ -241,6 +237,7 @@
rcu_unlock_domain(d);
return ret;
}
+#endif /* COMPAT */
ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
{
@@ -352,13 +349,19 @@
}
case PHYSDEVOP_map_pirq: {
- struct physdev_map_pirq map;
+ physdev_map_pirq_t map;
+ struct msi_info msi;
ret = -EFAULT;
if ( copy_from_guest(&map, arg, 1) != 0 )
break;
- ret = physdev_map_pirq(&map);
+ msi.bus = map.bus;
+ msi.devfn = map.devfn;
+ msi.entry_nr = map.entry_nr;
+ msi.table_base = map.table_base;
+ ret = physdev_map_pirq(map.domid, map.type, &map.index, &map.pirq,
+ &msi);
if ( copy_to_guest(arg, &map, 1) != 0 )
ret = -EFAULT;
@@ -372,7 +375,7 @@
if ( copy_from_guest(&unmap, arg, 1) != 0 )
break;
- ret = physdev_unmap_pirq(&unmap);
+ ret = physdev_unmap_pirq(unmap.domid, unmap.pirq);
break;
}
diff -r 6ba6b11c48e1 -r d1a2861b9caa xen/arch/x86/x86_64/physdev.c
--- a/xen/arch/x86/x86_64/physdev.c Fri Jul 08 13:20:09 2011 +0100
+++ b/xen/arch/x86/x86_64/physdev.c Fri Jul 08 13:21:53 2011 +0100
@@ -15,8 +15,9 @@
#define physdev_apic compat_physdev_apic
#define physdev_apic_t physdev_apic_compat_t
-#define physdev_eoi compat_physdev_eoi
-#define physdev_eoi_t physdev_eoi_compat_t
+#define xen_physdev_eoi physdev_eoi
+CHECK_physdev_eoi;
+#undef xen_physdev_eoi
#define physdev_pirq_eoi_gmfn compat_physdev_pirq_eoi_gmfn
#define physdev_pirq_eoi_gmfn_t physdev_pirq_eoi_gmfn_compat_t
@@ -24,35 +25,43 @@
#define physdev_set_iobitmap compat_physdev_set_iobitmap
#define physdev_set_iobitmap_t physdev_set_iobitmap_compat_t
-#define physdev_set_iopl compat_physdev_set_iopl
-#define physdev_set_iopl_t physdev_set_iopl_compat_t
+#define xen_physdev_set_iopl physdev_set_iopl
+CHECK_physdev_set_iopl;
+#undef xen_physdev_set_iopl
-#define physdev_irq compat_physdev_irq
-#define physdev_irq_t physdev_irq_compat_t
+#define xen_physdev_irq physdev_irq
+CHECK_physdev_irq;
+#undef xen_physdev_irq
-#define physdev_irq_status_query compat_physdev_irq_status_query
-#define physdev_irq_status_query_t physdev_irq_status_query_compat_t
+#define xen_physdev_irq_status_query physdev_irq_status_query
+CHECK_physdev_irq_status_query;
+#undef xen_physdev_irq_status_query
-#define physdev_map_pirq compat_physdev_map_pirq
#define physdev_map_pirq_t physdev_map_pirq_compat_t
-#define physdev_unmap_pirq compat_physdev_unmap_pirq
-#define physdev_unmap_pirq_t physdev_unmap_pirq_compat_t
+#define xen_physdev_unmap_pirq physdev_unmap_pirq
+CHECK_physdev_unmap_pirq;
+#undef xen_physdev_unmap_pirq
-#define physdev_manage_pci compat_physdev_manage_pci
-#define physdev_manage_pci_t physdev_manage_pci_compat_t
+#define xen_physdev_manage_pci physdev_manage_pci
+CHECK_physdev_manage_pci;
+#undef xen_physdev_manage_pci
-#define physdev_manage_pci_ext compat_physdev_manage_pci_ext
-#define physdev_manage_pci_ext_t physdev_manage_pci_ext_compat_t
+#define xen_physdev_manage_pci_ext physdev_manage_pci_ext
+CHECK_physdev_manage_pci_ext;
+#undef xen_physdev_manage_pci_ext
-#define physdev_restore_msi compat_physdev_restore_msi
-#define physdev_restore_msi_t physdev_restore_msi_compat_t
+#define xen_physdev_restore_msi physdev_restore_msi
+CHECK_physdev_restore_msi;
+#undef xen_physdev_restore_msi
-#define physdev_setup_gsi compat_physdev_setup_gsi
-#define physdev_setup_gsi_t physdev_setup_gsi_compat_t
+#define xen_physdev_setup_gsi physdev_setup_gsi
+CHECK_physdev_setup_gsi;
+#undef xen_physdev_setup_gsi
-#define physdev_get_free_pirq compat_physdev_get_free_pirq
-#define physdev_get_free_pirq_t physdev_get_free_pirq_compat_t
+#define xen_physdev_get_free_pirq physdev_get_free_pirq
+CHECK_physdev_get_free_pirq;
+#undef xen_physdev_get_free_pirq
#define COMPAT
#undef guest_handle_okay
diff -r 6ba6b11c48e1 -r d1a2861b9caa xen/include/xlat.lst
--- a/xen/include/xlat.lst Fri Jul 08 13:20:09 2011 +0100
+++ b/xen/include/xlat.lst Fri Jul 08 13:21:53 2011 +0100
@@ -59,6 +59,16 @@
! memory_map memory.h
! memory_reservation memory.h
! pod_target memory.h
+? physdev_eoi physdev.h
+? physdev_get_free_pirq physdev.h
+? physdev_irq physdev.h
+? physdev_irq_status_query physdev.h
+? physdev_manage_pci physdev.h
+? physdev_manage_pci_ext physdev.h
+? physdev_unmap_pirq physdev.h
+? physdev_restore_msi physdev.h
+? physdev_set_iopl physdev.h
+? physdev_setup_gsi physdev.h
! sched_poll sched.h
? sched_remote_shutdown sched.h
? sched_shutdown sched.h
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|