Matthew Fioravante
2012-Sep-18 18:22 UTC
[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)
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel