mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
e30a1abc93
commit
2c727b6f3f
4 files changed
+92
-4
No files matched your search
@@ -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)
|
||||
@@ -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, {}, {})
|
||||
@@ -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, {}, {})
|
||||
@@ -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)
|
||||
|
||||