[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Adds a new device interface to xend/xm similar to the one for ioports



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.