aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-31 13:30:59 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-31 13:30:59 +0100
commitfc57b9025f90edc1a5587e6a26682005b7ec14e9 (patch)
tree4ce5cf97731edd6c8631c4ffecdb83e2ab703425 /tools
parentadacb92a2b5e3ef66b924dc59ab1c2b2c98195c6 (diff)
downloadxen-fc57b9025f90edc1a5587e6a26682005b7ec14e9.tar.gz
xen-fc57b9025f90edc1a5587e6a26682005b7ec14e9.tar.bz2
xen-fc57b9025f90edc1a5587e6a26682005b7ec14e9.zip
xm on xenapi: Add missing support for creating pci-assigned domains
Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xm/create.dtd8
-rw-r--r--tools/python/xen/xm/xenapi_create.py73
2 files changed, 80 insertions, 1 deletions
diff --git a/tools/python/xen/xm/create.dtd b/tools/python/xen/xm/create.dtd
index efb3cbfd3e..0d9b52405a 100644
--- a/tools/python/xen/xm/create.dtd
+++ b/tools/python/xen/xm/create.dtd
@@ -39,6 +39,7 @@
vbd*,
vif*,
vtpm*,
+ pci*,
console*,
platform*,
vcpu_param*,
@@ -80,6 +81,13 @@
<!ELEMENT vtpm (name*)>
<!ATTLIST vtpm backend CDATA #REQUIRED>
+<!ELEMENT pci EMPTY>
+<!ATTLIST pci domain CDATA #REQUIRED
+ bus CDATA #REQUIRED
+ slot CDATA #REQUIRED
+ func CDATA #REQUIRED
+ vslt CDATA #IMPLIED>
+
<!ELEMENT console (other_config*)>
<!ATTLIST console protocol (vt100|rfb|rdp) #REQUIRED>
diff --git a/tools/python/xen/xm/xenapi_create.py b/tools/python/xen/xm/xenapi_create.py
index 7d834f37a1..ceac76f1e1 100644
--- a/tools/python/xen/xm/xenapi_create.py
+++ b/tools/python/xen/xm/xenapi_create.py
@@ -369,6 +369,12 @@ class xenapi_create:
self.create_consoles(vm_ref, consoles)
+ # Now create pcis
+
+ pcis = vm.getElementsByTagName("pci")
+
+ self.create_pcis(vm_ref, pcis)
+
return vm_ref
except:
server.xenapi.VM.destroy(vm_ref)
@@ -493,6 +499,39 @@ class xenapi_create:
return server.xenapi.console.create(console_record)
+ def create_pcis(self, vm_ref, pcis):
+ log(DEBUG, "create_pcis")
+ return map(lambda pci: self.create_pci(vm_ref, pci), pcis)
+
+ def create_pci(self, vm_ref, pci):
+ log(DEBUG, "create_pci")
+
+ domain = int(pci.attributes["domain"].value, 16)
+ bus = int(pci.attributes["bus"].value, 16)
+ slot = int(pci.attributes["slot"].value, 16)
+ func = int(pci.attributes["func"].value, 16)
+ name = "%04x:%02x:%02x.%01x" % (domain, bus, slot, func)
+
+ target_ref = None
+ for ppci_ref in server.xenapi.PPCI.get_all():
+ if name == server.xenapi.PPCI.get_name(ppci_ref):
+ target_ref = ppci_ref
+ break
+ if target_ref is None:
+ log(DEBUG, "create_pci: pci device not found")
+ return None
+
+ dpci_record = {
+ "VM":
+ vm_ref,
+ "PPCI":
+ target_ref,
+ "hotplug_slot":
+ int(pci.attributes["func"].value, 16)
+ }
+
+ return server.xenapi.DPCI.create(dpci_record)
+
def get_child_by_name(exp, childname, default = None):
try:
return [child for child in sxp.children(exp)
@@ -521,6 +560,9 @@ class sxp2xml:
vfbs_sxp = map(lambda x: x[1], [device for device in devices
if device[1][0] == "vfb"])
+ pcis_sxp = map(lambda x: x[1], [device for device in devices
+ if device[1][0] == "pci"])
+
# Create XML Document
impl = getDOMImplementation()
@@ -656,6 +698,12 @@ class sxp2xml:
map(vm.appendChild, vtpms)
+ # And now the pcis
+
+ pcis = self.extract_pcis(pcis_sxp, document)
+
+ map(vm.appendChild, pcis)
+
# Last but not least the consoles...
consoles = self.extract_consoles(image, document)
@@ -823,7 +871,28 @@ class sxp2xml:
return vfb
- _eths = -1
+ def extract_pcis(self, pcis_sxp, document):
+
+ pcis = []
+
+ for pci_sxp in pcis_sxp:
+ for dev_sxp in sxp.children(pci_sxp, "dev"):
+ pci = document.createElement("pci")
+
+ pci.attributes["domain"] \
+ = get_child_by_name(dev_sxp, "domain", "0")
+ pci.attributes["bus"] \
+ = get_child_by_name(dev_sxp, "bus", "0")
+ pci.attributes["slot"] \
+ = get_child_by_name(dev_sxp, "slot", "0")
+ pci.attributes["func"] \
+ = get_child_by_name(dev_sxp, "func", "0")
+ pci.attributes["vslt"] \
+ = get_child_by_name(dev_sxp, "vslt", "0")
+
+ pcis.append(pci)
+
+ return pcis
def mk_other_config(self, key, value, document):
other_config = document.createElement("other_config")
@@ -916,6 +985,8 @@ class sxp2xml:
return platform_configs
+ _eths = -1
+
def getFreshEthDevice(self):
self._eths += 1
return "eth%i" % self._eths