Mailing List Archive

[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@jhuapl.edu

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@hp.com>
+# 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)