# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 5ea87acc07dc748ad7aaa60e32bfd2f3a1fccfea
# Parent 37f3f5ad9110ac29273087150b8c8aa548a55e7e
Adds a new device interface to xend/xm similar to the one for ioports
where an interrupt (irq) can be specified in the configuration file
and permission to bind to that interrupt will be given to a driver
domain.
This functionality could be used when trying to give a legacy device
to a driver domain. For example, by specifying the i/o ports and the
interrupt of your serial controller, you can use this patch to put a
serial port in a driver domain. This was discussed briefly on
xen-users in regards to using an external modem in a domU:
http://article.gmane.org/gmane.comp.emulators.xen.devel/20573
http://article.gmane.org/gmane.comp.emulators.xen.user/8754
Also adds the ability to specify irqs on the xm command-line when
creating a domain (the following examples show a serial port being
given to a domU):
xm create serial-dd irq=4 ioports=03f8-03ff
or in a flat config-file:
irq = [4]
ioports = ['03f8-03ff']
or in an SXP config file:
(device (irq (irq 4)))
(device (ioports (from '0x03f8')(to '0x03ff')))
The ioports functionality is already in xen, but this patch also fixes a
bug with it that I assume cropped up due to changes in xend since it was
submitted ('dev' doesn't exist in iopif.py, returning 'None' seems to be
the solution).
Also adds some in-line documentation in tools/python/xen/xm/create.py
to be more accurate regarding adding pci devices and i/o ports on the
command-line.
Signed-off-by: Ryan Wilson <hap9@xxxxxxxxxxxxxx>
diff -r 37f3f5ad9110 -r 5ea87acc07dc tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Thu Mar 9 10:17:29 2006
+++ b/tools/python/xen/xend/XendDomainInfo.py Thu Mar 9 10:20:31 2006
@@ -1580,10 +1580,11 @@
controllerClasses[device_class] = cls
-from xen.xend.server import blkif, netif, tpmif, pciif, iopif, usbif
+from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, usbif
addControllerClass('vbd', blkif.BlkifController)
addControllerClass('vif', netif.NetifController)
addControllerClass('vtpm', tpmif.TPMifController)
addControllerClass('pci', pciif.PciController)
addControllerClass('ioports', iopif.IOPortsController)
+addControllerClass('irq', irqif.IRQController)
addControllerClass('usb', usbif.UsbifController)
diff -r 37f3f5ad9110 -r 5ea87acc07dc tools/python/xen/xend/server/iopif.py
--- a/tools/python/xen/xend/server/iopif.py Thu Mar 9 10:17:29 2006
+++ b/tools/python/xen/xend/server/iopif.py Thu Mar 9 10:20:31 2006
@@ -83,4 +83,4 @@
'ioports: Failed to configure legacy i/o range: %s - %s' %
(io_from, io_to))
- return (dev, {}, {})
+ return (None, {}, {})
diff -r 37f3f5ad9110 -r 5ea87acc07dc tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Thu Mar 9 10:17:29 2006
+++ b/tools/python/xen/xm/create.py Thu Mar 9 10:20:31 2006
@@ -252,14 +252,20 @@
gopts.var('pci', val='BUS:DEV.FUNC',
fn=append_value, default=[],
use="""Add a PCI device to a domain, using given params (in hex).
- For example '-pci c0:02.1a'.
+ For example 'pci=c0:02.1a'.
The option may be repeated to add more than one pci device.""")
gopts.var('ioports', val='FROM[-TO]',
fn=append_value, default=[],
use="""Add a legacy I/O range to a domain, using given params (in
hex).
- For example '-ioports 02f8-02ff'.
+ For example 'ioports=02f8-02ff'.
The option may be repeated to add more than one i/o range.""")
+
+gopts.var('irq', val='IRQ',
+ fn=append_value, default=[],
+ use="""Add an IRQ (interrupt line) to a domain.
+ For example 'irq=7'.
+ This option may be repeated to add more than one IRQ.""")
gopts.var('usb', val='PATH',
fn=append_value, default=[],
@@ -487,6 +493,13 @@
for (io_from, io_to) in vals.ioports:
config_ioports = ['ioports', ['from', io_from], ['to', io_to]]
config_devs.append(['device', config_ioports])
+
+def configure_irq(config_devs, vals):
+ """Create the config for irqs.
+ """
+ for irq in vals.irq:
+ config_irq = ['irq', ['irq', irq]]
+ config_devs.append(['device', config_irq])
def configure_usb(config_devs, vals):
for path in vals.usb:
@@ -615,6 +628,7 @@
configure_disks(config_devs, vals)
configure_pci(config_devs, vals)
configure_ioports(config_devs, vals)
+ configure_irq(config_devs, vals)
configure_vifs(config_devs, vals)
configure_usb(config_devs, vals)
configure_vtpm(config_devs, vals)
diff -r 37f3f5ad9110 -r 5ea87acc07dc tools/python/xen/xend/server/irqif.py
--- /dev/null Thu Mar 9 10:17:29 2006
+++ b/tools/python/xen/xend/server/irqif.py Thu Mar 9 10:20:31 2006
@@ -0,0 +1,73 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#============================================================================
+# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005 Jody Belka
+#============================================================================
+# This code based on tools/python/xen/xend/server/iopif.py and modified
+# to handle interrupts
+#============================================================================
+
+
+import types
+
+import xen.lowlevel.xc;
+
+from xen.xend import sxp
+from xen.xend.XendError import VmError
+
+from xen.xend.server.DevController import DevController
+
+
+xc = xen.lowlevel.xc.xc()
+
+
+class IRQController(DevController):
+
+ def __init__(self, vm):
+ DevController.__init__(self, vm)
+
+
+ def getDeviceDetails(self, config):
+ """@see DevController.getDeviceDetails"""
+
+ def get_param(field):
+ try:
+ val = sxp.child_value(config, field)
+
+ if not val:
+ raise VmError('irq: Missing %s config setting' % field)
+
+ if isinstance(val, types.StringType):
+ return int(val,10)
+ radix = 10
+ else:
+ return val
+ except:
+ raise VmError('irq: Invalid config setting %s: %s' %
+ (field, val))
+
+ pirq = get_param('irq')
+
+ rc = xc.domain_irq_permission(dom = self.getDomid(),
+ pirq = pirq,
+ allow_access = True)
+
+ if rc < 0:
+ #todo non-fatal
+ raise VmError(
+ 'irq: Failed to configure irq: %d' % (pirq))
+
+ return (None, {}, {})
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|