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)
--
Hollis Blanchard
IBM Linux Technology Center
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|