[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH xm/xl enhancements for vptm 6/6] add iomem feature to xm
This adds the iomem feature from patch 3 to xm as well. Signed off by Matthew Fioravante matthew.fioravante@xxxxxxxxxx diff --git a/tools/python/xen/xend/XendDevices.py b/tools/python/xen/xend/XendDevices.py --- a/tools/python/xen/xend/XendDevices.py +++ b/tools/python/xen/xend/XendDevices.py @@ -19,7 +19,7 @@ # A collection of DevControllers # -from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, vfbif, vscsiif, netif2, vusbif +from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, iomemif, vfbif, vscsiif, netif2, vusbif from xen.xend.server.BlktapController import BlktapController, Blktap2Controller from xen.xend.server.ConsoleController import ConsoleController @@ -42,6 +42,7 @@ class XendDevices: 'pci': pciif.PciController, 'ioports': iopif.IOPortsController, 'irq': irqif.IRQController, + 'iomem': iomemif.IOMEMController, 'tap': BlktapController, 'tap2': Blktap2Controller, 'vfb': vfbif.VfbifController, diff --git a/tools/python/xen/xend/server/iomemif.py b/tools/python/xen/xend/server/iomemif.py --- /dev/null +++ b/tools/python/xen/xend/server/iomemif.py @@ -0,0 +1,103 @@ +#============================================================================ +# 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 +#============================================================================ + + +import types + +import xen.lowlevel.xc + +from xen.xend.XendError import VmError + +from xen.xend.server.DevController import DevController + + +xc = xen.lowlevel.xc.xc() + + +def parse_iomemaddr(val): + """Parse an iomem address + """ + if isinstance(val, types.StringType): + radix = 10 + if val.startswith('0x') or val.startswith('0X'): + radix = 16 + v = int(val, radix) + else: + v = val + return v + + +class IOMEMController(DevController): + + valid_cfg = ['mfn', 'nmfns', 'enable'] + + def __init__(self, vm): + DevController.__init__(self, vm) + + def getDeviceConfiguration(self, devid, transaction = None): + result = DevController.getDeviceConfiguration(self, devid, transaction) + if transaction is None: + devinfo = self.readBackend(devid, *self.valid_cfg) + else: + devinfo = self.readBackendTxn(transaction, devid, *self.valid_cfg) + config = dict(zip(self.valid_cfg, devinfo)) + config = dict([(key, val) for key, val in config.items() + if val != None]) + return config + + def getDeviceDetails(self, config): + """@see DevController.getDeviceDetails""" + + def get_param(field): + try: + val = config.get(field) + + if not val: + raise VmError('iomem: Missing %s config setting' % field) + + return parse_iomemaddr(val) + except: + raise VmError('iomem: Invalid config setting %s: %s' % + (field, val)) + + mfn = get_param('mfn') + nmfns = get_param('nmfns') + enable = get_param('enable') + + if nmfns <= 0: + raise VmError('iomem: invalid number of mfns: %s' % str(nmfns)) + #FIXME: Bounds check for max iomem range?? + + rc = xc.domain_iomem_permission(domid = self.getDomid(), + first_pfn = mfn, + nr_pfns = nmfns, + allow_access = enable) + + if rc < 0: + #todo non-fatal + raise VmError( + 'iomem: Failed to configure memory mapped i/o range: %s,%s' % + (str(mfn), str(nmfns))) + + back = dict([(k, config[k]) for k in self.valid_cfg if k in config]) + return (self.allocateDeviceID(), back, {}) + + def waitForDevice(self, devid): + # don't wait for hotplug + return diff --git a/tools/python/xen/xm/create.py b/tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py +++ b/tools/python/xen/xm/create.py @@ -378,6 +378,14 @@ gopts.var('irq', val='IRQ', For example 'irq=7'. This option may be repeated to add more than one IRQ.""") +gopts.var('iomem', val='MFN,NMFNS,ENABLE', + fn=append_value, default=[], + use="""Allow access to memory mapped IO pages, using the given params. + For example 'iomem=e4df0,5,1', to allow access to 5 pages starting + at page number 0xe4df0. The first arg is in hex, the second in decimal. + The last argument is a 1 or 0, to either enable or disable the memory region. + This option may be repeated to add more than one memory range""") + gopts.var('vfb', val="vnc=1,sdl=1,vncunused=1,vncdisplay=N,vnclisten=ADDR,display=DISPLAY,xauthority=XAUTHORITY,vncpasswd=PASSWORD,opengl=1,keymap=FILE,serial=FILE,monitor=FILE", fn=append_value, default=[], use="""Make the domain a framebuffer backend. @@ -947,6 +955,13 @@ def configure_irq(config_devs, vals): config_irq = ['irq', ['irq', irq]] config_devs.append(['device', config_irq]) +def configure_iomem(config_devs, vals): + """Create the config for iomem. + """ + for (mfn, nmfns, enable) in vals.iomem: + config_iomem = ['iomem', ['mfn', mfn], ['nmfns', nmfns], ['enable', enable]] + config_devs.append(['device', config_iomem]) + def configure_vfbs(config_devs, vals): for f in vals.vfb: d = comma_sep_kv_to_dict(f) @@ -1191,6 +1206,7 @@ def make_config(vals): configure_vscsis(config_devs, vals) configure_vusbs(config_devs, vals) configure_ioports(config_devs, vals) + configure_iomem(config_devs, vals) configure_irq(config_devs, vals) configure_vifs(config_devs, vals) configure_vtpm(config_devs, vals) @@ -1307,6 +1323,18 @@ def preprocess_irq(vals): irq.append(d) vals.irq = irq +def preprocess_iomem(vals): + if not vals.iomem: return + iomem = [] + for v in vals.iomem: + d = v.split(',') + if len(d) < 1 or len(d) > 3: + err('Invalid iomem range specifier: ' + v) + #Add hex specifier to the page number + d[0] = '0x' + d[0] + iomem.append(d) + vals.iomem = iomem + def preprocess_vtpm(vals): if not vals.vtpm: return vtpms = [] @@ -1398,6 +1426,7 @@ def preprocess(vals): preprocess_pci(vals) preprocess_vscsi(vals) preprocess_ioports(vals) + preprocess_iomem(vals) preprocess_ip(vals) preprocess_irq(vals) preprocess_nfs(vals) Attachment:
smime.p7s _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |