# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Node ID 228d1441ee7207d56400aa455e57ca68ad6c5729
# Parent 5fe200a45698143f3614cad2b206d4f285a9d31c
[XEND][POWERPC] don't hardcode CPU name when copying properties for domU
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
tools/python/xen/xend/FlatDeviceTree.py | 45 ++++++++++++++++++++------------
1 files changed, 29 insertions(+), 16 deletions(-)
diff -r 5fe200a45698 -r 228d1441ee72 tools/python/xen/xend/FlatDeviceTree.py
--- a/tools/python/xen/xend/FlatDeviceTree.py Fri Aug 25 15:09:36 2006 -0500
+++ b/tools/python/xen/xend/FlatDeviceTree.py Fri Aug 25 16:41:14 2006 -0500
@@ -22,6 +22,9 @@ import struct
import struct
import stat
import re
+import glob
+
+_host_devtree_root = '/proc/device-tree'
_OF_DT_HEADER = int("d00dfeed", 16) # avoid signed/unsigned FutureWarning
_OF_DT_BEGIN_NODE = 0x1
@@ -231,29 +234,36 @@ class Tree(_Node):
header.totalsize = len(payload) + _alignup(len(header.to_bin()), 8)
return _pad(header.to_bin(), 8) + payload
-_host_devtree_root = '/proc/device-tree'
-def _getprop(propname):
- '''Extract a property from the system's device tree.'''
- f = file(os.path.join(_host_devtree_root, propname), 'r')
+def _readfile(fullpath):
+ '''Return full contents of a file.'''
+ f = file(fullpath, 'r')
data = f.read()
f.close()
return data
+def _find_first_cpu(dirpath):
+ '''Find the first node of type 'cpu' in a directory tree.'''
+ cpulist = glob.glob(os.path.join(dirpath, 'cpus', '*'))
+ for node in cpulist:
+ try:
+ data = _readfile(os.path.join(node, 'device_type'))
+ except IOError:
+ continue
+ if 'cpu' in data:
+ return node
+ raise IOError("couldn't find any CPU nodes under " + dirpath)
+
def _copynode(node, dirpath, propfilter):
- '''Extract all properties from a node in the system's device tree.'''
+ '''Copy all properties and children nodes from a directory tree.'''
dirents = os.listdir(dirpath)
for dirent in dirents:
fullpath = os.path.join(dirpath, dirent)
st = os.lstat(fullpath)
if stat.S_ISDIR(st.st_mode):
child = node.addnode(dirent)
- _copytree(child, fullpath, propfilter)
+ _copynode(child, fullpath, propfilter)
elif stat.S_ISREG(st.st_mode) and propfilter(fullpath):
- node.addprop(dirent, _getprop(fullpath))
-
-def _copytree(node, dirpath, propfilter):
- path = os.path.join(_host_devtree_root, dirpath)
- _copynode(node, path, propfilter)
+ node.addprop(dirent, _readfile(fullpath))
def build(imghandler):
'''Construct a device tree by combining the domain's configuration and
@@ -289,15 +299,18 @@ def build(imghandler):
cpus.addprop('#address-cells', 1)
# Copy all properties the system firmware gave us, except for 'linux,'
- # properties, from 'cpus/@0', once for every vcpu. Hopefully all cpus are
- # identical...
+ # properties, from the first CPU node in the device tree. Do this once for
+ # every vcpu. Hopefully all cpus are identical...
cpu0 = None
+ cpu0path = _find_first_cpu(_host_devtree_root)
def _nolinuxprops(fullpath):
return not os.path.basename(fullpath).startswith('linux,')
for i in range(imghandler.vm.getVCpuCount()):
- cpu = cpus.addnode('PowerPC,970@0')
- _copytree(cpu, 'cpus/PowerPC,970@0', _nolinuxprops)
- # and then overwrite what we need to
+ # create new node and copy all properties
+ cpu = cpus.addnode('PowerPC,970@%d' % i)
+ _copynode(cpu, cpu0path, _nolinuxprops)
+
+ # overwrite what we need to
pft_size = imghandler.vm.info.get('pft-size', 0x14)
cpu.setprop('ibm,pft-size', 0, pft_size)
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|