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] [PATCH 4 of 4] [PATCH] Remove FlatDeviceTree.py, move prose

To: Ryan Harper <ryanh@xxxxxxxxxx>
Subject: Re: [XenPPC] [PATCH 4 of 4] [PATCH] Remove FlatDeviceTree.py, move prose builder to libxc devtree construction
From: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Date: Thu, 11 Jan 2007 16:10:46 -0500
Cc: xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Thu, 11 Jan 2007 13:10:46 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <a2ff54d361f5853ff83a.1168544526@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-ppc-devel-request@lists.xensource.com?subject=help>
List-id: Xen PPC development <xen-ppc-devel.lists.xensource.com>
List-post: <mailto:xen-ppc-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ppc-devel>, <mailto:xen-ppc-devel-request@lists.xensource.com?subject=unsubscribe>
References: <a2ff54d361f5853ff83a.1168544526@xxxxxxxxxxxxxxxxxxxxx>
Sender: xen-ppc-devel-bounces@xxxxxxxxxxxxxxxxxxx
Straight off, prose should have no flat tree reference at all.
-JX
On Jan 11, 2007, at 1:42 PM, Ryan Harper wrote:

5 files changed, 48 insertions(+), 376 deletions(-)
tools/python/xen/xend/FlatDeviceTree.py | 359 -------------------------------
tools/libxc/powerpc64/xc_prose_build.c  |   44 +++
tools/libxc/xenguest.h                  |    3
tools/python/xen/lowlevel/xc/xc.c       |   12 -
tools/python/xen/xend/image.py          |    6


# HG changeset patch
# User Ryan Harper <ryanh@xxxxxxxxxx>
# Date 1168544367 21600
# Node ID a2ff54d361f5853ff83adedfe0d7bbc63363bfdc
# Parent  e4fda6c5e7a907b5e4726c4f4d5f117c0f4d6f50
[PATCH] Remove FlatDeviceTree.py, move prose builder to libxc devtree construction.

Signed-off-by: Ryan Harper <ryanh@xxxxxxxxxx>

diff -r e4fda6c5e7a9 -r a2ff54d361f5 tools/libxc/powerpc64/ xc_prose_build.c --- a/tools/libxc/powerpc64/xc_prose_build.c Thu Jan 11 13:39:27 2007 -0600 +++ b/tools/libxc/powerpc64/xc_prose_build.c Thu Jan 11 13:39:27 2007 -0600
@@ -13,10 +13,11 @@
  * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  *
- * Copyright (C) IBM Corporation 2006
+ * Copyright IBM Corporation 2006
  *
  * Authors: Hollis Blanchard <hollisb@xxxxxxxxxx>
  *          Jonathan Appavoo <jappavoo@xxxxxxxxxx>
+ *          Ryan Harper <ryanh@xxxxxxxxxx>
  */

 #include <stdio.h>
@@ -37,6 +38,7 @@
 #include "flatdevtree_env.h"
 #include "flatdevtree.h"
 #include "utils.h"
+#include "mk_flatdevtree.h"

 #define INITRD_ADDR (24UL << 20)
 #define DEVTREE_ADDR (16UL << 20)
