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@epoch.ncsc.mil>
This commit is contained in:
kaf24@firebug.cl.cam.ac.uk committed 2006-03-09 11:20:31 +01:00
1 parent e30a1abc93
commit 2c727b6f3f
4 files changed
+92 -4

No files matched your search

+2 -1
View File
@@ -1580,10 +1580,11 @@ def addControllerClass(device_class, cls):
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)
+1 -1
View File
@@ -83,4 +83,4 @@ class IOPortsController(DevController):
'ioports: Failed to configure legacy i/o range: %s - %s' %
(io_from, io_to))
return (dev, {}, {})
return (None, {}, {})
+73
View File
@@ -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@hp.com>
# 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, {}, {})
+16 -2
View File
@@ -252,15 +252,21 @@ gopts.var('disk', val='phy:DEV,VDEV,MODE[,DOM]',
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=[],
use="""Add a physical USB port to a domain, as specified by the path
@@ -488,6 +494,13 @@ def configure_ioports(config_devs, vals):
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:
config_usb = ['usb', ['path', path]]
@@ -615,6 +628,7 @@ def make_config(vals):
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)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.