changeset ad5b3252dcc6 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=ad5b3252dcc6
description:
        ext lib: add libfdt to enable flattened device tree support

        this patch adds libfdt, a library necessary for supporting
        flattened device tree support in current and future versions of
        the linux/android kernel for ARM.

diffstat:

 SConstruct                   |     4 +
 ext/libfdt/README            |    43 +
 ext/libfdt/SConscript        |    49 +
 ext/libfdt/fdt.c             |   201 +++++
 ext/libfdt/fdt.h             |   100 ++
 ext/libfdt/fdt_empty_tree.c  |    63 +
 ext/libfdt/fdt_ro.c          |   553 +++++++++++++++
 ext/libfdt/fdt_rw.c          |   471 +++++++++++++
 ext/libfdt/fdt_strerror.c    |    75 ++
 ext/libfdt/fdt_sw.c          |   235 ++++++
 ext/libfdt/fdt_wip.c         |    97 ++
 ext/libfdt/libfdt.h          |  1466 ++++++++++++++++++++++++++++++++++++++++++
 ext/libfdt/libfdt_env.h      |    90 ++
 ext/libfdt/libfdt_internal.h |    76 ++
 14 files changed, 3523 insertions(+), 0 deletions(-)

diffs (truncated from 3585 to 300 lines):

diff -r 8149223cd7db -r ad5b3252dcc6 SConstruct
--- a/SConstruct        Fri Feb 15 17:40:14 2013 -0500
+++ b/SConstruct        Fri Feb 15 18:48:59 2013 -0500
@@ -1040,6 +1040,10 @@
 main.SConscript('ext/gzstream/SConscript',
                 variant_dir = joinpath(build_root, 'gzstream'))
 
+# libfdt build is shared across all configs in the build root.
+main.SConscript('ext/libfdt/SConscript',
+                variant_dir = joinpath(build_root, 'libfdt'))
+
 ###################################################
 #
 # This function is used to set up a directory with switching headers
diff -r 8149223cd7db -r ad5b3252dcc6 ext/libfdt/README
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/ext/libfdt/README Fri Feb 15 18:48:59 2013 -0500
@@ -0,0 +1,43 @@
+libfdt is an open-source library released under the BSD license:
+
+libfdt - Flat Device Tree manipulation
+
+    Redistribution and use in source and binary forms, with or
+    without modification, are permitted provided that the following
+    conditions are met:
+
+    1. Redistributions of source code must retain the above
+       copyright notice, this list of conditions and the following
+       disclaimer.
+    2. Redistributions in binary form must reproduce the above
+       copyright notice, this list of conditions and the following
+       disclaimer in the documentation and/or other materials
+       provided with the distribution.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+    EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+libfdt allows flattened device trees to be represented as a
+"blob", which is a compact flattened format. This is useful,
+particularly for embedded systems, such as ARM, because it
+allows many different devices to be included in a single binary
+allowing for a high level of portability.
+
+The source and more information about the library can be found
+here:
+
+http://www.denx.de/wiki/U-Boot/UBootFdtInfo
+
+1) D. Gibson, B. Herrenschmidt. Device trees everywhere. 2006.
+http://ozlabs.org/~dgibson/papers/dtc-paper.pdf
diff -r 8149223cd7db -r ad5b3252dcc6 ext/libfdt/SConscript
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/ext/libfdt/SConscript     Fri Feb 15 18:48:59 2013 -0500
@@ -0,0 +1,49 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2013 The Regents of The University of Michigan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Anthony Gutierrez
+
+Import('main')
+
+fdt_files = []
+
+def FdtFile(filename):
+    fdt_files.append(File(filename))
+
+FdtFile('fdt.c')
+FdtFile('fdt_ro.c')
+FdtFile('fdt_rw.c')
+FdtFile('fdt_sw.c')
+FdtFile('fdt_wip.c')
+FdtFile('fdt_empty_tree.c')
+FdtFile('fdt_strerror.c')
+
+main.Library('fdt', [main.SharedObject(f) for f in fdt_files])
+main.Prepend(CPPPATH=Dir('.'))
+main.Append(LIBS=['fdt'])
+main.Prepend(LIBPATH=[Dir('.')])
diff -r 8149223cd7db -r ad5b3252dcc6 ext/libfdt/fdt.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/ext/libfdt/fdt.c  Fri Feb 15 18:48:59 2013 -0500
@@ -0,0 +1,201 @@
+/*
+ * libfdt - Flat Device Tree manipulation
+ * Copyright (C) 2006 David Gibson, IBM Corporation.
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *     1. Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *     2. Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ *     CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ *     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ *     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ *     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ *     OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ *     EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <fdt.h>
+#include <libfdt.h>
+
+#include "libfdt_env.h"
+#include "libfdt_internal.h"
+
+int fdt_check_header(const void *fdt)
+{
+        if (fdt_magic(fdt) == FDT_MAGIC) {
+                /* Complete tree */
+                if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
+                        return -FDT_ERR_BADVERSION;
+                if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
+                        return -FDT_ERR_BADVERSION;
+        } else if (fdt_magic(fdt) == FDT_SW_MAGIC) {
+                /* Unfinished sequential-write blob */
+                if (fdt_size_dt_struct(fdt) == 0)
+                        return -FDT_ERR_BADSTATE;
+        } else {
+                return -FDT_ERR_BADMAGIC;
+        }
+
+        return 0;
+}
+
+const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len)
+{
+        const char *p;
+
+        if (fdt_version(fdt) >= 0x11)
+                if (((offset + len) < offset)
+                    || ((offset + len) > fdt_size_dt_struct(fdt)))
+                        return NULL;
+
+        p = _fdt_offset_ptr(fdt, offset);
+
+        if (p + len < p)
+                return NULL;
+        return p;
+}
+
+uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
+{
+        const fdt32_t *tagp, *lenp;
+        uint32_t tag;
+        int offset = startoffset;
+        const char *p;
+
+        *nextoffset = -FDT_ERR_TRUNCATED;
+        tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
+        if (!tagp)
+                return FDT_END; /* premature end */
+        tag = fdt32_to_cpu(*tagp);
+        offset += FDT_TAGSIZE;
+
+        *nextoffset = -FDT_ERR_BADSTRUCTURE;
+        switch (tag) {
+        case FDT_BEGIN_NODE:
+                /* skip name */
+                do {
+                        p = fdt_offset_ptr(fdt, offset++, 1);
+                } while (p && (*p != '\0'));
+                if (!p)
+                        return FDT_END; /* premature end */
+                break;
+
+        case FDT_PROP:
+                lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
+                if (!lenp)
+                        return FDT_END; /* premature end */
+                /* skip-name offset, length and value */
+                offset += sizeof(struct fdt_property) - FDT_TAGSIZE
+                        + fdt32_to_cpu(*lenp);
+                break;
+
+        case FDT_END:
+        case FDT_END_NODE:
+        case FDT_NOP:
+                break;
+
+        default:
+                return FDT_END;
+        }
+
+        if (!fdt_offset_ptr(fdt, startoffset, offset - startoffset))
+                return FDT_END; /* premature end */
+
+        *nextoffset = FDT_TAGALIGN(offset);
+        return tag;
+}
+
+int _fdt_check_node_offset(const void *fdt, int offset)
+{
+        if ((offset < 0) || (offset % FDT_TAGSIZE)
+            || (fdt_next_tag(fdt, offset, &offset) != FDT_BEGIN_NODE))
+                return -FDT_ERR_BADOFFSET;
+
+        return offset;
+}
+
+int _fdt_check_prop_offset(const void *fdt, int offset)
+{
+        if ((offset < 0) || (offset % FDT_TAGSIZE)
+            || (fdt_next_tag(fdt, offset, &offset) != FDT_PROP))
+                return -FDT_ERR_BADOFFSET;
+
+        return offset;
+}
+
+int fdt_next_node(const void *fdt, int offset, int *depth)
+{
+        int nextoffset = 0;
+        uint32_t tag;
+
+        if (offset >= 0)
+                if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
+                        return nextoffset;
+
+        do {
+                offset = nextoffset;
+                tag = fdt_next_tag(fdt, offset, &nextoffset);
+
+                switch (tag) {
+                case FDT_PROP:
+                case FDT_NOP:
+                        break;
+
+                case FDT_BEGIN_NODE:
+                        if (depth)
+                                (*depth)++;
+                        break;
+
+                case FDT_END_NODE:
+                        if (depth && ((--(*depth)) < 0))
+                                return nextoffset;
+                        break;
+
+                case FDT_END:
+                        if ((nextoffset >= 0)
+                            || ((nextoffset == -FDT_ERR_TRUNCATED) && !depth))
+                                return -FDT_ERR_NOTFOUND;
+                        else
+                                return nextoffset;
+                }
+        } while (tag != FDT_BEGIN_NODE);
+
+        return offset;
+}
+
+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
+{
+        int len = strlen(s) + 1;
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to