[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
Description: S/MIME Cryptographic Signature

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.