Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/libfdt/dist Import libfdt 1.5.1



details:   https://anonhg.NetBSD.org/src/rev/1cd5c505f46f
branches:  trunk
changeset: 466437:1cd5c505f46f
user:      skrll <skrll%NetBSD.org@localhost>
date:      Sun Dec 22 12:30:36 2019 +0000

description:
Import libfdt 1.5.1

diffstat:

 sys/external/bsd/libfdt/dist/.gitignore        |    1 +
 sys/external/bsd/libfdt/dist/Makefile.libfdt   |    7 +
 sys/external/bsd/libfdt/dist/fdt.c             |  148 +++++---
 sys/external/bsd/libfdt/dist/fdt.h             |   55 +--
 sys/external/bsd/libfdt/dist/fdt_addresses.c   |  145 ++++---
 sys/external/bsd/libfdt/dist/fdt_empty_tree.c  |   50 +--
 sys/external/bsd/libfdt/dist/fdt_overlay.c     |  260 ++++++++++++-
 sys/external/bsd/libfdt/dist/fdt_ro.c          |  449 +++++++++++++++++-------
 sys/external/bsd/libfdt/dist/fdt_rw.c          |  207 +++++------
 sys/external/bsd/libfdt/dist/fdt_strerror.c    |   49 +--
 sys/external/bsd/libfdt/dist/fdt_sw.c          |  290 ++++++++++-----
 sys/external/bsd/libfdt/dist/fdt_wip.c         |   63 +---
 sys/external/bsd/libfdt/dist/libfdt.h          |  394 +++++++++++++++++----
 sys/external/bsd/libfdt/dist/libfdt_internal.h |   86 +---
 sys/external/bsd/libfdt/dist/version.lds       |   15 +-
 15 files changed, 1386 insertions(+), 833 deletions(-)

diffs (truncated from 3426 to 300 lines):

diff -r db82117c0200 -r 1cd5c505f46f sys/external/bsd/libfdt/dist/.gitignore
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/external/bsd/libfdt/dist/.gitignore   Sun Dec 22 12:30:36 2019 +0000
@@ -0,0 +1,1 @@
+libfdt.so.1
diff -r db82117c0200 -r 1cd5c505f46f sys/external/bsd/libfdt/dist/Makefile.libfdt
--- a/sys/external/bsd/libfdt/dist/Makefile.libfdt      Sun Dec 22 12:28:54 2019 +0000
+++ b/sys/external/bsd/libfdt/dist/Makefile.libfdt      Sun Dec 22 12:30:36 2019 +0000
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
 # Makefile.libfdt
 #
 # This is not a complete Makefile of itself.  Instead, it is designed to
@@ -9,3 +10,9 @@
 LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \
        fdt_addresses.c fdt_overlay.c
 LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
+LIBFDT_LIB = libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT)
+
+libfdt_clean:
+       @$(VECHO) CLEAN "(libfdt)"
+       rm -f $(STD_CLEANFILES:%=$(LIBFDT_dir)/%)
+       rm -f $(LIBFDT_dir)/$(LIBFDT_soname)
diff -r db82117c0200 -r 1cd5c505f46f sys/external/bsd/libfdt/dist/fdt.c
--- a/sys/external/bsd/libfdt/dist/fdt.c        Sun Dec 22 12:28:54 2019 +0000
+++ b/sys/external/bsd/libfdt/dist/fdt.c        Sun Dec 22 12:30:36 2019 +0000
@@ -1,54 +1,9 @@
-/*     $NetBSD: fdt.c,v 1.1.1.2 2017/06/08 15:53:11 skrll Exp $        */
+/*     $NetBSD: fdt.c,v 1.1.1.3 2019/12/22 12:30:36 skrll Exp $        */
 
+// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
 /*
  * libfdt - Flat Device Tree manipulation
  * Copyright (C) 2006 David Gibson, IBM Corporation.
- *
- * libfdt is dual licensed: you can use it either under the terms of
- * the GPL, or the BSD license, at your option.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     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 General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this library; if not, write to the Free
- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- *     MA 02110-1301 USA
- *
- * Alternatively,
- *
- *  b) 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 "libfdt_env.h"
 
@@ -57,8 +12,15 @@
 
 #include "libfdt_internal.h"
 
-int fdt_check_header(const void *fdt)
+/*
+ * Minimal sanity check for a read-only tree. fdt_ro_probe_() checks
+ * that the given buffer contains what appears to be a flattened
+ * device tree with sane information in its header.
+ */
+int32_t fdt_ro_probe_(const void *fdt)
 {
+       uint32_t totalsize = fdt_totalsize(fdt);
+
        if (fdt_magic(fdt) == FDT_MAGIC) {
                /* Complete tree */
                if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
@@ -73,6 +35,81 @@
                return -FDT_ERR_BADMAGIC;
        }
 
+       if (totalsize < INT32_MAX)
+               return totalsize;
+       else
+               return -FDT_ERR_TRUNCATED;
+}
+
+static int check_off_(uint32_t hdrsize, uint32_t totalsize, uint32_t off)
+{
+       return (off >= hdrsize) && (off <= totalsize);
+}
+
+static int check_block_(uint32_t hdrsize, uint32_t totalsize,
+                       uint32_t base, uint32_t size)
+{
+       if (!check_off_(hdrsize, totalsize, base))
+               return 0; /* block start out of bounds */
+       if ((base + size) < base)
+               return 0; /* overflow */
+       if (!check_off_(hdrsize, totalsize, base + size))
+               return 0; /* block end out of bounds */
+       return 1;
+}
+
+size_t fdt_header_size_(uint32_t version)
+{
+       if (version <= 1)
+               return FDT_V1_SIZE;
+       else if (version <= 2)
+               return FDT_V2_SIZE;
+       else if (version <= 3)
+               return FDT_V3_SIZE;
+       else if (version <= 16)
+               return FDT_V16_SIZE;
+       else
+               return FDT_V17_SIZE;
+}
+
+int fdt_check_header(const void *fdt)
+{
+       size_t hdrsize;
+
+       if (fdt_magic(fdt) != FDT_MAGIC)
+               return -FDT_ERR_BADMAGIC;
+       hdrsize = fdt_header_size(fdt);
+       if ((fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
+           || (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION))
+               return -FDT_ERR_BADVERSION;
+       if (fdt_version(fdt) < fdt_last_comp_version(fdt))
+               return -FDT_ERR_BADVERSION;
+
+       if ((fdt_totalsize(fdt) < hdrsize)
+           || (fdt_totalsize(fdt) > INT_MAX))
+               return -FDT_ERR_TRUNCATED;
+
+       /* Bounds check memrsv block */
+       if (!check_off_(hdrsize, fdt_totalsize(fdt), fdt_off_mem_rsvmap(fdt)))
+               return -FDT_ERR_TRUNCATED;
+
+       /* Bounds check structure block */
+       if (fdt_version(fdt) < 17) {
+               if (!check_off_(hdrsize, fdt_totalsize(fdt),
+                               fdt_off_dt_struct(fdt)))
+                       return -FDT_ERR_TRUNCATED;
+       } else {
+               if (!check_block_(hdrsize, fdt_totalsize(fdt),
+                                 fdt_off_dt_struct(fdt),
+                                 fdt_size_dt_struct(fdt)))
+                       return -FDT_ERR_TRUNCATED;
+       }
+
+       /* Bounds check strings block */
+       if (!check_block_(hdrsize, fdt_totalsize(fdt),
+                         fdt_off_dt_strings(fdt), fdt_size_dt_strings(fdt)))
+               return -FDT_ERR_TRUNCATED;
+
        return 0;
 }
 
@@ -90,7 +127,7 @@
                    || ((offset + len) > fdt_size_dt_struct(fdt)))
                        return NULL;
 
-       return _fdt_offset_ptr(fdt, offset);
+       return fdt_offset_ptr_(fdt, offset);
 }
 
 uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset)
@@ -125,6 +162,9 @@
                /* skip-name offset, length and value */
                offset += sizeof(struct fdt_property) - FDT_TAGSIZE
                        + fdt32_to_cpu(*lenp);
+               if (fdt_version(fdt) < 0x10 && fdt32_to_cpu(*lenp) >= 8 &&
+                   ((offset - fdt32_to_cpu(*lenp)) % 8) != 0)
+                       offset += 4;
                break;
 
        case FDT_END:
@@ -143,7 +183,7 @@
        return tag;
 }
 
-int _fdt_check_node_offset(const void *fdt, int offset)
+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))
@@ -152,7 +192,7 @@
        return offset;
 }
 
-int _fdt_check_prop_offset(const void *fdt, int 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))
@@ -167,7 +207,7 @@
        uint32_t tag;
 
        if (offset >= 0)
-               if ((nextoffset = _fdt_check_node_offset(fdt, offset)) < 0)
+               if ((nextoffset = fdt_check_node_offset_(fdt, offset)) < 0)
                        return nextoffset;
 
        do {
@@ -229,7 +269,7 @@
        return offset;
 }
 
-const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
+const char *fdt_find_string_(const char *strtab, int tabsize, const char *s)
 {
        int len = strlen(s) + 1;
        const char *last = strtab + tabsize - len;
@@ -243,7 +283,7 @@
 
 int fdt_move(const void *fdt, void *buf, int bufsize)
 {
-       FDT_CHECK_HEADER(fdt);
+       FDT_RO_PROBE(fdt);
 
        if (fdt_totalsize(fdt) > bufsize)
                return -FDT_ERR_NOSPACE;
diff -r db82117c0200 -r 1cd5c505f46f sys/external/bsd/libfdt/dist/fdt.h
--- a/sys/external/bsd/libfdt/dist/fdt.h        Sun Dec 22 12:28:54 2019 +0000
+++ b/sys/external/bsd/libfdt/dist/fdt.h        Sun Dec 22 12:30:36 2019 +0000
@@ -1,57 +1,12 @@
-/*     $NetBSD: fdt.h,v 1.1.1.2 2017/06/08 15:53:11 skrll Exp $        */
+/*     $NetBSD: fdt.h,v 1.1.1.3 2019/12/22 12:30:36 skrll Exp $        */
 
-#ifndef _FDT_H
-#define _FDT_H
+/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
+#ifndef FDT_H
+#define FDT_H
 /*
  * libfdt - Flat Device Tree manipulation
  * Copyright (C) 2006 David Gibson, IBM Corporation.
  * Copyright 2012 Kim Phillips, Freescale Semiconductor.
- *
- * libfdt is dual licensed: you can use it either under the terms of
- * the GPL, or the BSD license, at your option.
- *
- *  a) This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of the
- *     License, or (at your option) any later version.
- *
- *     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 General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this library; if not, write to the Free
- *     Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- *     MA 02110-1301 USA
- *
- * Alternatively,
- *
- *  b) 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



Home | Main Index | Thread Index | Old Index