@@ -239,8 +241,7 @@ int xc_prose_build(int xc_handle,
                    unsigned int store_evtchn,
                    unsigned long *store_mfn,
                    unsigned int console_evtchn,
-                   unsigned long *console_mfn,
-                   void *devtree)
+                   unsigned long *console_mfn)
 {
     start_info_t start_info;
     struct domain_setup_info dsi;
@@ -252,7 +253,13 @@ int xc_prose_build(int xc_handle,
     unsigned long initrd_len = 0;
     unsigned long start_info_addr;
     unsigned long rma_pages;
+    unsigned long shadow_mb;
     int rc = 0;
+    int op;
+    uint32_t nr_vcpus;
+    xc_dominfo_t info;
+    struct ft_cxt root;
+    void *devtree;

     DPRINTF("%s\n", __func__);

@@ -260,6 +267,36 @@ int xc_prose_build(int xc_handle,

     nr_pages = mem_mb << (20 - PAGE_SHIFT);
     DPRINTF("nr_pages 0x%lx\n", nr_pages);
+
+    /* XXX: fetch the number of vcpus configured for this domain
+       checking that xc_domain_getinfo returns info for exactly 1
+       dom */
+    if (xc_domain_getinfo(xc_handle, domid, 1, &info) != 1) {
+ DPRINTF("xc_domain_getinfo() failed, can't determine max_vcpu_id\n");
+        rc = -1;
+        goto out;
+    }
+
+    /* NB: max_vcpu_id is zero-based */
+    nr_vcpus = info.max_vcpu_id + 1;
+
+    /* XXX: fetch the current shadow_memory value for this domain */
+    op = XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION;
+ if (xc_shadow_control(xc_handle, domid, op, NULL, 0, &shadow_mb, 0, NULL) < 0 ) {
+        rc = -1;
+        goto out;
+    }
+
+    /* build the devtree here */
+    DPRINTF("constructing devtree\n");
+ if (make_devtree(&root, domid, mem_mb, nr_vcpus, shadow_mb, cmdline) < 0) {
+        DPRINTF("failed to create flattened device tree\n");
+        rc = -1;
+        goto out;
+    }
+
+    /* point devtree at bph blob */
+    devtree = root.bph;

     rma_pages = get_rma_pages(devtree);
     if (rma_pages == 0) {
@@ -318,6 +355,7 @@ int xc_prose_build(int xc_handle,
     }

 out:
+    free_devtree(root.bph);
     free_page_array(page_array);
     return rc;
 }
diff -r e4fda6c5e7a9 -r a2ff54d361f5 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h    Thu Jan 11 13:39:27 2007 -0600
+++ b/tools/libxc/xenguest.h    Thu Jan 11 13:39:27 2007 -0600
@@ -138,7 +138,6 @@ int xc_prose_build(int xc_handle,
                    unsigned int store_evtchn,
                    unsigned long *store_mfn,
                    unsigned int console_evtchn,
-                   unsigned long *console_mfn,
-                   void *arch_args);
+                   unsigned long *console_mfn);

 #endif /* XENGUEST_H */
diff -r e4fda6c5e7a9 -r a2ff54d361f5 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Thu Jan 11 13:39:27 2007 -0600
+++ b/tools/python/xen/lowlevel/xc/xc.c Thu Jan 11 13:39:27 2007 -0600
@@ -378,28 +378,26 @@ static PyObject *pyxc_prose_build(XcObje
     unsigned int mem_mb;
     unsigned long store_mfn = 0;
     unsigned long console_mfn = 0;
-    void *arch_args = NULL;
     int unused;

     static char *kwd_list[] = { "dom", "store_evtchn", "memsize",
                                 "console_evtchn", "image",
                                 /* optional */
                                 "ramdisk", "cmdline", "flags",
-                                "features", "arch_args", NULL };
-
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssiss#", kwd_list,
+                                "features", NULL };
+
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssis#", kwd_list,
                                       &dom, &store_evtchn, &mem_mb,
                                       &console_evtchn, &image,
                                       /* optional */
                                       &ramdisk, &cmdline, &flags,
- &features, &arch_args, &unused) )
+                                      &features, &unused) )
         return NULL;

     if ( xc_prose_build(self->xc_handle, dom, mem_mb, image,
                         ramdisk, cmdline, features, flags,
                         store_evtchn, &store_mfn,
-                        console_evtchn, &console_mfn,
-                        arch_args) != 0 ) {
+                        console_evtchn, &console_mfn) != 0 ) {
         if (!errno)
              errno = EINVAL;
         return PyErr_SetFromErrno(xc_error);
diff -r e4fda6c5e7a9 -r a2ff54d361f5 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Thu Jan 11 13:39:27 2007 -0600
+++ b/tools/python/xen/xend/image.py    Thu Jan 11 13:39:27 2007 -0600
@@ -29,7 +29,6 @@ from xen.xend.server.netif import random
 from xen.xend.server.netif import randomMAC
 from xen.xend.xenstore.xswatch import xswatch
 from xen.xend import arch
-from xen.xend import FlatDeviceTree


 xc = xen.lowlevel.xc.xc()
@@ -276,8 +275,6 @@ class PPC_ProseImageHandler(LinuxImageHa
         log.debug("vcpus          = %d", self.vm.getVCpuCount())
         log.debug("features       = %s", self.vm.getFeatures())

-        devtree = FlatDeviceTree.build(self)
-
         return xc.prose_build(dom            = self.vm.getDomid(),
                               memsize        = mem_mb,
                               image          = self.kernel,
@@ -285,8 +282,7 @@ class PPC_ProseImageHandler(LinuxImageHa
                               console_evtchn = console_evtchn,
                               cmdline        = self.cmdline,
                               ramdisk        = self.ramdisk,
-                              features       = self.vm.getFeatures(),
-                              arch_args      = devtree.to_bin())
+                              features       = self.vm.getFeatures())

     def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb):
         """@param shadow_mem_kb The configured shadow memory, in KiB.
diff -r e4fda6c5e7a9 -r a2ff54d361f5 tools/python/xen/xend/ FlatDeviceTree.py --- a/tools/python/xen/xend/FlatDeviceTree.py Thu Jan 11 13:39:27 2007 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-#!/usr/bin/env python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of version 2.1 of the GNU Lesser General Public
-# License as published by the Free Software Foundation.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Copyright (C) IBM Corp. 2006
-#
-# Authors: Hollis Blanchard <hollisb@xxxxxxxxxx>
-
-import os
-import sys
-import struct
-import stat
-import re
-import glob
-import math
-
-_host_devtree_root = '/proc/device-tree'
-
-_OF_DT_HEADER = int("d00dfeed", 16) # avoid signed/unsigned FutureWarning
-_OF_DT_BEGIN_NODE = 0x1
-_OF_DT_END_NODE = 0x2
-_OF_DT_PROP = 0x3
-_OF_DT_END = 0x9
-
-def _bincat(seq, separator=''):
-    '''Concatenate the contents of seq into a bytestream.'''
-    strs = []
-    for item in seq:
-        if isinstance(item, int):
-            strs.append(struct.pack(">I", item))
-        elif isinstance(item, long):
-            strs.append(struct.pack(">Q", item))
-        else:
-            try:
-                strs.append(item.to_bin())
-            except AttributeError, e:
-                strs.append(item)
-    return separator.join(strs)
-
-def _alignup(val, alignment):
-    return (val + alignment - 1) & ~(alignment - 1)
-
-def _pad(buf, alignment):
-    '''Pad bytestream with NULLs to specified alignment.'''
-    padlen = _alignup(len(buf), alignment)
-    return buf + '\0' * (padlen - len(buf))
-    # not present in Python 2.3:
-    #return buf.ljust(_padlen, '\0')
-
-def _indent(item):
-    indented = []
-    for line in str(item).splitlines(True):
-        indented.append('    ' + line)
-    return ''.join(indented)
-
-class _Property:
-    _nonprint = re.compile('[\000-\037\200-\377]')
-    def __init__(self, node, name, value):
-        self.node = node
-        self.value = value
-        self.name = name
-        self.node.tree.stradd(name)
-
-    def __str__(self):
-        result = self.name
-        if self.value:
-            searchtext = self.value
-            # it's ok for a string to end in NULL
-            if searchtext.find('\000') == len(searchtext)-1:
-                searchtext = searchtext[:-1]
-            m = self._nonprint.search(searchtext)
-            if m:
- bytes = struct.unpack("B" * len(self.value), self.value)
-                hexbytes = [ '%02x' % b for b in bytes ]
-                words = []
-                for i in range(0, len(self.value), 4):
-                    words.append(''.join(hexbytes[i:i+4]))
-                v = '<' + ' '.join(words) + '>'
-            else:
-                v = '"%s"' % self.value
-            result += ': ' + v
-        return result
-
-    def to_bin(self):
-        offset = self.node.tree.stroffset(self.name)
- return struct.pack('>III', _OF_DT_PROP, len(self.value), offset) \
-            + _pad(self.value, 4)
-
-class _Node:
-    def __init__(self, tree, name):
-        self.tree = tree
-        self.name = name
-        self.props = {}
-        self.children = {}
-        self.phandle = 0
-
-    def __str__(self):
-        propstrs = [ _indent(prop) for prop in self.props.values() ]
- childstrs = [ _indent(child) for child in self.children.values() ]
-        return '%s:\n%s\n%s' % (self.name, '\n'.join(propstrs),
-            '\n'.join(childstrs))
-
-    def to_bin(self):
-        name = _pad(self.name + '\0', 4)
-        return struct.pack('>I', _OF_DT_BEGIN_NODE) + \
-                name + \
-                _bincat(self.props.values()) + \
-                _bincat(self.children.values()) + \
-                struct.pack('>I', _OF_DT_END_NODE)
-
-    def addprop(self, propname, *cells):
-        '''setprop with duplicate error-checking.'''
-        if propname in self.props:
- raise AttributeError('%s/%s already exists' % (self.name, propname))
-        self.setprop(propname, *cells)
-
-    def setprop(self, propname, *cells):
- self.props[propname] = _Property(self, propname, _bincat (cells))
-
-    def addnode(self, nodename):
-        '''newnode with duplicate error-checking.'''
-        if nodename in self.children:
- raise AttributeError('%s/%s already exists' % (self.name, nodename))
-        return self.newnode(nodename)
-
-    def newnode(self, nodename):
-        node = _Node(self.tree, nodename)
-        self.children[nodename] = node
-        return node
-
-    def getprop(self, propname):
-        return self.props[propname]
-
-    def getchild(self, nodename):
-        return self.children[nodename]
-
-    def get_phandle(self):
-        if self.phandle:
-            return self.phandle
-        self.phandle = self.tree.alloc_phandle()
-        self.addprop('linux,phandle', self.phandle)
-        return self.phandle
-
-class _Header:
-    def __init__(self):
-        self.magic = 0
-        self.totalsize = 0
-        self.off_dt_struct = 0
-        self.off_dt_strings = 0
-        self.off_mem_rsvmap = 0
-        self.version = 0
-        self.last_comp_version = 0
-        self.boot_cpuid_phys = 0
-        self.size_dt_strings = 0
-    def to_bin(self):
-        return struct.pack('>9I',
-            self.magic,
-            self.totalsize,
-            self.off_dt_struct,
-            self.off_dt_strings,
-            self.off_mem_rsvmap,
-            self.version,
-            self.last_comp_version,
-            self.boot_cpuid_phys,
-            self.size_dt_strings)
-
-class _StringBlock:
-    def __init__(self):
-        self.table = []
-    def to_bin(self):
-        return _bincat(self.table, '\0') + '\0'
-    def add(self, str):
-        self.table.append(str)
-    def getoffset(self, str):
-        return self.to_bin().index(str + '\0')
-
-class Tree(_Node):
-    def __init__(self):
-        self.last_phandle = 0
-        self.strings = _StringBlock()
-        self.reserved = [(0, 0)]
-        _Node.__init__(self, self, '\0')
-
-    def alloc_phandle(self):
-        self.last_phandle += 1
-        return self.last_phandle
-
-    def stradd(self, str):
-        return self.strings.add(str)
-
-    def stroffset(self, str):
-        return self.strings.getoffset(str)
-
-    def reserve(self, start, len):
-        self.reserved.insert(0, (start, len))
-
-    def to_bin(self):
-        # layout:
-        #   header
-        #   reservation map
-        #   string block
-        #   data block
-
-        datablock = _Node.to_bin(self)
-
- r = [ struct.pack('>QQ', rsrv[0], rsrv[1]) for rsrv in self.reserved ]
-        reserved = _bincat(r)
-
-        strblock = _pad(self.strings.to_bin(), 4)
-        strblocklen = len(strblock)
-
-        header = _Header()
-        header.magic = _OF_DT_HEADER
-        header.off_mem_rsvmap = _alignup(len(header.to_bin()), 8)
-        header.off_dt_strings = header.off_mem_rsvmap + len(reserved)
-        header.off_dt_struct = header.off_dt_strings + strblocklen
-        header.version = 0x10
-        header.last_comp_version = 0x10
-        header.boot_cpuid_phys = 0
-        header.size_dt_strings = strblocklen
-
-        payload = reserved + \
-                strblock + \
-                datablock + \
-                struct.pack('>I', _OF_DT_END)
- header.totalsize = len(payload) + _alignup(len (header.to_bin()), 8)
-        return _pad(header.to_bin(), 8) + payload
-
-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):
- '''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)
-            _copynode(child, fullpath, propfilter)
-        elif stat.S_ISREG(st.st_mode) and propfilter(fullpath):
-            node.addprop(dirent, _readfile(fullpath))
-
-def build(imghandler):
- '''Construct a device tree by combining the domain's configuration and
-    the host's device tree.'''
-    root = Tree()
-
- # 1st reseravtion entry used for start_info, console, store, shared_info
-    root.reserve(0x3ffc000, 0x4000)
-
- # 2nd reservation enrty used for initrd, later on when we load the
-    # initrd we may fill this in with zeroes which signifies the end
- # of the reservation map. So as to avoid adding a zero map now we
-    # put some bogus yet sensible numbers here.
-    root.reserve(0x1000000, 0x1000)
-
-    root.addprop('device_type', 'chrp-but-not-really\0')
-    root.addprop('#size-cells', 2)
-    root.addprop('#address-cells', 2)
-    root.addprop('model', 'Momentum,Maple-D\0')
-    root.addprop('compatible', 'Momentum,Maple\0')
-
-    xen = root.addnode('xen')
-    xen.addprop('start-info', long(0x3ffc000), long(0x1000))
-    xen.addprop('version', 'Xen-3.0-unstable\0')
-    xen.addprop('reg', long(imghandler.vm.domid), long(0))
-    xen.addprop('domain-name', imghandler.vm.getName() + '\0')
-    xencons = xen.addnode('console')
-    xencons.addprop('interrupts', 1, 0)
-
-    # add memory nodes
-    totalmem = imghandler.vm.getMemoryTarget() * 1024
-    rma_log = 26 ### imghandler.vm.info.get('powerpc_rma_log')
-    rma_bytes = 1 << rma_log
-
-    # RMA node
-    rma = root.addnode('memory@0')
-    rma.addprop('reg', long(0), long(rma_bytes))
-    rma.addprop('device_type', 'memory\0')
-
-    # all the rest in a single node
-    remaining = totalmem - rma_bytes
-    if remaining > 0:
-        mem = root.addnode('memory@1')
-        mem.addprop('reg', long(rma_bytes), long(remaining))
-        mem.addprop('device_type', 'memory\0')
-
-    # add CPU nodes
-    cpus = root.addnode('cpus')
-    cpus.addprop('smp-enabled')
-    cpus.addprop('#size-cells', 0)
-    cpus.addprop('#address-cells', 1)
-
- # Copy all properties the system firmware gave us, except for 'linux,' - # 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()):
-        # create new node and copy all properties
-        cpu = cpus.addnode('PowerPC,970@%d' % i)
-        _copynode(cpu, cpu0path, _nolinuxprops)
-
-        # overwrite what we need to
-        shadow_mb = imghandler.vm.info.get('shadow_memory', 1)
-        shadow_mb_log = int(math.log(shadow_mb, 2))
-        pft_size = shadow_mb_log + 20
-        cpu.setprop('ibm,pft-size', 0, pft_size)
-
-        # set default CPU
-        if cpu0 == None:
-            cpu0 = cpu
-
-    chosen = root.addnode('chosen')
-    chosen.addprop('cpu', cpu0.get_phandle())
-    chosen.addprop('memory', rma.get_phandle())
-    chosen.addprop('linux,stdout-path', '/xen/console\0')
-    chosen.addprop('interrupt-controller', xen.get_phandle())
-    chosen.addprop('bootargs', imghandler.cmdline + '\0')
-    # xc_linux_load.c will overwrite these 64-bit properties later
-    chosen.addprop('linux,initrd-start', long(0))
-    chosen.addprop('linux,initrd-end', long(0))
-
-    if 1:
-        f = file('/tmp/domU.dtb', 'w')
-        f.write(root.to_bin())
-        f.close()
-
-    return root

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


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

<Prev in Thread] Current Thread [Next in Thread>