WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ppc-devel

Re: [XenPPC] Error creating domain on JS20 (Fw: [Prose-jvm] Brief Status

Kawachiya-san tried this patch and it worked for him.  Thank you.

Hollis Blanchard wrote:
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,970@0'

The directory does not exist in my dom0 Linux, but "PowerPC,970FX@0" 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,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