On Thu, 2006-08-24 at 10:35 -0500, Hollis Blanchard wrote:
> On Thu, 2006-08-24 at 10:42 -0400, Kiyokuni Kawachiya wrote:
> 
> > Today, I installed necessary tools including mercurial to LinuxPPC,
> > self-built XenPPC, dom0 Linux, and Xen Tools on LinuxPPC, and installed
> > them.  I also built j9-xen-ppc with the latest codes, and tried to start it
> > on my Linux/XenPPC/JS20.  The xend daemon was successfully started, but
> > when I tried "xm create -c xen-domain-config", it failed with the following
> > message.
> > 
> >     Error: [Errno 2] No such file or directory:
> > '/proc/device-tree/cpus/PowerPC,[EMAIL PROTECTED]'
> > 
> > The directory does not exist in my dom0 Linux, but "PowerPC,[EMAIL 
> > PROTECTED]" exists
> > instead.  Maybe, my JS20 is newer than Watson's, and uses different CPU
> > (970FX).  Today, I have no time to debug this further.  Any solution?
> 
> I'll try to come up with a more general solution.

Here is the more general solution: it searches /cpus for the first node
with device_type containing "cpu", regardless of how the node is named.

I won't commit until I hear a couple "works for me" reports (and no
"fails miserably" reports :) .

diff -r b2f2c477895a tools/python/xen/xend/FlatDeviceTree.py
--- a/tools/python/xen/xend/FlatDeviceTree.py   Tue Aug 22 16:48:58 2006 -0500
+++ b/tools/python/xen/xend/FlatDeviceTree.py   Thu Aug 24 15:16:13 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,[EMAIL PROTECTED]')
-        _copytree(cpu, 'cpus/PowerPC,[EMAIL PROTECTED]', _nolinuxprops)
-        # and then overwrite what we need to
+        # create new node and copy all properties
+        cpu = cpus.addnode('PowerPC,[EMAIL PROTECTED]' % 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)
 

-- 
Hollis Blanchard
IBM Linux Technology Center


_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to