From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wolfgang Denk Date: Wed, 27 Sep 2017 16:15:24 +0200 Subject: [U-Boot] [PATCH 5/5] Revert "scripts/dtc: Update to upstream version v1.4.3" In-Reply-To: <20170927141524.5920-1-wd@denx.de> References: <1506263222-7080-1-git-send-email-trini@konsulko.com> <20170927141524.5920-1-wd@denx.de> Message-ID: <20170927141524.5920-6-wd@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable To: u-boot@lists.denx.de This reverts commit c0e032e0090d6541549b19cc47e06ccd1f302893. This patch is part of a series which has never been reviewed and has not been generally accepted by the community. Signed-off-by: Wolfgang Denk Cc: Albert Aribaud Cc: Alexander Graf Cc: Alexey Brodkin Cc: Anatolij Gustschin Cc: Andre Przywara , Cc: Andreas Bie=C3=9Fmann Cc: Angelo Dureghello Cc: Bin Meng Cc: Daniel Hellstrom Cc: Daniel Schwierzeck Cc: Heiko Schocher Cc: Heinrich Schuchardt Cc: Huan Wang Cc: Jagan Teki Cc: Joe Hershberger Cc: Kim Phillips Cc: Kyungmin Park Cc: Lukasz Majewski Cc: Macpaul Lin Cc: Marek Vasut Cc: Marek Vasut Cc: Masahiro Yamada Cc: Michal Simek Cc: Minkyu Kang Cc: Nobuhiro Iwamatsu Cc: Pantelis Antoniou Cc: Prafulla Wadaskar Cc: Przemyslaw Marczak Cc: Robert Nelson Cc: Scott Wood Cc: Simon Glass Cc: Sonic Zhang Cc: Stanislav Galabov Cc: Stefan Roese Cc: Stefano Babic Cc: Stephen Warren Cc: Thomas Chou Cc: Tom Rini Cc: Tom Warren Cc: u-boot at lists.denx.de Cc: Vagrant Cascadian Cc: Vipin Kumar Cc: York Sun --- scripts/Kbuild.include | 5 + scripts/Makefile.extrawarn | 16 +- scripts/dtc/Makefile | 31 - scripts/dtc/Makefile.dtc | 18 - scripts/dtc/checks.c | 849 ------------- scripts/dtc/data.c | 269 ---- scripts/dtc/dtc-lexer.l | 311 ----- scripts/dtc/dtc-lexer.lex.c_shipped | 2260 ------------------------------= --- scripts/dtc/dtc-parser.tab.c_shipped | 2301 ------------------------------= ---- scripts/dtc/dtc-parser.tab.h_shipped | 123 -- scripts/dtc/dtc-parser.y | 519 -------- scripts/dtc/dtc.c | 366 ------ scripts/dtc/dtc.h | 285 ----- scripts/dtc/flattree.c | 946 -------------- scripts/dtc/fstree.c | 90 -- scripts/dtc/libfdt/Makefile.libfdt | 11 - scripts/dtc/libfdt/fdt.c | 251 ---- scripts/dtc/libfdt/fdt.h | 111 -- scripts/dtc/libfdt/fdt_empty_tree.c | 84 -- scripts/dtc/libfdt/fdt_ro.c | 703 ----------- scripts/dtc/libfdt/fdt_rw.c | 491 -------- scripts/dtc/libfdt/fdt_strerror.c | 102 -- scripts/dtc/libfdt/fdt_sw.c | 288 ----- scripts/dtc/libfdt/fdt_wip.c | 139 -- scripts/dtc/libfdt/libfdt.h | 1833 --------------------------- scripts/dtc/libfdt/libfdt_env.h | 112 -- scripts/dtc/libfdt/libfdt_internal.h | 95 -- scripts/dtc/livetree.c | 980 --------------- scripts/dtc/srcpos.c | 302 ----- scripts/dtc/srcpos.h | 118 -- scripts/dtc/treesource.c | 284 ----- scripts/dtc/update-dtc-source.sh | 81 -- scripts/dtc/util.c | 473 ------- scripts/dtc/util.h | 265 ---- scripts/dtc/version_gen.h | 1 - 35 files changed, 13 insertions(+), 15100 deletions(-) delete mode 100644 scripts/dtc/Makefile delete mode 100644 scripts/dtc/Makefile.dtc delete mode 100644 scripts/dtc/checks.c delete mode 100644 scripts/dtc/data.c delete mode 100644 scripts/dtc/dtc-lexer.l delete mode 100644 scripts/dtc/dtc-lexer.lex.c_shipped delete mode 100644 scripts/dtc/dtc-parser.tab.c_shipped delete mode 100644 scripts/dtc/dtc-parser.tab.h_shipped delete mode 100644 scripts/dtc/dtc-parser.y delete mode 100644 scripts/dtc/dtc.c delete mode 100644 scripts/dtc/dtc.h delete mode 100644 scripts/dtc/flattree.c delete mode 100644 scripts/dtc/fstree.c delete mode 100644 scripts/dtc/libfdt/Makefile.libfdt delete mode 100644 scripts/dtc/libfdt/fdt.c delete mode 100644 scripts/dtc/libfdt/fdt.h delete mode 100644 scripts/dtc/libfdt/fdt_empty_tree.c delete mode 100644 scripts/dtc/libfdt/fdt_ro.c delete mode 100644 scripts/dtc/libfdt/fdt_rw.c delete mode 100644 scripts/dtc/libfdt/fdt_strerror.c delete mode 100644 scripts/dtc/libfdt/fdt_sw.c delete mode 100644 scripts/dtc/libfdt/fdt_wip.c delete mode 100644 scripts/dtc/libfdt/libfdt.h delete mode 100644 scripts/dtc/libfdt/libfdt_env.h delete mode 100644 scripts/dtc/libfdt/libfdt_internal.h delete mode 100644 scripts/dtc/livetree.c delete mode 100644 scripts/dtc/srcpos.c delete mode 100644 scripts/dtc/srcpos.h delete mode 100644 scripts/dtc/treesource.c delete mode 100755 scripts/dtc/update-dtc-source.sh delete mode 100644 scripts/dtc/util.c delete mode 100644 scripts/dtc/util.h delete mode 100644 scripts/dtc/version_gen.h diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 2c7918ad37..a3a5c59d0d 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -172,6 +172,11 @@ ld-version =3D $(shell $(LD) --version | $(srctree)/sc= ripts/ld-version.sh) # Usage: $(call ld-ifversion, -ge, 22252, y) ld-ifversion =3D $(shell [ $(ld-version) $(1) $(2) ] && echo $(3) || echo = $(4)) =20 +# dtc-option +# Usage: DTC_FLAGS +=3D $(call dtc-option,-Wno-unit_address_vs_reg) +dtc-option =3D $(call try-run,\ + echo '/dts-v1/; / {};' | $(DTC) $(1),$(1),$(2)) + ###### =20 ### diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn index 1d3a570594..90dc149df3 100644 --- a/scripts/Makefile.extrawarn +++ b/scripts/Makefile.extrawarn @@ -58,8 +58,8 @@ endif =20 KBUILD_CFLAGS +=3D $(warning) =20 -dtc-warning-2 +=3D -Wnode_name_chars_strict -dtc-warning-2 +=3D -Wproperty_name_chars_strict +dtc-warning-2 +=3D $(call dtc-option,-Wnode_name_chars_strict) +dtc-warning-2 +=3D $(call dtc-option,-Wproperty_name_chars_strict) =20 dtc-warning :=3D $(dtc-warning-$(findstring 1, $(KBUILD_ENABLE_EXTRA_GCC_C= HECKS))) dtc-warning +=3D $(dtc-warning-$(findstring 2, $(KBUILD_ENABLE_EXTRA_GCC_C= HECKS))) @@ -70,11 +70,11 @@ DTC_FLAGS +=3D $(dtc-warning) else =20 # Disable noisy checks by default -DTC_FLAGS +=3D -Wno-unit_address_vs_reg -DTC_FLAGS +=3D -Wno-simple_bus_reg -DTC_FLAGS +=3D -Wno-unit_address_format -DTC_FLAGS +=3D -Wno-pci_bridge -DTC_FLAGS +=3D -Wno-pci_device_bus_num -DTC_FLAGS +=3D -Wno-pci_device_reg +DTC_FLAGS +=3D $(call dtc-option,-Wno-unit_address_vs_reg) +DTC_FLAGS +=3D $(call dtc-option,-Wno-simple_bus_reg) +DTC_FLAGS +=3D $(call dtc-option,-Wno-unit_address_format) +DTC_FLAGS +=3D $(call dtc-option,-Wno-pci_bridge) +DTC_FLAGS +=3D $(call dtc-option,-Wno-pci_device_bus_num) +DTC_FLAGS +=3D $(call dtc-option,-Wno-pci_device_reg) =20 endif diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile deleted file mode 100644 index 2a48022c41..0000000000 --- a/scripts/dtc/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# scripts/dtc makefile - -hostprogs-y :=3D dtc -always :=3D $(hostprogs-y) - -dtc-objs :=3D dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ - srcpos.o checks.o util.o -dtc-objs +=3D dtc-lexer.lex.o dtc-parser.tab.o - -# Source files need to get at the userspace version of libfdt_env.h to com= pile - -HOSTCFLAGS_DTC :=3D -I$(src) -I$(src)/libfdt - -HOSTCFLAGS_checks.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_data.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_dtc.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_flattree.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_fstree.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_livetree.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_srcpos.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_treesource.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_util.o :=3D $(HOSTCFLAGS_DTC) - -HOSTCFLAGS_dtc-lexer.lex.o :=3D $(HOSTCFLAGS_DTC) -HOSTCFLAGS_dtc-parser.tab.o :=3D $(HOSTCFLAGS_DTC) - -# dependencies on generated files need to be listed explicitly -$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h - -# generated files need to be cleaned explicitly -clean-files :=3D dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h diff --git a/scripts/dtc/Makefile.dtc b/scripts/dtc/Makefile.dtc deleted file mode 100644 index bece49b355..0000000000 --- a/scripts/dtc/Makefile.dtc +++ /dev/null @@ -1,18 +0,0 @@ -# Makefile.dtc -# -# This is not a complete Makefile of itself. Instead, it is designed to -# be easily embeddable into other systems of Makefiles. -# -DTC_SRCS =3D \ - checks.c \ - data.c \ - dtc.c \ - flattree.c \ - fstree.c \ - livetree.c \ - srcpos.c \ - treesource.c \ - util.c - -DTC_GEN_SRCS =3D dtc-lexer.lex.c dtc-parser.tab.c -DTC_OBJS =3D $(DTC_SRCS:%.c=3D%.o) $(DTC_GEN_SRCS:%.c=3D%.o) diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c deleted file mode 100644 index 0e8b978c36..0000000000 --- a/scripts/dtc/checks.c +++ /dev/null @@ -1,849 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2007. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -#ifdef TRACE_CHECKS -#define TRACE(c, ...) \ - do { \ - fprintf(stderr, "=3D=3D=3D %s: ", (c)->name); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - } while (0) -#else -#define TRACE(c, fmt, ...) do { } while (0) -#endif - -enum checkstatus { - UNCHECKED =3D 0, - PREREQ, - PASSED, - FAILED, -}; - -struct check; - -typedef void (*check_fn)(struct check *c, struct dt_info *dti, struct node= *node); - -struct check { - const char *name; - check_fn fn; - void *data; - bool warn, error; - enum checkstatus status; - bool inprogress; - int num_prereqs; - struct check **prereq; -}; - -#define CHECK_ENTRY(_nm, _fn, _d, _w, _e, ...) \ - static struct check *_nm##_prereqs[] =3D { __VA_ARGS__ }; \ - static struct check _nm =3D { \ - .name =3D #_nm, \ - .fn =3D (_fn), \ - .data =3D (_d), \ - .warn =3D (_w), \ - .error =3D (_e), \ - .status =3D UNCHECKED, \ - .num_prereqs =3D ARRAY_SIZE(_nm##_prereqs), \ - .prereq =3D _nm##_prereqs, \ - }; -#define WARNING(_nm, _fn, _d, ...) \ - CHECK_ENTRY(_nm, _fn, _d, true, false, __VA_ARGS__) -#define ERROR(_nm, _fn, _d, ...) \ - CHECK_ENTRY(_nm, _fn, _d, false, true, __VA_ARGS__) -#define CHECK(_nm, _fn, _d, ...) \ - CHECK_ENTRY(_nm, _fn, _d, false, false, __VA_ARGS__) - -#ifdef __GNUC__ -static inline void check_msg(struct check *c, struct dt_info *dti, - const char *fmt, ...) __attribute__((format (printf, 3, 4))); -#endif -static inline void check_msg(struct check *c, struct dt_info *dti, - const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - if ((c->warn && (quiet < 1)) - || (c->error && (quiet < 2))) { - fprintf(stderr, "%s: %s (%s): ", - strcmp(dti->outname, "-") ? dti->outname : "", - (c->error) ? "ERROR" : "Warning", c->name); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n"); - } - va_end(ap); -} - -#define FAIL(c, dti, ...) \ - do { \ - TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \ - (c)->status =3D FAILED; \ - check_msg((c), dti, __VA_ARGS__); \ - } while (0) - -static void check_nodes_props(struct check *c, struct dt_info *dti, struct= node *node) -{ - struct node *child; - - TRACE(c, "%s", node->fullpath); - if (c->fn) - c->fn(c, dti, node); - - for_each_child(node, child) - check_nodes_props(c, dti, child); -} - -static bool run_check(struct check *c, struct dt_info *dti) -{ - struct node *dt =3D dti->dt; - bool error =3D false; - int i; - - assert(!c->inprogress); - - if (c->status !=3D UNCHECKED) - goto out; - - c->inprogress =3D true; - - for (i =3D 0; i < c->num_prereqs; i++) { - struct check *prq =3D c->prereq[i]; - error =3D error || run_check(prq, dti); - if (prq->status !=3D PASSED) { - c->status =3D PREREQ; - check_msg(c, dti, "Failed prerequisite '%s'", - c->prereq[i]->name); - } - } - - if (c->status !=3D UNCHECKED) - goto out; - - check_nodes_props(c, dti, dt); - - if (c->status =3D=3D UNCHECKED) - c->status =3D PASSED; - - TRACE(c, "\tCompleted, status %d", c->status); - -out: - c->inprogress =3D false; - if ((c->status !=3D PASSED) && (c->error)) - error =3D true; - return error; -} - -/* - * Utility check functions - */ - -/* A check which always fails, for testing purposes only */ -static inline void check_always_fail(struct check *c, struct dt_info *dti, - struct node *node) -{ - FAIL(c, dti, "always_fail check"); -} -CHECK(always_fail, check_always_fail, NULL); - -static void check_is_string(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - char *propname =3D c->data; - - prop =3D get_property(node, propname); - if (!prop) - return; /* Not present, assumed ok */ - - if (!data_is_one_string(prop->val)) - FAIL(c, dti, "\"%s\" property in %s is not a string", - propname, node->fullpath); -} -#define WARNING_IF_NOT_STRING(nm, propname) \ - WARNING(nm, check_is_string, (propname)) -#define ERROR_IF_NOT_STRING(nm, propname) \ - ERROR(nm, check_is_string, (propname)) - -static void check_is_cell(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - char *propname =3D c->data; - - prop =3D get_property(node, propname); - if (!prop) - return; /* Not present, assumed ok */ - - if (prop->val.len !=3D sizeof(cell_t)) - FAIL(c, dti, "\"%s\" property in %s is not a single cell", - propname, node->fullpath); -} -#define WARNING_IF_NOT_CELL(nm, propname) \ - WARNING(nm, check_is_cell, (propname)) -#define ERROR_IF_NOT_CELL(nm, propname) \ - ERROR(nm, check_is_cell, (propname)) - -/* - * Structural check functions - */ - -static void check_duplicate_node_names(struct check *c, struct dt_info *dt= i, - struct node *node) -{ - struct node *child, *child2; - - for_each_child(node, child) - for (child2 =3D child->next_sibling; - child2; - child2 =3D child2->next_sibling) - if (streq(child->name, child2->name)) - FAIL(c, dti, "Duplicate node name %s", - child->fullpath); -} -ERROR(duplicate_node_names, check_duplicate_node_names, NULL); - -static void check_duplicate_property_names(struct check *c, struct dt_info= *dti, - struct node *node) -{ - struct property *prop, *prop2; - - for_each_property(node, prop) { - for (prop2 =3D prop->next; prop2; prop2 =3D prop2->next) { - if (prop2->deleted) - continue; - if (streq(prop->name, prop2->name)) - FAIL(c, dti, "Duplicate property name %s in %s", - prop->name, node->fullpath); - } - } -} -ERROR(duplicate_property_names, check_duplicate_property_names, NULL); - -#define LOWERCASE "abcdefghijklmnopqrstuvwxyz" -#define UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define DIGITS "0123456789" -#define PROPNODECHARS LOWERCASE UPPERCASE DIGITS ",._+*#?-" -#define PROPNODECHARSSTRICT LOWERCASE UPPERCASE DIGITS ",-" - -static void check_node_name_chars(struct check *c, struct dt_info *dti, - struct node *node) -{ - int n =3D strspn(node->name, c->data); - - if (n < strlen(node->name)) - FAIL(c, dti, "Bad character '%c' in node %s", - node->name[n], node->fullpath); -} -ERROR(node_name_chars, check_node_name_chars, PROPNODECHARS "@"); - -static void check_node_name_chars_strict(struct check *c, struct dt_info *= dti, - struct node *node) -{ - int n =3D strspn(node->name, c->data); - - if (n < node->basenamelen) - FAIL(c, dti, "Character '%c' not recommended in node %s", - node->name[n], node->fullpath); -} -CHECK(node_name_chars_strict, check_node_name_chars_strict, PROPNODECHARSS= TRICT); - -static void check_node_name_format(struct check *c, struct dt_info *dti, - struct node *node) -{ - if (strchr(get_unitname(node), '@')) - FAIL(c, dti, "Node %s has multiple '@' characters in name", - node->fullpath); -} -ERROR(node_name_format, check_node_name_format, NULL, &node_name_chars); - -static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti, - struct node *node) -{ - const char *unitname =3D get_unitname(node); - struct property *prop =3D get_property(node, "reg"); - - if (!prop) { - prop =3D get_property(node, "ranges"); - if (prop && !prop->val.len) - prop =3D NULL; - } - - if (prop) { - if (!unitname[0]) - FAIL(c, dti, "Node %s has a reg or ranges property, but no unit name", - node->fullpath); - } else { - if (unitname[0]) - FAIL(c, dti, "Node %s has a unit name, but no reg property", - node->fullpath); - } -} -WARNING(unit_address_vs_reg, check_unit_address_vs_reg, NULL); - -static void check_property_name_chars(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - - for_each_property(node, prop) { - int n =3D strspn(prop->name, c->data); - - if (n < strlen(prop->name)) - FAIL(c, dti, "Bad character '%c' in property name \"%s\", node %s", - prop->name[n], prop->name, node->fullpath); - } -} -ERROR(property_name_chars, check_property_name_chars, PROPNODECHARS); - -static void check_property_name_chars_strict(struct check *c, - struct dt_info *dti, - struct node *node) -{ - struct property *prop; - - for_each_property(node, prop) { - const char *name =3D prop->name; - int n =3D strspn(name, c->data); - - if (n =3D=3D strlen(prop->name)) - continue; - - /* Certain names are whitelisted */ - if (streq(name, "device_type")) - continue; - - /* - * # is only allowed at the beginning of property names not counting - * the vendor prefix. - */ - if (name[n] =3D=3D '#' && ((n =3D=3D 0) || (name[n-1] =3D=3D ','))) { - name +=3D n + 1; - n =3D strspn(name, c->data); - } - if (n < strlen(name)) - FAIL(c, dti, "Character '%c' not recommended in property name \"%s\", n= ode %s", - name[n], prop->name, node->fullpath); - } -} -CHECK(property_name_chars_strict, check_property_name_chars_strict, PROPNO= DECHARSSTRICT); - -#define DESCLABEL_FMT "%s%s%s%s%s" -#define DESCLABEL_ARGS(node,prop,mark) \ - ((mark) ? "value of " : ""), \ - ((prop) ? "'" : ""), \ - ((prop) ? (prop)->name : ""), \ - ((prop) ? "' in " : ""), (node)->fullpath - -static void check_duplicate_label(struct check *c, struct dt_info *dti, - const char *label, struct node *node, - struct property *prop, struct marker *mark) -{ - struct node *dt =3D dti->dt; - struct node *othernode =3D NULL; - struct property *otherprop =3D NULL; - struct marker *othermark =3D NULL; - - othernode =3D get_node_by_label(dt, label); - - if (!othernode) - otherprop =3D get_property_by_label(dt, label, &othernode); - if (!othernode) - othermark =3D get_marker_label(dt, label, &othernode, - &otherprop); - - if (!othernode) - return; - - if ((othernode !=3D node) || (otherprop !=3D prop) || (othermark !=3D mar= k)) - FAIL(c, dti, "Duplicate label '%s' on " DESCLABEL_FMT - " and " DESCLABEL_FMT, - label, DESCLABEL_ARGS(node, prop, mark), - DESCLABEL_ARGS(othernode, otherprop, othermark)); -} - -static void check_duplicate_label_node(struct check *c, struct dt_info *dt= i, - struct node *node) -{ - struct label *l; - struct property *prop; - - for_each_label(node->labels, l) - check_duplicate_label(c, dti, l->label, node, NULL, NULL); - - for_each_property(node, prop) { - struct marker *m =3D prop->val.markers; - - for_each_label(prop->labels, l) - check_duplicate_label(c, dti, l->label, node, prop, NULL); - - for_each_marker_of_type(m, LABEL) - check_duplicate_label(c, dti, m->ref, node, prop, m); - } -} -ERROR(duplicate_label, check_duplicate_label_node, NULL); - -static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, - struct node *node, const char *propname) -{ - struct node *root =3D dti->dt; - struct property *prop; - struct marker *m; - cell_t phandle; - - prop =3D get_property(node, propname); - if (!prop) - return 0; - - if (prop->val.len !=3D sizeof(cell_t)) { - FAIL(c, dti, "%s has bad length (%d) %s property", - node->fullpath, prop->val.len, prop->name); - return 0; - } - - m =3D prop->val.markers; - for_each_marker_of_type(m, REF_PHANDLE) { - assert(m->offset =3D=3D 0); - if (node !=3D get_node_by_ref(root, m->ref)) - /* "Set this node's phandle equal to some - * other node's phandle". That's nonsensical - * by construction. */ { - FAIL(c, dti, "%s in %s is a reference to another node", - prop->name, node->fullpath); - } - /* But setting this node's phandle equal to its own - * phandle is allowed - that means allocate a unique - * phandle for this node, even if it's not otherwise - * referenced. The value will be filled in later, so - * we treat it as having no phandle data for now. */ - return 0; - } - - phandle =3D propval_cell(prop); - - if ((phandle =3D=3D 0) || (phandle =3D=3D -1)) { - FAIL(c, dti, "%s has bad value (0x%x) in %s property", - node->fullpath, phandle, prop->name); - return 0; - } - - return phandle; -} - -static void check_explicit_phandles(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct node *root =3D dti->dt; - struct node *other; - cell_t phandle, linux_phandle; - - /* Nothing should have assigned phandles yet */ - assert(!node->phandle); - - phandle =3D check_phandle_prop(c, dti, node, "phandle"); - - linux_phandle =3D check_phandle_prop(c, dti, node, "linux,phandle"); - - if (!phandle && !linux_phandle) - /* No valid phandles; nothing further to check */ - return; - - if (linux_phandle && phandle && (phandle !=3D linux_phandle)) - FAIL(c, dti, "%s has mismatching 'phandle' and 'linux,phandle'" - " properties", node->fullpath); - - if (linux_phandle && !phandle) - phandle =3D linux_phandle; - - other =3D get_node_by_phandle(root, phandle); - if (other && (other !=3D node)) { - FAIL(c, dti, "%s has duplicated phandle 0x%x (seen before at %s)", - node->fullpath, phandle, other->fullpath); - return; - } - - node->phandle =3D phandle; -} -ERROR(explicit_phandles, check_explicit_phandles, NULL); - -static void check_name_properties(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property **pp, *prop =3D NULL; - - for (pp =3D &node->proplist; *pp; pp =3D &((*pp)->next)) - if (streq((*pp)->name, "name")) { - prop =3D *pp; - break; - } - - if (!prop) - return; /* No name property, that's fine */ - - if ((prop->val.len !=3D node->basenamelen+1) - || (memcmp(prop->val.val, node->name, node->basenamelen) !=3D 0)) { - FAIL(c, dti, "\"name\" property in %s is incorrect (\"%s\" instead" - " of base node name)", node->fullpath, prop->val.val); - } else { - /* The name property is correct, and therefore redundant. - * Delete it */ - *pp =3D prop->next; - free(prop->name); - data_free(prop->val); - free(prop); - } -} -ERROR_IF_NOT_STRING(name_is_string, "name"); -ERROR(name_properties, check_name_properties, NULL, &name_is_string); - -/* - * Reference fixup functions - */ - -static void fixup_phandle_references(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct node *dt =3D dti->dt; - struct property *prop; - - for_each_property(node, prop) { - struct marker *m =3D prop->val.markers; - struct node *refnode; - cell_t phandle; - - for_each_marker_of_type(m, REF_PHANDLE) { - assert(m->offset + sizeof(cell_t) <=3D prop->val.len); - - refnode =3D get_node_by_ref(dt, m->ref); - if (! refnode) { - if (!(dti->dtsflags & DTSF_PLUGIN)) - FAIL(c, dti, "Reference to non-existent node or " - "label \"%s\"\n", m->ref); - else /* mark the entry as unresolved */ - *((cell_t *)(prop->val.val + m->offset)) =3D - cpu_to_fdt32(0xffffffff); - continue; - } - - phandle =3D get_node_phandle(dt, refnode); - *((cell_t *)(prop->val.val + m->offset)) =3D cpu_to_fdt32(phandle); - } - } -} -ERROR(phandle_references, fixup_phandle_references, NULL, - &duplicate_node_names, &explicit_phandles); - -static void fixup_path_references(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct node *dt =3D dti->dt; - struct property *prop; - - for_each_property(node, prop) { - struct marker *m =3D prop->val.markers; - struct node *refnode; - char *path; - - for_each_marker_of_type(m, REF_PATH) { - assert(m->offset <=3D prop->val.len); - - refnode =3D get_node_by_ref(dt, m->ref); - if (!refnode) { - FAIL(c, dti, "Reference to non-existent node or label \"%s\"\n", - m->ref); - continue; - } - - path =3D refnode->fullpath; - prop->val =3D data_insert_at_marker(prop->val, m, path, - strlen(path) + 1); - } - } -} -ERROR(path_references, fixup_path_references, NULL, &duplicate_node_names); - -/* - * Semantic checks - */ -WARNING_IF_NOT_CELL(address_cells_is_cell, "#address-cells"); -WARNING_IF_NOT_CELL(size_cells_is_cell, "#size-cells"); -WARNING_IF_NOT_CELL(interrupt_cells_is_cell, "#interrupt-cells"); - -WARNING_IF_NOT_STRING(device_type_is_string, "device_type"); -WARNING_IF_NOT_STRING(model_is_string, "model"); -WARNING_IF_NOT_STRING(status_is_string, "status"); - -static void fixup_addr_size_cells(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - - node->addr_cells =3D -1; - node->size_cells =3D -1; - - prop =3D get_property(node, "#address-cells"); - if (prop) - node->addr_cells =3D propval_cell(prop); - - prop =3D get_property(node, "#size-cells"); - if (prop) - node->size_cells =3D propval_cell(prop); -} -WARNING(addr_size_cells, fixup_addr_size_cells, NULL, - &address_cells_is_cell, &size_cells_is_cell); - -#define node_addr_cells(n) \ - (((n)->addr_cells =3D=3D -1) ? 2 : (n)->addr_cells) -#define node_size_cells(n) \ - (((n)->size_cells =3D=3D -1) ? 1 : (n)->size_cells) - -static void check_reg_format(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - int addr_cells, size_cells, entrylen; - - prop =3D get_property(node, "reg"); - if (!prop) - return; /* No "reg", that's fine */ - - if (!node->parent) { - FAIL(c, dti, "Root node has a \"reg\" property"); - return; - } - - if (prop->val.len =3D=3D 0) - FAIL(c, dti, "\"reg\" property in %s is empty", node->fullpath); - - addr_cells =3D node_addr_cells(node->parent); - size_cells =3D node_size_cells(node->parent); - entrylen =3D (addr_cells + size_cells) * sizeof(cell_t); - - if (!entrylen || (prop->val.len % entrylen) !=3D 0) - FAIL(c, dti, "\"reg\" property in %s has invalid length (%d bytes) " - "(#address-cells =3D=3D %d, #size-cells =3D=3D %d)", - node->fullpath, prop->val.len, addr_cells, size_cells); -} -WARNING(reg_format, check_reg_format, NULL, &addr_size_cells); - -static void check_ranges_format(struct check *c, struct dt_info *dti, - struct node *node) -{ - struct property *prop; - int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen; - - prop =3D get_property(node, "ranges"); - if (!prop) - return; - - if (!node->parent) { - FAIL(c, dti, "Root node has a \"ranges\" property"); - return; - } - - p_addr_cells =3D node_addr_cells(node->parent); - p_size_cells =3D node_size_cells(node->parent); - c_addr_cells =3D node_addr_cells(node); - c_size_cells =3D node_size_cells(node); - entrylen =3D (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t= ); - - if (prop->val.len =3D=3D 0) { - if (p_addr_cells !=3D c_addr_cells) - FAIL(c, dti, "%s has empty \"ranges\" property but its " - "#address-cells (%d) differs from %s (%d)", - node->fullpath, c_addr_cells, node->parent->fullpath, - p_addr_cells); - if (p_size_cells !=3D c_size_cells) - FAIL(c, dti, "%s has empty \"ranges\" property but its " - "#size-cells (%d) differs from %s (%d)", - node->fullpath, c_size_cells, node->parent->fullpath, - p_size_cells); - } else if ((prop->val.len % entrylen) !=3D 0) { - FAIL(c, dti, "\"ranges\" property in %s has invalid length (%d bytes) " - "(parent #address-cells =3D=3D %d, child #address-cells =3D=3D %d, " - "#size-cells =3D=3D %d)", node->fullpath, prop->val.len, - p_addr_cells, c_addr_cells, c_size_cells); - } -} -WARNING(ranges_format, check_ranges_format, NULL, &addr_size_cells); - -/* - * Style checks - */ -static void check_avoid_default_addr_size(struct check *c, struct dt_info = *dti, - struct node *node) -{ - struct property *reg, *ranges; - - if (!node->parent) - return; /* Ignore root node */ - - reg =3D get_property(node, "reg"); - ranges =3D get_property(node, "ranges"); - - if (!reg && !ranges) - return; - - if (node->parent->addr_cells =3D=3D -1) - FAIL(c, dti, "Relying on default #address-cells value for %s", - node->fullpath); - - if (node->parent->size_cells =3D=3D -1) - FAIL(c, dti, "Relying on default #size-cells value for %s", - node->fullpath); -} -WARNING(avoid_default_addr_size, check_avoid_default_addr_size, NULL, - &addr_size_cells); - -static void check_obsolete_chosen_interrupt_controller(struct check *c, - struct dt_info *dti, - struct node *node) -{ - struct node *dt =3D dti->dt; - struct node *chosen; - struct property *prop; - - if (node !=3D dt) - return; - - - chosen =3D get_node_by_path(dt, "/chosen"); - if (!chosen) - return; - - prop =3D get_property(chosen, "interrupt-controller"); - if (prop) - FAIL(c, dti, "/chosen has obsolete \"interrupt-controller\" " - "property"); -} -WARNING(obsolete_chosen_interrupt_controller, - check_obsolete_chosen_interrupt_controller, NULL); - -static struct check *check_table[] =3D { - &duplicate_node_names, &duplicate_property_names, - &node_name_chars, &node_name_format, &property_name_chars, - &name_is_string, &name_properties, - - &duplicate_label, - - &explicit_phandles, - &phandle_references, &path_references, - - &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell, - &device_type_is_string, &model_is_string, &status_is_string, - - &property_name_chars_strict, - &node_name_chars_strict, - - &addr_size_cells, ®_format, &ranges_format, - - &unit_address_vs_reg, - - &avoid_default_addr_size, - &obsolete_chosen_interrupt_controller, - - &always_fail, -}; - -static void enable_warning_error(struct check *c, bool warn, bool error) -{ - int i; - - /* Raising level, also raise it for prereqs */ - if ((warn && !c->warn) || (error && !c->error)) - for (i =3D 0; i < c->num_prereqs; i++) - enable_warning_error(c->prereq[i], warn, error); - - c->warn =3D c->warn || warn; - c->error =3D c->error || error; -} - -static void disable_warning_error(struct check *c, bool warn, bool error) -{ - int i; - - /* Lowering level, also lower it for things this is the prereq - * for */ - if ((warn && c->warn) || (error && c->error)) { - for (i =3D 0; i < ARRAY_SIZE(check_table); i++) { - struct check *cc =3D check_table[i]; - int j; - - for (j =3D 0; j < cc->num_prereqs; j++) - if (cc->prereq[j] =3D=3D c) - disable_warning_error(cc, warn, error); - } - } - - c->warn =3D c->warn && !warn; - c->error =3D c->error && !error; -} - -void parse_checks_option(bool warn, bool error, const char *arg) -{ - int i; - const char *name =3D arg; - bool enable =3D true; - - if ((strncmp(arg, "no-", 3) =3D=3D 0) - || (strncmp(arg, "no_", 3) =3D=3D 0)) { - name =3D arg + 3; - enable =3D false; - } - - for (i =3D 0; i < ARRAY_SIZE(check_table); i++) { - struct check *c =3D check_table[i]; - - if (streq(c->name, name)) { - if (enable) - enable_warning_error(c, warn, error); - else - disable_warning_error(c, warn, error); - return; - } - } - - die("Unrecognized check name \"%s\"\n", name); -} - -void process_checks(bool force, struct dt_info *dti) -{ - int i; - int error =3D 0; - - for (i =3D 0; i < ARRAY_SIZE(check_table); i++) { - struct check *c =3D check_table[i]; - - if (c->warn || c->error) - error =3D error || run_check(c, dti); - } - - if (error) { - if (!force) { - fprintf(stderr, "ERROR: Input tree has errors, aborting " - "(use -f to force output)\n"); - exit(2); - } else if (quiet < 3) { - fprintf(stderr, "Warning: Input tree has errors, " - "output forced\n"); - } - } -} diff --git a/scripts/dtc/data.c b/scripts/dtc/data.c deleted file mode 100644 index 8cae237468..0000000000 --- a/scripts/dtc/data.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -void data_free(struct data d) -{ - struct marker *m, *nm; - - m =3D d.markers; - while (m) { - nm =3D m->next; - free(m->ref); - free(m); - m =3D nm; - } - - if (d.val) - free(d.val); -} - -struct data data_grow_for(struct data d, int xlen) -{ - struct data nd; - int newsize; - - if (xlen =3D=3D 0) - return d; - - nd =3D d; - - newsize =3D xlen; - - while ((d.len + xlen) > newsize) - newsize *=3D 2; - - nd.val =3D xrealloc(d.val, newsize); - - return nd; -} - -struct data data_copy_mem(const char *mem, int len) -{ - struct data d; - - d =3D data_grow_for(empty_data, len); - - d.len =3D len; - memcpy(d.val, mem, len); - - return d; -} - -struct data data_copy_escape_string(const char *s, int len) -{ - int i =3D 0; - struct data d; - char *q; - - d =3D data_grow_for(empty_data, len + 1); - - q =3D d.val; - while (i < len) { - char c =3D s[i++]; - - if (c =3D=3D '\\') - c =3D get_escape_char(s, &i); - - q[d.len++] =3D c; - } - - q[d.len++] =3D '\0'; - return d; -} - -struct data data_copy_file(FILE *f, size_t maxlen) -{ - struct data d =3D empty_data; - - while (!feof(f) && (d.len < maxlen)) { - size_t chunksize, ret; - - if (maxlen =3D=3D -1) - chunksize =3D 4096; - else - chunksize =3D maxlen - d.len; - - d =3D data_grow_for(d, chunksize); - ret =3D fread(d.val + d.len, 1, chunksize, f); - - if (ferror(f)) - die("Error reading file into data: %s", strerror(errno)); - - if (d.len + ret < d.len) - die("Overflow reading file into data\n"); - - d.len +=3D ret; - } - - return d; -} - -struct data data_append_data(struct data d, const void *p, int len) -{ - d =3D data_grow_for(d, len); - memcpy(d.val + d.len, p, len); - d.len +=3D len; - return d; -} - -struct data data_insert_at_marker(struct data d, struct marker *m, - const void *p, int len) -{ - d =3D data_grow_for(d, len); - memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset); - memcpy(d.val + m->offset, p, len); - d.len +=3D len; - - /* Adjust all markers after the one we're inserting at */ - m =3D m->next; - for_each_marker(m) - m->offset +=3D len; - return d; -} - -static struct data data_append_markers(struct data d, struct marker *m) -{ - struct marker **mp =3D &d.markers; - - /* Find the end of the markerlist */ - while (*mp) - mp =3D &((*mp)->next); - *mp =3D m; - return d; -} - -struct data data_merge(struct data d1, struct data d2) -{ - struct data d; - struct marker *m2 =3D d2.markers; - - d =3D data_append_markers(data_append_data(d1, d2.val, d2.len), m2); - - /* Adjust for the length of d1 */ - for_each_marker(m2) - m2->offset +=3D d1.len; - - d2.markers =3D NULL; /* So data_free() doesn't clobber them */ - data_free(d2); - - return d; -} - -struct data data_append_integer(struct data d, uint64_t value, int bits) -{ - uint8_t value_8; - uint16_t value_16; - uint32_t value_32; - uint64_t value_64; - - switch (bits) { - case 8: - value_8 =3D value; - return data_append_data(d, &value_8, 1); - - case 16: - value_16 =3D cpu_to_fdt16(value); - return data_append_data(d, &value_16, 2); - - case 32: - value_32 =3D cpu_to_fdt32(value); - return data_append_data(d, &value_32, 4); - - case 64: - value_64 =3D cpu_to_fdt64(value); - return data_append_data(d, &value_64, 8); - - default: - die("Invalid literal size (%d)\n", bits); - } -} - -struct data data_append_re(struct data d, const struct fdt_reserve_entry *= re) -{ - struct fdt_reserve_entry bere; - - bere.address =3D cpu_to_fdt64(re->address); - bere.size =3D cpu_to_fdt64(re->size); - - return data_append_data(d, &bere, sizeof(bere)); -} - -struct data data_append_cell(struct data d, cell_t word) -{ - return data_append_integer(d, word, sizeof(word) * 8); -} - -struct data data_append_addr(struct data d, uint64_t addr) -{ - return data_append_integer(d, addr, sizeof(addr) * 8); -} - -struct data data_append_byte(struct data d, uint8_t byte) -{ - return data_append_data(d, &byte, 1); -} - -struct data data_append_zeroes(struct data d, int len) -{ - d =3D data_grow_for(d, len); - - memset(d.val + d.len, 0, len); - d.len +=3D len; - return d; -} - -struct data data_append_align(struct data d, int align) -{ - int newlen =3D ALIGN(d.len, align); - return data_append_zeroes(d, newlen - d.len); -} - -struct data data_add_marker(struct data d, enum markertype type, char *ref) -{ - struct marker *m; - - m =3D xmalloc(sizeof(*m)); - m->offset =3D d.len; - m->type =3D type; - m->ref =3D ref; - m->next =3D NULL; - - return data_append_markers(d, m); -} - -bool data_is_one_string(struct data d) -{ - int i; - int len =3D d.len; - - if (len =3D=3D 0) - return false; - - for (i =3D 0; i < len-1; i++) - if (d.val[i] =3D=3D '\0') - return false; - - if (d.val[len-1] !=3D '\0') - return false; - - return true; -} diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l deleted file mode 100644 index 52bed7b749..0000000000 --- a/scripts/dtc/dtc-lexer.l +++ /dev/null @@ -1,311 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -%option noyywrap nounput noinput never-interactive - -%x BYTESTRING -%x PROPNODENAME -%s V1 - -PROPNODECHAR [a-zA-Z0-9,._+*#?@-] -PATHCHAR ({PROPNODECHAR}|[/]) -LABEL [a-zA-Z_][a-zA-Z0-9_]* -STRING \"([^\\"]|\\.)*\" -CHAR_LITERAL '([^']|\\')*' -WS [[:space:]] -COMMENT "/*"([^*]|\*+[^*/])*\*+"/" -LINECOMMENT "//".*\n - -%{ -#include "dtc.h" -#include "srcpos.h" -#include "dtc-parser.tab.h" - -YYLTYPE yylloc; -extern bool treesource_error; - -/* CAUTION: this will stop working if we ever use yyless() or yyunput() */ -#define YY_USER_ACTION \ - { \ - srcpos_update(&yylloc, yytext, yyleng); \ - } - -/*#define LEXDEBUG 1*/ - -#ifdef LEXDEBUG -#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) -#else -#define DPRINT(fmt, ...) do { } while (0) -#endif - -static int dts_version =3D 1; - -#define BEGIN_DEFAULT() DPRINT("\n"); \ - BEGIN(V1); \ - -static void push_input_file(const char *filename); -static bool pop_input_file(void); -#ifdef __GNUC__ -static void lexical_error(const char *fmt, ...) - __attribute__((format (printf, 1, 2))); -#else -static void lexical_error(const char *fmt, ...); -#endif - -%} - -%% -<*>"/include/"{WS}*{STRING} { - char *name =3D strchr(yytext, '\"') + 1; - yytext[yyleng-1] =3D '\0'; - push_input_file(name); - } - -<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? { - char *line, *fnstart, *fnend; - struct data fn; - /* skip text before line # */ - line =3D yytext; - while (!isdigit((unsigned char)*line)) - line++; - - /* regexp ensures that first and list " - * in the whole yytext are those at - * beginning and end of the filename string */ - fnstart =3D memchr(yytext, '"', yyleng); - for (fnend =3D yytext + yyleng - 1; - *fnend !=3D '"'; fnend--) - ; - assert(fnstart && fnend && (fnend > fnstart)); - - fn =3D data_copy_escape_string(fnstart + 1, - fnend - fnstart - 1); - - /* Don't allow nuls in filenames */ - if (memchr(fn.val, '\0', fn.len - 1)) - lexical_error("nul in line number directive"); - - /* -1 since #line is the number of the next line */ - srcpos_set_line(xstrdup(fn.val), atoi(line) - 1); - data_free(fn); - } - -<*><> { - if (!pop_input_file()) { - yyterminate(); - } - } - -<*>{STRING} { - DPRINT("String: %s\n", yytext); - yylval.data =3D data_copy_escape_string(yytext+1, - yyleng-2); - return DT_STRING; - } - -<*>"/dts-v1/" { - DPRINT("Keyword: /dts-v1/\n"); - dts_version =3D 1; - BEGIN_DEFAULT(); - return DT_V1; - } - -<*>"/plugin/" { - DPRINT("Keyword: /plugin/\n"); - return DT_PLUGIN; - } - -<*>"/memreserve/" { - DPRINT("Keyword: /memreserve/\n"); - BEGIN_DEFAULT(); - return DT_MEMRESERVE; - } - -<*>"/bits/" { - DPRINT("Keyword: /bits/\n"); - BEGIN_DEFAULT(); - return DT_BITS; - } - -<*>"/delete-property/" { - DPRINT("Keyword: /delete-property/\n"); - DPRINT("\n"); - BEGIN(PROPNODENAME); - return DT_DEL_PROP; - } - -<*>"/delete-node/" { - DPRINT("Keyword: /delete-node/\n"); - DPRINT("\n"); - BEGIN(PROPNODENAME); - return DT_DEL_NODE; - } - -<*>{LABEL}: { - DPRINT("Label: %s\n", yytext); - yylval.labelref =3D xstrdup(yytext); - yylval.labelref[yyleng-1] =3D '\0'; - return DT_LABEL; - } - -([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? { - char *e; - DPRINT("Integer Literal: '%s'\n", yytext); - - errno =3D 0; - yylval.integer =3D strtoull(yytext, &e, 0); - - if (*e && e[strspn(e, "UL")]) { - lexical_error("Bad integer literal '%s'", - yytext); - } - - if (errno =3D=3D ERANGE) - lexical_error("Integer literal '%s' out of range", - yytext); - else - /* ERANGE is the only strtoull error triggerable - * by strings matching the pattern */ - assert(errno =3D=3D 0); - return DT_LITERAL; - } - -<*>{CHAR_LITERAL} { - struct data d; - DPRINT("Character literal: %s\n", yytext); - - d =3D data_copy_escape_string(yytext+1, yyleng-2); - if (d.len =3D=3D 1) { - lexical_error("Empty character literal"); - yylval.integer =3D 0; - } else { - yylval.integer =3D (unsigned char)d.val[0]; - - if (d.len > 2) - lexical_error("Character literal has %d" - " characters instead of 1", - d.len - 1); - } - - data_free(d); - return DT_CHAR_LITERAL; - } - -<*>\&{LABEL} { /* label reference */ - DPRINT("Ref: %s\n", yytext+1); - yylval.labelref =3D xstrdup(yytext+1); - return DT_REF; - } - -<*>"&{/"{PATHCHAR}*\} { /* new-style path reference */ - yytext[yyleng-1] =3D '\0'; - DPRINT("Ref: %s\n", yytext+2); - yylval.labelref =3D xstrdup(yytext+2); - return DT_REF; - } - -[0-9a-fA-F]{2} { - yylval.byte =3D strtol(yytext, NULL, 16); - DPRINT("Byte: %02x\n", (int)yylval.byte); - return DT_BYTE; - } - -"]" { - DPRINT("/BYTESTRING\n"); - BEGIN_DEFAULT(); - return ']'; - } - -\\?{PROPNODECHAR}+ { - DPRINT("PropNodeName: %s\n", yytext); - yylval.propnodename =3D xstrdup((yytext[0] =3D=3D '\\') ? - yytext + 1 : yytext); - BEGIN_DEFAULT(); - return DT_PROPNODENAME; - } - -"/incbin/" { - DPRINT("Binary Include\n"); - return DT_INCBIN; - } - -<*>{WS}+ /* eat whitespace */ -<*>{COMMENT}+ /* eat C-style comments */ -<*>{LINECOMMENT}+ /* eat C++-style comments */ - -<*>"<<" { return DT_LSHIFT; }; -<*>">>" { return DT_RSHIFT; }; -<*>"<=3D" { return DT_LE; }; -<*>">=3D" { return DT_GE; }; -<*>"=3D=3D" { return DT_EQ; }; -<*>"!=3D" { return DT_NE; }; -<*>"&&" { return DT_AND; }; -<*>"||" { return DT_OR; }; - -<*>. { - DPRINT("Char: %c (\\x%02x)\n", yytext[0], - (unsigned)yytext[0]); - if (yytext[0] =3D=3D '[') { - DPRINT("\n"); - BEGIN(BYTESTRING); - } - if ((yytext[0] =3D=3D '{') - || (yytext[0] =3D=3D ';')) { - DPRINT("\n"); - BEGIN(PROPNODENAME); - } - return yytext[0]; - } - -%% - -static void push_input_file(const char *filename) -{ - assert(filename); - - srcfile_push(filename); - - yyin =3D current_srcfile->f; - - yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE)); -} - - -static bool pop_input_file(void) -{ - if (srcfile_pop() =3D=3D 0) - return false; - - yypop_buffer_state(); - yyin =3D current_srcfile->f; - - return true; -} - -static void lexical_error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - srcpos_verror(&yylloc, "Lexical error", fmt, ap); - va_end(ap); - - treesource_error =3D true; -} diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.le= x.c_shipped deleted file mode 100644 index d77fdfe590..0000000000 --- a/scripts/dtc/dtc-lexer.lex.c_shipped +++ /dev/null @@ -1,2260 +0,0 @@ -#line 2 "dtc-lexer.lex.c" - -#line 4 "dtc-lexer.lex.c" - -#define YY_INT_ALIGNED short int - -/* A lexical scanner generated by flex */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 -#if YY_FLEX_SUBMINOR_VERSION > 0 -#define FLEX_BETA -#endif - -/* First, we deal with platform-specific or compiler-specific issues. */ - -/* begin standard C headers. */ -#include -#include -#include -#include - -/* end standard C headers. */ - -/* flex integer type definitions */ - -#ifndef FLEXINT_H -#define FLEXINT_H - -/* C99 systems have . Non-C99 systems may or may not. */ - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >=3D 199901L - -/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, - * if you want the limit (max/min) macros for int types.=20 - */ -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 -#endif - -#include -typedef int8_t flex_int8_t; -typedef uint8_t flex_uint8_t; -typedef int16_t flex_int16_t; -typedef uint16_t flex_uint16_t; -typedef int32_t flex_int32_t; -typedef uint32_t flex_uint32_t; -#else -typedef signed char flex_int8_t; -typedef short int flex_int16_t; -typedef int flex_int32_t; -typedef unsigned char flex_uint8_t;=20 -typedef unsigned short int flex_uint16_t; -typedef unsigned int flex_uint32_t; - -/* Limits of integral types. */ -#ifndef INT8_MIN -#define INT8_MIN (-128) -#endif -#ifndef INT16_MIN -#define INT16_MIN (-32767-1) -#endif -#ifndef INT32_MIN -#define INT32_MIN (-2147483647-1) -#endif -#ifndef INT8_MAX -#define INT8_MAX (127) -#endif -#ifndef INT16_MAX -#define INT16_MAX (32767) -#endif -#ifndef INT32_MAX -#define INT32_MAX (2147483647) -#endif -#ifndef UINT8_MAX -#define UINT8_MAX (255U) -#endif -#ifndef UINT16_MAX -#define UINT16_MAX (65535U) -#endif -#ifndef UINT32_MAX -#define UINT32_MAX (4294967295U) -#endif - -#endif /* ! C99 */ - -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) - -#define YY_USE_CONST - -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN (yy_start) =3D 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START (((yy_start) - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#ifndef YY_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k. - * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. - * Ditto for the __ia64__ case accordingly. - */ -#define YY_BUF_SIZE 32768 -#else -#define YY_BUF_SIZE 16384 -#endif /* __ia64__ */ -#endif - -/* The state buf must be large enough to hold one state per character in t= he main buffer. - */ -#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) - -#ifndef YY_TYPEDEF_YY_BUFFER_STATE -#define YY_TYPEDEF_YY_BUFFER_STATE -typedef struct yy_buffer_state *YY_BUFFER_STATE; -#endif - -extern int yyleng; - -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - - #define YY_LESS_LINENO(n) - =20 -/* Return all but the first "n" matched characters back to the input strea= m. */ -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg =3D (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - *yy_cp =3D (yy_hold_char); \ - YY_RESTORE_YY_MORE_OFFSET \ - (yy_c_buf_p) =3D yy_cp =3D yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, (yytext_ptr) ) - -#ifndef YY_TYPEDEF_YY_SIZE_T -#define YY_TYPEDEF_YY_SIZE_T -typedef size_t yy_size_t; -#endif - -#ifndef YY_STRUCT_YY_BUFFER_STATE -#define YY_STRUCT_YY_BUFFER_STATE -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - =20 - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; - -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin@a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - - }; -#endif /* !YY_STRUCT_YY_BUFFER_STATE */ - -/* Stack of input buffers. */ -static size_t yy_buffer_stack_top =3D 0; /**< index of top of stack. */ -static size_t yy_buffer_stack_max =3D 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack =3D 0; /**< Stack as an array. */ - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - * - * Returns the top of the stack, or NULL. - */ -#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ - ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ - : NULL) - -/* Same as previous macro, but useful when we know that the buffer stack i= s not - * NULL or when we need an lvalue. For internal use only. - */ -#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p =3D (char *) 0; -static int yy_init =3D 0; /* whether we need to initialize */ -static int yy_start =3D 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); - -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) - -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! YY_CURRENT_BUFFER ){ \ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE =3D \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_is_interactive =3D is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! YY_CURRENT_BUFFER ){\ - yyensure_buffer_stack (); \ - YY_CURRENT_BUFFER_LVALUE =3D \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ - } \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol =3D at_bol; \ - } - -#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) - -/* Begin user sect3 */ - -#define yywrap(n) 1 -#define YY_SKIP_YYWRAP - -typedef unsigned char YY_CHAR; - -FILE *yyin =3D (FILE *) 0, *yyout =3D (FILE *) 0; - -typedef int yy_state_type; - -extern int yylineno; - -int yylineno =3D 1; - -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - (yytext_ptr) =3D yy_bp; \ - yyleng =3D (size_t) (yy_cp - yy_bp); \ - (yy_hold_char) =3D *yy_cp; \ - *yy_cp =3D '\0'; \ - (yy_c_buf_p) =3D yy_cp; - -#define YY_NUM_RULES 31 -#define YY_END_OF_BUFFER 32 -/* This struct is not used in this scanner, - but its presence is necessary. */ -struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[166] =3D - { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 30, - 19, 19, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 16, 17, 17, 30, - 17, 11, 11, 19, 27, 0, 3, 0, 28, 13, - 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 24, 26, 25, 23, 0, 10, 29, 0, - 0, 0, 15, 15, 17, 17, 17, 11, 11, 11, - 0, 13, 0, 12, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 17, 11, 11, - 11, 0, 14, 20, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 17, 7, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 18, 0, 0, 5, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 6, 9, 0, - 0, 0, 0, 8, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] =3D - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 5, 6, 7, 1, 1, 8, 9, 1, - 1, 10, 11, 11, 12, 11, 13, 14, 15, 16, - 16, 16, 16, 16, 16, 16, 16, 17, 1, 18, - 19, 20, 11, 11, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, - 22, 22, 22, 22, 24, 22, 22, 25, 22, 22, - 1, 26, 27, 1, 22, 1, 21, 28, 29, 30, - - 31, 21, 32, 22, 33, 22, 22, 34, 35, 36, - 37, 38, 22, 39, 40, 41, 42, 43, 22, 25, - 44, 22, 45, 46, 47, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[48] =3D - { 0, - 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, - 2, 2, 4, 5, 5, 5, 6, 1, 1, 1, - 7, 8, 8, 8, 8, 1, 1, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 3, 1, 4 - } ; - -static yyconst flex_int16_t yy_base[180] =3D - { 0, - 0, 393, 35, 392, 66, 391, 38, 107, 397, 401, - 55, 113, 377, 112, 111, 111, 114, 42, 376, 106, - 377, 347, 126, 120, 0, 147, 401, 0, 124, 0, - 137, 158, 170, 163, 401, 153, 401, 389, 401, 0, - 378, 120, 401, 131, 380, 386, 355, 139, 351, 355, - 351, 401, 401, 401, 401, 401, 367, 401, 401, 185, - 350, 346, 401, 364, 0, 185, 347, 189, 356, 355, - 0, 0, 330, 180, 366, 141, 372, 361, 332, 338, - 331, 341, 334, 326, 205, 331, 337, 329, 401, 341, - 167, 316, 401, 349, 348, 320, 328, 346, 180, 318, - - 324, 209, 324, 320, 322, 342, 338, 309, 306, 315, - 305, 315, 312, 192, 342, 341, 401, 293, 306, 282, - 268, 252, 255, 203, 285, 282, 272, 268, 252, 233, - 232, 239, 208, 107, 401, 401, 238, 211, 401, 211, - 212, 208, 228, 203, 215, 207, 233, 222, 212, 211, - 203, 227, 401, 237, 225, 204, 185, 401, 401, 149, - 128, 88, 42, 401, 401, 253, 259, 267, 271, 275, - 281, 288, 292, 300, 308, 312, 318, 326, 334 - } ; - -static yyconst flex_int16_t yy_def[180] =3D - { 0, - 165, 1, 1, 3, 165, 5, 1, 1, 165, 165, - 165, 165, 165, 166, 167, 168, 165, 165, 165, 165, - 169, 165, 165, 165, 170, 169, 165, 171, 172, 171, - 171, 165, 165, 165, 165, 166, 165, 166, 165, 173, - 165, 168, 165, 168, 174, 175, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 169, 165, 165, 165, - 165, 165, 165, 169, 171, 172, 171, 165, 165, 165, - 176, 173, 177, 168, 174, 174, 175, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 171, 165, 165, - 176, 177, 165, 165, 165, 165, 165, 165, 165, 165, - - 165, 165, 165, 165, 171, 165, 165, 165, 165, 165, - 165, 165, 165, 178, 165, 171, 165, 165, 165, 165, - 165, 165, 165, 178, 165, 178, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 179, 165, 165, - 165, 179, 165, 179, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 0, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165 - } ; - -static yyconst flex_int16_t yy_nxt[449] =3D - { 0, - 10, 11, 12, 11, 13, 14, 10, 15, 16, 10, - 10, 10, 17, 10, 10, 10, 10, 18, 19, 20, - 21, 21, 21, 21, 21, 10, 10, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 10, 22, 10, 24, 25, 25, - 25, 32, 33, 33, 164, 26, 34, 34, 34, 52, - 53, 27, 26, 26, 26, 26, 10, 11, 12, 11, - 13, 14, 28, 15, 16, 28, 28, 28, 24, 28, - 28, 28, 10, 18, 19, 20, 29, 29, 29, 29, - 29, 30, 10, 29, 29, 29, 29, 29, 29, 29, - - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 10, 22, 10, 23, 34, 34, 34, 37, 39, 43, - 32, 33, 33, 45, 55, 56, 46, 60, 43, 45, - 65, 163, 46, 65, 65, 65, 44, 38, 60, 74, - 58, 47, 141, 48, 142, 44, 49, 47, 50, 48, - 76, 51, 62, 94, 50, 41, 44, 51, 37, 61, - 64, 64, 64, 58, 34, 34, 34, 64, 162, 80, - 67, 68, 68, 68, 64, 64, 64, 64, 38, 81, - 69, 70, 71, 68, 68, 68, 60, 161, 43, 69, - 70, 65, 69, 70, 65, 65, 65, 125, 85, 85, - - 85, 58, 68, 68, 68, 44, 102, 110, 125, 133, - 102, 69, 70, 111, 114, 160, 159, 126, 85, 85, - 85, 140, 140, 140, 140, 140, 140, 153, 126, 147, - 147, 147, 153, 148, 147, 147, 147, 158, 148, 165, - 157, 156, 155, 151, 150, 149, 146, 154, 145, 144, - 143, 139, 154, 36, 36, 36, 36, 36, 36, 36, - 36, 40, 138, 137, 136, 40, 40, 42, 42, 42, - 42, 42, 42, 42, 42, 57, 57, 57, 57, 63, - 135, 63, 65, 134, 165, 65, 133, 65, 65, 66, - 132, 131, 66, 66, 66, 66, 72, 130, 72, 72, - - 75, 75, 75, 75, 75, 75, 75, 75, 77, 77, - 77, 77, 77, 77, 77, 77, 91, 129, 91, 92, - 128, 92, 92, 127, 92, 92, 124, 124, 124, 124, - 124, 124, 124, 124, 152, 152, 152, 152, 152, 152, - 152, 152, 60, 60, 123, 122, 121, 120, 119, 118, - 117, 45, 116, 111, 115, 113, 112, 109, 108, 107, - 46, 106, 93, 89, 105, 104, 103, 101, 100, 99, - 98, 97, 96, 95, 78, 76, 93, 90, 89, 88, - 58, 87, 86, 58, 84, 83, 82, 79, 78, 76, - 73, 165, 59, 58, 54, 35, 165, 31, 23, 23, - - 9, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165 - } ; - -static yyconst flex_int16_t yy_chk[449] =3D - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, - 3, 7, 7, 7, 163, 3, 11, 11, 11, 18, - 18, 3, 3, 3, 3, 3, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 8, 12, 12, 12, 14, 15, 16, - 8, 8, 8, 17, 20, 20, 17, 23, 42, 24, - 29, 162, 24, 29, 29, 29, 16, 14, 31, 44, - 29, 17, 134, 17, 134, 42, 17, 24, 17, 24, - 76, 17, 24, 76, 24, 15, 44, 24, 36, 23, - 26, 26, 26, 26, 34, 34, 34, 26, 161, 48, - 31, 32, 32, 32, 26, 26, 26, 26, 36, 48, - 32, 32, 32, 33, 33, 33, 60, 160, 74, 91, - 91, 66, 33, 33, 66, 66, 66, 114, 60, 60, - - 60, 66, 68, 68, 68, 74, 85, 99, 124, 133, - 102, 68, 68, 99, 102, 157, 156, 114, 85, 85, - 85, 133, 133, 133, 140, 140, 140, 148, 124, 143, - 143, 143, 152, 143, 147, 147, 147, 155, 147, 154, - 151, 150, 149, 146, 145, 144, 142, 148, 141, 138, - 137, 132, 152, 166, 166, 166, 166, 166, 166, 166, - 166, 167, 131, 130, 129, 167, 167, 168, 168, 168, - 168, 168, 168, 168, 168, 169, 169, 169, 169, 170, - 128, 170, 171, 127, 126, 171, 125, 171, 171, 172, - 123, 122, 172, 172, 172, 172, 173, 121, 173, 173, - - 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, - 175, 175, 175, 175, 175, 175, 176, 120, 176, 177, - 119, 177, 177, 118, 177, 177, 178, 178, 178, 178, - 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, - 179, 179, 116, 115, 113, 112, 111, 110, 109, 108, - 107, 106, 105, 104, 103, 101, 100, 98, 97, 96, - 95, 94, 92, 90, 88, 87, 86, 84, 83, 82, - 81, 80, 79, 78, 77, 75, 73, 70, 69, 67, - 64, 62, 61, 57, 51, 50, 49, 47, 46, 45, - 41, 38, 22, 21, 19, 13, 9, 6, 4, 2, - - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, - 165, 165, 165, 165, 165, 165, 165, 165 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -extern int yy_flex_debug; -int yy_flex_debug =3D 0; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "dtc-lexer.l" -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -#define YY_NO_INPUT 1 - - - -#line 37 "dtc-lexer.l" -#include "dtc.h" -#include "srcpos.h" -#include "dtc-parser.tab.h" - -YYLTYPE yylloc; -extern bool treesource_error; - -/* CAUTION: this will stop working if we ever use yyless() or yyunput() */ -#define YY_USER_ACTION \ - { \ - srcpos_update(&yylloc, yytext, yyleng); \ - } - -/*#define LEXDEBUG 1*/ - -#ifdef LEXDEBUG -#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) -#else -#define DPRINT(fmt, ...) do { } while (0) -#endif - -static int dts_version =3D 1; - -#define BEGIN_DEFAULT() DPRINT("\n"); \ - BEGIN(V1); \ - -static void push_input_file(const char *filename); -static bool pop_input_file(void); -#ifdef __GNUC__ -static void lexical_error(const char *fmt, ...) - __attribute__((format (printf, 1, 2))); -#else -static void lexical_error(const char *fmt, ...); -#endif - -#line 674 "dtc-lexer.lex.c" - -#define INITIAL 0 -#define BYTESTRING 1 -#define PROPNODENAME 2 -#define V1 3 - -#ifndef YY_NO_UNISTD_H -/* Special case for "unistd.h", since it is non-ANSI. We include it way - * down here because we want the user's section 1 to have been scanned fir= st. - * The user has a chance to override it with an option. - */ -#include -#endif - -#ifndef YY_EXTRA_TYPE -#define YY_EXTRA_TYPE void * -#endif - -static int yy_init_globals (void ); - -/* Accessor methods to globals. - These are made visible to non-reentrant scanners for convenience. */ - -int yylex_destroy (void ); - -int yyget_debug (void ); - -void yyset_debug (int debug_flag ); - -YY_EXTRA_TYPE yyget_extra (void ); - -void yyset_extra (YY_EXTRA_TYPE user_defined ); - -FILE *yyget_in (void ); - -void yyset_in (FILE * in_str ); - -FILE *yyget_out (void ); - -void yyset_out (FILE * out_str ); - -int yyget_leng (void ); - -char *yyget_text (void ); - -int yyget_lineno (void ); - -void yyset_lineno (int line_number ); - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap (void ); -#else -extern int yywrap (void ); -#endif -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); -#endif - -#ifndef YY_NO_INPUT - -#ifdef __cplusplus -static int yyinput (void ); -#else -static int input (void ); -#endif - -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#ifdef __ia64__ -/* On IA-64, the buffer size is 16k, not 8k */ -#define YY_READ_BUF_SIZE 16384 -#else -#define YY_READ_BUF_SIZE 8192 -#endif /* __ia64__ */ -#endif - -/* Copy whatever the last rule matched to the standard output. */ -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_= NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ - { \ - int c =3D '*'; \ - size_t n; \ - for ( n =3D 0; n < max_size && \ - (c =3D getc( yyin )) !=3D EOF && c !=3D '\n'; ++n ) \ - buf[n] =3D (char) c; \ - if ( c =3D=3D '\n' ) \ - buf[n++] =3D (char) c; \ - if ( c =3D=3D EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result =3D n; \ - } \ - else \ - { \ - errno=3D0; \ - while ( (result =3D fread(buf, 1, max_size, yyin))=3D=3D0 && ferror(yyin= )) \ - { \ - if( errno !=3D EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=3D0; \ - clearerr(yyin); \ - } \ - }\ -\ - -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* end tables serialization structures and prototypes */ - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL_IS_OURS 1 - -extern int yylex (void); - -#define YY_DECL int yylex (void) -#endif /* !YY_DECL */ - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed@the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - YY_CURRENT_BUFFER_LVALUE->yy_at_bol =3D \ - (yytext[yyleng - 1] =3D=3D '\n'); \ - YY_USER_ACTION - -/** The main scanner function which does all the work. - */ -YY_DECL -{ - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - =20 -#line 74 "dtc-lexer.l" - -#line 867 "dtc-lexer.lex.c" - - if ( !(yy_init) ) - { - (yy_init) =3D 1; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! (yy_start) ) - (yy_start) =3D 1; /* first start state */ - - if ( ! yyin ) - yyin =3D stdin; - - if ( ! yyout ) - yyout =3D stdout; - - if ( ! YY_CURRENT_BUFFER ) { - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE =3D - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp =3D (yy_c_buf_p); - - /* Support of yytext. */ - *yy_cp =3D (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp =3D yy_cp; - - yy_current_state =3D (yy_start); - yy_current_state +=3D YY_AT_BOL(); -yy_match: - do - { - register YY_CHAR yy_c =3D yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) =3D yy_current_state; - (yy_last_accepting_cpos) =3D yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] !=3D yy_current_state ) - { - yy_current_state =3D (int) yy_def[yy_current_state]; - if ( yy_current_state >=3D 166 ) - yy_c =3D yy_meta[(unsigned int) yy_c]; - } - yy_current_state =3D yy_nxt[yy_base[yy_current_state] + (unsigned int) = yy_c]; - ++yy_cp; - } - while ( yy_current_state !=3D 165 ); - yy_cp =3D (yy_last_accepting_cpos); - yy_current_state =3D (yy_last_accepting_state); - -yy_find_action: - yy_act =3D yy_accept[yy_current_state]; - - YY_DO_BEFORE_ACTION; - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp =3D (yy_hold_char); - yy_cp =3D (yy_last_accepting_cpos); - yy_current_state =3D (yy_last_accepting_state); - goto yy_find_action; - -case 1: -/* rule 1 can match eol */ -YY_RULE_SETUP -#line 75 "dtc-lexer.l" -{ - char *name =3D strchr(yytext, '\"') + 1; - yytext[yyleng-1] =3D '\0'; - push_input_file(name); - } - YY_BREAK -case 2: -/* rule 2 can match eol */ -YY_RULE_SETUP -#line 81 "dtc-lexer.l" -{ - char *line, *fnstart, *fnend; - struct data fn; - /* skip text before line # */ - line =3D yytext; - while (!isdigit((unsigned char)*line)) - line++; - - /* regexp ensures that first and list " - * in the whole yytext are those at - * beginning and end of the filename string */ - fnstart =3D memchr(yytext, '"', yyleng); - for (fnend =3D yytext + yyleng - 1; - *fnend !=3D '"'; fnend--) - ; - assert(fnstart && fnend && (fnend > fnstart)); - - fn =3D data_copy_escape_string(fnstart + 1, - fnend - fnstart - 1); - - /* Don't allow nuls in filenames */ - if (memchr(fn.val, '\0', fn.len - 1)) - lexical_error("nul in line number directive"); - - /* -1 since #line is the number of the next line */ - srcpos_set_line(xstrdup(fn.val), atoi(line) - 1); - data_free(fn); - } - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(BYTESTRING): -case YY_STATE_EOF(PROPNODENAME): -case YY_STATE_EOF(V1): -#line 110 "dtc-lexer.l" -{ - if (!pop_input_file()) { - yyterminate(); - } - } - YY_BREAK -case 3: -/* rule 3 can match eol */ -YY_RULE_SETUP -#line 116 "dtc-lexer.l" -{ - DPRINT("String: %s\n", yytext); - yylval.data =3D data_copy_escape_string(yytext+1, - yyleng-2); - return DT_STRING; - } - YY_BREAK -case 4: -YY_RULE_SETUP -#line 123 "dtc-lexer.l" -{ - DPRINT("Keyword: /dts-v1/\n"); - dts_version =3D 1; - BEGIN_DEFAULT(); - return DT_V1; - } - YY_BREAK -case 5: -YY_RULE_SETUP -#line 130 "dtc-lexer.l" -{ - DPRINT("Keyword: /plugin/\n"); - return DT_PLUGIN; - } - YY_BREAK -case 6: -YY_RULE_SETUP -#line 135 "dtc-lexer.l" -{ - DPRINT("Keyword: /memreserve/\n"); - BEGIN_DEFAULT(); - return DT_MEMRESERVE; - } - YY_BREAK -case 7: -YY_RULE_SETUP -#line 141 "dtc-lexer.l" -{ - DPRINT("Keyword: /bits/\n"); - BEGIN_DEFAULT(); - return DT_BITS; - } - YY_BREAK -case 8: -YY_RULE_SETUP -#line 147 "dtc-lexer.l" -{ - DPRINT("Keyword: /delete-property/\n"); - DPRINT("\n"); - BEGIN(PROPNODENAME); - return DT_DEL_PROP; - } - YY_BREAK -case 9: -YY_RULE_SETUP -#line 154 "dtc-lexer.l" -{ - DPRINT("Keyword: /delete-node/\n"); - DPRINT("\n"); - BEGIN(PROPNODENAME); - return DT_DEL_NODE; - } - YY_BREAK -case 10: -YY_RULE_SETUP -#line 161 "dtc-lexer.l" -{ - DPRINT("Label: %s\n", yytext); - yylval.labelref =3D xstrdup(yytext); - yylval.labelref[yyleng-1] =3D '\0'; - return DT_LABEL; - } - YY_BREAK -case 11: -YY_RULE_SETUP -#line 168 "dtc-lexer.l" -{ - char *e; - DPRINT("Integer Literal: '%s'\n", yytext); - - errno =3D 0; - yylval.integer =3D strtoull(yytext, &e, 0); - - if (*e && e[strspn(e, "UL")]) { - lexical_error("Bad integer literal '%s'", - yytext); - } - - if (errno =3D=3D ERANGE) - lexical_error("Integer literal '%s' out of range", - yytext); - else - /* ERANGE is the only strtoull error triggerable - * by strings matching the pattern */ - assert(errno =3D=3D 0); - return DT_LITERAL; - } - YY_BREAK -case 12: -/* rule 12 can match eol */ -YY_RULE_SETUP -#line 190 "dtc-lexer.l" -{ - struct data d; - DPRINT("Character literal: %s\n", yytext); - - d =3D data_copy_escape_string(yytext+1, yyleng-2); - if (d.len =3D=3D 1) { - lexical_error("Empty character literal"); - yylval.integer =3D 0; - } else { - yylval.integer =3D (unsigned char)d.val[0]; - - if (d.len > 2) - lexical_error("Character literal has %d" - " characters instead of 1", - d.len - 1); - } - - data_free(d); - return DT_CHAR_LITERAL; - } - YY_BREAK -case 13: -YY_RULE_SETUP -#line 211 "dtc-lexer.l" -{ /* label reference */ - DPRINT("Ref: %s\n", yytext+1); - yylval.labelref =3D xstrdup(yytext+1); - return DT_REF; - } - YY_BREAK -case 14: -YY_RULE_SETUP -#line 217 "dtc-lexer.l" -{ /* new-style path reference */ - yytext[yyleng-1] =3D '\0'; - DPRINT("Ref: %s\n", yytext+2); - yylval.labelref =3D xstrdup(yytext+2); - return DT_REF; - } - YY_BREAK -case 15: -YY_RULE_SETUP -#line 224 "dtc-lexer.l" -{ - yylval.byte =3D strtol(yytext, NULL, 16); - DPRINT("Byte: %02x\n", (int)yylval.byte); - return DT_BYTE; - } - YY_BREAK -case 16: -YY_RULE_SETUP -#line 230 "dtc-lexer.l" -{ - DPRINT("/BYTESTRING\n"); - BEGIN_DEFAULT(); - return ']'; - } - YY_BREAK -case 17: -YY_RULE_SETUP -#line 236 "dtc-lexer.l" -{ - DPRINT("PropNodeName: %s\n", yytext); - yylval.propnodename =3D xstrdup((yytext[0] =3D=3D '\\') ? - yytext + 1 : yytext); - BEGIN_DEFAULT(); - return DT_PROPNODENAME; - } - YY_BREAK -case 18: -YY_RULE_SETUP -#line 244 "dtc-lexer.l" -{ - DPRINT("Binary Include\n"); - return DT_INCBIN; - } - YY_BREAK -case 19: -/* rule 19 can match eol */ -YY_RULE_SETUP -#line 249 "dtc-lexer.l" -/* eat whitespace */ - YY_BREAK -case 20: -/* rule 20 can match eol */ -YY_RULE_SETUP -#line 250 "dtc-lexer.l" -/* eat C-style comments */ - YY_BREAK -case 21: -/* rule 21 can match eol */ -YY_RULE_SETUP -#line 251 "dtc-lexer.l" -/* eat C++-style comments */ - YY_BREAK -case 22: -YY_RULE_SETUP -#line 253 "dtc-lexer.l" -{ return DT_LSHIFT; }; - YY_BREAK -case 23: -YY_RULE_SETUP -#line 254 "dtc-lexer.l" -{ return DT_RSHIFT; }; - YY_BREAK -case 24: -YY_RULE_SETUP -#line 255 "dtc-lexer.l" -{ return DT_LE; }; - YY_BREAK -case 25: -YY_RULE_SETUP -#line 256 "dtc-lexer.l" -{ return DT_GE; }; - YY_BREAK -case 26: -YY_RULE_SETUP -#line 257 "dtc-lexer.l" -{ return DT_EQ; }; - YY_BREAK -case 27: -YY_RULE_SETUP -#line 258 "dtc-lexer.l" -{ return DT_NE; }; - YY_BREAK -case 28: -YY_RULE_SETUP -#line 259 "dtc-lexer.l" -{ return DT_AND; }; - YY_BREAK -case 29: -YY_RULE_SETUP -#line 260 "dtc-lexer.l" -{ return DT_OR; }; - YY_BREAK -case 30: -YY_RULE_SETUP -#line 262 "dtc-lexer.l" -{ - DPRINT("Char: %c (\\x%02x)\n", yytext[0], - (unsigned)yytext[0]); - if (yytext[0] =3D=3D '[') { - DPRINT("\n"); - BEGIN(BYTESTRING); - } - if ((yytext[0] =3D=3D '{') - || (yytext[0] =3D=3D ';')) { - DPRINT("\n"); - BEGIN(PROPNODENAME); - } - return yytext[0]; - } - YY_BREAK -case 31: -YY_RULE_SETUP -#line 277 "dtc-lexer.l" -ECHO; - YY_BREAK -#line 1265 "dtc-lexer.lex.c" - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text =3D (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp =3D (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =3D=3D YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) =3D YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file =3D yyin; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =3D YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=3D" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <=3D &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)= ] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) =3D (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state =3D yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state =3D yy_try_NUL_trans( yy_current_state ); - - yy_bp =3D (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp =3D ++(yy_c_buf_p); - yy_current_state =3D yy_next_state; - goto yy_match; - } - - else - { - yy_cp =3D (yy_last_accepting_cpos); - yy_current_state =3D (yy_last_accepting_state); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) =3D 0; - - if ( yywrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) =3D (yytext_ptr) + YY_MORE_ADJ; - - yy_act =3D YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) =3D - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state =3D yy_get_previous_state( ); - - yy_cp =3D (yy_c_buf_p); - yy_bp =3D (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) =3D - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state =3D yy_get_previous_state( ); - - yy_cp =3D (yy_c_buf_p); - yy_bp =3D (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of yylex */ - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ -static int yy_get_next_buffer (void) -{ - register char *dest =3D YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source =3D (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1= ] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer =3D=3D 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ =3D=3D 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move =3D (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i =3D 0; i < number_to_move; ++i ) - *(dest++) =3D *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =3D=3D YY_BUFFER_EOF_PEND= ING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars =3D (yy_n_chars) =3D 0; - - else - { - int num_to_read =3D - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <=3D 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b =3D YY_CURRENT_BUFFER; - - int yy_c_buf_p_offset =3D - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size =3D b->yy_buf_size * 2; - - if ( new_size <=3D 0 ) - b->yy_buf_size +=3D b->yy_buf_size / 8; - else - b->yy_buf_size *=3D 2; - - b->yy_ch_buf =3D (char *) - /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf =3D 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) =3D &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read =3D YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read =3D YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), (size_t) num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars =3D (yy_n_chars); - } - - if ( (yy_n_chars) =3D=3D 0 ) - { - if ( number_to_move =3D=3D YY_MORE_ADJ ) - { - ret_val =3D EOB_ACT_END_OF_FILE; - yyrestart(yyin ); - } - - else - { - ret_val =3D EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =3D - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val =3D EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALU= E->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size =3D (yy_n_chars) + number_to_move + ((yy_n_chars) >> = 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf =3D (char *) yyrealloc((void *) YY_C= URRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } - - (yy_n_chars) +=3D number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] =3D YY_END_OF_BUFFER_CH= AR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] =3D YY_END_OF_BUFFE= R_CHAR; - - (yytext_ptr) =3D &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; - - return ret_val; -} - -/* yy_get_previous_state - get the state just before the EOB char was reac= hed */ - - static yy_state_type yy_get_previous_state (void) -{ - register yy_state_type yy_current_state; - register char *yy_cp; - =20 - yy_current_state =3D (yy_start); - yy_current_state +=3D YY_AT_BOL(); - - for ( yy_cp =3D (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp= ) - { - register YY_CHAR yy_c =3D (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) =3D yy_current_state; - (yy_last_accepting_cpos) =3D yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] !=3D yy_current_state ) - { - yy_current_state =3D (int) yy_def[yy_current_state]; - if ( yy_current_state >=3D 166 ) - yy_c =3D yy_meta[(unsigned int) yy_c]; - } - yy_current_state =3D yy_nxt[yy_base[yy_current_state] + (unsigned int) y= y_c]; - } - - return yy_current_state; -} - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state =3D yy_try_NUL_trans( current_state ); - */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state= ) -{ - register int yy_is_jam; - register char *yy_cp =3D (yy_c_buf_p); - - register YY_CHAR yy_c =3D 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) =3D yy_current_state; - (yy_last_accepting_cpos) =3D yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] !=3D yy_current_state ) - { - yy_current_state =3D (int) yy_def[yy_current_state]; - if ( yy_current_state >=3D 166 ) - yy_c =3D yy_meta[(unsigned int) yy_c]; - } - yy_current_state =3D yy_nxt[yy_base[yy_current_state] + (unsigned int) yy= _c]; - yy_is_jam =3D (yy_current_state =3D=3D 165); - - return yy_is_jam ? 0 : yy_current_state; -} - -#ifndef YY_NO_INPUT -#ifdef __cplusplus - static int yyinput (void) -#else - static int input (void) -#endif - -{ - int c; - =20 - *(yy_c_buf_p) =3D (yy_hold_char); - - if ( *(yy_c_buf_p) =3D=3D YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) =3D '\0'; - - else - { /* need more input */ - int offset =3D (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart(yyin ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) =3D (yytext_ptr) + offset; - break; - } - } - } - - c =3D *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) =3D '\0'; /* preserve yytext */ - (yy_hold_char) =3D *++(yy_c_buf_p); - - YY_CURRENT_BUFFER_LVALUE->yy_at_bol =3D (c =3D=3D '\n'); - - return c; -} -#endif /* ifndef YY_NO_INPUT */ - -/** Immediately switch to a different input stream. - * @param input_file A readable stream. - *=20 - * @note This function does not reset the start condition to @c INITIAL . - */ - void yyrestart (FILE * input_file ) -{ - =20 - if ( ! YY_CURRENT_BUFFER ){ - yyensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE =3D - yy_create_buffer(yyin,YY_BUF_SIZE ); - } - - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); -} - -/** Switch to a different input buffer. - * @param new_buffer The new input buffer. - *=20 - */ - void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -{ - =20 - /* TODO. We should be able to replace this entire function body - * with - * yypop_buffer_state(); - * yypush_buffer_state(new_buffer); - */ - yyensure_buffer_stack (); - if ( YY_CURRENT_BUFFER =3D=3D new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) =3D (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos =3D (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars =3D (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE =3D new_buffer; - yy_load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) =3D 1; -} - -static void yy_load_buffer_state (void) -{ - (yy_n_chars) =3D YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) =3D (yy_c_buf_p) =3D YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - yyin =3D YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) =3D *(yy_c_buf_p); -} - -/** Allocate and initialize an input buffer state. - * @param file A readable stream. - * @param size The character buffer size in bytes. When in doubt, use @c Y= Y_BUF_SIZE. - *=20 - * @return the allocated buffer state. - */ - YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -{ - YY_BUFFER_STATE b; - =20 - b =3D (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size =3D size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf =3D (char *) yyalloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer =3D 1; - - yy_init_buffer(b,file ); - - return b; -} - -/** Destroy the buffer. - * @param b a buffer created with yy_create_buffer() - *=20 - */ - void yy_delete_buffer (YY_BUFFER_STATE b ) -{ - =20 - if ( ! b ) - return; - - if ( b =3D=3D YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE =3D (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); - - yyfree((void *) b ); -} - -/* Initializes or reinitializes a buffer. - * This function is sometimes called more than once on the same buffer, - * such as during a yyrestart() or at EOF. - */ - static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) - -{ - int oerrno =3D errno; - =20 - yy_flush_buffer(b ); - - b->yy_input_file =3D file; - b->yy_fill_buffer =3D 1; - - /* If b is the current buffer, then yy_init_buffer was _probably_ - * called from yyrestart() or through yy_get_next_buffer. - * In that case, we don't want to reset the lineno or column. - */ - if (b !=3D YY_CURRENT_BUFFER){ - b->yy_bs_lineno =3D 1; - b->yy_bs_column =3D 0; - } - - b->yy_is_interactive =3D 0; - =20 - errno =3D oerrno; -} - -/** Discard all buffered characters. On the next scan, YY_INPUT will be ca= lled. - * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. - *=20 - */ - void yy_flush_buffer (YY_BUFFER_STATE b ) -{ - if ( ! b ) - return; - - b->yy_n_chars =3D 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] =3D YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] =3D YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos =3D &b->yy_ch_buf[0]; - - b->yy_at_bol =3D 1; - b->yy_buffer_status =3D YY_BUFFER_NEW; - - if ( b =3D=3D YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); -} - -/** Pushes the new state onto the stack. The new state becomes - * the current state. This function will allocate the stack - * if necessary. - * @param new_buffer The new state. - * =20 - */ -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -{ - if (new_buffer =3D=3D NULL) - return; - - yyensure_buffer_stack(); - - /* This block is copied from yy_switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) =3D (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos =3D (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars =3D (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE =3D new_buffer; - - /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) =3D 1; -} - -/** Removes and deletes the top of the stack, if present. - * The next element becomes the new top. - * =20 - */ -void yypop_buffer_state (void) -{ - if (!YY_CURRENT_BUFFER) - return; - - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE =3D NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); - (yy_did_buffer_switch_on_eof) =3D 1; - } -} - -/* Allocates the stack if it does not exist. - * Guarantees space for at least one push. - */ -static void yyensure_buffer_stack (void) -{ - int num_to_alloc; - =20 - if (!(yy_buffer_stack)) { - - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. - */ - num_to_alloc =3D 1; - (yy_buffer_stack) =3D (struct yy_buffer_state**)yyalloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - =20 - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_stat= e*)); - =09 - (yy_buffer_stack_max) =3D num_to_alloc; - (yy_buffer_stack_top) =3D 0; - return; - } - - if ((yy_buffer_stack_top) >=3D ((yy_buffer_stack_max)) - 1){ - - /* Increase the buffer to prepare for a possible push. */ - int grow_size =3D 8 /* arbitrary grow size */; - - num_to_alloc =3D (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) =3D (struct yy_buffer_state**)yyrealloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(= struct yy_buffer_state*)); - (yy_buffer_stack_max) =3D num_to_alloc; - } -} - -/** Setup the input buffer state to scan directly from a user-specified ch= aracter buffer. - * @param base the character buffer - * @param size the size in bytes of the character buffer - *=20 - * @return the newly allocated buffer state object.=20 - */ -YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) -{ - YY_BUFFER_STATE b; - =20 - if ( size < 2 || - base[size-2] !=3D YY_END_OF_BUFFER_CHAR || - base[size-1] !=3D YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b =3D (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size =3D size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos =3D b->yy_ch_buf =3D base; - b->yy_is_our_buffer =3D 0; - b->yy_input_file =3D 0; - b->yy_n_chars =3D b->yy_buf_size; - b->yy_is_interactive =3D 0; - b->yy_at_bol =3D 1; - b->yy_fill_buffer =3D 0; - b->yy_buffer_status =3D YY_BUFFER_NEW; - - yy_switch_to_buffer(b ); - - return b; -} - -/** Setup the input buffer state to scan a string. The next call to yylex(= ) will - * scan from a @e copy of @a str. - * @param yystr a NUL-terminated string to scan - *=20 - * @return the newly allocated buffer state object. - * @note If you want to scan bytes that may contain NUL values, then use - * yy_scan_bytes() instead. - */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) -{ - =20 - return yy_scan_bytes(yystr,strlen(yystr) ); -} - -/** Setup the input buffer state to scan the given bytes. The next call to= yylex() will - * scan from a @e copy of @a bytes. - * @param yybytes the byte buffer to scan - * @param _yybytes_len the number of bytes in the buffer pointed to by @a = bytes. - *=20 - * @return the newly allocated buffer state object. - */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) -{ - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - =20 - /* Get memory for full buffer, including space for trailing EOB's. */ - n =3D _yybytes_len + 2; - buf =3D (char *) yyalloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i =3D 0; i < _yybytes_len; ++i ) - buf[i] =3D yybytes[i]; - - buf[_yybytes_len] =3D buf[_yybytes_len+1] =3D YY_END_OF_BUFFER_CHAR; - - b =3D yy_scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer =3D 1; - - return b; -} - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -static void yy_fatal_error (yyconst char* msg ) -{ - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - int yyless_macro_arg =3D (n); \ - YY_LESS_LINENO(yyless_macro_arg);\ - yytext[yyleng] =3D (yy_hold_char); \ - (yy_c_buf_p) =3D yytext + yyless_macro_arg; \ - (yy_hold_char) =3D *(yy_c_buf_p); \ - *(yy_c_buf_p) =3D '\0'; \ - yyleng =3D yyless_macro_arg; \ - } \ - while ( 0 ) - -/* Accessor methods (get/set functions) to struct members. */ - -/** Get the current line number. - *=20 - */ -int yyget_lineno (void) -{ - =20 - return yylineno; -} - -/** Get the input stream. - *=20 - */ -FILE *yyget_in (void) -{ - return yyin; -} - -/** Get the output stream. - *=20 - */ -FILE *yyget_out (void) -{ - return yyout; -} - -/** Get the length of the current token. - *=20 - */ -int yyget_leng (void) -{ - return yyleng; -} - -/** Get the current token. - *=20 - */ - -char *yyget_text (void) -{ - return yytext; -} - -/** Set the current line number. - * @param line_number - *=20 - */ -void yyset_lineno (int line_number ) -{ - =20 - yylineno =3D line_number; -} - -/** Set the input stream. This does not discard the current - * input buffer. - * @param in_str A readable stream. - *=20 - * @see yy_switch_to_buffer - */ -void yyset_in (FILE * in_str ) -{ - yyin =3D in_str ; -} - -void yyset_out (FILE * out_str ) -{ - yyout =3D out_str ; -} - -int yyget_debug (void) -{ - return yy_flex_debug; -} - -void yyset_debug (int bdebug ) -{ - yy_flex_debug =3D bdebug ; -} - -static int yy_init_globals (void) -{ - /* Initialization is the same as for the non-reentrant scanner. - * This function is called from yylex_destroy(), so don't allocate her= e. - */ - - (yy_buffer_stack) =3D 0; - (yy_buffer_stack_top) =3D 0; - (yy_buffer_stack_max) =3D 0; - (yy_c_buf_p) =3D (char *) 0; - (yy_init) =3D 0; - (yy_start) =3D 0; - -/* Defined in main.c */ -#ifdef YY_STDINIT - yyin =3D stdin; - yyout =3D stdout; -#else - yyin =3D (FILE *) 0; - yyout =3D (FILE *) 0; -#endif - - /* For future reference: Set errno on error, since we are called by - * yylex_init() - */ - return 0; -} - -/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -int yylex_destroy (void) -{ - =20 - /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE =3D NULL; - yypop_buffer_state(); - } - - /* Destroy the stack itself. */ - yyfree((yy_buffer_stack) ); - (yy_buffer_stack) =3D NULL; - - /* Reset the globals. This is important in a non-reentrant scanner so = the next time - * yylex() is called, initialization will occur. */ - yy_init_globals( ); - - return 0; -} - -/* - * Internal utility routines. - */ - -#ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) -{ - register int i; - for ( i =3D 0; i < n; ++i ) - s1[i] =3D s2[i]; -} -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) -{ - register int n; - for ( n =3D 0; s[n]; ++n ) - ; - - return n; -} -#endif - -void *yyalloc (yy_size_t size ) -{ - return (void *) malloc( size ); -} - -void *yyrealloc (void * ptr, yy_size_t size ) -{ - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); -} - -void yyfree (void * ptr ) -{ - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -} - -#define YYTABLES_NAME "yytables" - -#line 277 "dtc-lexer.l" - - - -static void push_input_file(const char *filename) -{ - assert(filename); - - srcfile_push(filename); - - yyin =3D current_srcfile->f; - - yypush_buffer_state(yy_create_buffer(yyin,YY_BUF_SIZE)); -} - - -static bool pop_input_file(void) -{ - if (srcfile_pop() =3D=3D 0) - return false; - - yypop_buffer_state(); - yyin =3D current_srcfile->f; - - return true; -} - -static void lexical_error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - srcpos_verror(&yylloc, "Lexical error", fmt, ap); - va_end(ap); - - treesource_error =3D true; -} - diff --git a/scripts/dtc/dtc-parser.tab.c_shipped b/scripts/dtc/dtc-parser.= tab.c_shipped deleted file mode 100644 index 4d10814b3f..0000000000 --- a/scripts/dtc/dtc-parser.tab.c_shipped +++ /dev/null @@ -1,2301 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ - -/* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - - This program 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 3 of the License, or - (at your option) any later version. - - This program 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 program. If not, see . = */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "3.0.2" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - - - - -/* Copy the first part of user declarations. */ -#line 20 "dtc-parser.y" /* yacc.c:339 */ - -#include -#include - -#include "dtc.h" -#include "srcpos.h" - -extern int yylex(void); -extern void yyerror(char const *s); -#define ERROR(loc, ...) \ - do { \ - srcpos_error((loc), "Error", __VA_ARGS__); \ - treesource_error =3D true; \ - } while (0) - -extern struct dt_info *parser_output; -extern bool treesource_error; - -#line 85 "dtc-parser.tab.c" /* yacc.c:339 */ - -# ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <=3D __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* In a future release of Bison, this section will be replaced - by #include "dtc-parser.tab.h". */ -#ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED -# define YY_YY_DTC_PARSER_TAB_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - DT_V1 =3D 258, - DT_PLUGIN =3D 259, - DT_MEMRESERVE =3D 260, - DT_LSHIFT =3D 261, - DT_RSHIFT =3D 262, - DT_LE =3D 263, - DT_GE =3D 264, - DT_EQ =3D 265, - DT_NE =3D 266, - DT_AND =3D 267, - DT_OR =3D 268, - DT_BITS =3D 269, - DT_DEL_PROP =3D 270, - DT_DEL_NODE =3D 271, - DT_PROPNODENAME =3D 272, - DT_LITERAL =3D 273, - DT_CHAR_LITERAL =3D 274, - DT_BYTE =3D 275, - DT_STRING =3D 276, - DT_LABEL =3D 277, - DT_REF =3D 278, - DT_INCBIN =3D 279 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; -union YYSTYPE -{ -#line 39 "dtc-parser.y" /* yacc.c:355 */ - - char *propnodename; - char *labelref; - uint8_t byte; - struct data data; - - struct { - struct data data; - int bits; - } array; - - struct property *prop; - struct property *proplist; - struct node *node; - struct node *nodelist; - struct reserve_info *re; - uint64_t integer; - unsigned int flags; - -#line 170 "dtc-parser.tab.c" /* yacc.c:355 */ -}; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - -extern YYSTYPE yylval; -extern YYLTYPE yylloc; -int yyparse (void); - -#endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED */ - -/* Copy the second part of user declarations. */ - -#line 199 "dtc-parser.tab.c" /* yacc.c:358 */ - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#else -typedef signed char yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -# endif -# endif -# ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ =3D=3D 2 && 96 <=3D __GNUC_MINOR__))) = \ - || defined __SUNPRO_C && 0x5110 <=3D __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <=3D _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) -#else -# define YYUSE(E) /* empty */ -#endif - -#if defined __GNUC__ && 407 <=3D __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") -#else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END -#endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ -#endif - - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -# include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the sta= ck, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined EXIT_SUCCESS \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef EXIT_SUCCESS -# define EXIT_SUCCESS 0 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ - && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; - YYLTYPE yyls_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ - + 2 * YYSTACK_GAP_MAXIMUM) - -# define YYCOPY_NEEDED 1 - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack =3D &yyptr->Stack_alloc; \ - yynewbytes =3D yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM= ; \ - yyptr +=3D yynewbytes / sizeof (*yyptr); \ - } \ - while (0) - -#endif - -#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) -# else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi =3D 0; yyi < (Count); yyi++) \ - (Dst)[yyi] =3D (Src)[yyi]; \ - } \ - while (0) -# endif -# endif -#endif /* !YYCOPY_NEEDED */ - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 6 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 138 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 48 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 30 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 84 -/* YYNSTATES -- Number of states. */ -#define YYNSTATES 149 - -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 279 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <=3D YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ -static const yytype_uint8 yytranslate[] =3D -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 47, 2, 2, 2, 45, 41, 2, - 33, 35, 44, 42, 34, 43, 2, 26, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 38, 25, - 36, 29, 30, 37, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 31, 2, 32, 40, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 27, 39, 28, 46, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 -}; - -#if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] =3D -{ - 0, 109, 109, 117, 121, 128, 129, 139, 142, 149, - 153, 161, 165, 170, 181, 191, 206, 214, 217, 224, - 228, 232, 236, 244, 248, 252, 256, 260, 276, 286, - 294, 297, 301, 308, 324, 329, 348, 362, 369, 370, - 371, 378, 382, 383, 387, 388, 392, 393, 397, 398, - 402, 403, 407, 408, 412, 413, 414, 418, 419, 420, - 421, 422, 426, 427, 428, 432, 433, 434, 438, 439, - 448, 457, 461, 462, 463, 464, 469, 472, 476, 484, - 487, 491, 499, 503, 507 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || 0 -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting@YYNTOKENS, nonterminals. */ -static const char *const yytname[] =3D -{ - "$end", "error", "$undefined", "DT_V1", "DT_PLUGIN", "DT_MEMRESERVE", - "DT_LSHIFT", "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND", - "DT_OR", "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME", - "DT_LITERAL", "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL", - "DT_REF", "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'=3D'", "'>'", "'['", - "']'", "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'", - "'+'", "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile", - "header", "headers", "memreserves", "memreserve", "devicetree", - "nodedef", "proplist", "propdef", "propdata", "propdataprefix", - "arrayprefix", "integer_prim", "integer_expr", "integer_trinary", - "integer_or", "integer_and", "integer_bitor", "integer_bitxor", - "integer_bitand", "integer_eq", "integer_rela", "integer_shift", - "integer_add", "integer_mul", "integer_unary", "bytestring", "subnodes", - "subnode", YY_NULLPTR -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ -static const yytype_uint16 yytoknum[] =3D -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 59, 47, 123, 125, 61, - 62, 91, 93, 40, 44, 41, 60, 63, 58, 124, - 94, 38, 43, 45, 42, 37, 126, 33 -}; -# endif - -#define YYPACT_NINF -44 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) =3D=3D (-44))) - -#define YYTABLE_NINF -1 - -#define yytable_value_is_error(Yytable_value) \ - 0 - - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int8 yypact[] =3D -{ - 14, 27, 61, 14, 8, 18, -44, -44, 37, 8, - 40, 8, 64, -44, -44, -12, 37, -44, 50, 52, - -44, -44, -12, -12, -12, -44, 51, -44, -4, 78, - 53, 54, 55, 17, 2, 30, 38, -3, -44, 66, - -44, -44, 70, 72, 50, 50, -44, -44, -44, -44, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, - -12, -12, -12, -12, -12, -12, -12, -12, -12, -44, - 3, 73, 50, -44, -44, 78, 59, 53, 54, 55, - 17, 2, 2, 30, 30, 30, 30, 38, 38, -3, - -3, -44, -44, -44, 82, 83, 44, 3, -44, 74, - 3, -44, -44, -12, 76, 79, -44, -44, -44, -44, - -44, 80, -44, -44, -44, -44, -44, -10, 36, -44, - -44, -44, -44, 85, -44, -44, -44, 75, -44, -44, - 21, 71, 88, -6, -44, -44, -44, -44, -44, 11, - -44, -44, -44, 37, -44, 77, 37, 81, -44 -}; - - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] =3D -{ - 0, 0, 0, 5, 7, 3, 1, 6, 0, 0, - 0, 7, 0, 38, 39, 0, 0, 10, 0, 2, - 8, 4, 0, 0, 0, 72, 0, 41, 42, 44, - 46, 48, 50, 52, 54, 57, 64, 67, 71, 0, - 17, 11, 0, 0, 0, 0, 73, 74, 75, 40, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 79, 0, 0, 14, 12, 45, 0, 47, 49, 51, - 53, 55, 56, 60, 61, 59, 58, 62, 63, 65, - 66, 69, 68, 70, 0, 0, 0, 0, 18, 0, - 79, 15, 13, 0, 0, 0, 20, 30, 82, 22, - 84, 0, 81, 80, 43, 21, 83, 0, 0, 16, - 29, 19, 31, 0, 23, 32, 26, 0, 76, 34, - 0, 0, 0, 0, 37, 36, 24, 35, 33, 0, - 77, 78, 25, 0, 28, 0, 0, 0, 27 -}; - - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] =3D -{ - -44, -44, -44, 103, 99, 104, -44, -43, -44, -21, - -44, -44, -44, -8, 63, 9, -44, 65, 67, 68, - 69, 62, 26, 4, 22, 23, -19, -44, 20, 28 -}; - - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] =3D -{ - -1, 2, 3, 4, 10, 11, 19, 41, 70, 98, - 117, 118, 130, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 133, 99, 100 -}; - - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ -static const yytype_uint8 yytable[] =3D -{ - 16, 73, 74, 46, 47, 48, 13, 14, 39, 50, - 58, 59, 120, 8, 140, 121, 141, 1, 94, 95, - 96, 15, 12, 66, 122, 97, 142, 56, 57, 102, - 9, 22, 60, 51, 23, 24, 62, 63, 61, 13, - 14, 67, 68, 134, 135, 143, 144, 91, 92, 93, - 123, 136, 5, 108, 15, 13, 14, 124, 125, 126, - 127, 6, 83, 84, 85, 86, 18, 128, 42, 106, - 15, 40, 129, 107, 43, 44, 109, 40, 45, 112, - 64, 65, 81, 82, 87, 88, 49, 89, 90, 21, - 52, 69, 53, 71, 54, 72, 55, 103, 101, 104, - 105, 115, 111, 131, 116, 119, 7, 138, 132, 139, - 20, 146, 114, 17, 76, 75, 148, 80, 0, 77, - 113, 78, 137, 79, 0, 110, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 145, 0, 0, 147 -}; - -static const yytype_int16 yycheck[] =3D -{ - 8, 44, 45, 22, 23, 24, 18, 19, 16, 13, - 8, 9, 22, 5, 20, 25, 22, 3, 15, 16, - 17, 33, 4, 26, 34, 22, 32, 10, 11, 72, - 22, 43, 30, 37, 46, 47, 6, 7, 36, 18, - 19, 44, 45, 22, 23, 34, 35, 66, 67, 68, - 14, 30, 25, 96, 33, 18, 19, 21, 22, 23, - 24, 0, 58, 59, 60, 61, 26, 31, 16, 25, - 33, 27, 36, 29, 22, 23, 97, 27, 26, 100, - 42, 43, 56, 57, 62, 63, 35, 64, 65, 25, - 12, 25, 39, 23, 40, 23, 41, 38, 25, 17, - 17, 25, 28, 18, 25, 25, 3, 36, 33, 21, - 11, 34, 103, 9, 51, 50, 35, 55, -1, 52, - 100, 53, 130, 54, -1, 97, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 143, -1, -1, 146 -}; - - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] =3D -{ - 0, 3, 49, 50, 51, 25, 0, 51, 5, 22, - 52, 53, 4, 18, 19, 33, 61, 53, 26, 54, - 52, 25, 43, 46, 47, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 61, - 27, 55, 16, 22, 23, 26, 74, 74, 74, 35, - 13, 37, 12, 39, 40, 41, 10, 11, 8, 9, - 30, 36, 6, 7, 42, 43, 26, 44, 45, 25, - 56, 23, 23, 55, 55, 65, 62, 66, 67, 68, - 69, 70, 70, 71, 71, 71, 71, 72, 72, 73, - 73, 74, 74, 74, 15, 16, 17, 22, 57, 76, - 77, 25, 55, 38, 17, 17, 25, 29, 55, 57, - 77, 28, 57, 76, 63, 25, 25, 58, 59, 25, - 22, 25, 34, 14, 21, 22, 23, 24, 31, 36, - 60, 18, 33, 75, 22, 23, 30, 61, 36, 21, - 20, 22, 32, 34, 35, 61, 34, 61, 35 -}; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] =3D -{ - 0, 48, 49, 50, 50, 51, 51, 52, 52, 53, - 53, 54, 54, 54, 54, 54, 55, 56, 56, 57, - 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, - 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, - 61, 62, 63, 63, 64, 64, 65, 65, 66, 66, - 67, 67, 68, 68, 69, 69, 69, 70, 70, 70, - 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, - 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, - 76, 76, 77, 77, 77 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] =3D -{ - 0, 2, 3, 2, 4, 1, 2, 0, 2, 4, - 2, 2, 3, 4, 3, 4, 5, 0, 2, 4, - 2, 3, 2, 2, 3, 4, 2, 9, 5, 2, - 0, 2, 2, 3, 1, 2, 2, 2, 1, 1, - 3, 1, 1, 5, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 1, 3, 3, 1, 3, 3, - 3, 3, 3, 3, 1, 3, 3, 1, 3, 3, - 3, 1, 1, 2, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 3, 2 -}; - - -#define yyerrok (yyerrstatus =3D 0) -#define yyclearin (yychar =3D YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar =3D=3D YYEMPTY) \ - { \ - yychar =3D (Token); \ - yylval =3D (Value); \ - YYPOPSTACK (yylen); \ - yystate =3D *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) - -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first_line =3D YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column =3D YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line =3D YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column =3D YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line =3D (Current).last_line =3D = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column =3D (Current).last_column =3D = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (0) -#endif - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) - - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - -/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ - -YY_ATTRIBUTE_UNUSED -static unsigned -yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) -{ - unsigned res =3D 0; - int end_col =3D 0 !=3D yylocp->last_column ? yylocp->last_column - 1 : 0; - if (0 <=3D yylocp->first_line) - { - res +=3D YYFPRINTF (yyo, "%d", yylocp->first_line); - if (0 <=3D yylocp->first_column) - res +=3D YYFPRINTF (yyo, ".%d", yylocp->first_column); - } - if (0 <=3D yylocp->last_line) - { - if (yylocp->first_line < yylocp->last_line) - { - res +=3D YYFPRINTF (yyo, "-%d", yylocp->last_line); - if (0 <=3D end_col) - res +=3D YYFPRINTF (yyo, ".%d", end_col); - } - else if (0 <=3D end_col && yylocp->first_column < end_col) - res +=3D YYFPRINTF (yyo, "-%d", end_col); - } - return res; - } - -# define YY_LOCATION_PRINT(File, Loc) \ - yy_location_print_ (File, &(Loc)) - -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value, Location); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) - - -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ - -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const y= yvaluep, YYLTYPE const * const yylocationp) -{ - FILE *yyo =3D yyoutput; - YYUSE (yyo); - YYUSE (yylocationp); - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# endif - YYUSE (yytype); -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue= p, YYLTYPE const * const yylocationp) -{ - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - - YY_LOCATION_PRINT (yyoutput, *yylocationp); - YYFPRINTF (yyoutput, ": "); - yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <=3D yytop; yybottom++) - { - int yybot =3D *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int = yyrule) -{ - unsigned long int yylno =3D yyrline[yyrule]; - int yynrhs =3D yyr2[yyrule]; - int yyi; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi =3D 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d =3D ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , &(yylsp[(yyi + 1) - (yynrhs)]) = ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \ -} while (0) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -static YYSIZE_T -yystrlen (const char *yystr) -{ - YYSIZE_T yylen; - for (yylen =3D 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -static char * -yystpcpy (char *yydest, const char *yysrc) -{ - char *yyd =3D yydest; - const char *yys =3D yysrc; - - while ((*yyd++ =3D *yys++) !=3D '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr =3D=3D '"') - { - YYSIZE_T yyn =3D 0; - char const *yyp =3D yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp !=3D '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] =3D *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] =3D '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message - about the unexpected token YYTOKEN for the state stack whose top is - YYSSP. - - Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is - not large enough to hold the message. In that case, also set - *YYMSG_ALLOC to the required number of bytes. Return 2 if the - required number of bytes is too large to store. */ -static int -yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, - yytype_int16 *yyssp, int yytoken) -{ - YYSIZE_T yysize0 =3D yytnamerr (YY_NULLPTR, yytname[yytoken]); - YYSIZE_T yysize =3D yysize0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM =3D 5 }; - /* Internationalized format string. */ - const char *yyformat =3D YY_NULLPTR; - /* Arguments of yyformat. */ - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - /* Number of reported tokens (one for the "unexpected", one per - "expected"). */ - int yycount =3D 0; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yychar) is if - this state is a consistent state with a default action. Thus, - detecting the absence of a lookahead is sufficient to determine - that there is no unexpected or expected token to report. In that - case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is a - consistent state with a default action. There might have been a - previous inconsistent state, consistent state with a non-default - action, or user semantic action that manipulated yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state merging - (from LALR or IELR) and default reductions corrupt the expected - token list. However, the list is correct for canonical LR with - one exception: it will still contain any token that will not be - accepted due to an error action in a later state. - */ - if (yytoken !=3D YYEMPTY) - { - int yyn =3D yypact[*yyssp]; - yyarg[yycount++] =3D yytname[yytoken]; - if (!yypact_value_is_default (yyn)) - { - /* Start YYX@-YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin =3D yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim =3D YYLAST - yyn + 1; - int yyxend =3D yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yyx; - - for (yyx =3D yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] =3D=3D yyx && yyx !=3D YYTERROR - && !yytable_value_is_error (yytable[yyx + yyn])) - { - if (yycount =3D=3D YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount =3D 1; - yysize =3D yysize0; - break; - } - yyarg[yycount++] =3D yytname[yyx]; - { - YYSIZE_T yysize1 =3D yysize + yytnamerr (YY_NULLPTR, yyt= name[yyx]); - if (! (yysize <=3D yysize1 - && yysize1 <=3D YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize =3D yysize1; - } - } - } - } - - switch (yycount) - { -# define YYCASE_(N, S) \ - case N: \ - yyformat =3D S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %= s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %= s or %s")); -# undef YYCASE_ - } - - { - YYSIZE_T yysize1 =3D yysize + yystrlen (yyformat); - if (! (yysize <=3D yysize1 && yysize1 <=3D YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize =3D yysize1; - } - - if (*yymsg_alloc < yysize) - { - *yymsg_alloc =3D 2 * yysize; - if (! (yysize <=3D *yymsg_alloc - && *yymsg_alloc <=3D YYSTACK_ALLOC_MAXIMUM)) - *yymsg_alloc =3D YYSTACK_ALLOC_MAXIMUM; - return 1; - } - - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - { - char *yyp =3D *yymsg; - int yyi =3D 0; - while ((*yyp =3D *yyformat) !=3D '\0') - if (*yyp =3D=3D '%' && yyformat[1] =3D=3D 's' && yyi < yycount) - { - yyp +=3D yytnamerr (yyp, yyarg[yyi++]); - yyformat +=3D 2; - } - else - { - yyp++; - yyformat++; - } - } - return 0; -} -#endif /* YYERROR_VERBOSE */ - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yyl= ocationp) -{ - YYUSE (yyvaluep); - YYUSE (yylocationp); - if (!yymsg) - yymsg =3D "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END -} - - - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; -/* Location data for the lookahead symbol. */ -YYLTYPE yylloc -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL - =3D { 1, 1, 1, 1 } -# endif -; -/* Number of syntax errors so far. */ -int yynerrs; - - -/*----------. -| yyparse. | -`----------*/ - -int -yyparse (void) -{ - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. - 'yyls': related to locations. - - Refer to the stacks through separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - /* The location stack. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls; - YYLTYPE *yylsp; - - /* The locations where the error started and ended. */ - YYLTYPE yyerror_range[3]; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken =3D 0; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - YYLTYPE yyloc; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg =3D yymsgbuf; - YYSIZE_T yymsg_alloc =3D sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -=3D (N), yyssp -=3D (N), yylsp -=3D (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen =3D 0; - - yyssp =3D yyss =3D yyssa; - yyvsp =3D yyvs =3D yyvsa; - yylsp =3D yyls =3D yylsa; - yystacksize =3D YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate =3D 0; - yyerrstatus =3D 0; - yynerrs =3D 0; - yychar =3D YYEMPTY; /* Cause a token to be read. */ - yylsp[0] =3D yylloc; - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp =3D yystate; - - if (yyss + yystacksize - 1 <=3D yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize =3D yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 =3D yyvs; - yytype_int16 *yyss1 =3D yyss; - YYLTYPE *yyls1 =3D yyls; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yyls1, yysize * sizeof (*yylsp), - &yystacksize); - - yyls =3D yyls1; - yyss =3D yyss1; - yyvs =3D yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <=3D yystacksize) - goto yyexhaustedlab; - yystacksize *=3D 2; - if (YYMAXDEPTH < yystacksize) - yystacksize =3D YYMAXDEPTH; - - { - yytype_int16 *yyss1 =3D yyss; - union yyalloc *yyptr =3D - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); - YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE - if (yyss1 !=3D yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp =3D yyss + yysize - 1; - yyvsp =3D yyvs + yysize - 1; - yylsp =3D yyls + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <=3D yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate =3D=3D YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. = */ - yyn =3D yypact[yystate]; - if (yypact_value_is_default (yyn)) - goto yydefault; - - /* Not known =3D> get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar =3D=3D YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar =3D yylex (); - } - - if (yychar <=3D YYEOF) - { - yychar =3D yytoken =3D YYEOF; - YYDPRINTF ((stderr, "Now@end of input.\n")); - } - else - { - yytoken =3D YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn +=3D yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] !=3D yytoken) - goto yydefault; - yyn =3D yytable[yyn]; - if (yyn <=3D 0) - { - if (yytable_value_is_error (yyn)) - goto yyerrlab; - yyn =3D -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar =3D YYEMPTY; - - yystate =3D yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp =3D yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - *++yylsp =3D yylloc; - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn =3D yydefact[yystate]; - if (yyn =3D=3D 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen =3D yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - '$$ =3D $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval =3D yyvsp[1-yylen]; - - /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: -#line 110 "dtc-parser.y" /* yacc.c:1646 */ - { - parser_output =3D build_dt_info((yyvsp[-2].flags), (yyvsp[-1].re), (yyv= sp[0].node), - guess_boot_cpuid((yyvsp[0].node))); - } -#line 1476 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 3: -#line 118 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.flags) =3D DTSF_V1; - } -#line 1484 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 4: -#line 122 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.flags) =3D DTSF_V1 | DTSF_PLUGIN; - } -#line 1492 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 6: -#line 130 "dtc-parser.y" /* yacc.c:1646 */ - { - if ((yyvsp[0].flags) !=3D (yyvsp[-1].flags)) - ERROR(&(yylsp[0]), "Header flags don't match earlier ones"); - (yyval.flags) =3D (yyvsp[-1].flags); - } -#line 1502 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 7: -#line 139 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.re) =3D NULL; - } -#line 1510 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 8: -#line 143 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.re) =3D chain_reserve_entry((yyvsp[-1].re), (yyvsp[0].re)); - } -#line 1518 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 9: -#line 150 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.re) =3D build_reserve_entry((yyvsp[-2].integer), (yyvsp[-1].inte= ger)); - } -#line 1526 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 10: -#line 154 "dtc-parser.y" /* yacc.c:1646 */ - { - add_label(&(yyvsp[0].re)->labels, (yyvsp[-1].labelref)); - (yyval.re) =3D (yyvsp[0].re); - } -#line 1535 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 11: -#line 162 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.node) =3D name_node((yyvsp[0].node), ""); - } -#line 1543 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 12: -#line 166 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.node) =3D merge_nodes((yyvsp[-2].node), (yyvsp[0].node)); - } -#line 1551 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 13: -#line 171 "dtc-parser.y" /* yacc.c:1646 */ - { - struct node *target =3D get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].la= belref)); - - if (target) { - add_label(&target->labels, (yyvsp[-2].labelref)); - merge_nodes(target, (yyvsp[0].node)); - } else - ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref)= ); - (yyval.node) =3D (yyvsp[-3].node); - } -#line 1566 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 14: -#line 182 "dtc-parser.y" /* yacc.c:1646 */ - { - struct node *target =3D get_node_by_ref((yyvsp[-2].node), (yyvsp[-1].la= belref)); - - if (target) - merge_nodes(target, (yyvsp[0].node)); - else - ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref)= ); - (yyval.node) =3D (yyvsp[-2].node); - } -#line 1580 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 15: -#line 192 "dtc-parser.y" /* yacc.c:1646 */ - { - struct node *target =3D get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].la= belref)); - - if (target) - delete_node(target); - else - ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref)= ); - - - (yyval.node) =3D (yyvsp[-3].node); - } -#line 1596 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 16: -#line 207 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.node) =3D build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist)); - } -#line 1604 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 17: -#line 214 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.proplist) =3D NULL; - } -#line 1612 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 18: -#line 218 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.proplist) =3D chain_property((yyvsp[0].prop), (yyvsp[-1].proplis= t)); - } -#line 1620 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 19: -#line 225 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.prop) =3D build_property((yyvsp[-3].propnodename), (yyvsp[-1].da= ta)); - } -#line 1628 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 20: -#line 229 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.prop) =3D build_property((yyvsp[-1].propnodename), empty_data); - } -#line 1636 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 21: -#line 233 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.prop) =3D build_property_delete((yyvsp[-1].propnodename)); - } -#line 1644 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 22: -#line 237 "dtc-parser.y" /* yacc.c:1646 */ - { - add_label(&(yyvsp[0].prop)->labels, (yyvsp[-1].labelref)); - (yyval.prop) =3D (yyvsp[0].prop); - } -#line 1653 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 23: -#line 245 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_merge((yyvsp[-1].data), (yyvsp[0].data)); - } -#line 1661 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 24: -#line 249 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_merge((yyvsp[-2].data), (yyvsp[-1].array).data); - } -#line 1669 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 25: -#line 253 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_merge((yyvsp[-3].data), (yyvsp[-1].data)); - } -#line 1677 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 26: -#line 257 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_add_marker((yyvsp[-1].data), REF_PATH, (yyvsp[0].= labelref)); - } -#line 1685 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 27: -#line 261 "dtc-parser.y" /* yacc.c:1646 */ - { - FILE *f =3D srcfile_relative_open((yyvsp[-5].data).val, NULL); - struct data d; - - if ((yyvsp[-3].integer) !=3D 0) - if (fseek(f, (yyvsp[-3].integer), SEEK_SET) !=3D 0) - die("Couldn't seek to offset %llu in \"%s\": %s", - (unsigned long long)(yyvsp[-3].integer), (yyvsp[-5].data).val, - strerror(errno)); - - d =3D data_copy_file(f, (yyvsp[-1].integer)); - - (yyval.data) =3D data_merge((yyvsp[-8].data), d); - fclose(f); - } -#line 1705 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 28: -#line 277 "dtc-parser.y" /* yacc.c:1646 */ - { - FILE *f =3D srcfile_relative_open((yyvsp[-1].data).val, NULL); - struct data d =3D empty_data; - - d =3D data_copy_file(f, -1); - - (yyval.data) =3D data_merge((yyvsp[-4].data), d); - fclose(f); - } -#line 1719 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 29: -#line 287 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].lab= elref)); - } -#line 1727 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 30: -#line 294 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D empty_data; - } -#line 1735 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 31: -#line 298 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D (yyvsp[-1].data); - } -#line 1743 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 32: -#line 302 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].lab= elref)); - } -#line 1751 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 33: -#line 309 "dtc-parser.y" /* yacc.c:1646 */ - { - unsigned long long bits; - - bits =3D (yyvsp[-1].integer); - - if ((bits !=3D 8) && (bits !=3D 16) && - (bits !=3D 32) && (bits !=3D 64)) { - ERROR(&(yylsp[-1]), "Array elements must be" - " 8, 16, 32 or 64-bits"); - bits =3D 32; - } - - (yyval.array).data =3D empty_data; - (yyval.array).bits =3D bits; - } -#line 1771 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 34: -#line 325 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.array).data =3D empty_data; - (yyval.array).bits =3D 32; - } -#line 1780 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 35: -#line 330 "dtc-parser.y" /* yacc.c:1646 */ - { - if ((yyvsp[-1].array).bits < 64) { - uint64_t mask =3D (1ULL << (yyvsp[-1].array).bits) - 1; - /* - * Bits above mask must either be all zero - * (positive within range of mask) or all one - * (negative and sign-extended). The second - * condition is true if when we set all bits - * within the mask to one (i.e. | in the - * mask), all bits are one. - */ - if (((yyvsp[0].integer) > mask) && (((yyvsp[0].integer) | mask) !=3D -= 1ULL)) - ERROR(&(yylsp[0]), "Value out of range for" - " %d-bit array element", (yyvsp[-1].array).bits); - } - - (yyval.array).data =3D data_append_integer((yyvsp[-1].array).data, (yyv= sp[0].integer), (yyvsp[-1].array).bits); - } -#line 1803 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 36: -#line 349 "dtc-parser.y" /* yacc.c:1646 */ - { - uint64_t val =3D ~0ULL >> (64 - (yyvsp[-1].array).bits); - - if ((yyvsp[-1].array).bits =3D=3D 32) - (yyvsp[-1].array).data =3D data_add_marker((yyvsp[-1].array).data, - REF_PHANDLE, - (yyvsp[0].labelref)); - else - ERROR(&(yylsp[0]), "References are only allowed in " - "arrays with 32-bit elements."); - - (yyval.array).data =3D data_append_integer((yyvsp[-1].array).data, val,= (yyvsp[-1].array).bits); - } -#line 1821 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 37: -#line 363 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.array).data =3D data_add_marker((yyvsp[-1].array).data, LABEL, (= yyvsp[0].labelref)); - } -#line 1829 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 40: -#line 372 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.integer) =3D (yyvsp[-1].integer); - } -#line 1837 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 43: -#line 383 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-4].integer) ? (yyvsp[-2].integer) : (yyv= sp[0].integer); } -#line 1843 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 45: -#line 388 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) || (yyvsp[0].integer); } -#line 1849 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 47: -#line 393 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) && (yyvsp[0].integer); } -#line 1855 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 49: -#line 398 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) | (yyvsp[0].integer); } -#line 1861 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 51: -#line 403 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) ^ (yyvsp[0].integer); } -#line 1867 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 53: -#line 408 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) & (yyvsp[0].integer); } -#line 1873 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 55: -#line 413 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) =3D=3D (yyvsp[0].integer); } -#line 1879 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 56: -#line 414 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) !=3D (yyvsp[0].integer); } -#line 1885 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 58: -#line 419 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) < (yyvsp[0].integer); } -#line 1891 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 59: -#line 420 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) > (yyvsp[0].integer); } -#line 1897 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 60: -#line 421 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) <=3D (yyvsp[0].integer); } -#line 1903 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 61: -#line 422 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) >=3D (yyvsp[0].integer); } -#line 1909 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 62: -#line 426 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) << (yyvsp[0].integer); } -#line 1915 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 63: -#line 427 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) >> (yyvsp[0].integer); } -#line 1921 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 65: -#line 432 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) + (yyvsp[0].integer); } -#line 1927 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 66: -#line 433 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) - (yyvsp[0].integer); } -#line 1933 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 68: -#line 438 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D (yyvsp[-2].integer) * (yyvsp[0].integer); } -#line 1939 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 69: -#line 440 "dtc-parser.y" /* yacc.c:1646 */ - { - if ((yyvsp[0].integer) !=3D 0) { - (yyval.integer) =3D (yyvsp[-2].integer) / (yyvsp[0].integer); - } else { - ERROR(&(yyloc), "Division by zero"); - (yyval.integer) =3D 0; - } - } -#line 1952 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 70: -#line 449 "dtc-parser.y" /* yacc.c:1646 */ - { - if ((yyvsp[0].integer) !=3D 0) { - (yyval.integer) =3D (yyvsp[-2].integer) % (yyvsp[0].integer); - } else { - ERROR(&(yyloc), "Division by zero"); - (yyval.integer) =3D 0; - } - } -#line 1965 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 73: -#line 462 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D -(yyvsp[0].integer); } -#line 1971 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 74: -#line 463 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D ~(yyvsp[0].integer); } -#line 1977 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 75: -#line 464 "dtc-parser.y" /* yacc.c:1646 */ - { (yyval.integer) =3D !(yyvsp[0].integer); } -#line 1983 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 76: -#line 469 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D empty_data; - } -#line 1991 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 77: -#line 473 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_append_byte((yyvsp[-1].data), (yyvsp[0].byte)); - } -#line 1999 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 78: -#line 477 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.data) =3D data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].lab= elref)); - } -#line 2007 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 79: -#line 484 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.nodelist) =3D NULL; - } -#line 2015 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 80: -#line 488 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.nodelist) =3D chain_node((yyvsp[-1].node), (yyvsp[0].nodelist)); - } -#line 2023 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 81: -#line 492 "dtc-parser.y" /* yacc.c:1646 */ - { - ERROR(&(yylsp[0]), "Properties must precede subnodes"); - YYERROR; - } -#line 2032 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 82: -#line 500 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.node) =3D name_node((yyvsp[0].node), (yyvsp[-1].propnodename)); - } -#line 2040 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 83: -#line 504 "dtc-parser.y" /* yacc.c:1646 */ - { - (yyval.node) =3D name_node(build_node_delete(), (yyvsp[-1].propnodename= )); - } -#line 2048 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - case 84: -#line 508 "dtc-parser.y" /* yacc.c:1646 */ - { - add_label(&(yyvsp[0].node)->labels, (yyvsp[-1].labelref)); - (yyval.node) =3D (yyvsp[0].node); - } -#line 2057 "dtc-parser.tab.c" /* yacc.c:1646 */ - break; - - -#line 2061 "dtc-parser.tab.c" /* yacc.c:1646 */ - default: break; - } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action invokes - YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or - if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an - incorrect destructor might then be invoked immediately. In the - case of YYERROR or YYBACKUP, subsequent parser actions might lead - to an incorrect destructor call or verbose syntax error message - before the lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =3D", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen =3D 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp =3D yyval; - *++yylsp =3D yyloc; - - /* Now 'shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn =3D yyr1[yyn]; - - yystate =3D yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <=3D yystate && yystate <=3D YYLAST && yycheck[yystate] =3D=3D *yy= ssp) - yystate =3D yytable[yystate]; - else - yystate =3D yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ -yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken =3D yychar =3D=3D YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else -# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ - yyssp, yytoken) - { - char const *yymsgp =3D YY_("syntax error"); - int yysyntax_error_status; - yysyntax_error_status =3D YYSYNTAX_ERROR; - if (yysyntax_error_status =3D=3D 0) - yymsgp =3D yymsg; - else if (yysyntax_error_status =3D=3D 1) - { - if (yymsg !=3D yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg =3D (char *) YYSTACK_ALLOC (yymsg_alloc); - if (!yymsg) - { - yymsg =3D yymsgbuf; - yymsg_alloc =3D sizeof yymsgbuf; - yysyntax_error_status =3D 2; - } - else - { - yysyntax_error_status =3D YYSYNTAX_ERROR; - yymsgp =3D yymsg; - } - } - yyerror (yymsgp); - if (yysyntax_error_status =3D=3D 2) - goto yyexhaustedlab; - } -# undef YYSYNTAX_ERROR -#endif - } - - yyerror_range[1] =3D yylloc; - - if (yyerrstatus =3D=3D 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <=3D YYEOF) - { - /* Return failure if@end of input. */ - if (yychar =3D=3D YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc); - yychar =3D YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - yyerror_range[1] =3D yylsp[1-yylen]; - /* Do not reclaim the symbols of the rule whose action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen =3D 0; - YY_STACK_PRINT (yyss, yyssp); - yystate =3D *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus =3D 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn =3D yypact[yystate]; - if (!yypact_value_is_default (yyn)) - { - yyn +=3D YYTERROR; - if (0 <=3D yyn && yyn <=3D YYLAST && yycheck[yyn] =3D=3D YYTERRO= R) - { - yyn =3D yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. = */ - if (yyssp =3D=3D yyss) - YYABORT; - - yyerror_range[1] =3D *yylsp; - yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp); - YYPOPSTACK (1); - yystate =3D *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - *++yyvsp =3D yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END - - yyerror_range[2] =3D yylloc; - /* Using YYLLOC is tempting, but would change the location of - the lookahead. YYLOC is available though. */ - YYLLOC_DEFAULT (yyloc, yyerror_range, 2); - *++yylsp =3D yyloc; - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate =3D yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult =3D 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult =3D 1; - goto yyreturn; - -#if !defined yyoverflow || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult =3D 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar !=3D YYEMPTY) - { - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken =3D YYTRANSLATE (yychar); - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, &yylloc); - } - /* Do not reclaim the symbols of the rule whose action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp !=3D yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, yylsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss !=3D yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg !=3D yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - return yyresult; -} -#line 514 "dtc-parser.y" /* yacc.c:1906 */ - - -void yyerror(char const *s) -{ - ERROR(&yylloc, "%s", s); -} diff --git a/scripts/dtc/dtc-parser.tab.h_shipped b/scripts/dtc/dtc-parser.= tab.h_shipped deleted file mode 100644 index e7b04dd016..0000000000 --- a/scripts/dtc/dtc-parser.tab.h_shipped +++ /dev/null @@ -1,123 +0,0 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ - -/* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - - This program 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 3 of the License, or - (at your option) any later version. - - This program 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 program. If not, see . = */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -#ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED -# define YY_YY_DTC_PARSER_TAB_H_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#endif - -/* Token type. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - enum yytokentype - { - DT_V1 =3D 258, - DT_PLUGIN =3D 259, - DT_MEMRESERVE =3D 260, - DT_LSHIFT =3D 261, - DT_RSHIFT =3D 262, - DT_LE =3D 263, - DT_GE =3D 264, - DT_EQ =3D 265, - DT_NE =3D 266, - DT_AND =3D 267, - DT_OR =3D 268, - DT_BITS =3D 269, - DT_DEL_PROP =3D 270, - DT_DEL_NODE =3D 271, - DT_PROPNODENAME =3D 272, - DT_LITERAL =3D 273, - DT_CHAR_LITERAL =3D 274, - DT_BYTE =3D 275, - DT_STRING =3D 276, - DT_LABEL =3D 277, - DT_REF =3D 278, - DT_INCBIN =3D 279 - }; -#endif - -/* Value type. */ -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; -union YYSTYPE -{ -#line 39 "dtc-parser.y" /* yacc.c:1909 */ - - char *propnodename; - char *labelref; - uint8_t byte; - struct data data; - - struct { - struct data data; - int bits; - } array; - - struct property *prop; - struct property *proplist; - struct node *node; - struct node *nodelist; - struct reserve_info *re; - uint64_t integer; - unsigned int flags; - -#line 99 "dtc-parser.tab.h" /* yacc.c:1909 */ -}; -# define YYSTYPE_IS_TRIVIAL 1 -# define YYSTYPE_IS_DECLARED 1 -#endif - -/* Location type. */ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE YYLTYPE; -struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -}; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - - -extern YYSTYPE yylval; -extern YYLTYPE yylloc; -int yyparse (void); - -#endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED */ diff --git a/scripts/dtc/dtc-parser.y b/scripts/dtc/dtc-parser.y deleted file mode 100644 index ca3f500342..0000000000 --- a/scripts/dtc/dtc-parser.y +++ /dev/null @@ -1,519 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ -%{ -#include -#include - -#include "dtc.h" -#include "srcpos.h" - -extern int yylex(void); -extern void yyerror(char const *s); -#define ERROR(loc, ...) \ - do { \ - srcpos_error((loc), "Error", __VA_ARGS__); \ - treesource_error =3D true; \ - } while (0) - -extern struct dt_info *parser_output; -extern bool treesource_error; -%} - -%union { - char *propnodename; - char *labelref; - uint8_t byte; - struct data data; - - struct { - struct data data; - int bits; - } array; - - struct property *prop; - struct property *proplist; - struct node *node; - struct node *nodelist; - struct reserve_info *re; - uint64_t integer; - unsigned int flags; -} - -%token DT_V1 -%token DT_PLUGIN -%token DT_MEMRESERVE -%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR -%token DT_BITS -%token DT_DEL_PROP -%token DT_DEL_NODE -%token DT_PROPNODENAME -%token DT_LITERAL -%token DT_CHAR_LITERAL -%token DT_BYTE -%token DT_STRING -%token DT_LABEL -%token DT_REF -%token DT_INCBIN - -%type propdata -%type propdataprefix -%type header -%type headers -%type memreserve -%type memreserves -%type arrayprefix -%type bytestring -%type propdef -%type proplist - -%type devicetree -%type nodedef -%type subnode -%type subnodes - -%type integer_prim -%type integer_unary -%type integer_mul -%type integer_add -%type integer_shift -%type integer_rela -%type integer_eq -%type integer_bitand -%type integer_bitxor -%type integer_bitor -%type integer_and -%type integer_or -%type integer_trinary -%type integer_expr - -%% - -sourcefile: - headers memreserves devicetree - { - parser_output =3D build_dt_info($1, $2, $3, - guess_boot_cpuid($3)); - } - ; - -header: - DT_V1 ';' - { - $$ =3D DTSF_V1; - } - | DT_V1 ';' DT_PLUGIN ';' - { - $$ =3D DTSF_V1 | DTSF_PLUGIN; - } - ; - -headers: - header - | header headers - { - if ($2 !=3D $1) - ERROR(&@2, "Header flags don't match earlier ones"); - $$ =3D $1; - } - ; - -memreserves: - /* empty */ - { - $$ =3D NULL; - } - | memreserve memreserves - { - $$ =3D chain_reserve_entry($1, $2); - } - ; - -memreserve: - DT_MEMRESERVE integer_prim integer_prim ';' - { - $$ =3D build_reserve_entry($2, $3); - } - | DT_LABEL memreserve - { - add_label(&$2->labels, $1); - $$ =3D $2; - } - ; - -devicetree: - '/' nodedef - { - $$ =3D name_node($2, ""); - } - | devicetree '/' nodedef - { - $$ =3D merge_nodes($1, $3); - } - - | devicetree DT_LABEL DT_REF nodedef - { - struct node *target =3D get_node_by_ref($1, $3); - - if (target) { - add_label(&target->labels, $2); - merge_nodes(target, $4); - } else - ERROR(&@3, "Label or path %s not found", $3); - $$ =3D $1; - } - | devicetree DT_REF nodedef - { - struct node *target =3D get_node_by_ref($1, $2); - - if (target) - merge_nodes(target, $3); - else - ERROR(&@2, "Label or path %s not found", $2); - $$ =3D $1; - } - | devicetree DT_DEL_NODE DT_REF ';' - { - struct node *target =3D get_node_by_ref($1, $3); - - if (target) - delete_node(target); - else - ERROR(&@3, "Label or path %s not found", $3); - - - $$ =3D $1; - } - ; - -nodedef: - '{' proplist subnodes '}' ';' - { - $$ =3D build_node($2, $3); - } - ; - -proplist: - /* empty */ - { - $$ =3D NULL; - } - | proplist propdef - { - $$ =3D chain_property($2, $1); - } - ; - -propdef: - DT_PROPNODENAME '=3D' propdata ';' - { - $$ =3D build_property($1, $3); - } - | DT_PROPNODENAME ';' - { - $$ =3D build_property($1, empty_data); - } - | DT_DEL_PROP DT_PROPNODENAME ';' - { - $$ =3D build_property_delete($2); - } - | DT_LABEL propdef - { - add_label(&$2->labels, $1); - $$ =3D $2; - } - ; - -propdata: - propdataprefix DT_STRING - { - $$ =3D data_merge($1, $2); - } - | propdataprefix arrayprefix '>' - { - $$ =3D data_merge($1, $2.data); - } - | propdataprefix '[' bytestring ']' - { - $$ =3D data_merge($1, $3); - } - | propdataprefix DT_REF - { - $$ =3D data_add_marker($1, REF_PATH, $2); - } - | propdataprefix DT_INCBIN '(' DT_STRING ',' integer_prim ',' integer_pri= m ')' - { - FILE *f =3D srcfile_relative_open($4.val, NULL); - struct data d; - - if ($6 !=3D 0) - if (fseek(f, $6, SEEK_SET) !=3D 0) - die("Couldn't seek to offset %llu in \"%s\": %s", - (unsigned long long)$6, $4.val, - strerror(errno)); - - d =3D data_copy_file(f, $8); - - $$ =3D data_merge($1, d); - fclose(f); - } - | propdataprefix DT_INCBIN '(' DT_STRING ')' - { - FILE *f =3D srcfile_relative_open($4.val, NULL); - struct data d =3D empty_data; - - d =3D data_copy_file(f, -1); - - $$ =3D data_merge($1, d); - fclose(f); - } - | propdata DT_LABEL - { - $$ =3D data_add_marker($1, LABEL, $2); - } - ; - -propdataprefix: - /* empty */ - { - $$ =3D empty_data; - } - | propdata ',' - { - $$ =3D $1; - } - | propdataprefix DT_LABEL - { - $$ =3D data_add_marker($1, LABEL, $2); - } - ; - -arrayprefix: - DT_BITS DT_LITERAL '<' - { - unsigned long long bits; - - bits =3D $2; - - if ((bits !=3D 8) && (bits !=3D 16) && - (bits !=3D 32) && (bits !=3D 64)) { - ERROR(&@2, "Array elements must be" - " 8, 16, 32 or 64-bits"); - bits =3D 32; - } - - $$.data =3D empty_data; - $$.bits =3D bits; - } - | '<' - { - $$.data =3D empty_data; - $$.bits =3D 32; - } - | arrayprefix integer_prim - { - if ($1.bits < 64) { - uint64_t mask =3D (1ULL << $1.bits) - 1; - /* - * Bits above mask must either be all zero - * (positive within range of mask) or all one - * (negative and sign-extended). The second - * condition is true if when we set all bits - * within the mask to one (i.e. | in the - * mask), all bits are one. - */ - if (($2 > mask) && (($2 | mask) !=3D -1ULL)) - ERROR(&@2, "Value out of range for" - " %d-bit array element", $1.bits); - } - - $$.data =3D data_append_integer($1.data, $2, $1.bits); - } - | arrayprefix DT_REF - { - uint64_t val =3D ~0ULL >> (64 - $1.bits); - - if ($1.bits =3D=3D 32) - $1.data =3D data_add_marker($1.data, - REF_PHANDLE, - $2); - else - ERROR(&@2, "References are only allowed in " - "arrays with 32-bit elements."); - - $$.data =3D data_append_integer($1.data, val, $1.bits); - } - | arrayprefix DT_LABEL - { - $$.data =3D data_add_marker($1.data, LABEL, $2); - } - ; - -integer_prim: - DT_LITERAL - | DT_CHAR_LITERAL - | '(' integer_expr ')' - { - $$ =3D $2; - } - ; - -integer_expr: - integer_trinary - ; - -integer_trinary: - integer_or - | integer_or '?' integer_expr ':' integer_trinary { $$ =3D $1 ? $3 : $5; } - ; - -integer_or: - integer_and - | integer_or DT_OR integer_and { $$ =3D $1 || $3; } - ; - -integer_and: - integer_bitor - | integer_and DT_AND integer_bitor { $$ =3D $1 && $3; } - ; - -integer_bitor: - integer_bitxor - | integer_bitor '|' integer_bitxor { $$ =3D $1 | $3; } - ; - -integer_bitxor: - integer_bitand - | integer_bitxor '^' integer_bitand { $$ =3D $1 ^ $3; } - ; - -integer_bitand: - integer_eq - | integer_bitand '&' integer_eq { $$ =3D $1 & $3; } - ; - -integer_eq: - integer_rela - | integer_eq DT_EQ integer_rela { $$ =3D $1 =3D=3D $3; } - | integer_eq DT_NE integer_rela { $$ =3D $1 !=3D $3; } - ; - -integer_rela: - integer_shift - | integer_rela '<' integer_shift { $$ =3D $1 < $3; } - | integer_rela '>' integer_shift { $$ =3D $1 > $3; } - | integer_rela DT_LE integer_shift { $$ =3D $1 <=3D $3; } - | integer_rela DT_GE integer_shift { $$ =3D $1 >=3D $3; } - ; - -integer_shift: - integer_shift DT_LSHIFT integer_add { $$ =3D $1 << $3; } - | integer_shift DT_RSHIFT integer_add { $$ =3D $1 >> $3; } - | integer_add - ; - -integer_add: - integer_add '+' integer_mul { $$ =3D $1 + $3; } - | integer_add '-' integer_mul { $$ =3D $1 - $3; } - | integer_mul - ; - -integer_mul: - integer_mul '*' integer_unary { $$ =3D $1 * $3; } - | integer_mul '/' integer_unary - { - if ($3 !=3D 0) { - $$ =3D $1 / $3; - } else { - ERROR(&@$, "Division by zero"); - $$ =3D 0; - } - } - | integer_mul '%' integer_unary - { - if ($3 !=3D 0) { - $$ =3D $1 % $3; - } else { - ERROR(&@$, "Division by zero"); - $$ =3D 0; - } - } - | integer_unary - ; - -integer_unary: - integer_prim - | '-' integer_unary { $$ =3D -$2; } - | '~' integer_unary { $$ =3D ~$2; } - | '!' integer_unary { $$ =3D !$2; } - ; - -bytestring: - /* empty */ - { - $$ =3D empty_data; - } - | bytestring DT_BYTE - { - $$ =3D data_append_byte($1, $2); - } - | bytestring DT_LABEL - { - $$ =3D data_add_marker($1, LABEL, $2); - } - ; - -subnodes: - /* empty */ - { - $$ =3D NULL; - } - | subnode subnodes - { - $$ =3D chain_node($1, $2); - } - | subnode propdef - { - ERROR(&@2, "Properties must precede subnodes"); - YYERROR; - } - ; - -subnode: - DT_PROPNODENAME nodedef - { - $$ =3D name_node($2, $1); - } - | DT_DEL_NODE DT_PROPNODENAME ';' - { - $$ =3D name_node(build_node_delete(), $2); - } - | DT_LABEL subnode - { - add_label(&$2->labels, $1); - $$ =3D $2; - } - ; - -%% - -void yyerror(char const *s) -{ - ERROR(&yylloc, "%s", s); -} diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c deleted file mode 100644 index bb1e52b318..0000000000 --- a/scripts/dtc/dtc.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include - -#include "dtc.h" -#include "srcpos.h" - -/* - * Command line options - */ -int quiet; /* Level of quietness */ -int reservenum; /* Number of memory reservation slots */ -int minsize; /* Minimum blob size */ -int padsize; /* Additional padding to blob */ -int alignsize; /* Additional padding to blob accroding to the alignsize */ -int phandle_format =3D PHANDLE_BOTH; /* Use linux,phandle or phandle prope= rties */ -int generate_symbols; /* enable symbols & fixup support */ -int generate_fixups; /* suppress generation of fixups on symbol support */ -int auto_label_aliases; /* auto generate labels -> aliases */ - -static int is_power_of_2(int x) -{ - return (x > 0) && ((x & (x - 1)) =3D=3D 0); -} - -static void fill_fullpaths(struct node *tree, const char *prefix) -{ - struct node *child; - const char *unit; - - tree->fullpath =3D join_path(prefix, tree->name); - - unit =3D strchr(tree->name, '@'); - if (unit) - tree->basenamelen =3D unit - tree->name; - else - tree->basenamelen =3D strlen(tree->name); - - for_each_child(tree, child) - fill_fullpaths(child, tree->fullpath); -} - -/* Usage related data. */ -#define FDT_VERSION(version) _FDT_VERSION(version) -#define _FDT_VERSION(version) #version -static const char usage_synopsis[] =3D "dtc [options] "; -static const char usage_short_opts[] =3D "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@= Ahv"; -static struct option const usage_long_opts[] =3D { - {"quiet", no_argument, NULL, 'q'}, - {"in-format", a_argument, NULL, 'I'}, - {"out", a_argument, NULL, 'o'}, - {"out-format", a_argument, NULL, 'O'}, - {"out-version", a_argument, NULL, 'V'}, - {"out-dependency", a_argument, NULL, 'd'}, - {"reserve", a_argument, NULL, 'R'}, - {"space", a_argument, NULL, 'S'}, - {"pad", a_argument, NULL, 'p'}, - {"align", a_argument, NULL, 'a'}, - {"boot-cpu", a_argument, NULL, 'b'}, - {"force", no_argument, NULL, 'f'}, - {"include", a_argument, NULL, 'i'}, - {"sort", no_argument, NULL, 's'}, - {"phandle", a_argument, NULL, 'H'}, - {"warning", a_argument, NULL, 'W'}, - {"error", a_argument, NULL, 'E'}, - {"symbols", no_argument, NULL, '@'}, - {"auto-alias", no_argument, NULL, 'A'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'v'}, - {NULL, no_argument, NULL, 0x0}, -}; -static const char * const usage_opts_help[] =3D { - "\n\tQuiet: -q suppress warnings, -qq errors, -qqq all", - "\n\tInput formats are:\n" - "\t\tdts - device tree source text\n" - "\t\tdtb - device tree blob\n" - "\t\tfs - /proc/device-tree style directory", - "\n\tOutput file", - "\n\tOutput formats are:\n" - "\t\tdts - device tree source text\n" - "\t\tdtb - device tree blob\n" - "\t\tasm - assembler source", - "\n\tBlob version to produce, defaults to "FDT_VERSION(DEFAULT_FDT_VERSIO= N)" (for dtb and asm output)", - "\n\tOutput dependency file", - "\n\tMake space for reserve map entries (for dtb and asm output)= ", - "\n\tMake the blob at least long (extra space)", - "\n\tAdd padding to the blob of long (extra space)", - "\n\tMake the blob align to the (extra space)", - "\n\tSet the physical boot cpu", - "\n\tTry to produce output even if the input tree has errors", - "\n\tAdd a path to search for include files", - "\n\tSort nodes and properties before outputting (useful for comparing tr= ees)", - "\n\tValid phandle formats are:\n" - "\t\tlegacy - \"linux,phandle\" properties only\n" - "\t\tepapr - \"phandle\" properties only\n" - "\t\tboth - Both \"linux,phandle\" and \"phandle\" properties", - "\n\tEnable/disable warnings (prefix with \"no-\")", - "\n\tEnable/disable errors (prefix with \"no-\")", - "\n\tEnable generation of symbols", - "\n\tEnable auto-alias of labels", - "\n\tPrint this help and exit", - "\n\tPrint version and exit", - NULL, -}; - -static const char *guess_type_by_name(const char *fname, const char *fallb= ack) -{ - const char *s; - - s =3D strrchr(fname, '.'); - if (s =3D=3D NULL) - return fallback; - if (!strcasecmp(s, ".dts")) - return "dts"; - if (!strcasecmp(s, ".dtb")) - return "dtb"; - return fallback; -} - -static const char *guess_input_format(const char *fname, const char *fallb= ack) -{ - struct stat statbuf; - uint32_t magic; - FILE *f; - - if (stat(fname, &statbuf) !=3D 0) - return fallback; - - if (S_ISDIR(statbuf.st_mode)) - return "fs"; - - if (!S_ISREG(statbuf.st_mode)) - return fallback; - - f =3D fopen(fname, "r"); - if (f =3D=3D NULL) - return fallback; - if (fread(&magic, 4, 1, f) !=3D 1) { - fclose(f); - return fallback; - } - fclose(f); - - magic =3D fdt32_to_cpu(magic); - if (magic =3D=3D FDT_MAGIC) - return "dtb"; - - return guess_type_by_name(fname, fallback); -} - -int main(int argc, char *argv[]) -{ - struct dt_info *dti; - const char *inform =3D NULL; - const char *outform =3D NULL; - const char *outname =3D "-"; - const char *depname =3D NULL; - bool force =3D false, sort =3D false; - const char *arg; - int opt; - FILE *outf =3D NULL; - int outversion =3D DEFAULT_FDT_VERSION; - long long cmdline_boot_cpuid =3D -1; - - quiet =3D 0; - reservenum =3D 0; - minsize =3D 0; - padsize =3D 0; - alignsize =3D 0; - - while ((opt =3D util_getopt_long()) !=3D EOF) { - switch (opt) { - case 'I': - inform =3D optarg; - break; - case 'O': - outform =3D optarg; - break; - case 'o': - outname =3D optarg; - break; - case 'V': - outversion =3D strtol(optarg, NULL, 0); - break; - case 'd': - depname =3D optarg; - break; - case 'R': - reservenum =3D strtol(optarg, NULL, 0); - break; - case 'S': - minsize =3D strtol(optarg, NULL, 0); - break; - case 'p': - padsize =3D strtol(optarg, NULL, 0); - break; - case 'a': - alignsize =3D strtol(optarg, NULL, 0); - if (!is_power_of_2(alignsize)) - die("Invalid argument \"%d\" to -a option\n", - alignsize); - break; - case 'f': - force =3D true; - break; - case 'q': - quiet++; - break; - case 'b': - cmdline_boot_cpuid =3D strtoll(optarg, NULL, 0); - break; - case 'i': - srcfile_add_search_path(optarg); - break; - case 'v': - util_version(); - case 'H': - if (streq(optarg, "legacy")) - phandle_format =3D PHANDLE_LEGACY; - else if (streq(optarg, "epapr")) - phandle_format =3D PHANDLE_EPAPR; - else if (streq(optarg, "both")) - phandle_format =3D PHANDLE_BOTH; - else - die("Invalid argument \"%s\" to -H option\n", - optarg); - break; - - case 's': - sort =3D true; - break; - - case 'W': - parse_checks_option(true, false, optarg); - break; - - case 'E': - parse_checks_option(false, true, optarg); - break; - - case '@': - generate_symbols =3D 1; - break; - case 'A': - auto_label_aliases =3D 1; - break; - - case 'h': - usage(NULL); - default: - usage("unknown option"); - } - } - - if (argc > (optind+1)) - usage("missing files"); - else if (argc < (optind+1)) - arg =3D "-"; - else - arg =3D argv[optind]; - - /* minsize and padsize are mutually exclusive */ - if (minsize && padsize) - die("Can't set both -p and -S\n"); - - if (depname) { - depfile =3D fopen(depname, "w"); - if (!depfile) - die("Couldn't open dependency file %s: %s\n", depname, - strerror(errno)); - fprintf(depfile, "%s:", outname); - } - - if (inform =3D=3D NULL) - inform =3D guess_input_format(arg, "dts"); - if (outform =3D=3D NULL) { - outform =3D guess_type_by_name(outname, NULL); - if (outform =3D=3D NULL) { - if (streq(inform, "dts")) - outform =3D "dtb"; - else - outform =3D "dts"; - } - } - if (streq(inform, "dts")) - dti =3D dt_from_source(arg); - else if (streq(inform, "fs")) - dti =3D dt_from_fs(arg); - else if(streq(inform, "dtb")) - dti =3D dt_from_blob(arg); - else - die("Unknown input format \"%s\"\n", inform); - - dti->outname =3D outname; - - if (depfile) { - fputc('\n', depfile); - fclose(depfile); - } - - if (cmdline_boot_cpuid !=3D -1) - dti->boot_cpuid_phys =3D cmdline_boot_cpuid; - - fill_fullpaths(dti->dt, ""); - process_checks(force, dti); - - /* on a plugin, generate by default */ - if (dti->dtsflags & DTSF_PLUGIN) { - generate_fixups =3D 1; - } - - if (auto_label_aliases) - generate_label_tree(dti, "aliases", false); - - if (generate_symbols) - generate_label_tree(dti, "__symbols__", true); - - if (generate_fixups) { - generate_fixups_tree(dti, "__fixups__"); - generate_local_fixups_tree(dti, "__local_fixups__"); - } - - if (sort) - sort_tree(dti); - - if (streq(outname, "-")) { - outf =3D stdout; - } else { - outf =3D fopen(outname, "wb"); - if (! outf) - die("Couldn't open output file %s: %s\n", - outname, strerror(errno)); - } - - if (streq(outform, "dts")) { - dt_to_source(outf, dti); - } else if (streq(outform, "dtb")) { - dt_to_blob(outf, dti, outversion); - } else if (streq(outform, "asm")) { - dt_to_asm(outf, dti, outversion); - } else if (streq(outform, "null")) { - /* do nothing */ - } else { - die("Unknown output format \"%s\"\n", outform); - } - - exit(0); -} diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h deleted file mode 100644 index 1ac2a1e3a4..0000000000 --- a/scripts/dtc/dtc.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef _DTC_H -#define _DTC_H - -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "util.h" - -#ifdef DEBUG -#define debug(...) printf(__VA_ARGS__) -#else -#define debug(...) -#endif - - -#define DEFAULT_FDT_VERSION 17 - -/* - * Command line options - */ -extern int quiet; /* Level of quietness */ -extern int reservenum; /* Number of memory reservation slots */ -extern int minsize; /* Minimum blob size */ -extern int padsize; /* Additional padding to blob */ -extern int alignsize; /* Additional padding to blob accroding to the alig= nsize */ -extern int phandle_format; /* Use linux,phandle or phandle properties */ -extern int generate_symbols; /* generate symbols for nodes with labels */ -extern int generate_fixups; /* generate fixups */ -extern int auto_label_aliases; /* auto generate labels -> aliases */ - -#define PHANDLE_LEGACY 0x1 -#define PHANDLE_EPAPR 0x2 -#define PHANDLE_BOTH 0x3 - -typedef uint32_t cell_t; - - -#define streq(a, b) (strcmp((a), (b)) =3D=3D 0) -#define strneq(a, b, n) (strncmp((a), (b), (n)) =3D=3D 0) - -#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) - -/* Data blobs */ -enum markertype { - REF_PHANDLE, - REF_PATH, - LABEL, -}; - -struct marker { - enum markertype type; - int offset; - char *ref; - struct marker *next; -}; - -struct data { - int len; - char *val; - struct marker *markers; -}; - - -#define empty_data ((struct data){ 0 /* all .members =3D 0 or NULL */ }) - -#define for_each_marker(m) \ - for (; (m); (m) =3D (m)->next) -#define for_each_marker_of_type(m, t) \ - for_each_marker(m) \ - if ((m)->type =3D=3D (t)) - -void data_free(struct data d); - -struct data data_grow_for(struct data d, int xlen); - -struct data data_copy_mem(const char *mem, int len); -struct data data_copy_escape_string(const char *s, int len); -struct data data_copy_file(FILE *f, size_t len); - -struct data data_append_data(struct data d, const void *p, int len); -struct data data_insert_at_marker(struct data d, struct marker *m, - const void *p, int len); -struct data data_merge(struct data d1, struct data d2); -struct data data_append_cell(struct data d, cell_t word); -struct data data_append_integer(struct data d, uint64_t word, int bits); -struct data data_append_re(struct data d, const struct fdt_reserve_entry *= re); -struct data data_append_addr(struct data d, uint64_t addr); -struct data data_append_byte(struct data d, uint8_t byte); -struct data data_append_zeroes(struct data d, int len); -struct data data_append_align(struct data d, int align); - -struct data data_add_marker(struct data d, enum markertype type, char *ref= ); - -bool data_is_one_string(struct data d); - -/* DT constraints */ - -#define MAX_PROPNAME_LEN 31 -#define MAX_NODENAME_LEN 31 - -/* Live trees */ -struct label { - bool deleted; - char *label; - struct label *next; -}; - -struct property { - bool deleted; - char *name; - struct data val; - - struct property *next; - - struct label *labels; -}; - -struct node { - bool deleted; - char *name; - struct property *proplist; - struct node *children; - - struct node *parent; - struct node *next_sibling; - - char *fullpath; - int basenamelen; - - cell_t phandle; - int addr_cells, size_cells; - - struct label *labels; -}; - -#define for_each_label_withdel(l0, l) \ - for ((l) =3D (l0); (l); (l) =3D (l)->next) - -#define for_each_label(l0, l) \ - for_each_label_withdel(l0, l) \ - if (!(l)->deleted) - -#define for_each_property_withdel(n, p) \ - for ((p) =3D (n)->proplist; (p); (p) =3D (p)->next) - -#define for_each_property(n, p) \ - for_each_property_withdel(n, p) \ - if (!(p)->deleted) - -#define for_each_child_withdel(n, c) \ - for ((c) =3D (n)->children; (c); (c) =3D (c)->next_sibling) - -#define for_each_child(n, c) \ - for_each_child_withdel(n, c) \ - if (!(c)->deleted) - -void add_label(struct label **labels, char *label); -void delete_labels(struct label **labels); - -struct property *build_property(char *name, struct data val); -struct property *build_property_delete(char *name); -struct property *chain_property(struct property *first, struct property *l= ist); -struct property *reverse_properties(struct property *first); - -struct node *build_node(struct property *proplist, struct node *children); -struct node *build_node_delete(void); -struct node *name_node(struct node *node, char *name); -struct node *chain_node(struct node *first, struct node *list); -struct node *merge_nodes(struct node *old_node, struct node *new_node); - -void add_property(struct node *node, struct property *prop); -void delete_property_by_name(struct node *node, char *name); -void delete_property(struct property *prop); -void add_child(struct node *parent, struct node *child); -void delete_node_by_name(struct node *parent, char *name); -void delete_node(struct node *node); -void append_to_property(struct node *node, - char *name, const void *data, int len); - -const char *get_unitname(struct node *node); -struct property *get_property(struct node *node, const char *propname); -cell_t propval_cell(struct property *prop); -struct property *get_property_by_label(struct node *tree, const char *labe= l, - struct node **node); -struct marker *get_marker_label(struct node *tree, const char *label, - struct node **node, struct property **prop); -struct node *get_subnode(struct node *node, const char *nodename); -struct node *get_node_by_path(struct node *tree, const char *path); -struct node *get_node_by_label(struct node *tree, const char *label); -struct node *get_node_by_phandle(struct node *tree, cell_t phandle); -struct node *get_node_by_ref(struct node *tree, const char *ref); -cell_t get_node_phandle(struct node *root, struct node *node); - -uint32_t guess_boot_cpuid(struct node *tree); - -/* Boot info (tree plus memreserve information */ - -struct reserve_info { - struct fdt_reserve_entry re; - - struct reserve_info *next; - - struct label *labels; -}; - -struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len); -struct reserve_info *chain_reserve_entry(struct reserve_info *first, - struct reserve_info *list); -struct reserve_info *add_reserve_entry(struct reserve_info *list, - struct reserve_info *new); - - -struct dt_info { - unsigned int dtsflags; - struct reserve_info *reservelist; - uint32_t boot_cpuid_phys; - struct node *dt; /* the device tree */ - const char *outname; /* filename being written to, "-" for stdout */ -}; - -/* DTS version flags definitions */ -#define DTSF_V1 0x0001 /* /dts-v1/ */ -#define DTSF_PLUGIN 0x0002 /* /plugin/ */ - -struct dt_info *build_dt_info(unsigned int dtsflags, - struct reserve_info *reservelist, - struct node *tree, uint32_t boot_cpuid_phys); -void sort_tree(struct dt_info *dti); -void generate_label_tree(struct dt_info *dti, char *name, bool allocph); -void generate_fixups_tree(struct dt_info *dti, char *name); -void generate_local_fixups_tree(struct dt_info *dti, char *name); - -/* Checks */ - -void parse_checks_option(bool warn, bool error, const char *arg); -void process_checks(bool force, struct dt_info *dti); - -/* Flattened trees */ - -void dt_to_blob(FILE *f, struct dt_info *dti, int version); -void dt_to_asm(FILE *f, struct dt_info *dti, int version); - -struct dt_info *dt_from_blob(const char *fname); - -/* Tree source */ - -void dt_to_source(FILE *f, struct dt_info *dti); -struct dt_info *dt_from_source(const char *f); - -/* FS trees */ - -struct dt_info *dt_from_fs(const char *dirname); - -#endif /* _DTC_H */ diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c deleted file mode 100644 index ebac548b3f..0000000000 --- a/scripts/dtc/flattree.c +++ /dev/null @@ -1,946 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" -#include "srcpos.h" - -#define FTF_FULLPATH 0x1 -#define FTF_VARALIGN 0x2 -#define FTF_NAMEPROPS 0x4 -#define FTF_BOOTCPUID 0x8 -#define FTF_STRTABSIZE 0x10 -#define FTF_STRUCTSIZE 0x20 -#define FTF_NOPS 0x40 - -static struct version_info { - int version; - int last_comp_version; - int hdr_size; - int flags; -} version_table[] =3D { - {1, 1, FDT_V1_SIZE, - FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS}, - {2, 1, FDT_V2_SIZE, - FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID}, - {3, 1, FDT_V3_SIZE, - FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE}, - {16, 16, FDT_V3_SIZE, - FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS}, - {17, 16, FDT_V17_SIZE, - FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS}, -}; - -struct emitter { - void (*cell)(void *, cell_t); - void (*string)(void *, char *, int); - void (*align)(void *, int); - void (*data)(void *, struct data); - void (*beginnode)(void *, struct label *labels); - void (*endnode)(void *, struct label *labels); - void (*property)(void *, struct label *labels); -}; - -static void bin_emit_cell(void *e, cell_t val) -{ - struct data *dtbuf =3D e; - - *dtbuf =3D data_append_cell(*dtbuf, val); -} - -static void bin_emit_string(void *e, char *str, int len) -{ - struct data *dtbuf =3D e; - - if (len =3D=3D 0) - len =3D strlen(str); - - *dtbuf =3D data_append_data(*dtbuf, str, len); - *dtbuf =3D data_append_byte(*dtbuf, '\0'); -} - -static void bin_emit_align(void *e, int a) -{ - struct data *dtbuf =3D e; - - *dtbuf =3D data_append_align(*dtbuf, a); -} - -static void bin_emit_data(void *e, struct data d) -{ - struct data *dtbuf =3D e; - - *dtbuf =3D data_append_data(*dtbuf, d.val, d.len); -} - -static void bin_emit_beginnode(void *e, struct label *labels) -{ - bin_emit_cell(e, FDT_BEGIN_NODE); -} - -static void bin_emit_endnode(void *e, struct label *labels) -{ - bin_emit_cell(e, FDT_END_NODE); -} - -static void bin_emit_property(void *e, struct label *labels) -{ - bin_emit_cell(e, FDT_PROP); -} - -static struct emitter bin_emitter =3D { - .cell =3D bin_emit_cell, - .string =3D bin_emit_string, - .align =3D bin_emit_align, - .data =3D bin_emit_data, - .beginnode =3D bin_emit_beginnode, - .endnode =3D bin_emit_endnode, - .property =3D bin_emit_property, -}; - -static void emit_label(FILE *f, const char *prefix, const char *label) -{ - fprintf(f, "\t.globl\t%s_%s\n", prefix, label); - fprintf(f, "%s_%s:\n", prefix, label); - fprintf(f, "_%s_%s:\n", prefix, label); -} - -static void emit_offset_label(FILE *f, const char *label, int offset) -{ - fprintf(f, "\t.globl\t%s\n", label); - fprintf(f, "%s\t=3D . + %d\n", label, offset); -} - -#define ASM_EMIT_BELONG(f, fmt, ...) \ - { \ - fprintf((f), "\t.byte\t((" fmt ") >> 24) & 0xff\n", __VA_ARGS__); \ - fprintf((f), "\t.byte\t((" fmt ") >> 16) & 0xff\n", __VA_ARGS__); \ - fprintf((f), "\t.byte\t((" fmt ") >> 8) & 0xff\n", __VA_ARGS__); \ - fprintf((f), "\t.byte\t(" fmt ") & 0xff\n", __VA_ARGS__); \ - } - -static void asm_emit_cell(void *e, cell_t val) -{ - FILE *f =3D e; - - fprintf(f, "\t.byte 0x%02x; .byte 0x%02x; .byte 0x%02x; .byte 0x%02x\n", - (val >> 24) & 0xff, (val >> 16) & 0xff, - (val >> 8) & 0xff, val & 0xff); -} - -static void asm_emit_string(void *e, char *str, int len) -{ - FILE *f =3D e; - char c =3D 0; - - if (len !=3D 0) { - /* XXX: ewww */ - c =3D str[len]; - str[len] =3D '\0'; - } - - fprintf(f, "\t.string\t\"%s\"\n", str); - - if (len !=3D 0) { - str[len] =3D c; - } -} - -static void asm_emit_align(void *e, int a) -{ - FILE *f =3D e; - - fprintf(f, "\t.balign\t%d, 0\n", a); -} - -static void asm_emit_data(void *e, struct data d) -{ - FILE *f =3D e; - int off =3D 0; - struct marker *m =3D d.markers; - - for_each_marker_of_type(m, LABEL) - emit_offset_label(f, m->ref, m->offset); - - while ((d.len - off) >=3D sizeof(uint32_t)) { - asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off)))); - off +=3D sizeof(uint32_t); - } - - while ((d.len - off) >=3D 1) { - fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]); - off +=3D 1; - } - - assert(off =3D=3D d.len); -} - -static void asm_emit_beginnode(void *e, struct label *labels) -{ - FILE *f =3D e; - struct label *l; - - for_each_label(labels, l) { - fprintf(f, "\t.globl\t%s\n", l->label); - fprintf(f, "%s:\n", l->label); - } - fprintf(f, "\t/* FDT_BEGIN_NODE */\n"); - asm_emit_cell(e, FDT_BEGIN_NODE); -} - -static void asm_emit_endnode(void *e, struct label *labels) -{ - FILE *f =3D e; - struct label *l; - - fprintf(f, "\t/* FDT_END_NODE */\n"); - asm_emit_cell(e, FDT_END_NODE); - for_each_label(labels, l) { - fprintf(f, "\t.globl\t%s_end\n", l->label); - fprintf(f, "%s_end:\n", l->label); - } -} - -static void asm_emit_property(void *e, struct label *labels) -{ - FILE *f =3D e; - struct label *l; - - for_each_label(labels, l) { - fprintf(f, "\t.globl\t%s\n", l->label); - fprintf(f, "%s:\n", l->label); - } - fprintf(f, "\t/* FDT_PROP */\n"); - asm_emit_cell(e, FDT_PROP); -} - -static struct emitter asm_emitter =3D { - .cell =3D asm_emit_cell, - .string =3D asm_emit_string, - .align =3D asm_emit_align, - .data =3D asm_emit_data, - .beginnode =3D asm_emit_beginnode, - .endnode =3D asm_emit_endnode, - .property =3D asm_emit_property, -}; - -static int stringtable_insert(struct data *d, const char *str) -{ - int i; - - /* FIXME: do this more efficiently? */ - - for (i =3D 0; i < d->len; i++) { - if (streq(str, d->val + i)) - return i; - } - - *d =3D data_append_data(*d, str, strlen(str)+1); - return i; -} - -static void flatten_tree(struct node *tree, struct emitter *emit, - void *etarget, struct data *strbuf, - struct version_info *vi) -{ - struct property *prop; - struct node *child; - bool seen_name_prop =3D false; - - if (tree->deleted) - return; - - emit->beginnode(etarget, tree->labels); - - if (vi->flags & FTF_FULLPATH) - emit->string(etarget, tree->fullpath, 0); - else - emit->string(etarget, tree->name, 0); - - emit->align(etarget, sizeof(cell_t)); - - for_each_property(tree, prop) { - int nameoff; - - if (streq(prop->name, "name")) - seen_name_prop =3D true; - - nameoff =3D stringtable_insert(strbuf, prop->name); - - emit->property(etarget, prop->labels); - emit->cell(etarget, prop->val.len); - emit->cell(etarget, nameoff); - - if ((vi->flags & FTF_VARALIGN) && (prop->val.len >=3D 8)) - emit->align(etarget, 8); - - emit->data(etarget, prop->val); - emit->align(etarget, sizeof(cell_t)); - } - - if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) { - emit->property(etarget, NULL); - emit->cell(etarget, tree->basenamelen+1); - emit->cell(etarget, stringtable_insert(strbuf, "name")); - - if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >=3D 8)) - emit->align(etarget, 8); - - emit->string(etarget, tree->name, tree->basenamelen); - emit->align(etarget, sizeof(cell_t)); - } - - for_each_child(tree, child) { - flatten_tree(child, emit, etarget, strbuf, vi); - } - - emit->endnode(etarget, tree->labels); -} - -static struct data flatten_reserve_list(struct reserve_info *reservelist, - struct version_info *vi) -{ - struct reserve_info *re; - struct data d =3D empty_data; - static struct fdt_reserve_entry null_re =3D {0,0}; - int j; - - for (re =3D reservelist; re; re =3D re->next) { - d =3D data_append_re(d, &re->re); - } - /* - * Add additional reserved slots if the user asked for them. - */ - for (j =3D 0; j < reservenum; j++) { - d =3D data_append_re(d, &null_re); - } - - return d; -} - -static void make_fdt_header(struct fdt_header *fdt, - struct version_info *vi, - int reservesize, int dtsize, int strsize, - int boot_cpuid_phys) -{ - int reserve_off; - - reservesize +=3D sizeof(struct fdt_reserve_entry); - - memset(fdt, 0xff, sizeof(*fdt)); - - fdt->magic =3D cpu_to_fdt32(FDT_MAGIC); - fdt->version =3D cpu_to_fdt32(vi->version); - fdt->last_comp_version =3D cpu_to_fdt32(vi->last_comp_version); - - /* Reserve map should be doubleword aligned */ - reserve_off =3D ALIGN(vi->hdr_size, 8); - - fdt->off_mem_rsvmap =3D cpu_to_fdt32(reserve_off); - fdt->off_dt_struct =3D cpu_to_fdt32(reserve_off + reservesize); - fdt->off_dt_strings =3D cpu_to_fdt32(reserve_off + reservesize - + dtsize); - fdt->totalsize =3D cpu_to_fdt32(reserve_off + reservesize + dtsize + strs= ize); - - if (vi->flags & FTF_BOOTCPUID) - fdt->boot_cpuid_phys =3D cpu_to_fdt32(boot_cpuid_phys); - if (vi->flags & FTF_STRTABSIZE) - fdt->size_dt_strings =3D cpu_to_fdt32(strsize); - if (vi->flags & FTF_STRUCTSIZE) - fdt->size_dt_struct =3D cpu_to_fdt32(dtsize); -} - -void dt_to_blob(FILE *f, struct dt_info *dti, int version) -{ - struct version_info *vi =3D NULL; - int i; - struct data blob =3D empty_data; - struct data reservebuf =3D empty_data; - struct data dtbuf =3D empty_data; - struct data strbuf =3D empty_data; - struct fdt_header fdt; - int padlen =3D 0; - - for (i =3D 0; i < ARRAY_SIZE(version_table); i++) { - if (version_table[i].version =3D=3D version) - vi =3D &version_table[i]; - } - if (!vi) - die("Unknown device tree blob version %d\n", version); - - flatten_tree(dti->dt, &bin_emitter, &dtbuf, &strbuf, vi); - bin_emit_cell(&dtbuf, FDT_END); - - reservebuf =3D flatten_reserve_list(dti->reservelist, vi); - - /* Make header */ - make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len, - dti->boot_cpuid_phys); - - /* - * If the user asked for more space than is used, adjust the totalsize. - */ - if (minsize > 0) { - padlen =3D minsize - fdt32_to_cpu(fdt.totalsize); - if (padlen < 0) { - padlen =3D 0; - if (quiet < 1) - fprintf(stderr, - "Warning: blob size %d >=3D minimum size %d\n", - fdt32_to_cpu(fdt.totalsize), minsize); - } - } - - if (padsize > 0) - padlen =3D padsize; - - if (alignsize > 0) - padlen =3D ALIGN(fdt32_to_cpu(fdt.totalsize) + padlen, alignsize) - - fdt32_to_cpu(fdt.totalsize); - - if (padlen > 0) { - int tsize =3D fdt32_to_cpu(fdt.totalsize); - tsize +=3D padlen; - fdt.totalsize =3D cpu_to_fdt32(tsize); - } - - /* - * Assemble the blob: start with the header, add with alignment - * the reserve buffer, add the reserve map terminating zeroes, - * the device tree itself, and finally the strings. - */ - blob =3D data_append_data(blob, &fdt, vi->hdr_size); - blob =3D data_append_align(blob, 8); - blob =3D data_merge(blob, reservebuf); - blob =3D data_append_zeroes(blob, sizeof(struct fdt_reserve_entry)); - blob =3D data_merge(blob, dtbuf); - blob =3D data_merge(blob, strbuf); - - /* - * If the user asked for more space than is used, pad out the blob. - */ - if (padlen > 0) - blob =3D data_append_zeroes(blob, padlen); - - if (fwrite(blob.val, blob.len, 1, f) !=3D 1) { - if (ferror(f)) - die("Error writing device tree blob: %s\n", - strerror(errno)); - else - die("Short write on device tree blob\n"); - } - - /* - * data_merge() frees the right-hand element so only the blob - * remains to be freed. - */ - data_free(blob); -} - -static void dump_stringtable_asm(FILE *f, struct data strbuf) -{ - const char *p; - int len; - - p =3D strbuf.val; - - while (p < (strbuf.val + strbuf.len)) { - len =3D strlen(p); - fprintf(f, "\t.string \"%s\"\n", p); - p +=3D len+1; - } -} - -void dt_to_asm(FILE *f, struct dt_info *dti, int version) -{ - struct version_info *vi =3D NULL; - int i; - struct data strbuf =3D empty_data; - struct reserve_info *re; - const char *symprefix =3D "dt"; - - for (i =3D 0; i < ARRAY_SIZE(version_table); i++) { - if (version_table[i].version =3D=3D version) - vi =3D &version_table[i]; - } - if (!vi) - die("Unknown device tree blob version %d\n", version); - - fprintf(f, "/* autogenerated by dtc, do not edit */\n\n"); - - emit_label(f, symprefix, "blob_start"); - emit_label(f, symprefix, "header"); - fprintf(f, "\t/* magic */\n"); - asm_emit_cell(f, FDT_MAGIC); - fprintf(f, "\t/* totalsize */\n"); - ASM_EMIT_BELONG(f, "_%s_blob_abs_end - _%s_blob_start", - symprefix, symprefix); - fprintf(f, "\t/* off_dt_struct */\n"); - ASM_EMIT_BELONG(f, "_%s_struct_start - _%s_blob_start", - symprefix, symprefix); - fprintf(f, "\t/* off_dt_strings */\n"); - ASM_EMIT_BELONG(f, "_%s_strings_start - _%s_blob_start", - symprefix, symprefix); - fprintf(f, "\t/* off_mem_rsvmap */\n"); - ASM_EMIT_BELONG(f, "_%s_reserve_map - _%s_blob_start", - symprefix, symprefix); - fprintf(f, "\t/* version */\n"); - asm_emit_cell(f, vi->version); - fprintf(f, "\t/* last_comp_version */\n"); - asm_emit_cell(f, vi->last_comp_version); - - if (vi->flags & FTF_BOOTCPUID) { - fprintf(f, "\t/* boot_cpuid_phys */\n"); - asm_emit_cell(f, dti->boot_cpuid_phys); - } - - if (vi->flags & FTF_STRTABSIZE) { - fprintf(f, "\t/* size_dt_strings */\n"); - ASM_EMIT_BELONG(f, "_%s_strings_end - _%s_strings_start", - symprefix, symprefix); - } - - if (vi->flags & FTF_STRUCTSIZE) { - fprintf(f, "\t/* size_dt_struct */\n"); - ASM_EMIT_BELONG(f, "_%s_struct_end - _%s_struct_start", - symprefix, symprefix); - } - - /* - * Reserve map entries. - * Align the reserve map to a doubleword boundary. - * Each entry is an (address, size) pair of u64 values. - * Always supply a zero-sized temination entry. - */ - asm_emit_align(f, 8); - emit_label(f, symprefix, "reserve_map"); - - fprintf(f, "/* Memory reserve map from source file */\n"); - - /* - * Use .long on high and low halfs of u64s to avoid .quad - * as it appears .quad isn't available in some assemblers. - */ - for (re =3D dti->reservelist; re; re =3D re->next) { - struct label *l; - - for_each_label(re->labels, l) { - fprintf(f, "\t.globl\t%s\n", l->label); - fprintf(f, "%s:\n", l->label); - } - ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32)); - ASM_EMIT_BELONG(f, "0x%08x", - (unsigned int)(re->re.address & 0xffffffff)); - ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32)); - ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff)); - } - for (i =3D 0; i < reservenum; i++) { - fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); - } - - fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); - - emit_label(f, symprefix, "struct_start"); - flatten_tree(dti->dt, &asm_emitter, f, &strbuf, vi); - - fprintf(f, "\t/* FDT_END */\n"); - asm_emit_cell(f, FDT_END); - emit_label(f, symprefix, "struct_end"); - - emit_label(f, symprefix, "strings_start"); - dump_stringtable_asm(f, strbuf); - emit_label(f, symprefix, "strings_end"); - - emit_label(f, symprefix, "blob_end"); - - /* - * If the user asked for more space than is used, pad it out. - */ - if (minsize > 0) { - fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n", - minsize, symprefix, symprefix); - } - if (padsize > 0) { - fprintf(f, "\t.space\t%d, 0\n", padsize); - } - if (alignsize > 0) - asm_emit_align(f, alignsize); - emit_label(f, symprefix, "blob_abs_end"); - - data_free(strbuf); -} - -struct inbuf { - char *base, *limit, *ptr; -}; - -static void inbuf_init(struct inbuf *inb, void *base, void *limit) -{ - inb->base =3D base; - inb->limit =3D limit; - inb->ptr =3D inb->base; -} - -static void flat_read_chunk(struct inbuf *inb, void *p, int len) -{ - if ((inb->ptr + len) > inb->limit) - die("Premature end of data parsing flat device tree\n"); - - memcpy(p, inb->ptr, len); - - inb->ptr +=3D len; -} - -static uint32_t flat_read_word(struct inbuf *inb) -{ - uint32_t val; - - assert(((inb->ptr - inb->base) % sizeof(val)) =3D=3D 0); - - flat_read_chunk(inb, &val, sizeof(val)); - - return fdt32_to_cpu(val); -} - -static void flat_realign(struct inbuf *inb, int align) -{ - int off =3D inb->ptr - inb->base; - - inb->ptr =3D inb->base + ALIGN(off, align); - if (inb->ptr > inb->limit) - die("Premature end of data parsing flat device tree\n"); -} - -static char *flat_read_string(struct inbuf *inb) -{ - int len =3D 0; - const char *p =3D inb->ptr; - char *str; - - do { - if (p >=3D inb->limit) - die("Premature end of data parsing flat device tree\n"); - len++; - } while ((*p++) !=3D '\0'); - - str =3D xstrdup(inb->ptr); - - inb->ptr +=3D len; - - flat_realign(inb, sizeof(uint32_t)); - - return str; -} - -static struct data flat_read_data(struct inbuf *inb, int len) -{ - struct data d =3D empty_data; - - if (len =3D=3D 0) - return empty_data; - - d =3D data_grow_for(d, len); - d.len =3D len; - - flat_read_chunk(inb, d.val, len); - - flat_realign(inb, sizeof(uint32_t)); - - return d; -} - -static char *flat_read_stringtable(struct inbuf *inb, int offset) -{ - const char *p; - - p =3D inb->base + offset; - while (1) { - if (p >=3D inb->limit || p < inb->base) - die("String offset %d overruns string table\n", - offset); - - if (*p =3D=3D '\0') - break; - - p++; - } - - return xstrdup(inb->base + offset); -} - -static struct property *flat_read_property(struct inbuf *dtbuf, - struct inbuf *strbuf, int flags) -{ - uint32_t proplen, stroff; - char *name; - struct data val; - - proplen =3D flat_read_word(dtbuf); - stroff =3D flat_read_word(dtbuf); - - name =3D flat_read_stringtable(strbuf, stroff); - - if ((flags & FTF_VARALIGN) && (proplen >=3D 8)) - flat_realign(dtbuf, 8); - - val =3D flat_read_data(dtbuf, proplen); - - return build_property(name, val); -} - - -static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb) -{ - struct reserve_info *reservelist =3D NULL; - struct reserve_info *new; - struct fdt_reserve_entry re; - - /* - * Each entry is a pair of u64 (addr, size) values for 4 cell_t's. - * List terminates at an entry with size equal to zero. - * - * First pass, count entries. - */ - while (1) { - flat_read_chunk(inb, &re, sizeof(re)); - re.address =3D fdt64_to_cpu(re.address); - re.size =3D fdt64_to_cpu(re.size); - if (re.size =3D=3D 0) - break; - - new =3D build_reserve_entry(re.address, re.size); - reservelist =3D add_reserve_entry(reservelist, new); - } - - return reservelist; -} - - -static char *nodename_from_path(const char *ppath, const char *cpath) -{ - int plen; - - plen =3D strlen(ppath); - - if (!strneq(ppath, cpath, plen)) - die("Path \"%s\" is not valid as a child of \"%s\"\n", - cpath, ppath); - - /* root node is a special case */ - if (!streq(ppath, "/")) - plen++; - - return xstrdup(cpath + plen); -} - -static struct node *unflatten_tree(struct inbuf *dtbuf, - struct inbuf *strbuf, - const char *parent_flatname, int flags) -{ - struct node *node; - char *flatname; - uint32_t val; - - node =3D build_node(NULL, NULL); - - flatname =3D flat_read_string(dtbuf); - - if (flags & FTF_FULLPATH) - node->name =3D nodename_from_path(parent_flatname, flatname); - else - node->name =3D flatname; - - do { - struct property *prop; - struct node *child; - - val =3D flat_read_word(dtbuf); - switch (val) { - case FDT_PROP: - if (node->children) - fprintf(stderr, "Warning: Flat tree input has " - "subnodes preceding a property.\n"); - prop =3D flat_read_property(dtbuf, strbuf, flags); - add_property(node, prop); - break; - - case FDT_BEGIN_NODE: - child =3D unflatten_tree(dtbuf,strbuf, flatname, flags); - add_child(node, child); - break; - - case FDT_END_NODE: - break; - - case FDT_END: - die("Premature FDT_END in device tree blob\n"); - break; - - case FDT_NOP: - if (!(flags & FTF_NOPS)) - fprintf(stderr, "Warning: NOP tag found in flat tree" - " version <16\n"); - - /* Ignore */ - break; - - default: - die("Invalid opcode word %08x in device tree blob\n", - val); - } - } while (val !=3D FDT_END_NODE); - - if (node->name !=3D flatname) { - free(flatname); - } - - return node; -} - - -struct dt_info *dt_from_blob(const char *fname) -{ - FILE *f; - uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; - uint32_t off_dt, off_str, off_mem_rsvmap; - int rc; - char *blob; - struct fdt_header *fdt; - char *p; - struct inbuf dtbuf, strbuf; - struct inbuf memresvbuf; - int sizeleft; - struct reserve_info *reservelist; - struct node *tree; - uint32_t val; - int flags =3D 0; - - f =3D srcfile_relative_open(fname, NULL); - - rc =3D fread(&magic, sizeof(magic), 1, f); - if (ferror(f)) - die("Error reading DT blob magic number: %s\n", - strerror(errno)); - if (rc < 1) { - if (feof(f)) - die("EOF reading DT blob magic number\n"); - else - die("Mysterious short read reading magic number\n"); - } - - magic =3D fdt32_to_cpu(magic); - if (magic !=3D FDT_MAGIC) - die("Blob has incorrect magic number\n"); - - rc =3D fread(&totalsize, sizeof(totalsize), 1, f); - if (ferror(f)) - die("Error reading DT blob size: %s\n", strerror(errno)); - if (rc < 1) { - if (feof(f)) - die("EOF reading DT blob size\n"); - else - die("Mysterious short read reading blob size\n"); - } - - totalsize =3D fdt32_to_cpu(totalsize); - if (totalsize < FDT_V1_SIZE) - die("DT blob size (%d) is too small\n", totalsize); - - blob =3D xmalloc(totalsize); - - fdt =3D (struct fdt_header *)blob; - fdt->magic =3D cpu_to_fdt32(magic); - fdt->totalsize =3D cpu_to_fdt32(totalsize); - - sizeleft =3D totalsize - sizeof(magic) - sizeof(totalsize); - p =3D blob + sizeof(magic) + sizeof(totalsize); - - while (sizeleft) { - if (feof(f)) - die("EOF before reading %d bytes of DT blob\n", - totalsize); - - rc =3D fread(p, 1, sizeleft, f); - if (ferror(f)) - die("Error reading DT blob: %s\n", - strerror(errno)); - - sizeleft -=3D rc; - p +=3D rc; - } - - off_dt =3D fdt32_to_cpu(fdt->off_dt_struct); - off_str =3D fdt32_to_cpu(fdt->off_dt_strings); - off_mem_rsvmap =3D fdt32_to_cpu(fdt->off_mem_rsvmap); - version =3D fdt32_to_cpu(fdt->version); - boot_cpuid_phys =3D fdt32_to_cpu(fdt->boot_cpuid_phys); - - if (off_mem_rsvmap >=3D totalsize) - die("Mem Reserve structure offset exceeds total size\n"); - - if (off_dt >=3D totalsize) - die("DT structure offset exceeds total size\n"); - - if (off_str > totalsize) - die("String table offset exceeds total size\n"); - - if (version >=3D 3) { - uint32_t size_str =3D fdt32_to_cpu(fdt->size_dt_strings); - if ((off_str+size_str < off_str) || (off_str+size_str > totalsize)) - die("String table extends past total size\n"); - inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str); - } else { - inbuf_init(&strbuf, blob + off_str, blob + totalsize); - } - - if (version >=3D 17) { - size_dt =3D fdt32_to_cpu(fdt->size_dt_struct); - if ((off_dt+size_dt < off_dt) || (off_dt+size_dt > totalsize)) - die("Structure block extends past total size\n"); - } - - if (version < 16) { - flags |=3D FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN; - } else { - flags |=3D FTF_NOPS; - } - - inbuf_init(&memresvbuf, - blob + off_mem_rsvmap, blob + totalsize); - inbuf_init(&dtbuf, blob + off_dt, blob + totalsize); - - reservelist =3D flat_read_mem_reserve(&memresvbuf); - - val =3D flat_read_word(&dtbuf); - - if (val !=3D FDT_BEGIN_NODE) - die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%= 08x)\n", val); - - tree =3D unflatten_tree(&dtbuf, &strbuf, "", flags); - - val =3D flat_read_word(&dtbuf); - if (val !=3D FDT_END) - die("Device tree blob doesn't end with FDT_END\n"); - - free(blob); - - fclose(f); - - return build_dt_info(DTSF_V1, reservelist, tree, boot_cpuid_phys); -} diff --git a/scripts/dtc/fstree.c b/scripts/dtc/fstree.c deleted file mode 100644 index ae7d06c3c4..0000000000 --- a/scripts/dtc/fstree.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -#include -#include - -static struct node *read_fstree(const char *dirname) -{ - DIR *d; - struct dirent *de; - struct stat st; - struct node *tree; - - d =3D opendir(dirname); - if (!d) - die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno)); - - tree =3D build_node(NULL, NULL); - - while ((de =3D readdir(d)) !=3D NULL) { - char *tmpname; - - if (streq(de->d_name, ".") - || streq(de->d_name, "..")) - continue; - - tmpname =3D join_path(dirname, de->d_name); - - if (lstat(tmpname, &st) < 0) - die("stat(%s): %s\n", tmpname, strerror(errno)); - - if (S_ISREG(st.st_mode)) { - struct property *prop; - FILE *pfile; - - pfile =3D fopen(tmpname, "rb"); - if (! pfile) { - fprintf(stderr, - "WARNING: Cannot open %s: %s\n", - tmpname, strerror(errno)); - } else { - prop =3D build_property(xstrdup(de->d_name), - data_copy_file(pfile, - st.st_size)); - add_property(tree, prop); - fclose(pfile); - } - } else if (S_ISDIR(st.st_mode)) { - struct node *newchild; - - newchild =3D read_fstree(tmpname); - newchild =3D name_node(newchild, xstrdup(de->d_name)); - add_child(tree, newchild); - } - - free(tmpname); - } - - closedir(d); - return tree; -} - -struct dt_info *dt_from_fs(const char *dirname) -{ - struct node *tree; - - tree =3D read_fstree(dirname); - tree =3D name_node(tree, ""); - - return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree)); -} diff --git a/scripts/dtc/libfdt/Makefile.libfdt b/scripts/dtc/libfdt/Makefi= le.libfdt deleted file mode 100644 index 098b3f36e6..0000000000 --- a/scripts/dtc/libfdt/Makefile.libfdt +++ /dev/null @@ -1,11 +0,0 @@ -# Makefile.libfdt -# -# This is not a complete Makefile of itself. Instead, it is designed to -# be easily embeddable into other systems of Makefiles. -# -LIBFDT_soname =3D libfdt.$(SHAREDLIB_EXT).1 -LIBFDT_INCLUDES =3D fdt.h libfdt.h libfdt_env.h -LIBFDT_VERSION =3D version.lds -LIBFDT_SRCS =3D 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 =3D $(LIBFDT_SRCS:%.c=3D%.o) diff --git a/scripts/dtc/libfdt/fdt.c b/scripts/dtc/libfdt/fdt.c deleted file mode 100644 index 22286a1aae..0000000000 --- a/scripts/dtc/libfdt/fdt.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * 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" - -#include -#include - -#include "libfdt_internal.h" - -int fdt_check_header(const void *fdt) -{ - if (fdt_magic(fdt) =3D=3D 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) =3D=3D FDT_SW_MAGIC) { - /* Unfinished sequential-write blob */ - if (fdt_size_dt_struct(fdt) =3D=3D 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) -{ - unsigned absoffset =3D offset + fdt_off_dt_struct(fdt); - - if ((absoffset < offset) - || ((absoffset + len) < absoffset) - || (absoffset + len) > fdt_totalsize(fdt)) - return NULL; - - if (fdt_version(fdt) >=3D 0x11) - if (((offset + len) < offset) - || ((offset + len) > fdt_size_dt_struct(fdt))) - return NULL; - - return _fdt_offset_ptr(fdt, offset); -} - -uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) -{ - const fdt32_t *tagp, *lenp; - uint32_t tag; - int offset =3D startoffset; - const char *p; - - *nextoffset =3D -FDT_ERR_TRUNCATED; - tagp =3D fdt_offset_ptr(fdt, offset, FDT_TAGSIZE); - if (!tagp) - return FDT_END; /* premature end */ - tag =3D fdt32_to_cpu(*tagp); - offset +=3D FDT_TAGSIZE; - - *nextoffset =3D -FDT_ERR_BADSTRUCTURE; - switch (tag) { - case FDT_BEGIN_NODE: - /* skip name */ - do { - p =3D fdt_offset_ptr(fdt, offset++, 1); - } while (p && (*p !=3D '\0')); - if (!p) - return FDT_END; /* premature end */ - break; - - case FDT_PROP: - lenp =3D fdt_offset_ptr(fdt, offset, sizeof(*lenp)); - if (!lenp) - return FDT_END; /* premature end */ - /* skip-name offset, length and value */ - offset +=3D 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 =3D 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) !=3D 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) !=3D FDT_PROP)) - return -FDT_ERR_BADOFFSET; - - return offset; -} - -int fdt_next_node(const void *fdt, int offset, int *depth) -{ - int nextoffset =3D 0; - uint32_t tag; - - if (offset >=3D 0) - if ((nextoffset =3D _fdt_check_node_offset(fdt, offset)) < 0) - return nextoffset; - - do { - offset =3D nextoffset; - tag =3D 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 >=3D 0) - || ((nextoffset =3D=3D -FDT_ERR_TRUNCATED) && !depth)) - return -FDT_ERR_NOTFOUND; - else - return nextoffset; - } - } while (tag !=3D FDT_BEGIN_NODE); - - return offset; -} - -int fdt_first_subnode(const void *fdt, int offset) -{ - int depth =3D 0; - - offset =3D fdt_next_node(fdt, offset, &depth); - if (offset < 0 || depth !=3D 1) - return -FDT_ERR_NOTFOUND; - - return offset; -} - -int fdt_next_subnode(const void *fdt, int offset) -{ - int depth =3D 1; - - /* - * With respect to the parent, the depth of the next subnode will be - * the same as the last. - */ - do { - offset =3D fdt_next_node(fdt, offset, &depth); - if (offset < 0 || depth < 1) - return -FDT_ERR_NOTFOUND; - } while (depth > 1); - - return offset; -} - -const char *_fdt_find_string(const char *strtab, int tabsize, const char *= s) -{ - int len =3D strlen(s) + 1; - const char *last =3D strtab + tabsize - len; - const char *p; - - for (p =3D strtab; p <=3D last; p++) - if (memcmp(p, s, len) =3D=3D 0) - return p; - return NULL; -} - -int fdt_move(const void *fdt, void *buf, int bufsize) -{ - FDT_CHECK_HEADER(fdt); - - if (fdt_totalsize(fdt) > bufsize) - return -FDT_ERR_NOSPACE; - - memmove(buf, fdt, fdt_totalsize(fdt)); - return 0; -} diff --git a/scripts/dtc/libfdt/fdt.h b/scripts/dtc/libfdt/fdt.h deleted file mode 100644 index 526aedb515..0000000000 --- a/scripts/dtc/libfdt/fdt.h +++ /dev/null @@ -1,111 +0,0 @@ -#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 - * 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. - */ - -#ifndef __ASSEMBLY__ - -struct fdt_header { - fdt32_t magic; /* magic word FDT_MAGIC */ - fdt32_t totalsize; /* total size of DT block */ - fdt32_t off_dt_struct; /* offset to structure */ - fdt32_t off_dt_strings; /* offset to strings */ - fdt32_t off_mem_rsvmap; /* offset to memory reserve map */ - fdt32_t version; /* format version */ - fdt32_t last_comp_version; /* last compatible version */ - - /* version 2 fields below */ - fdt32_t boot_cpuid_phys; /* Which physical CPU id we're - booting on */ - /* version 3 fields below */ - fdt32_t size_dt_strings; /* size of the strings block */ - - /* version 17 fields below */ - fdt32_t size_dt_struct; /* size of the structure block */ -}; - -struct fdt_reserve_entry { - fdt64_t address; - fdt64_t size; -}; - -struct fdt_node_header { - fdt32_t tag; - char name[0]; -}; - -struct fdt_property { - fdt32_t tag; - fdt32_t len; - fdt32_t nameoff; - char data[0]; -}; - -#endif /* !__ASSEMBLY */ - -#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ -#define FDT_TAGSIZE sizeof(fdt32_t) - -#define FDT_BEGIN_NODE 0x1 /* Start node: full name */ -#define FDT_END_NODE 0x2 /* End node */ -#define FDT_PROP 0x3 /* Property: name off, - size, content */ -#define FDT_NOP 0x4 /* nop */ -#define FDT_END 0x9 - -#define FDT_V1_SIZE (7*sizeof(fdt32_t)) -#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) -#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) -#define FDT_V16_SIZE FDT_V3_SIZE -#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) - -#endif /* _FDT_H */ diff --git a/scripts/dtc/libfdt/fdt_empty_tree.c b/scripts/dtc/libfdt/fdt_e= mpty_tree.c deleted file mode 100644 index f72d13b1d1..0000000000 --- a/scripts/dtc/libfdt/fdt_empty_tree.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * libfdt - Flat Device Tree manipulation - * Copyright (C) 2012 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" - -#include -#include - -#include "libfdt_internal.h" - -int fdt_create_empty_tree(void *buf, int bufsize) -{ - int err; - - err =3D fdt_create(buf, bufsize); - if (err) - return err; - - err =3D fdt_finish_reservemap(buf); - if (err) - return err; - - err =3D fdt_begin_node(buf, ""); - if (err) - return err; - - err =3D fdt_end_node(buf); - if (err) - return err; - - err =3D fdt_finish(buf); - if (err) - return err; - - return fdt_open_into(buf, buf, bufsize); -} - diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c deleted file mode 100644 index 3d00d2eee0..0000000000 --- a/scripts/dtc/libfdt/fdt_ro.c +++ /dev/null @@ -1,703 +0,0 @@ -/* - * 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" - -#include -#include - -#include "libfdt_internal.h" - -static int _fdt_nodename_eq(const void *fdt, int offset, - const char *s, int len) -{ - const char *p =3D fdt_offset_ptr(fdt, offset + FDT_TAGSIZE, len+1); - - if (! p) - /* short match */ - return 0; - - if (memcmp(p, s, len) !=3D 0) - return 0; - - if (p[len] =3D=3D '\0') - return 1; - else if (!memchr(s, '@', len) && (p[len] =3D=3D '@')) - return 1; - else - return 0; -} - -const char *fdt_string(const void *fdt, int stroffset) -{ - return (const char *)fdt + fdt_off_dt_strings(fdt) + stroffset; -} - -static int _fdt_string_eq(const void *fdt, int stroffset, - const char *s, int len) -{ - const char *p =3D fdt_string(fdt, stroffset); - - return (strlen(p) =3D=3D len) && (memcmp(p, s, len) =3D=3D 0); -} - -uint32_t fdt_get_max_phandle(const void *fdt) -{ - uint32_t max_phandle =3D 0; - int offset; - - for (offset =3D fdt_next_node(fdt, -1, NULL);; - offset =3D fdt_next_node(fdt, offset, NULL)) { - uint32_t phandle; - - if (offset =3D=3D -FDT_ERR_NOTFOUND) - return max_phandle; - - if (offset < 0) - return (uint32_t)-1; - - phandle =3D fdt_get_phandle(fdt, offset); - if (phandle =3D=3D (uint32_t)-1) - continue; - - if (phandle > max_phandle) - max_phandle =3D phandle; - } - - return 0; -} - -int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *s= ize) -{ - FDT_CHECK_HEADER(fdt); - *address =3D fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address); - *size =3D fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size); - return 0; -} - -int fdt_num_mem_rsv(const void *fdt) -{ - int i =3D 0; - - while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) !=3D 0) - i++; - return i; -} - -static int _nextprop(const void *fdt, int offset) -{ - uint32_t tag; - int nextoffset; - - do { - tag =3D fdt_next_tag(fdt, offset, &nextoffset); - - switch (tag) { - case FDT_END: - if (nextoffset >=3D 0) - return -FDT_ERR_BADSTRUCTURE; - else - return nextoffset; - - case FDT_PROP: - return offset; - } - offset =3D nextoffset; - } while (tag =3D=3D FDT_NOP); - - return -FDT_ERR_NOTFOUND; -} - -int fdt_subnode_offset_namelen(const void *fdt, int offset, - const char *name, int namelen) -{ - int depth; - - FDT_CHECK_HEADER(fdt); - - for (depth =3D 0; - (offset >=3D 0) && (depth >=3D 0); - offset =3D fdt_next_node(fdt, offset, &depth)) - if ((depth =3D=3D 1) - && _fdt_nodename_eq(fdt, offset, name, namelen)) - return offset; - - if (depth < 0) - return -FDT_ERR_NOTFOUND; - return offset; /* error */ -} - -int fdt_subnode_offset(const void *fdt, int parentoffset, - const char *name) -{ - return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name)); -} - -int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen) -{ - const char *end =3D path + namelen; - const char *p =3D path; - int offset =3D 0; - - FDT_CHECK_HEADER(fdt); - - /* see if we have an alias */ - if (*path !=3D '/') { - const char *q =3D memchr(path, '/', end - p); - - if (!q) - q =3D end; - - p =3D fdt_get_alias_namelen(fdt, p, q - p); - if (!p) - return -FDT_ERR_BADPATH; - offset =3D fdt_path_offset(fdt, p); - - p =3D q; - } - - while (p < end) { - const char *q; - - while (*p =3D=3D '/') { - p++; - if (p =3D=3D end) - return offset; - } - q =3D memchr(p, '/', end - p); - if (! q) - q =3D end; - - offset =3D fdt_subnode_offset_namelen(fdt, offset, p, q-p); - if (offset < 0) - return offset; - - p =3D q; - } - - return offset; -} - -int fdt_path_offset(const void *fdt, const char *path) -{ - return fdt_path_offset_namelen(fdt, path, strlen(path)); -} - -const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) -{ - const struct fdt_node_header *nh =3D _fdt_offset_ptr(fdt, nodeoffset); - int err; - - if (((err =3D fdt_check_header(fdt)) !=3D 0) - || ((err =3D _fdt_check_node_offset(fdt, nodeoffset)) < 0)) - goto fail; - - if (len) - *len =3D strlen(nh->name); - - return nh->name; - - fail: - if (len) - *len =3D err; - return NULL; -} - -int fdt_first_property_offset(const void *fdt, int nodeoffset) -{ - int offset; - - if ((offset =3D _fdt_check_node_offset(fdt, nodeoffset)) < 0) - return offset; - - return _nextprop(fdt, offset); -} - -int fdt_next_property_offset(const void *fdt, int offset) -{ - if ((offset =3D _fdt_check_prop_offset(fdt, offset)) < 0) - return offset; - - return _nextprop(fdt, offset); -} - -const struct fdt_property *fdt_get_property_by_offset(const void *fdt, - int offset, - int *lenp) -{ - int err; - const struct fdt_property *prop; - - if ((err =3D _fdt_check_prop_offset(fdt, offset)) < 0) { - if (lenp) - *lenp =3D err; - return NULL; - } - - prop =3D _fdt_offset_ptr(fdt, offset); - - if (lenp) - *lenp =3D fdt32_to_cpu(prop->len); - - return prop; -} - -const struct fdt_property *fdt_get_property_namelen(const void *fdt, - int offset, - const char *name, - int namelen, int *lenp) -{ - for (offset =3D fdt_first_property_offset(fdt, offset); - (offset >=3D 0); - (offset =3D fdt_next_property_offset(fdt, offset))) { - const struct fdt_property *prop; - - if (!(prop =3D fdt_get_property_by_offset(fdt, offset, lenp))) { - offset =3D -FDT_ERR_INTERNAL; - break; - } - if (_fdt_string_eq(fdt, fdt32_to_cpu(prop->nameoff), - name, namelen)) - return prop; - } - - if (lenp) - *lenp =3D offset; - return NULL; -} - -const struct fdt_property *fdt_get_property(const void *fdt, - int nodeoffset, - const char *name, int *lenp) -{ - return fdt_get_property_namelen(fdt, nodeoffset, name, - strlen(name), lenp); -} - -const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, - const char *name, int namelen, int *lenp) -{ - const struct fdt_property *prop; - - prop =3D fdt_get_property_namelen(fdt, nodeoffset, name, namelen, lenp); - if (! prop) - return NULL; - - return prop->data; -} - -const void *fdt_getprop_by_offset(const void *fdt, int offset, - const char **namep, int *lenp) -{ - const struct fdt_property *prop; - - prop =3D fdt_get_property_by_offset(fdt, offset, lenp); - if (!prop) - return NULL; - if (namep) - *namep =3D fdt_string(fdt, fdt32_to_cpu(prop->nameoff)); - return prop->data; -} - -const void *fdt_getprop(const void *fdt, int nodeoffset, - const char *name, int *lenp) -{ - return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp); -} - -uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) -{ - const fdt32_t *php; - int len; - - /* FIXME: This is a bit sub-optimal, since we potentially scan - * over all the properties twice. */ - php =3D fdt_getprop(fdt, nodeoffset, "phandle", &len); - if (!php || (len !=3D sizeof(*php))) { - php =3D fdt_getprop(fdt, nodeoffset, "linux,phandle", &len); - if (!php || (len !=3D sizeof(*php))) - return 0; - } - - return fdt32_to_cpu(*php); -} - -const char *fdt_get_alias_namelen(const void *fdt, - const char *name, int namelen) -{ - int aliasoffset; - - aliasoffset =3D fdt_path_offset(fdt, "/aliases"); - if (aliasoffset < 0) - return NULL; - - return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); -} - -const char *fdt_get_alias(const void *fdt, const char *name) -{ - return fdt_get_alias_namelen(fdt, name, strlen(name)); -} - -int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen) -{ - int pdepth =3D 0, p =3D 0; - int offset, depth, namelen; - const char *name; - - FDT_CHECK_HEADER(fdt); - - if (buflen < 2) - return -FDT_ERR_NOSPACE; - - for (offset =3D 0, depth =3D 0; - (offset >=3D 0) && (offset <=3D nodeoffset); - offset =3D fdt_next_node(fdt, offset, &depth)) { - while (pdepth > depth) { - do { - p--; - } while (buf[p-1] !=3D '/'); - pdepth--; - } - - if (pdepth >=3D depth) { - name =3D fdt_get_name(fdt, offset, &namelen); - if (!name) - return namelen; - if ((p + namelen + 1) <=3D buflen) { - memcpy(buf + p, name, namelen); - p +=3D namelen; - buf[p++] =3D '/'; - pdepth++; - } - } - - if (offset =3D=3D nodeoffset) { - if (pdepth < (depth + 1)) - return -FDT_ERR_NOSPACE; - - if (p > 1) /* special case so that root path is "/", not "" */ - p--; - buf[p] =3D '\0'; - return 0; - } - } - - if ((offset =3D=3D -FDT_ERR_NOTFOUND) || (offset >=3D 0)) - return -FDT_ERR_BADOFFSET; - else if (offset =3D=3D -FDT_ERR_BADOFFSET) - return -FDT_ERR_BADSTRUCTURE; - - return offset; /* error from fdt_next_node() */ -} - -int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, - int supernodedepth, int *nodedepth) -{ - int offset, depth; - int supernodeoffset =3D -FDT_ERR_INTERNAL; - - FDT_CHECK_HEADER(fdt); - - if (supernodedepth < 0) - return -FDT_ERR_NOTFOUND; - - for (offset =3D 0, depth =3D 0; - (offset >=3D 0) && (offset <=3D nodeoffset); - offset =3D fdt_next_node(fdt, offset, &depth)) { - if (depth =3D=3D supernodedepth) - supernodeoffset =3D offset; - - if (offset =3D=3D nodeoffset) { - if (nodedepth) - *nodedepth =3D depth; - - if (supernodedepth > depth) - return -FDT_ERR_NOTFOUND; - else - return supernodeoffset; - } - } - - if ((offset =3D=3D -FDT_ERR_NOTFOUND) || (offset >=3D 0)) - return -FDT_ERR_BADOFFSET; - else if (offset =3D=3D -FDT_ERR_BADOFFSET) - return -FDT_ERR_BADSTRUCTURE; - - return offset; /* error from fdt_next_node() */ -} - -int fdt_node_depth(const void *fdt, int nodeoffset) -{ - int nodedepth; - int err; - - err =3D fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth); - if (err) - return (err < 0) ? err : -FDT_ERR_INTERNAL; - return nodedepth; -} - -int fdt_parent_offset(const void *fdt, int nodeoffset) -{ - int nodedepth =3D fdt_node_depth(fdt, nodeoffset); - - if (nodedepth < 0) - return nodedepth; - return fdt_supernode_atdepth_offset(fdt, nodeoffset, - nodedepth - 1, NULL); -} - -int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, - const char *propname, - const void *propval, int proplen) -{ - int offset; - const void *val; - int len; - - FDT_CHECK_HEADER(fdt); - - /* FIXME: The algorithm here is pretty horrible: we scan each - * property of a node in fdt_getprop(), then if that didn't - * find what we want, we scan over them again making our way - * to the next node. Still it's the easiest to implement - * approach; performance can come later. */ - for (offset =3D fdt_next_node(fdt, startoffset, NULL); - offset >=3D 0; - offset =3D fdt_next_node(fdt, offset, NULL)) { - val =3D fdt_getprop(fdt, offset, propname, &len); - if (val && (len =3D=3D proplen) - && (memcmp(val, propval, len) =3D=3D 0)) - return offset; - } - - return offset; /* error from fdt_next_node() */ -} - -int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle) -{ - int offset; - - if ((phandle =3D=3D 0) || (phandle =3D=3D -1)) - return -FDT_ERR_BADPHANDLE; - - FDT_CHECK_HEADER(fdt); - - /* FIXME: The algorithm here is pretty horrible: we - * potentially scan each property of a node in - * fdt_get_phandle(), then if that didn't find what - * we want, we scan over them again making our way to the next - * node. Still it's the easiest to implement approach; - * performance can come later. */ - for (offset =3D fdt_next_node(fdt, -1, NULL); - offset >=3D 0; - offset =3D fdt_next_node(fdt, offset, NULL)) { - if (fdt_get_phandle(fdt, offset) =3D=3D phandle) - return offset; - } - - return offset; /* error from fdt_next_node() */ -} - -int fdt_stringlist_contains(const char *strlist, int listlen, const char *= str) -{ - int len =3D strlen(str); - const char *p; - - while (listlen >=3D len) { - if (memcmp(str, strlist, len+1) =3D=3D 0) - return 1; - p =3D memchr(strlist, '\0', listlen); - if (!p) - return 0; /* malformed strlist.. */ - listlen -=3D (p-strlist) + 1; - strlist =3D p + 1; - } - return 0; -} - -int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *prop= erty) -{ - const char *list, *end; - int length, count =3D 0; - - list =3D fdt_getprop(fdt, nodeoffset, property, &length); - if (!list) - return length; - - end =3D list + length; - - while (list < end) { - length =3D strnlen(list, end - list) + 1; - - /* Abort if the last string isn't properly NUL-terminated. */ - if (list + length > end) - return -FDT_ERR_BADVALUE; - - list +=3D length; - count++; - } - - return count; -} - -int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *pro= perty, - const char *string) -{ - int length, len, idx =3D 0; - const char *list, *end; - - list =3D fdt_getprop(fdt, nodeoffset, property, &length); - if (!list) - return length; - - len =3D strlen(string) + 1; - end =3D list + length; - - while (list < end) { - length =3D strnlen(list, end - list) + 1; - - /* Abort if the last string isn't properly NUL-terminated. */ - if (list + length > end) - return -FDT_ERR_BADVALUE; - - if (length =3D=3D len && memcmp(list, string, length) =3D=3D 0) - return idx; - - list +=3D length; - idx++; - } - - return -FDT_ERR_NOTFOUND; -} - -const char *fdt_stringlist_get(const void *fdt, int nodeoffset, - const char *property, int idx, - int *lenp) -{ - const char *list, *end; - int length; - - list =3D fdt_getprop(fdt, nodeoffset, property, &length); - if (!list) { - if (lenp) - *lenp =3D length; - - return NULL; - } - - end =3D list + length; - - while (list < end) { - length =3D strnlen(list, end - list) + 1; - - /* Abort if the last string isn't properly NUL-terminated. */ - if (list + length > end) { - if (lenp) - *lenp =3D -FDT_ERR_BADVALUE; - - return NULL; - } - - if (idx =3D=3D 0) { - if (lenp) - *lenp =3D length - 1; - - return list; - } - - list +=3D length; - idx--; - } - - if (lenp) - *lenp =3D -FDT_ERR_NOTFOUND; - - return NULL; -} - -int fdt_node_check_compatible(const void *fdt, int nodeoffset, - const char *compatible) -{ - const void *prop; - int len; - - prop =3D fdt_getprop(fdt, nodeoffset, "compatible", &len); - if (!prop) - return len; - - return !fdt_stringlist_contains(prop, len, compatible); -} - -int fdt_node_offset_by_compatible(const void *fdt, int startoffset, - const char *compatible) -{ - int offset, err; - - FDT_CHECK_HEADER(fdt); - - /* FIXME: The algorithm here is pretty horrible: we scan each - * property of a node in fdt_node_check_compatible(), then if - * that didn't find what we want, we scan over them again - * making our way to the next node. Still it's the easiest to - * implement approach; performance can come later. */ - for (offset =3D fdt_next_node(fdt, startoffset, NULL); - offset >=3D 0; - offset =3D fdt_next_node(fdt, offset, NULL)) { - err =3D fdt_node_check_compatible(fdt, offset, compatible); - if ((err < 0) && (err !=3D -FDT_ERR_NOTFOUND)) - return err; - else if (err =3D=3D 0) - return offset; - } - - return offset; /* error from fdt_next_node() */ -} diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c deleted file mode 100644 index 3fd5847377..0000000000 --- a/scripts/dtc/libfdt/fdt_rw.c +++ /dev/null @@ -1,491 +0,0 @@ -/* - * 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,@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" - -#include -#include - -#include "libfdt_internal.h" - -static int _fdt_blocks_misordered(const void *fdt, - int mem_rsv_size, int struct_size) -{ - return (fdt_off_mem_rsvmap(fdt) < FDT_ALIGN(sizeof(struct fdt_header), 8)) - || (fdt_off_dt_struct(fdt) < - (fdt_off_mem_rsvmap(fdt) + mem_rsv_size)) - || (fdt_off_dt_strings(fdt) < - (fdt_off_dt_struct(fdt) + struct_size)) - || (fdt_totalsize(fdt) < - (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt))); -} - -static int _fdt_rw_check_header(void *fdt) -{ - FDT_CHECK_HEADER(fdt); - - if (fdt_version(fdt) < 17) - return -FDT_ERR_BADVERSION; - if (_fdt_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry), - fdt_size_dt_struct(fdt))) - return -FDT_ERR_BADLAYOUT; - if (fdt_version(fdt) > 17) - fdt_set_version(fdt, 17); - - return 0; -} - -#define FDT_RW_CHECK_HEADER(fdt) \ - { \ - int __err; \ - if ((__err =3D _fdt_rw_check_header(fdt)) !=3D 0) \ - return __err; \ - } - -static inline int _fdt_data_size(void *fdt) -{ - return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); -} - -static int _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newle= n) -{ - char *p =3D splicepoint; - char *end =3D (char *)fdt + _fdt_data_size(fdt); - - if (((p + oldlen) < p) || ((p + oldlen) > end)) - return -FDT_ERR_BADOFFSET; - if ((p < (char *)fdt) || ((end - oldlen + newlen) < (char *)fdt)) - return -FDT_ERR_BADOFFSET; - if ((end - oldlen + newlen) > ((char *)fdt + fdt_totalsize(fdt))) - return -FDT_ERR_NOSPACE; - memmove(p + newlen, p + oldlen, end - p - oldlen); - return 0; -} - -static int _fdt_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p, - int oldn, int newn) -{ - int delta =3D (newn - oldn) * sizeof(*p); - int err; - err =3D _fdt_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p)); - if (err) - return err; - fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta); - fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); - return 0; -} - -static int _fdt_splice_struct(void *fdt, void *p, - int oldlen, int newlen) -{ - int delta =3D newlen - oldlen; - int err; - - if ((err =3D _fdt_splice(fdt, p, oldlen, newlen))) - return err; - - fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta); - fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta); - return 0; -} - -static int _fdt_splice_string(void *fdt, int newlen) -{ - void *p =3D (char *)fdt - + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt); - int err; - - if ((err =3D _fdt_splice(fdt, p, 0, newlen))) - return err; - - fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen); - return 0; -} - -static int _fdt_find_add_string(void *fdt, const char *s) -{ - char *strtab =3D (char *)fdt + fdt_off_dt_strings(fdt); - const char *p; - char *new; - int len =3D strlen(s) + 1; - int err; - - p =3D _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s); - if (p) - /* found it */ - return (p - strtab); - - new =3D strtab + fdt_size_dt_strings(fdt); - err =3D _fdt_splice_string(fdt, len); - if (err) - return err; - - memcpy(new, s, len); - return (new - strtab); -} - -int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size) -{ - struct fdt_reserve_entry *re; - int err; - - FDT_RW_CHECK_HEADER(fdt); - - re =3D _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt)); - err =3D _fdt_splice_mem_rsv(fdt, re, 0, 1); - if (err) - return err; - - re->address =3D cpu_to_fdt64(address); - re->size =3D cpu_to_fdt64(size); - return 0; -} - -int fdt_del_mem_rsv(void *fdt, int n) -{ - struct fdt_reserve_entry *re =3D _fdt_mem_rsv_w(fdt, n); - - FDT_RW_CHECK_HEADER(fdt); - - if (n >=3D fdt_num_mem_rsv(fdt)) - return -FDT_ERR_NOTFOUND; - - return _fdt_splice_mem_rsv(fdt, re, 1, 0); -} - -static int _fdt_resize_property(void *fdt, int nodeoffset, const char *nam= e, - int len, struct fdt_property **prop) -{ - int oldlen; - int err; - - *prop =3D fdt_get_property_w(fdt, nodeoffset, name, &oldlen); - if (! (*prop)) - return oldlen; - - if ((err =3D _fdt_splice_struct(fdt, (*prop)->data, FDT_TAGALIGN(oldlen), - FDT_TAGALIGN(len)))) - return err; - - (*prop)->len =3D cpu_to_fdt32(len); - return 0; -} - -static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, - int len, struct fdt_property **prop) -{ - int proplen; - int nextoffset; - int namestroff; - int err; - - if ((nextoffset =3D _fdt_check_node_offset(fdt, nodeoffset)) < 0) - return nextoffset; - - namestroff =3D _fdt_find_add_string(fdt, name); - if (namestroff < 0) - return namestroff; - - *prop =3D _fdt_offset_ptr_w(fdt, nextoffset); - proplen =3D sizeof(**prop) + FDT_TAGALIGN(len); - - err =3D _fdt_splice_struct(fdt, *prop, 0, proplen); - if (err) - return err; - - (*prop)->tag =3D cpu_to_fdt32(FDT_PROP); - (*prop)->nameoff =3D cpu_to_fdt32(namestroff); - (*prop)->len =3D cpu_to_fdt32(len); - return 0; -} - -int fdt_set_name(void *fdt, int nodeoffset, const char *name) -{ - char *namep; - int oldlen, newlen; - int err; - - FDT_RW_CHECK_HEADER(fdt); - - namep =3D (char *)(uintptr_t)fdt_get_name(fdt, nodeoffset, &oldlen); - if (!namep) - return oldlen; - - newlen =3D strlen(name); - - err =3D _fdt_splice_struct(fdt, namep, FDT_TAGALIGN(oldlen+1), - FDT_TAGALIGN(newlen+1)); - if (err) - return err; - - memcpy(namep, name, newlen+1); - return 0; -} - -int fdt_setprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len) -{ - struct fdt_property *prop; - int err; - - FDT_RW_CHECK_HEADER(fdt); - - err =3D _fdt_resize_property(fdt, nodeoffset, name, len, &prop); - if (err =3D=3D -FDT_ERR_NOTFOUND) - err =3D _fdt_add_property(fdt, nodeoffset, name, len, &prop); - if (err) - return err; - - if (len) - memcpy(prop->data, val, len); - return 0; -} - -int fdt_appendprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len) -{ - struct fdt_property *prop; - int err, oldlen, newlen; - - FDT_RW_CHECK_HEADER(fdt); - - prop =3D fdt_get_property_w(fdt, nodeoffset, name, &oldlen); - if (prop) { - newlen =3D len + oldlen; - err =3D _fdt_splice_struct(fdt, prop->data, - FDT_TAGALIGN(oldlen), - FDT_TAGALIGN(newlen)); - if (err) - return err; - prop->len =3D cpu_to_fdt32(newlen); - memcpy(prop->data + oldlen, val, len); - } else { - err =3D _fdt_add_property(fdt, nodeoffset, name, len, &prop); - if (err) - return err; - memcpy(prop->data, val, len); - } - return 0; -} - -int fdt_delprop(void *fdt, int nodeoffset, const char *name) -{ - struct fdt_property *prop; - int len, proplen; - - FDT_RW_CHECK_HEADER(fdt); - - prop =3D fdt_get_property_w(fdt, nodeoffset, name, &len); - if (! prop) - return len; - - proplen =3D sizeof(*prop) + FDT_TAGALIGN(len); - return _fdt_splice_struct(fdt, prop, proplen, 0); -} - -int fdt_add_subnode_namelen(void *fdt, int parentoffset, - const char *name, int namelen) -{ - struct fdt_node_header *nh; - int offset, nextoffset; - int nodelen; - int err; - uint32_t tag; - fdt32_t *endtag; - - FDT_RW_CHECK_HEADER(fdt); - - offset =3D fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen); - if (offset >=3D 0) - return -FDT_ERR_EXISTS; - else if (offset !=3D -FDT_ERR_NOTFOUND) - return offset; - - /* Try to place the new node after the parent's properties */ - fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */ - do { - offset =3D nextoffset; - tag =3D fdt_next_tag(fdt, offset, &nextoffset); - } while ((tag =3D=3D FDT_PROP) || (tag =3D=3D FDT_NOP)); - - nh =3D _fdt_offset_ptr_w(fdt, offset); - nodelen =3D sizeof(*nh) + FDT_TAGALIGN(namelen+1) + FDT_TAGSIZE; - - err =3D _fdt_splice_struct(fdt, nh, 0, nodelen); - if (err) - return err; - - nh->tag =3D cpu_to_fdt32(FDT_BEGIN_NODE); - memset(nh->name, 0, FDT_TAGALIGN(namelen+1)); - memcpy(nh->name, name, namelen); - endtag =3D (fdt32_t *)((char *)nh + nodelen - FDT_TAGSIZE); - *endtag =3D cpu_to_fdt32(FDT_END_NODE); - - return offset; -} - -int fdt_add_subnode(void *fdt, int parentoffset, const char *name) -{ - return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name)); -} - -int fdt_del_node(void *fdt, int nodeoffset) -{ - int endoffset; - - FDT_RW_CHECK_HEADER(fdt); - - endoffset =3D _fdt_node_end_offset(fdt, nodeoffset); - if (endoffset < 0) - return endoffset; - - return _fdt_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset), - endoffset - nodeoffset, 0); -} - -static void _fdt_packblocks(const char *old, char *new, - int mem_rsv_size, int struct_size) -{ - int mem_rsv_off, struct_off, strings_off; - - mem_rsv_off =3D FDT_ALIGN(sizeof(struct fdt_header), 8); - struct_off =3D mem_rsv_off + mem_rsv_size; - strings_off =3D struct_off + struct_size; - - memmove(new + mem_rsv_off, old + fdt_off_mem_rsvmap(old), mem_rsv_size); - fdt_set_off_mem_rsvmap(new, mem_rsv_off); - - memmove(new + struct_off, old + fdt_off_dt_struct(old), struct_size); - fdt_set_off_dt_struct(new, struct_off); - fdt_set_size_dt_struct(new, struct_size); - - memmove(new + strings_off, old + fdt_off_dt_strings(old), - fdt_size_dt_strings(old)); - fdt_set_off_dt_strings(new, strings_off); - fdt_set_size_dt_strings(new, fdt_size_dt_strings(old)); -} - -int fdt_open_into(const void *fdt, void *buf, int bufsize) -{ - int err; - int mem_rsv_size, struct_size; - int newsize; - const char *fdtstart =3D fdt; - const char *fdtend =3D fdtstart + fdt_totalsize(fdt); - char *tmp; - - FDT_CHECK_HEADER(fdt); - - mem_rsv_size =3D (fdt_num_mem_rsv(fdt)+1) - * sizeof(struct fdt_reserve_entry); - - if (fdt_version(fdt) >=3D 17) { - struct_size =3D fdt_size_dt_struct(fdt); - } else { - struct_size =3D 0; - while (fdt_next_tag(fdt, struct_size, &struct_size) !=3D FDT_END) - ; - if (struct_size < 0) - return struct_size; - } - - if (!_fdt_blocks_misordered(fdt, mem_rsv_size, struct_size)) { - /* no further work necessary */ - err =3D fdt_move(fdt, buf, bufsize); - if (err) - return err; - fdt_set_version(buf, 17); - fdt_set_size_dt_struct(buf, struct_size); - fdt_set_totalsize(buf, bufsize); - return 0; - } - - /* Need to reorder */ - newsize =3D FDT_ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size - + struct_size + fdt_size_dt_strings(fdt); - - if (bufsize < newsize) - return -FDT_ERR_NOSPACE; - - /* First attempt to build converted tree@beginning of buffer */ - tmp =3D buf; - /* But if that overlaps with the old tree... */ - if (((tmp + newsize) > fdtstart) && (tmp < fdtend)) { - /* Try right after the old tree instead */ - tmp =3D (char *)(uintptr_t)fdtend; - if ((tmp + newsize) > ((char *)buf + bufsize)) - return -FDT_ERR_NOSPACE; - } - - _fdt_packblocks(fdt, tmp, mem_rsv_size, struct_size); - memmove(buf, tmp, newsize); - - fdt_set_magic(buf, FDT_MAGIC); - fdt_set_totalsize(buf, bufsize); - fdt_set_version(buf, 17); - fdt_set_last_comp_version(buf, 16); - fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt)); - - return 0; -} - -int fdt_pack(void *fdt) -{ - int mem_rsv_size; - - FDT_RW_CHECK_HEADER(fdt); - - mem_rsv_size =3D (fdt_num_mem_rsv(fdt)+1) - * sizeof(struct fdt_reserve_entry); - _fdt_packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt)); - fdt_set_totalsize(fdt, _fdt_data_size(fdt)); - - return 0; -} diff --git a/scripts/dtc/libfdt/fdt_strerror.c b/scripts/dtc/libfdt/fdt_str= error.c deleted file mode 100644 index 9677a1887e..0000000000 --- a/scripts/dtc/libfdt/fdt_strerror.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * 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" - -#include -#include - -#include "libfdt_internal.h" - -struct fdt_errtabent { - const char *str; -}; - -#define FDT_ERRTABENT(val) \ - [(val)] =3D { .str =3D #val, } - -static struct fdt_errtabent fdt_errtable[] =3D { - FDT_ERRTABENT(FDT_ERR_NOTFOUND), - FDT_ERRTABENT(FDT_ERR_EXISTS), - FDT_ERRTABENT(FDT_ERR_NOSPACE), - - FDT_ERRTABENT(FDT_ERR_BADOFFSET), - FDT_ERRTABENT(FDT_ERR_BADPATH), - FDT_ERRTABENT(FDT_ERR_BADPHANDLE), - FDT_ERRTABENT(FDT_ERR_BADSTATE), - - FDT_ERRTABENT(FDT_ERR_TRUNCATED), - FDT_ERRTABENT(FDT_ERR_BADMAGIC), - FDT_ERRTABENT(FDT_ERR_BADVERSION), - FDT_ERRTABENT(FDT_ERR_BADSTRUCTURE), - FDT_ERRTABENT(FDT_ERR_BADLAYOUT), - FDT_ERRTABENT(FDT_ERR_INTERNAL), - FDT_ERRTABENT(FDT_ERR_BADNCELLS), - FDT_ERRTABENT(FDT_ERR_BADVALUE), - FDT_ERRTABENT(FDT_ERR_BADOVERLAY), - FDT_ERRTABENT(FDT_ERR_NOPHANDLES), -}; -#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0])) - -const char *fdt_strerror(int errval) -{ - if (errval > 0) - return ""; - else if (errval =3D=3D 0) - return ""; - else if (errval > -FDT_ERRTABSIZE) { - const char *s =3D fdt_errtable[-errval].str; - - if (s) - return s; - } - - return ""; -} diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c deleted file mode 100644 index 6a804859fd..0000000000 --- a/scripts/dtc/libfdt/fdt_sw.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - * 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" - -#include -#include - -#include "libfdt_internal.h" - -static int _fdt_sw_check_header(void *fdt) -{ - if (fdt_magic(fdt) !=3D FDT_SW_MAGIC) - return -FDT_ERR_BADMAGIC; - /* FIXME: should check more details about the header state */ - return 0; -} - -#define FDT_SW_CHECK_HEADER(fdt) \ - { \ - int err; \ - if ((err =3D _fdt_sw_check_header(fdt)) !=3D 0) \ - return err; \ - } - -static void *_fdt_grab_space(void *fdt, size_t len) -{ - int offset =3D fdt_size_dt_struct(fdt); - int spaceleft; - - spaceleft =3D fdt_totalsize(fdt) - fdt_off_dt_struct(fdt) - - fdt_size_dt_strings(fdt); - - if ((offset + len < offset) || (offset + len > spaceleft)) - return NULL; - - fdt_set_size_dt_struct(fdt, offset + len); - return _fdt_offset_ptr_w(fdt, offset); -} - -int fdt_create(void *buf, int bufsize) -{ - void *fdt =3D buf; - - if (bufsize < sizeof(struct fdt_header)) - return -FDT_ERR_NOSPACE; - - memset(buf, 0, bufsize); - - fdt_set_magic(fdt, FDT_SW_MAGIC); - fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); - fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); - fdt_set_totalsize(fdt, bufsize); - - fdt_set_off_mem_rsvmap(fdt, FDT_ALIGN(sizeof(struct fdt_header), - sizeof(struct fdt_reserve_entry))); - fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt)); - fdt_set_off_dt_strings(fdt, bufsize); - - return 0; -} - -int fdt_resize(void *fdt, void *buf, int bufsize) -{ - size_t headsize, tailsize; - char *oldtail, *newtail; - - FDT_SW_CHECK_HEADER(fdt); - - headsize =3D fdt_off_dt_struct(fdt); - tailsize =3D fdt_size_dt_strings(fdt); - - if ((headsize + tailsize) > bufsize) - return -FDT_ERR_NOSPACE; - - oldtail =3D (char *)fdt + fdt_totalsize(fdt) - tailsize; - newtail =3D (char *)buf + bufsize - tailsize; - - /* Two cases to avoid clobbering data if the old and new - * buffers partially overlap */ - if (buf <=3D fdt) { - memmove(buf, fdt, headsize); - memmove(newtail, oldtail, tailsize); - } else { - memmove(newtail, oldtail, tailsize); - memmove(buf, fdt, headsize); - } - - fdt_set_off_dt_strings(buf, bufsize); - fdt_set_totalsize(buf, bufsize); - - return 0; -} - -int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size) -{ - struct fdt_reserve_entry *re; - int offset; - - FDT_SW_CHECK_HEADER(fdt); - - if (fdt_size_dt_struct(fdt)) - return -FDT_ERR_BADSTATE; - - offset =3D fdt_off_dt_struct(fdt); - if ((offset + sizeof(*re)) > fdt_totalsize(fdt)) - return -FDT_ERR_NOSPACE; - - re =3D (struct fdt_reserve_entry *)((char *)fdt + offset); - re->address =3D cpu_to_fdt64(addr); - re->size =3D cpu_to_fdt64(size); - - fdt_set_off_dt_struct(fdt, offset + sizeof(*re)); - - return 0; -} - -int fdt_finish_reservemap(void *fdt) -{ - return fdt_add_reservemap_entry(fdt, 0, 0); -} - -int fdt_begin_node(void *fdt, const char *name) -{ - struct fdt_node_header *nh; - int namelen =3D strlen(name) + 1; - - FDT_SW_CHECK_HEADER(fdt); - - nh =3D _fdt_grab_space(fdt, sizeof(*nh) + FDT_TAGALIGN(namelen)); - if (! nh) - return -FDT_ERR_NOSPACE; - - nh->tag =3D cpu_to_fdt32(FDT_BEGIN_NODE); - memcpy(nh->name, name, namelen); - return 0; -} - -int fdt_end_node(void *fdt) -{ - fdt32_t *en; - - FDT_SW_CHECK_HEADER(fdt); - - en =3D _fdt_grab_space(fdt, FDT_TAGSIZE); - if (! en) - return -FDT_ERR_NOSPACE; - - *en =3D cpu_to_fdt32(FDT_END_NODE); - return 0; -} - -static int _fdt_find_add_string(void *fdt, const char *s) -{ - char *strtab =3D (char *)fdt + fdt_totalsize(fdt); - const char *p; - int strtabsize =3D fdt_size_dt_strings(fdt); - int len =3D strlen(s) + 1; - int struct_top, offset; - - p =3D _fdt_find_string(strtab - strtabsize, strtabsize, s); - if (p) - return p - strtab; - - /* Add it */ - offset =3D -strtabsize - len; - struct_top =3D fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); - if (fdt_totalsize(fdt) + offset < struct_top) - return 0; /* no more room :( */ - - memcpy(strtab + offset, s, len); - fdt_set_size_dt_strings(fdt, strtabsize + len); - return offset; -} - -int fdt_property(void *fdt, const char *name, const void *val, int len) -{ - struct fdt_property *prop; - int nameoff; - - FDT_SW_CHECK_HEADER(fdt); - - nameoff =3D _fdt_find_add_string(fdt, name); - if (nameoff =3D=3D 0) - return -FDT_ERR_NOSPACE; - - prop =3D _fdt_grab_space(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); - if (! prop) - return -FDT_ERR_NOSPACE; - - prop->tag =3D cpu_to_fdt32(FDT_PROP); - prop->nameoff =3D cpu_to_fdt32(nameoff); - prop->len =3D cpu_to_fdt32(len); - memcpy(prop->data, val, len); - return 0; -} - -int fdt_finish(void *fdt) -{ - char *p =3D (char *)fdt; - fdt32_t *end; - int oldstroffset, newstroffset; - uint32_t tag; - int offset, nextoffset; - - FDT_SW_CHECK_HEADER(fdt); - - /* Add terminator */ - end =3D _fdt_grab_space(fdt, sizeof(*end)); - if (! end) - return -FDT_ERR_NOSPACE; - *end =3D cpu_to_fdt32(FDT_END); - - /* Relocate the string table */ - oldstroffset =3D fdt_totalsize(fdt) - fdt_size_dt_strings(fdt); - newstroffset =3D fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); - memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt)); - fdt_set_off_dt_strings(fdt, newstroffset); - - /* Walk the structure, correcting string offsets */ - offset =3D 0; - while ((tag =3D fdt_next_tag(fdt, offset, &nextoffset)) !=3D FDT_END) { - if (tag =3D=3D FDT_PROP) { - struct fdt_property *prop =3D - _fdt_offset_ptr_w(fdt, offset); - int nameoff; - - nameoff =3D fdt32_to_cpu(prop->nameoff); - nameoff +=3D fdt_size_dt_strings(fdt); - prop->nameoff =3D cpu_to_fdt32(nameoff); - } - offset =3D nextoffset; - } - if (nextoffset < 0) - return nextoffset; - - /* Finally, adjust the header */ - fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); - fdt_set_magic(fdt, FDT_MAGIC); - return 0; -} diff --git a/scripts/dtc/libfdt/fdt_wip.c b/scripts/dtc/libfdt/fdt_wip.c deleted file mode 100644 index 6aaab39992..0000000000 --- a/scripts/dtc/libfdt/fdt_wip.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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,@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" - -#include -#include - -#include "libfdt_internal.h" - -int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, - const char *name, int namelen, - uint32_t idx, const void *val, - int len) -{ - void *propval; - int proplen; - - propval =3D fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen, - &proplen); - if (!propval) - return proplen; - - if (proplen < (len + idx)) - return -FDT_ERR_NOSPACE; - - memcpy((char *)propval + idx, val, len); - return 0; -} - -int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, - const void *val, int len) -{ - const void *propval; - int proplen; - - propval =3D fdt_getprop(fdt, nodeoffset, name, &proplen); - if (! propval) - return proplen; - - if (proplen !=3D len) - return -FDT_ERR_NOSPACE; - - return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name, - strlen(name), 0, - val, len); -} - -static void _fdt_nop_region(void *start, int len) -{ - fdt32_t *p; - - for (p =3D start; (char *)p < ((char *)start + len); p++) - *p =3D cpu_to_fdt32(FDT_NOP); -} - -int fdt_nop_property(void *fdt, int nodeoffset, const char *name) -{ - struct fdt_property *prop; - int len; - - prop =3D fdt_get_property_w(fdt, nodeoffset, name, &len); - if (! prop) - return len; - - _fdt_nop_region(prop, len + sizeof(*prop)); - - return 0; -} - -int _fdt_node_end_offset(void *fdt, int offset) -{ - int depth =3D 0; - - while ((offset >=3D 0) && (depth >=3D 0)) - offset =3D fdt_next_node(fdt, offset, &depth); - - return offset; -} - -int fdt_nop_node(void *fdt, int nodeoffset) -{ - int endoffset; - - endoffset =3D _fdt_node_end_offset(fdt, nodeoffset); - if (endoffset < 0) - return endoffset; - - _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), - endoffset - nodeoffset); - return 0; -} diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h deleted file mode 100644 index 9e71bb9e03..0000000000 --- a/scripts/dtc/libfdt/libfdt.h +++ /dev/null @@ -1,1833 +0,0 @@ -#ifndef _LIBFDT_H -#define _LIBFDT_H -/* - * 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" -#include "fdt.h" - -#define FDT_FIRST_SUPPORTED_VERSION 0x10 -#define FDT_LAST_SUPPORTED_VERSION 0x11 - -/* Error codes: informative error codes */ -#define FDT_ERR_NOTFOUND 1 - /* FDT_ERR_NOTFOUND: The requested node or property does not exist */ -#define FDT_ERR_EXISTS 2 - /* FDT_ERR_EXISTS: Attempted to create a node or property which - * already exists */ -#define FDT_ERR_NOSPACE 3 - /* FDT_ERR_NOSPACE: Operation needed to expand the device - * tree, but its buffer did not have sufficient space to - * contain the expanded tree. Use fdt_open_into() to move the - * device tree to a buffer with more space. */ - -/* Error codes: codes for bad parameters */ -#define FDT_ERR_BADOFFSET 4 - /* FDT_ERR_BADOFFSET: Function was passed a structure block - * offset which is out-of-bounds, or which points to an - * unsuitable part of the structure for the operation. */ -#define FDT_ERR_BADPATH 5 - /* FDT_ERR_BADPATH: Function was passed a badly formatted path - * (e.g. missing a leading / for a function which requires an - * absolute path) */ -#define FDT_ERR_BADPHANDLE 6 - /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle. - * This can be caused either by an invalid phandle property - * length, or the phandle value was either 0 or -1, which are - * not permitted. */ -#define FDT_ERR_BADSTATE 7 - /* FDT_ERR_BADSTATE: Function was passed an incomplete device - * tree created by the sequential-write functions, which is - * not sufficiently complete for the requested operation. */ - -/* Error codes: codes for bad device tree blobs */ -#define FDT_ERR_TRUNCATED 8 - /* FDT_ERR_TRUNCATED: Structure block of the given device tree - * ends without an FDT_END tag. */ -#define FDT_ERR_BADMAGIC 9 - /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a - * device tree@all - it is missing the flattened device - * tree magic number. */ -#define FDT_ERR_BADVERSION 10 - /* FDT_ERR_BADVERSION: Given device tree has a version which - * can't be handled by the requested operation. For - * read-write functions, this may mean that fdt_open_into() is - * required to convert the tree to the expected version. */ -#define FDT_ERR_BADSTRUCTURE 11 - /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt - * structure block or other serious error (e.g. misnested - * nodes, or subnodes preceding properties). */ -#define FDT_ERR_BADLAYOUT 12 - /* FDT_ERR_BADLAYOUT: For read-write functions, the given - * device tree has it's sub-blocks in an order that the - * function can't handle (memory reserve map, then structure, - * then strings). Use fdt_open_into() to reorganize the tree - * into a form suitable for the read-write operations. */ - -/* "Can't happen" error indicating a bug in libfdt */ -#define FDT_ERR_INTERNAL 13 - /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion. - * Should never be returned, if it is, it indicates a bug in - * libfdt itself. */ - -/* Errors in device tree content */ -#define FDT_ERR_BADNCELLS 14 - /* FDT_ERR_BADNCELLS: Device tree has a #address-cells, #size-cells - * or similar property with a bad format or value */ - -#define FDT_ERR_BADVALUE 15 - /* FDT_ERR_BADVALUE: Device tree has a property with an unexpected - * value. For example: a property expected to contain a string list - * is not NUL-terminated within the length of its value. */ - -#define FDT_ERR_BADOVERLAY 16 - /* FDT_ERR_BADOVERLAY: The device tree overlay, while - * correctly structured, cannot be applied due to some - * unexpected or missing value, property or node. */ - -#define FDT_ERR_NOPHANDLES 17 - /* FDT_ERR_NOPHANDLES: The device tree doesn't have any - * phandle available anymore without causing an overflow */ - -#define FDT_ERR_MAX 17 - -/**********************************************************************/ -/* Low-level functions (you probably don't need these) */ -/**********************************************************************/ - -const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int check= len); -static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) -{ - return (void *)(uintptr_t)fdt_offset_ptr(fdt, offset, checklen); -} - -uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); - -/**********************************************************************/ -/* Traversal functions */ -/**********************************************************************/ - -int fdt_next_node(const void *fdt, int offset, int *depth); - -/** - * fdt_first_subnode() - get offset of first direct subnode - * - * @fdt: FDT blob - * @offset: Offset of node to check - * @return offset of first subnode, or -FDT_ERR_NOTFOUND if there is none - */ -int fdt_first_subnode(const void *fdt, int offset); - -/** - * fdt_next_subnode() - get offset of next direct subnode - * - * After first calling fdt_first_subnode(), call this function repeatedly = to - * get direct subnodes of a parent node. - * - * @fdt: FDT blob - * @offset: Offset of previous subnode - * @return offset of next subnode, or -FDT_ERR_NOTFOUND if there are no mo= re - * subnodes - */ -int fdt_next_subnode(const void *fdt, int offset); - -/** - * fdt_for_each_subnode - iterate over all subnodes of a parent - * - * @node: child node (int, lvalue) - * @fdt: FDT blob (const void *) - * @parent: parent node (int) - * - * This is actually a wrapper around a for loop and would be used like so: - * - * fdt_for_each_subnode(node, fdt, parent) { - * Use node - * ... - * } - * - * if ((node < 0) && (node !=3D -FDT_ERR_NOT_FOUND)) { - * Error handling - * } - * - * Note that this is implemented as a macro and @node is used as - * iterator in the loop. The parent variable be constant or even a - * literal. - * - */ -#define fdt_for_each_subnode(node, fdt, parent) \ - for (node =3D fdt_first_subnode(fdt, parent); \ - node >=3D 0; \ - node =3D fdt_next_subnode(fdt, node)) - -/**********************************************************************/ -/* General functions */ -/**********************************************************************/ - -#define fdt_get_header(fdt, field) \ - (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field)) -#define fdt_magic(fdt) (fdt_get_header(fdt, magic)) -#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize)) -#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct)) -#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings)) -#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap)) -#define fdt_version(fdt) (fdt_get_header(fdt, version)) -#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version)) -#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys)) -#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings)) -#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct)) - -#define __fdt_set_hdr(name) \ - static inline void fdt_set_##name(void *fdt, uint32_t val) \ - { \ - struct fdt_header *fdth =3D (struct fdt_header *)fdt; \ - fdth->name =3D cpu_to_fdt32(val); \ - } -__fdt_set_hdr(magic); -__fdt_set_hdr(totalsize); -__fdt_set_hdr(off_dt_struct); -__fdt_set_hdr(off_dt_strings); -__fdt_set_hdr(off_mem_rsvmap); -__fdt_set_hdr(version); -__fdt_set_hdr(last_comp_version); -__fdt_set_hdr(boot_cpuid_phys); -__fdt_set_hdr(size_dt_strings); -__fdt_set_hdr(size_dt_struct); -#undef __fdt_set_hdr - -/** - * fdt_check_header - sanity check a device tree or possible device tree - * @fdt: pointer to data which might be a flattened device tree - * - * fdt_check_header() checks that the given buffer contains what - * appears to be a flattened device tree with sane information in its - * header. - * - * returns: - * 0, if the buffer appears to contain a valid device tree - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, standard meanings, as above - */ -int fdt_check_header(const void *fdt); - -/** - * fdt_move - move a device tree around in memory - * @fdt: pointer to the device tree to move - * @buf: pointer to memory where the device is to be moved - * @bufsize: size of the memory space at buf - * - * fdt_move() relocates, if possible, the device tree blob located at - * fdt to the buffer at buf of size bufsize. The buffer may overlap - * with the existing device tree blob at fdt. Therefore, - * fdt_move(fdt, fdt, fdt_totalsize(fdt)) - * should always succeed. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, standard meanings - */ -int fdt_move(const void *fdt, void *buf, int bufsize); - -/**********************************************************************/ -/* Read-only functions */ -/**********************************************************************/ - -/** - * fdt_string - retrieve a string from the strings block of a device tree - * @fdt: pointer to the device tree blob - * @stroffset: offset of the string within the strings block (native endia= n) - * - * fdt_string() retrieves a pointer to a single string from the - * strings block of the device tree blob at fdt. - * - * returns: - * a pointer to the string, on success - * NULL, if stroffset is out of bounds - */ -const char *fdt_string(const void *fdt, int stroffset); - -/** - * fdt_get_max_phandle - retrieves the highest phandle in a tree - * @fdt: pointer to the device tree blob - * - * fdt_get_max_phandle retrieves the highest phandle in the given - * device tree. This will ignore badly formatted phandles, or phandles - * with a value of 0 or -1. - * - * returns: - * the highest phandle on success - * 0, if no phandle was found in the device tree - * -1, if an error occurred - */ -uint32_t fdt_get_max_phandle(const void *fdt); - -/** - * fdt_num_mem_rsv - retrieve the number of memory reserve map entries - * @fdt: pointer to the device tree blob - * - * Returns the number of entries in the device tree blob's memory - * reservation map. This does not include the terminating 0,0 entry - * or any other (0,0) entries reserved for expansion. - * - * returns: - * the number of entries - */ -int fdt_num_mem_rsv(const void *fdt); - -/** - * fdt_get_mem_rsv - retrieve one memory reserve map entry - * @fdt: pointer to the device tree blob - * @address, @size: pointers to 64-bit variables - * - * On success, *address and *size will contain the address and size of - * the n-th reserve map entry from the device tree blob, in - * native-endian format. - * - * returns: - * 0, on success - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, standard meanings - */ -int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *s= ize); - -/** - * fdt_subnode_offset_namelen - find a subnode based on substring - * @fdt: pointer to the device tree blob - * @parentoffset: structure block offset of a node - * @name: name of the subnode to locate - * @namelen: number of characters of name to consider - * - * Identical to fdt_subnode_offset(), but only examine the first - * namelen characters of name for matching the subnode name. This is - * useful for finding subnodes based on a portion of a larger string, - * such as a full path. - */ -int fdt_subnode_offset_namelen(const void *fdt, int parentoffset, - const char *name, int namelen); -/** - * fdt_subnode_offset - find a subnode of a given node - * @fdt: pointer to the device tree blob - * @parentoffset: structure block offset of a node - * @name: name of the subnode to locate - * - * fdt_subnode_offset() finds a subnode of the node at structure block - * offset parentoffset with the given name. name may include a unit - * address, in which case fdt_subnode_offset() will find the subnode - * with that unit address, or the unit address may be omitted, in - * which case fdt_subnode_offset() will find an arbitrary subnode - * whose name excluding unit address matches the given name. - * - * returns: - * structure block offset of the requested subnode (>=3D0), on success - * -FDT_ERR_NOTFOUND, if the requested subnode does not exist - * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE - * tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings. - */ -int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name= ); - -/** - * fdt_path_offset_namelen - find a tree node by its full path - * @fdt: pointer to the device tree blob - * @path: full path of the node to locate - * @namelen: number of characters of path to consider - * - * Identical to fdt_path_offset(), but only consider the first namelen - * characters of path as the path name. - */ -int fdt_path_offset_namelen(const void *fdt, const char *path, int namelen= ); - -/** - * fdt_path_offset - find a tree node by its full path - * @fdt: pointer to the device tree blob - * @path: full path of the node to locate - * - * fdt_path_offset() finds a node of a given path in the device tree. - * Each path component may omit the unit address portion, but the - * results of this are undefined if any such path component is - * ambiguous (that is if there are multiple nodes at the relevant - * level matching the given component, differentiated only by unit - * address). - * - * returns: - * structure block offset of the node with the requested path (>=3D0), on - * success - * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid - * -FDT_ERR_NOTFOUND, if the requested node does not exist - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings. - */ -int fdt_path_offset(const void *fdt, const char *path); - -/** - * fdt_get_name - retrieve the name of a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: structure block offset of the starting node - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_get_name() retrieves the name (including unit address) of the - * device tree node at structure block offset nodeoffset. If lenp is - * non-NULL, the length of this name is also returned, in the integer - * pointed to by lenp. - * - * returns: - * pointer to the node's name, on success - * If lenp is non-NULL, *lenp contains the length of that name - * (>=3D0) - * NULL, on error - * if lenp is non-NULL *lenp contains an error code (<0): - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE - * tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, standard meanings - */ -const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp); - -/** - * fdt_first_property_offset - find the offset of a node's first property - * @fdt: pointer to the device tree blob - * @nodeoffset: structure block offset of a node - * - * fdt_first_property_offset() finds the first property of the node at - * the given structure block offset. - * - * returns: - * structure block offset of the property (>=3D0), on success - * -FDT_ERR_NOTFOUND, if the requested node has no properties - * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings. - */ -int fdt_first_property_offset(const void *fdt, int nodeoffset); - -/** - * fdt_next_property_offset - step through a node's properties - * @fdt: pointer to the device tree blob - * @offset: structure block offset of a property - * - * fdt_next_property_offset() finds the property immediately after the - * one at the given structure block offset. This will be a property - * of the same node as the given property. - * - * returns: - * structure block offset of the next property (>=3D0), on success - * -FDT_ERR_NOTFOUND, if the given property is the last in its node - * -FDT_ERR_BADOFFSET, if nodeoffset did not point to an FDT_PROP tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings. - */ -int fdt_next_property_offset(const void *fdt, int offset); - -/** - * fdt_for_each_property_offset - iterate over all properties of a node - * - * @property_offset: property offset (int, lvalue) - * @fdt: FDT blob (const void *) - * @node: node offset (int) - * - * This is actually a wrapper around a for loop and would be used like so: - * - * fdt_for_each_property_offset(property, fdt, node) { - * Use property - * ... - * } - * - * if ((property < 0) && (property !=3D -FDT_ERR_NOT_FOUND)) { - * Error handling - * } - * - * Note that this is implemented as a macro and property is used as - * iterator in the loop. The node variable can be constant or even a - * literal. - */ -#define fdt_for_each_property_offset(property, fdt, node) \ - for (property =3D fdt_first_property_offset(fdt, node); \ - property >=3D 0; \ - property =3D fdt_next_property_offset(fdt, property)) - -/** - * fdt_get_property_by_offset - retrieve the property at a given offset - * @fdt: pointer to the device tree blob - * @offset: offset of the property to retrieve - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_get_property_by_offset() retrieves a pointer to the - * fdt_property structure within the device tree blob at the given - * offset. If lenp is non-NULL, the length of the property value is - * also returned, in the integer pointed to by lenp. - * - * returns: - * pointer to the structure representing the property - * if lenp is non-NULL, *lenp contains the length of the property - * value (>=3D0) - * NULL, on error - * if lenp is non-NULL, *lenp contains an error code (<0): - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -const struct fdt_property *fdt_get_property_by_offset(const void *fdt, - int offset, - int *lenp); - -/** - * fdt_get_property_namelen - find a property based on substring - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to find - * @name: name of the property to find - * @namelen: number of characters of name to consider - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * Identical to fdt_get_property(), but only examine the first namelen - * characters of name for matching the property name. - */ -const struct fdt_property *fdt_get_property_namelen(const void *fdt, - int nodeoffset, - const char *name, - int namelen, int *lenp); - -/** - * fdt_get_property - find a given property in a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to find - * @name: name of the property to find - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_get_property() retrieves a pointer to the fdt_property - * structure within the device tree blob corresponding to the property - * named 'name' of the node@offset nodeoffset. If lenp is - * non-NULL, the length of the property value is also returned, in the - * integer pointed to by lenp. - * - * returns: - * pointer to the structure representing the property - * if lenp is non-NULL, *lenp contains the length of the property - * value (>=3D0) - * NULL, on error - * if lenp is non-NULL, *lenp contains an error code (<0): - * -FDT_ERR_NOTFOUND, node does not have named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE - * tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffse= t, - const char *name, int *lenp); -static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeo= ffset, - const char *name, - int *lenp) -{ - return (struct fdt_property *)(uintptr_t) - fdt_get_property(fdt, nodeoffset, name, lenp); -} - -/** - * fdt_getprop_by_offset - retrieve the value of a property at a given off= set - * @fdt: pointer to the device tree blob - * @ffset: offset of the property to read - * @namep: pointer to a string variable (will be overwritten) or NULL - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_getprop_by_offset() retrieves a pointer to the value of the - * property@structure block offset 'offset' (this will be a pointer - * to within the device blob itself, not a copy of the value). If - * lenp is non-NULL, the length of the property value is also - * returned, in the integer pointed to by lenp. If namep is non-NULL, - * the property's namne will also be returned in the char * pointed to - * by namep (this will be a pointer to within the device tree's string - * block, not a new copy of the name). - * - * returns: - * pointer to the property's value - * if lenp is non-NULL, *lenp contains the length of the property - * value (>=3D0) - * if namep is non-NULL *namep contiains a pointer to the property - * name. - * NULL, on error - * if lenp is non-NULL, *lenp contains an error code (<0): - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_PROP tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -const void *fdt_getprop_by_offset(const void *fdt, int offset, - const char **namep, int *lenp); - -/** - * fdt_getprop_namelen - get property value based on substring - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to find - * @name: name of the property to find - * @namelen: number of characters of name to consider - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * Identical to fdt_getprop(), but only examine the first namelen - * characters of name for matching the property name. - */ -const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, - const char *name, int namelen, int *lenp); -static inline void *fdt_getprop_namelen_w(void *fdt, int nodeoffset, - const char *name, int namelen, - int *lenp) -{ - return (void *)(uintptr_t)fdt_getprop_namelen(fdt, nodeoffset, name, - namelen, lenp); -} - -/** - * fdt_getprop - retrieve the value of a given property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to find - * @name: name of the property to find - * @lenp: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_getprop() retrieves a pointer to the value of the property - * named 'name' of the node@offset nodeoffset (this will be a - * pointer to within the device blob itself, not a copy of the value). - * If lenp is non-NULL, the length of the property value is also - * returned, in the integer pointed to by lenp. - * - * returns: - * pointer to the property's value - * if lenp is non-NULL, *lenp contains the length of the property - * value (>=3D0) - * NULL, on error - * if lenp is non-NULL, *lenp contains an error code (<0): - * -FDT_ERR_NOTFOUND, node does not have named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE - * tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -const void *fdt_getprop(const void *fdt, int nodeoffset, - const char *name, int *lenp); -static inline void *fdt_getprop_w(void *fdt, int nodeoffset, - const char *name, int *lenp) -{ - return (void *)(uintptr_t)fdt_getprop(fdt, nodeoffset, name, lenp); -} - -/** - * fdt_get_phandle - retrieve the phandle of a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: structure block offset of the node - * - * fdt_get_phandle() retrieves the phandle of the device tree node at - * structure block offset nodeoffset. - * - * returns: - * the phandle of the node at nodeoffset, on success (!=3D 0, !=3D -1) - * 0, if the node has no phandle, or another error occurs - */ -uint32_t fdt_get_phandle(const void *fdt, int nodeoffset); - -/** - * fdt_get_alias_namelen - get alias based on substring - * @fdt: pointer to the device tree blob - * @name: name of the alias th look up - * @namelen: number of characters of name to consider - * - * Identical to fdt_get_alias(), but only examine the first namelen - * characters of name for matching the alias name. - */ -const char *fdt_get_alias_namelen(const void *fdt, - const char *name, int namelen); - -/** - * fdt_get_alias - retrieve the path referenced by a given alias - * @fdt: pointer to the device tree blob - * @name: name of the alias th look up - * - * fdt_get_alias() retrieves the value of a given alias. That is, the - * value of the property named 'name' in the node /aliases. - * - * returns: - * a pointer to the expansion of the alias named 'name', if it exists - * NULL, if the given alias or the /aliases node does not exist - */ -const char *fdt_get_alias(const void *fdt, const char *name); - -/** - * fdt_get_path - determine the full path of a node - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose path to find - * @buf: character buffer to contain the returned path (will be overwritte= n) - * @buflen: size of the character buffer at buf - * - * fdt_get_path() computes the full path of the node at offset - * nodeoffset, and records that path in the buffer at buf. - * - * NOTE: This function is expensive, as it must scan the device tree - * structure from the start to nodeoffset. - * - * returns: - * 0, on success - * buf contains the absolute path of the node at - * nodeoffset, as a NUL-terminated string. - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1) - * characters and will not fit in the given buffer. - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen); - -/** - * fdt_supernode_atdepth_offset - find a specific ancestor of a node - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose parent to find - * @supernodedepth: depth of the ancestor to find - * @nodedepth: pointer to an integer variable (will be overwritten) or NULL - * - * fdt_supernode_atdepth_offset() finds an ancestor of the given node - * at a specific depth from the root (where the root itself has depth - * 0, its immediate subnodes depth 1 and so forth). So - * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL); - * will always return 0, the offset of the root node. If the node at - * nodeoffset has depth D, then: - * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL); - * will return nodeoffset itself. - * - * NOTE: This function is expensive, as it must scan the device tree - * structure from the start to nodeoffset. - * - * returns: - * structure block offset of the node@node offset's ancestor - * of depth supernodedepth (>=3D0), on success - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of - * nodeoffset - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, - int supernodedepth, int *nodedepth); - -/** - * fdt_node_depth - find the depth of a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose parent to find - * - * fdt_node_depth() finds the depth of a given node. The root node - * has depth 0, its immediate subnodes depth 1 and so forth. - * - * NOTE: This function is expensive, as it must scan the device tree - * structure from the start to nodeoffset. - * - * returns: - * depth of the node at nodeoffset (>=3D0), on success - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_node_depth(const void *fdt, int nodeoffset); - -/** - * fdt_parent_offset - find the parent of a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose parent to find - * - * fdt_parent_offset() locates the parent node of a given node (that - * is, it finds the offset of the node which contains the node at - * nodeoffset as a subnode). - * - * NOTE: This function is expensive, as it must scan the device tree - * structure from the start to nodeoffset, *twice*. - * - * returns: - * structure block offset of the parent of the node at nodeoffset - * (>=3D0), on success - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_parent_offset(const void *fdt, int nodeoffset); - -/** - * fdt_node_offset_by_prop_value - find nodes with a given property value - * @fdt: pointer to the device tree blob - * @startoffset: only find nodes after this offset - * @propname: property name to check - * @propval: property value to search for - * @proplen: length of the value in propval - * - * fdt_node_offset_by_prop_value() returns the offset of the first - * node after startoffset, which has a property named propname whose - * value is of length proplen and has value equal to propval; or if - * startoffset is -1, the very first such node in the tree. - * - * To iterate through all nodes matching the criterion, the following - * idiom can be used: - * offset =3D fdt_node_offset_by_prop_value(fdt, -1, propname, - * propval, proplen); - * while (offset !=3D -FDT_ERR_NOTFOUND) { - * // other code here - * offset =3D fdt_node_offset_by_prop_value(fdt, offset, propname, - * propval, proplen); - * } - * - * Note the -1 in the first call to the function, if 0 is used here - * instead, the function will never locate the root node, even if it - * matches the criterion. - * - * returns: - * structure block offset of the located node (>=3D 0, >startoffset), - * on success - * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the - * tree after startoffset - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, - const char *propname, - const void *propval, int proplen); - -/** - * fdt_node_offset_by_phandle - find the node with a given phandle - * @fdt: pointer to the device tree blob - * @phandle: phandle value - * - * fdt_node_offset_by_phandle() returns the offset of the node - * which has the given phandle value. If there is more than one node - * in the tree with the given phandle (an invalid tree), results are - * undefined. - * - * returns: - * structure block offset of the located node (>=3D 0), on success - * -FDT_ERR_NOTFOUND, no node with that phandle exists - * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1) - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle); - -/** - * fdt_node_check_compatible: check a node's compatible property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of a tree node - * @compatible: string to match against - * - * - * fdt_node_check_compatible() returns 0 if the given node contains a - * 'compatible' property with the given string as one of its elements, - * it returns non-zero otherwise, or on error. - * - * returns: - * 0, if the node has a 'compatible' property listing the given string - * 1, if the node has a 'compatible' property, but it does not list - * the given string - * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property - * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_node_check_compatible(const void *fdt, int nodeoffset, - const char *compatible); - -/** - * fdt_node_offset_by_compatible - find nodes with a given 'compatible' va= lue - * @fdt: pointer to the device tree blob - * @startoffset: only find nodes after this offset - * @compatible: 'compatible' string to match against - * - * fdt_node_offset_by_compatible() returns the offset of the first - * node after startoffset, which has a 'compatible' property which - * lists the given compatible string; or if startoffset is -1, the - * very first such node in the tree. - * - * To iterate through all nodes matching the criterion, the following - * idiom can be used: - * offset =3D fdt_node_offset_by_compatible(fdt, -1, compatible); - * while (offset !=3D -FDT_ERR_NOTFOUND) { - * // other code here - * offset =3D fdt_node_offset_by_compatible(fdt, offset, compatible); - * } - * - * Note the -1 in the first call to the function, if 0 is used here - * instead, the function will never locate the root node, even if it - * matches the criterion. - * - * returns: - * structure block offset of the located node (>=3D 0, >startoffset), - * on success - * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the - * tree after startoffset - * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, standard meanings - */ -int fdt_node_offset_by_compatible(const void *fdt, int startoffset, - const char *compatible); - -/** - * fdt_stringlist_contains - check a string list property for a string - * @strlist: Property containing a list of strings to check - * @listlen: Length of property - * @str: String to search for - * - * This is a utility function provided for convenience. The list contains - * one or more strings, each terminated by \0, as is found in a device tree - * "compatible" property. - * - * @return: 1 if the string is found in the list, 0 not found, or invalid = list - */ -int fdt_stringlist_contains(const char *strlist, int listlen, const char *= str); - -/** - * fdt_stringlist_count - count the number of strings in a string list - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of a tree node - * @property: name of the property containing the string list - * @return: - * the number of strings in the given property - * -FDT_ERR_BADVALUE if the property value is not NUL-terminated - * -FDT_ERR_NOTFOUND if the property does not exist - */ -int fdt_stringlist_count(const void *fdt, int nodeoffset, const char *prop= erty); - -/** - * fdt_stringlist_search - find a string in a string list and return its i= ndex - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of a tree node - * @property: name of the property containing the string list - * @string: string to look up in the string list - * - * Note that it is possible for this function to succeed on property values - * that are not NUL-terminated. That's because the function will stop after - * finding the first occurrence of @string. This can for example happen wi= th - * small-valued cell properties, such as #address-cells, when searching for - * the empty string. - * - * @return: - * the index of the string in the list of strings - * -FDT_ERR_BADVALUE if the property value is not NUL-terminated - * -FDT_ERR_NOTFOUND if the property does not exist or does not contain - * the given string - */ -int fdt_stringlist_search(const void *fdt, int nodeoffset, const char *pro= perty, - const char *string); - -/** - * fdt_stringlist_get() - obtain the string at a given index in a string l= ist - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of a tree node - * @property: name of the property containing the string list - * @index: index of the string to return - * @lenp: return location for the string length or an error code on failure - * - * Note that this will successfully extract strings from properties with - * non-NUL-terminated values. For example on small-valued cell properties - * this function will return the empty string. - * - * If non-NULL, the length of the string (on success) or a negative error-= code - * (on failure) will be stored in the integer pointer to by lenp. - * - * @return: - * A pointer to the string at the given index in the string list or NULL= on - * failure. On success the length of the string will be stored in the me= mory - * location pointed to by the lenp parameter, if non-NULL. On failure on= e of - * the following negative error codes will be returned in the lenp param= eter - * (if non-NULL): - * -FDT_ERR_BADVALUE if the property value is not NUL-terminated - * -FDT_ERR_NOTFOUND if the property does not exist - */ -const char *fdt_stringlist_get(const void *fdt, int nodeoffset, - const char *property, int index, - int *lenp); - -/**********************************************************************/ -/* Read-only functions (addressing related) */ -/**********************************************************************/ - -/** - * FDT_MAX_NCELLS - maximum value for #address-cells and #size-cells - * - * This is the maximum value for #address-cells, #size-cells and - * similar properties that will be processed by libfdt. IEE1275 - * requires that OF implementations handle values up to 4. - * Implementations may support larger values, but in practice higher - * values aren't used. - */ -#define FDT_MAX_NCELLS 4 - -/** - * fdt_address_cells - retrieve address size for a bus represented in the = tree - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node to find the address size for - * - * When the node has a valid #address-cells property, returns its value. - * - * returns: - * 0 <=3D n < FDT_MAX_NCELLS, on success - * 2, if the node has no #address-cells property - * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid - * #address-cells property - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_address_cells(const void *fdt, int nodeoffset); - -/** - * fdt_size_cells - retrieve address range size for a bus represented in t= he - * tree - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node to find the address range size for - * - * When the node has a valid #size-cells property, returns its value. - * - * returns: - * 0 <=3D n < FDT_MAX_NCELLS, on success - * 2, if the node has no #address-cells property - * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid - * #size-cells property - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_size_cells(const void *fdt, int nodeoffset); - - -/**********************************************************************/ -/* Write-in-place functions */ -/**********************************************************************/ - -/** - * fdt_setprop_inplace_namelen_partial - change a property's value, - * but not its size - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @namelen: number of characters of name to consider - * @idx: index of the property to change in the array - * @val: pointer to data to replace the property value with - * @len: length of the property value - * - * Identical to fdt_setprop_inplace(), but modifies the given property - * starting from the given index, and using only the first characters - * of the name. It is useful when you want to manipulate only one value of - * an array and you have a string that doesn't end with \0. - */ -int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset, - const char *name, int namelen, - uint32_t idx, const void *val, - int len); - -/** - * fdt_setprop_inplace - change a property's value, but not its size - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: pointer to data to replace the property value with - * @len: length of the property value - * - * fdt_setprop_inplace() replaces the value of a given property with - * the data in val, of length len. This function cannot change the - * size of a property, and so will only work if len is equal to the - * current length of the property. - * - * This function will alter only the bytes in the blob which contain - * the given property value, and will not alter or move any other part - * of the tree. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, if len is not equal to the property's current length - * -FDT_ERR_NOTFOUND, node does not have the named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name, - const void *val, int len); - -/** - * fdt_setprop_inplace_u32 - change the value of a 32-bit integer property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 32-bit integer value to replace the property with - * - * fdt_setprop_inplace_u32() replaces the value of a given property - * with the 32-bit integer value in val, converting val to big-endian - * if necessary. This function cannot change the size of a property, - * and so will only work if the property already exists and has length - * 4. - * - * This function will alter only the bytes in the blob which contain - * the given property value, and will not alter or move any other part - * of the tree. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, if the property's length is not equal to 4 - * -FDT_ERR_NOTFOUND, node does not have the named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_setprop_inplace_u32(void *fdt, int nodeoffset, - const char *name, uint32_t val) -{ - fdt32_t tmp =3D cpu_to_fdt32(val); - return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_setprop_inplace_u64 - change the value of a 64-bit integer property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 64-bit integer value to replace the property with - * - * fdt_setprop_inplace_u64() replaces the value of a given property - * with the 64-bit integer value in val, converting val to big-endian - * if necessary. This function cannot change the size of a property, - * and so will only work if the property already exists and has length - * 8. - * - * This function will alter only the bytes in the blob which contain - * the given property value, and will not alter or move any other part - * of the tree. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, if the property's length is not equal to 8 - * -FDT_ERR_NOTFOUND, node does not have the named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_setprop_inplace_u64(void *fdt, int nodeoffset, - const char *name, uint64_t val) -{ - fdt64_t tmp =3D cpu_to_fdt64(val); - return fdt_setprop_inplace(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_setprop_inplace_cell - change the value of a single-cell property - * - * This is an alternative name for fdt_setprop_inplace_u32() - */ -static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset, - const char *name, uint32_t val) -{ - return fdt_setprop_inplace_u32(fdt, nodeoffset, name, val); -} - -/** - * fdt_nop_property - replace a property with nop tags - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to nop - * @name: name of the property to nop - * - * fdt_nop_property() will replace a given property's representation - * in the blob with FDT_NOP tags, effectively removing it from the - * tree. - * - * This function will alter only the bytes in the blob which contain - * the property, and will not alter or move any other part of the - * tree. - * - * returns: - * 0, on success - * -FDT_ERR_NOTFOUND, node does not have the named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_nop_property(void *fdt, int nodeoffset, const char *name); - -/** - * fdt_nop_node - replace a node (subtree) with nop tags - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node to nop - * - * fdt_nop_node() will replace a given node's representation in the - * blob, including all its subnodes, if any, with FDT_NOP tags, - * effectively removing it from the tree. - * - * This function will alter only the bytes in the blob which contain - * the node and its properties and subnodes, and will not alter or - * move any other part of the tree. - * - * returns: - * 0, on success - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_nop_node(void *fdt, int nodeoffset); - -/**********************************************************************/ -/* Sequential write functions */ -/**********************************************************************/ - -int fdt_create(void *buf, int bufsize); -int fdt_resize(void *fdt, void *buf, int bufsize); -int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size); -int fdt_finish_reservemap(void *fdt); -int fdt_begin_node(void *fdt, const char *name); -int fdt_property(void *fdt, const char *name, const void *val, int len); -static inline int fdt_property_u32(void *fdt, const char *name, uint32_t v= al) -{ - fdt32_t tmp =3D cpu_to_fdt32(val); - return fdt_property(fdt, name, &tmp, sizeof(tmp)); -} -static inline int fdt_property_u64(void *fdt, const char *name, uint64_t v= al) -{ - fdt64_t tmp =3D cpu_to_fdt64(val); - return fdt_property(fdt, name, &tmp, sizeof(tmp)); -} -static inline int fdt_property_cell(void *fdt, const char *name, uint32_t = val) -{ - return fdt_property_u32(fdt, name, val); -} -#define fdt_property_string(fdt, name, str) \ - fdt_property(fdt, name, str, strlen(str)+1) -int fdt_end_node(void *fdt); -int fdt_finish(void *fdt); - -/**********************************************************************/ -/* Read-write functions */ -/**********************************************************************/ - -int fdt_create_empty_tree(void *buf, int bufsize); -int fdt_open_into(const void *fdt, void *buf, int bufsize); -int fdt_pack(void *fdt); - -/** - * fdt_add_mem_rsv - add one memory reserve map entry - * @fdt: pointer to the device tree blob - * @address, @size: 64-bit values (native endian) - * - * Adds a reserve map entry to the given blob reserving a region at - * address address of length size. - * - * This function will insert data into the reserve map and will - * therefore change the indexes of some entries in the table. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new reservation entry - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size); - -/** - * fdt_del_mem_rsv - remove a memory reserve map entry - * @fdt: pointer to the device tree blob - * @n: entry to remove - * - * fdt_del_mem_rsv() removes the n-th memory reserve map entry from - * the blob. - * - * This function will delete data from the reservation table and will - * therefore change the indexes of some entries in the table. - * - * returns: - * 0, on success - * -FDT_ERR_NOTFOUND, there is no entry of the given index (i.e. there - * are less than n+1 reserve map entries) - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_del_mem_rsv(void *fdt, int n); - -/** - * fdt_set_name - change the name of a given node - * @fdt: pointer to the device tree blob - * @nodeoffset: structure block offset of a node - * @name: name to give the node - * - * fdt_set_name() replaces the name (including unit address, if any) - * of the given node with the given string. NOTE: this function can't - * efficiently check if the new name is unique amongst the given - * node's siblings; results are undefined if this function is invoked - * with a name equal to one of the given node's siblings. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob - * to contain the new name - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, standard meanings - */ -int fdt_set_name(void *fdt, int nodeoffset, const char *name); - -/** - * fdt_setprop - create or change a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: pointer to data to set the property value to - * @len: length of the property value - * - * fdt_setprop() sets the value of the named property in the given - * node to the given value and length, creating the property if it - * does not already exist. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_setprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len); - -/** - * fdt_setprop_u32 - set a property to a 32-bit integer - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 32-bit integer value for the property (native endian) - * - * fdt_setprop_u32() sets the value of the named property in the given - * node to the given 32-bit integer value (converting to big-endian if - * necessary), or creates a new property with that value if it does - * not already exist. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_setprop_u32(void *fdt, int nodeoffset, const char *n= ame, - uint32_t val) -{ - fdt32_t tmp =3D cpu_to_fdt32(val); - return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_setprop_u64 - set a property to a 64-bit integer - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 64-bit integer value for the property (native endian) - * - * fdt_setprop_u64() sets the value of the named property in the given - * node to the given 64-bit integer value (converting to big-endian if - * necessary), or creates a new property with that value if it does - * not already exist. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_setprop_u64(void *fdt, int nodeoffset, const char *n= ame, - uint64_t val) -{ - fdt64_t tmp =3D cpu_to_fdt64(val); - return fdt_setprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_setprop_cell - set a property to a single cell value - * - * This is an alternative name for fdt_setprop_u32() - */ -static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *= name, - uint32_t val) -{ - return fdt_setprop_u32(fdt, nodeoffset, name, val); -} - -/** - * fdt_setprop_string - set a property to a string value - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @str: string value for the property - * - * fdt_setprop_string() sets the value of the named property in the - * given node to the given string value (using the length of the - * string to determine the new length of the property), or creates a - * new property with that value if it does not already exist. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -#define fdt_setprop_string(fdt, nodeoffset, name, str) \ - fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) - - -/** - * fdt_setprop_empty - set a property to an empty value - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * - * fdt_setprop_empty() sets the value of the named property in the - * given node to an empty (zero length) value, or creates a new empty - * property if it does not already exist. - * - * This function may insert or delete data from the blob, and will - * therefore change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -#define fdt_setprop_empty(fdt, nodeoffset, name) \ - fdt_setprop((fdt), (nodeoffset), (name), NULL, 0) - -/** - * fdt_appendprop - append to or create a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to append to - * @val: pointer to data to append to the property value - * @len: length of the data to append to the property value - * - * fdt_appendprop() appends the value to the named property in the - * given node, creating the property if it does not already exist. - * - * This function may insert data into the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_appendprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len); - -/** - * fdt_appendprop_u32 - append a 32-bit integer value to a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 32-bit integer value to append to the property (native endian) - * - * fdt_appendprop_u32() appends the given 32-bit integer value - * (converting to big-endian if necessary) to the value of the named - * property in the given node, or creates a new property with that - * value if it does not already exist. - * - * This function may insert data into the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_appendprop_u32(void *fdt, int nodeoffset, - const char *name, uint32_t val) -{ - fdt32_t tmp =3D cpu_to_fdt32(val); - return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_appendprop_u64 - append a 64-bit integer value to a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @val: 64-bit integer value to append to the property (native endian) - * - * fdt_appendprop_u64() appends the given 64-bit integer value - * (converting to big-endian if necessary) to the value of the named - * property in the given node, or creates a new property with that - * value if it does not already exist. - * - * This function may insert data into the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -static inline int fdt_appendprop_u64(void *fdt, int nodeoffset, - const char *name, uint64_t val) -{ - fdt64_t tmp =3D cpu_to_fdt64(val); - return fdt_appendprop(fdt, nodeoffset, name, &tmp, sizeof(tmp)); -} - -/** - * fdt_appendprop_cell - append a single cell value to a property - * - * This is an alternative name for fdt_appendprop_u32() - */ -static inline int fdt_appendprop_cell(void *fdt, int nodeoffset, - const char *name, uint32_t val) -{ - return fdt_appendprop_u32(fdt, nodeoffset, name, val); -} - -/** - * fdt_appendprop_string - append a string to a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to change - * @name: name of the property to change - * @str: string value to append to the property - * - * fdt_appendprop_string() appends the given string to the value of - * the named property in the given node, or creates a new property - * with that value if it does not already exist. - * - * This function may insert data into the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to - * contain the new property value - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_TRUNCATED, standard meanings - */ -#define fdt_appendprop_string(fdt, nodeoffset, name, str) \ - fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) - -/** - * fdt_delprop - delete a property - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node whose property to nop - * @name: name of the property to nop - * - * fdt_del_property() will delete the given property. - * - * This function will delete data from the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_NOTFOUND, node does not have the named property - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_delprop(void *fdt, int nodeoffset, const char *name); - -/** - * fdt_add_subnode_namelen - creates a new node based on substring - * @fdt: pointer to the device tree blob - * @parentoffset: structure block offset of a node - * @name: name of the subnode to locate - * @namelen: number of characters of name to consider - * - * Identical to fdt_add_subnode(), but use only the first namelen - * characters of name as the name of the new node. This is useful for - * creating subnodes based on a portion of a larger string, such as a - * full path. - */ -int fdt_add_subnode_namelen(void *fdt, int parentoffset, - const char *name, int namelen); - -/** - * fdt_add_subnode - creates a new node - * @fdt: pointer to the device tree blob - * @parentoffset: structure block offset of a node - * @name: name of the subnode to locate - * - * fdt_add_subnode() creates a new node as a subnode of the node at - * structure block offset parentoffset, with the given name (which - * should include the unit address, if any). - * - * This function will insert data into the blob, and will therefore - * change the offsets of some existing nodes. - - * returns: - * structure block offset of the created nodeequested subnode (>=3D0), on - * success - * -FDT_ERR_NOTFOUND, if the requested subnode does not exist - * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE - * tag - * -FDT_ERR_EXISTS, if the node at parentoffset already has a subnode of - * the given name - * -FDT_ERR_NOSPACE, if there is insufficient free space in the - * blob to contain the new node - * -FDT_ERR_NOSPACE - * -FDT_ERR_BADLAYOUT - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings. - */ -int fdt_add_subnode(void *fdt, int parentoffset, const char *name); - -/** - * fdt_del_node - delete a node (subtree) - * @fdt: pointer to the device tree blob - * @nodeoffset: offset of the node to nop - * - * fdt_del_node() will remove the given node, including all its - * subnodes if any, from the blob. - * - * This function will delete data from the blob, and will therefore - * change the offsets of some existing nodes. - * - * returns: - * 0, on success - * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_del_node(void *fdt, int nodeoffset); - -/** - * fdt_overlay_apply - Applies a DT overlay on a base DT - * @fdt: pointer to the base device tree blob - * @fdto: pointer to the device tree overlay blob - * - * fdt_overlay_apply() will apply the given device tree overlay on the - * given base device tree. - * - * Expect the base device tree to be modified, even if the function - * returns an error. - * - * returns: - * 0, on success - * -FDT_ERR_NOSPACE, there's not enough space in the base device tree - * -FDT_ERR_NOTFOUND, the overlay points to some inexistant nodes or - * properties in the base DT - * -FDT_ERR_BADPHANDLE, - * -FDT_ERR_BADOVERLAY, - * -FDT_ERR_NOPHANDLES, - * -FDT_ERR_INTERNAL, - * -FDT_ERR_BADLAYOUT, - * -FDT_ERR_BADMAGIC, - * -FDT_ERR_BADOFFSET, - * -FDT_ERR_BADPATH, - * -FDT_ERR_BADVERSION, - * -FDT_ERR_BADSTRUCTURE, - * -FDT_ERR_BADSTATE, - * -FDT_ERR_TRUNCATED, standard meanings - */ -int fdt_overlay_apply(void *fdt, void *fdto); - -/**********************************************************************/ -/* Debugging / informational functions */ -/**********************************************************************/ - -const char *fdt_strerror(int errval); - -#endif /* _LIBFDT_H */ diff --git a/scripts/dtc/libfdt/libfdt_env.h b/scripts/dtc/libfdt/libfdt_en= v.h deleted file mode 100644 index 99f936dacc..0000000000 --- a/scripts/dtc/libfdt/libfdt_env.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef _LIBFDT_ENV_H -#define _LIBFDT_ENV_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 - * 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 -#include -#include -#include - -#ifdef __CHECKER__ -#define __force __attribute__((force)) -#define __bitwise __attribute__((bitwise)) -#else -#define __force -#define __bitwise -#endif - -typedef uint16_t __bitwise fdt16_t; -typedef uint32_t __bitwise fdt32_t; -typedef uint64_t __bitwise fdt64_t; - -#define EXTRACT_BYTE(x, n) ((unsigned long long)((uint8_t *)&x)[n]) -#define CPU_TO_FDT16(x) ((EXTRACT_BYTE(x, 0) << 8) | EXTRACT_BYTE(x, 1)) -#define CPU_TO_FDT32(x) ((EXTRACT_BYTE(x, 0) << 24) | (EXTRACT_BYTE(x, 1) = << 16) | \ - (EXTRACT_BYTE(x, 2) << 8) | EXTRACT_BYTE(x, 3)) -#define CPU_TO_FDT64(x) ((EXTRACT_BYTE(x, 0) << 56) | (EXTRACT_BYTE(x, 1) = << 48) | \ - (EXTRACT_BYTE(x, 2) << 40) | (EXTRACT_BYTE(x, 3) << 32) | \ - (EXTRACT_BYTE(x, 4) << 24) | (EXTRACT_BYTE(x, 5) << 16) | \ - (EXTRACT_BYTE(x, 6) << 8) | EXTRACT_BYTE(x, 7)) - -static inline uint16_t fdt16_to_cpu(fdt16_t x) -{ - return (__force uint16_t)CPU_TO_FDT16(x); -} -static inline fdt16_t cpu_to_fdt16(uint16_t x) -{ - return (__force fdt16_t)CPU_TO_FDT16(x); -} - -static inline uint32_t fdt32_to_cpu(fdt32_t x) -{ - return (__force uint32_t)CPU_TO_FDT32(x); -} -static inline fdt32_t cpu_to_fdt32(uint32_t x) -{ - return (__force fdt32_t)CPU_TO_FDT32(x); -} - -static inline uint64_t fdt64_to_cpu(fdt64_t x) -{ - return (__force uint64_t)CPU_TO_FDT64(x); -} -static inline fdt64_t cpu_to_fdt64(uint64_t x) -{ - return (__force fdt64_t)CPU_TO_FDT64(x); -} -#undef CPU_TO_FDT64 -#undef CPU_TO_FDT32 -#undef CPU_TO_FDT16 -#undef EXTRACT_BYTE - -#endif /* _LIBFDT_ENV_H */ diff --git a/scripts/dtc/libfdt/libfdt_internal.h b/scripts/dtc/libfdt/libf= dt_internal.h deleted file mode 100644 index 02cfa6fb61..0000000000 --- a/scripts/dtc/libfdt/libfdt_internal.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef _LIBFDT_INTERNAL_H -#define _LIBFDT_INTERNAL_H -/* - * 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,@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 - -#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) -#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) - -#define FDT_CHECK_HEADER(fdt) \ - { \ - int __err; \ - if ((__err =3D fdt_check_header(fdt)) !=3D 0) \ - return __err; \ - } - -int _fdt_check_node_offset(const void *fdt, int offset); -int _fdt_check_prop_offset(const void *fdt, int offset); -const char *_fdt_find_string(const char *strtab, int tabsize, const char *= s); -int _fdt_node_end_offset(void *fdt, int nodeoffset); - -static inline const void *_fdt_offset_ptr(const void *fdt, int offset) -{ - return (const char *)fdt + fdt_off_dt_struct(fdt) + offset; -} - -static inline void *_fdt_offset_ptr_w(void *fdt, int offset) -{ - return (void *)(uintptr_t)_fdt_offset_ptr(fdt, offset); -} - -static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt= , int n) -{ - const struct fdt_reserve_entry *rsv_table =3D - (const struct fdt_reserve_entry *) - ((const char *)fdt + fdt_off_mem_rsvmap(fdt)); - - return rsv_table + n; -} -static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n) -{ - return (void *)(uintptr_t)_fdt_mem_rsv(fdt, n); -} - -#define FDT_SW_MAGIC (~FDT_MAGIC) - -#endif /* _LIBFDT_INTERNAL_H */ diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c deleted file mode 100644 index 36be9afefd..0000000000 --- a/scripts/dtc/livetree.c +++ /dev/null @@ -1,980 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" - -/* - * Tree building functions - */ - -void add_label(struct label **labels, char *label) -{ - struct label *new; - - /* Make sure the label isn't already there */ - for_each_label_withdel(*labels, new) - if (streq(new->label, label)) { - new->deleted =3D 0; - return; - } - - new =3D xmalloc(sizeof(*new)); - memset(new, 0, sizeof(*new)); - new->label =3D label; - new->next =3D *labels; - *labels =3D new; -} - -void delete_labels(struct label **labels) -{ - struct label *label; - - for_each_label(*labels, label) - label->deleted =3D 1; -} - -struct property *build_property(char *name, struct data val) -{ - struct property *new =3D xmalloc(sizeof(*new)); - - memset(new, 0, sizeof(*new)); - - new->name =3D name; - new->val =3D val; - - return new; -} - -struct property *build_property_delete(char *name) -{ - struct property *new =3D xmalloc(sizeof(*new)); - - memset(new, 0, sizeof(*new)); - - new->name =3D name; - new->deleted =3D 1; - - return new; -} - -struct property *chain_property(struct property *first, struct property *l= ist) -{ - assert(first->next =3D=3D NULL); - - first->next =3D list; - return first; -} - -struct property *reverse_properties(struct property *first) -{ - struct property *p =3D first; - struct property *head =3D NULL; - struct property *next; - - while (p) { - next =3D p->next; - p->next =3D head; - head =3D p; - p =3D next; - } - return head; -} - -struct node *build_node(struct property *proplist, struct node *children) -{ - struct node *new =3D xmalloc(sizeof(*new)); - struct node *child; - - memset(new, 0, sizeof(*new)); - - new->proplist =3D reverse_properties(proplist); - new->children =3D children; - - for_each_child(new, child) { - child->parent =3D new; - } - - return new; -} - -struct node *build_node_delete(void) -{ - struct node *new =3D xmalloc(sizeof(*new)); - - memset(new, 0, sizeof(*new)); - - new->deleted =3D 1; - - return new; -} - -struct node *name_node(struct node *node, char *name) -{ - assert(node->name =3D=3D NULL); - - node->name =3D name; - - return node; -} - -struct node *merge_nodes(struct node *old_node, struct node *new_node) -{ - struct property *new_prop, *old_prop; - struct node *new_child, *old_child; - struct label *l; - - old_node->deleted =3D 0; - - /* Add new node labels to old node */ - for_each_label_withdel(new_node->labels, l) - add_label(&old_node->labels, l->label); - - /* Move properties from the new node to the old node. If there - * is a collision, replace the old value with the new */ - while (new_node->proplist) { - /* Pop the property off the list */ - new_prop =3D new_node->proplist; - new_node->proplist =3D new_prop->next; - new_prop->next =3D NULL; - - if (new_prop->deleted) { - delete_property_by_name(old_node, new_prop->name); - free(new_prop); - continue; - } - - /* Look for a collision, set new value if there is */ - for_each_property_withdel(old_node, old_prop) { - if (streq(old_prop->name, new_prop->name)) { - /* Add new labels to old property */ - for_each_label_withdel(new_prop->labels, l) - add_label(&old_prop->labels, l->label); - - old_prop->val =3D new_prop->val; - old_prop->deleted =3D 0; - free(new_prop); - new_prop =3D NULL; - break; - } - } - - /* if no collision occurred, add property to the old node. */ - if (new_prop) - add_property(old_node, new_prop); - } - - /* Move the override child nodes into the primary node. If - * there is a collision, then merge the nodes. */ - while (new_node->children) { - /* Pop the child node off the list */ - new_child =3D new_node->children; - new_node->children =3D new_child->next_sibling; - new_child->parent =3D NULL; - new_child->next_sibling =3D NULL; - - if (new_child->deleted) { - delete_node_by_name(old_node, new_child->name); - free(new_child); - continue; - } - - /* Search for a collision. Merge if there is */ - for_each_child_withdel(old_node, old_child) { - if (streq(old_child->name, new_child->name)) { - merge_nodes(old_child, new_child); - new_child =3D NULL; - break; - } - } - - /* if no collision occurred, add child to the old node. */ - if (new_child) - add_child(old_node, new_child); - } - - /* The new node contents are now merged into the old node. Free - * the new node. */ - free(new_node); - - return old_node; -} - -struct node *chain_node(struct node *first, struct node *list) -{ - assert(first->next_sibling =3D=3D NULL); - - first->next_sibling =3D list; - return first; -} - -void add_property(struct node *node, struct property *prop) -{ - struct property **p; - - prop->next =3D NULL; - - p =3D &node->proplist; - while (*p) - p =3D &((*p)->next); - - *p =3D prop; -} - -void delete_property_by_name(struct node *node, char *name) -{ - struct property *prop =3D node->proplist; - - while (prop) { - if (streq(prop->name, name)) { - delete_property(prop); - return; - } - prop =3D prop->next; - } -} - -void delete_property(struct property *prop) -{ - prop->deleted =3D 1; - delete_labels(&prop->labels); -} - -void add_child(struct node *parent, struct node *child) -{ - struct node **p; - - child->next_sibling =3D NULL; - child->parent =3D parent; - - p =3D &parent->children; - while (*p) - p =3D &((*p)->next_sibling); - - *p =3D child; -} - -void delete_node_by_name(struct node *parent, char *name) -{ - struct node *node =3D parent->children; - - while (node) { - if (streq(node->name, name)) { - delete_node(node); - return; - } - node =3D node->next_sibling; - } -} - -void delete_node(struct node *node) -{ - struct property *prop; - struct node *child; - - node->deleted =3D 1; - for_each_child(node, child) - delete_node(child); - for_each_property(node, prop) - delete_property(prop); - delete_labels(&node->labels); -} - -void append_to_property(struct node *node, - char *name, const void *data, int len) -{ - struct data d; - struct property *p; - - p =3D get_property(node, name); - if (p) { - d =3D data_append_data(p->val, data, len); - p->val =3D d; - } else { - d =3D data_append_data(empty_data, data, len); - p =3D build_property(name, d); - add_property(node, p); - } -} - -struct reserve_info *build_reserve_entry(uint64_t address, uint64_t size) -{ - struct reserve_info *new =3D xmalloc(sizeof(*new)); - - memset(new, 0, sizeof(*new)); - - new->re.address =3D address; - new->re.size =3D size; - - return new; -} - -struct reserve_info *chain_reserve_entry(struct reserve_info *first, - struct reserve_info *list) -{ - assert(first->next =3D=3D NULL); - - first->next =3D list; - return first; -} - -struct reserve_info *add_reserve_entry(struct reserve_info *list, - struct reserve_info *new) -{ - struct reserve_info *last; - - new->next =3D NULL; - - if (! list) - return new; - - for (last =3D list; last->next; last =3D last->next) - ; - - last->next =3D new; - - return list; -} - -struct dt_info *build_dt_info(unsigned int dtsflags, - struct reserve_info *reservelist, - struct node *tree, uint32_t boot_cpuid_phys) -{ - struct dt_info *dti; - - dti =3D xmalloc(sizeof(*dti)); - dti->dtsflags =3D dtsflags; - dti->reservelist =3D reservelist; - dti->dt =3D tree; - dti->boot_cpuid_phys =3D boot_cpuid_phys; - - return dti; -} - -/* - * Tree accessor functions - */ - -const char *get_unitname(struct node *node) -{ - if (node->name[node->basenamelen] =3D=3D '\0') - return ""; - else - return node->name + node->basenamelen + 1; -} - -struct property *get_property(struct node *node, const char *propname) -{ - struct property *prop; - - for_each_property(node, prop) - if (streq(prop->name, propname)) - return prop; - - return NULL; -} - -cell_t propval_cell(struct property *prop) -{ - assert(prop->val.len =3D=3D sizeof(cell_t)); - return fdt32_to_cpu(*((cell_t *)prop->val.val)); -} - -struct property *get_property_by_label(struct node *tree, const char *labe= l, - struct node **node) -{ - struct property *prop; - struct node *c; - - *node =3D tree; - - for_each_property(tree, prop) { - struct label *l; - - for_each_label(prop->labels, l) - if (streq(l->label, label)) - return prop; - } - - for_each_child(tree, c) { - prop =3D get_property_by_label(c, label, node); - if (prop) - return prop; - } - - *node =3D NULL; - return NULL; -} - -struct marker *get_marker_label(struct node *tree, const char *label, - struct node **node, struct property **prop) -{ - struct marker *m; - struct property *p; - struct node *c; - - *node =3D tree; - - for_each_property(tree, p) { - *prop =3D p; - m =3D p->val.markers; - for_each_marker_of_type(m, LABEL) - if (streq(m->ref, label)) - return m; - } - - for_each_child(tree, c) { - m =3D get_marker_label(c, label, node, prop); - if (m) - return m; - } - - *prop =3D NULL; - *node =3D NULL; - return NULL; -} - -struct node *get_subnode(struct node *node, const char *nodename) -{ - struct node *child; - - for_each_child(node, child) - if (streq(child->name, nodename)) - return child; - - return NULL; -} - -struct node *get_node_by_path(struct node *tree, const char *path) -{ - const char *p; - struct node *child; - - if (!path || ! (*path)) { - if (tree->deleted) - return NULL; - return tree; - } - - while (path[0] =3D=3D '/') - path++; - - p =3D strchr(path, '/'); - - for_each_child(tree, child) { - if (p && strneq(path, child->name, p-path)) - return get_node_by_path(child, p+1); - else if (!p && streq(path, child->name)) - return child; - } - - return NULL; -} - -struct node *get_node_by_label(struct node *tree, const char *label) -{ - struct node *child, *node; - struct label *l; - - assert(label && (strlen(label) > 0)); - - for_each_label(tree->labels, l) - if (streq(l->label, label)) - return tree; - - for_each_child(tree, child) { - node =3D get_node_by_label(child, label); - if (node) - return node; - } - - return NULL; -} - -struct node *get_node_by_phandle(struct node *tree, cell_t phandle) -{ - struct node *child, *node; - - assert((phandle !=3D 0) && (phandle !=3D -1)); - - if (tree->phandle =3D=3D phandle) { - if (tree->deleted) - return NULL; - return tree; - } - - for_each_child(tree, child) { - node =3D get_node_by_phandle(child, phandle); - if (node) - return node; - } - - return NULL; -} - -struct node *get_node_by_ref(struct node *tree, const char *ref) -{ - if (streq(ref, "/")) - return tree; - else if (ref[0] =3D=3D '/') - return get_node_by_path(tree, ref); - else - return get_node_by_label(tree, ref); -} - -cell_t get_node_phandle(struct node *root, struct node *node) -{ - static cell_t phandle =3D 1; /* FIXME: ick, static local */ - - if ((node->phandle !=3D 0) && (node->phandle !=3D -1)) - return node->phandle; - - while (get_node_by_phandle(root, phandle)) - phandle++; - - node->phandle =3D phandle; - - if (!get_property(node, "linux,phandle") - && (phandle_format & PHANDLE_LEGACY)) - add_property(node, - build_property("linux,phandle", - data_append_cell(empty_data, phandle))); - - if (!get_property(node, "phandle") - && (phandle_format & PHANDLE_EPAPR)) - add_property(node, - build_property("phandle", - data_append_cell(empty_data, phandle))); - - /* If the node *does* have a phandle property, we must - * be dealing with a self-referencing phandle, which will be - * fixed up momentarily in the caller */ - - return node->phandle; -} - -uint32_t guess_boot_cpuid(struct node *tree) -{ - struct node *cpus, *bootcpu; - struct property *reg; - - cpus =3D get_node_by_path(tree, "/cpus"); - if (!cpus) - return 0; - - - bootcpu =3D cpus->children; - if (!bootcpu) - return 0; - - reg =3D get_property(bootcpu, "reg"); - if (!reg || (reg->val.len !=3D sizeof(uint32_t))) - return 0; - - /* FIXME: Sanity check node? */ - - return propval_cell(reg); -} - -static int cmp_reserve_info(const void *ax, const void *bx) -{ - const struct reserve_info *a, *b; - - a =3D *((const struct reserve_info * const *)ax); - b =3D *((const struct reserve_info * const *)bx); - - if (a->re.address < b->re.address) - return -1; - else if (a->re.address > b->re.address) - return 1; - else if (a->re.size < b->re.size) - return -1; - else if (a->re.size > b->re.size) - return 1; - else - return 0; -} - -static void sort_reserve_entries(struct dt_info *dti) -{ - struct reserve_info *ri, **tbl; - int n =3D 0, i =3D 0; - - for (ri =3D dti->reservelist; - ri; - ri =3D ri->next) - n++; - - if (n =3D=3D 0) - return; - - tbl =3D xmalloc(n * sizeof(*tbl)); - - for (ri =3D dti->reservelist; - ri; - ri =3D ri->next) - tbl[i++] =3D ri; - - qsort(tbl, n, sizeof(*tbl), cmp_reserve_info); - - dti->reservelist =3D tbl[0]; - for (i =3D 0; i < (n-1); i++) - tbl[i]->next =3D tbl[i+1]; - tbl[n-1]->next =3D NULL; - - free(tbl); -} - -static int cmp_prop(const void *ax, const void *bx) -{ - const struct property *a, *b; - - a =3D *((const struct property * const *)ax); - b =3D *((const struct property * const *)bx); - - return strcmp(a->name, b->name); -} - -static void sort_properties(struct node *node) -{ - int n =3D 0, i =3D 0; - struct property *prop, **tbl; - - for_each_property_withdel(node, prop) - n++; - - if (n =3D=3D 0) - return; - - tbl =3D xmalloc(n * sizeof(*tbl)); - - for_each_property_withdel(node, prop) - tbl[i++] =3D prop; - - qsort(tbl, n, sizeof(*tbl), cmp_prop); - - node->proplist =3D tbl[0]; - for (i =3D 0; i < (n-1); i++) - tbl[i]->next =3D tbl[i+1]; - tbl[n-1]->next =3D NULL; - - free(tbl); -} - -static int cmp_subnode(const void *ax, const void *bx) -{ - const struct node *a, *b; - - a =3D *((const struct node * const *)ax); - b =3D *((const struct node * const *)bx); - - return strcmp(a->name, b->name); -} - -static void sort_subnodes(struct node *node) -{ - int n =3D 0, i =3D 0; - struct node *subnode, **tbl; - - for_each_child_withdel(node, subnode) - n++; - - if (n =3D=3D 0) - return; - - tbl =3D xmalloc(n * sizeof(*tbl)); - - for_each_child_withdel(node, subnode) - tbl[i++] =3D subnode; - - qsort(tbl, n, sizeof(*tbl), cmp_subnode); - - node->children =3D tbl[0]; - for (i =3D 0; i < (n-1); i++) - tbl[i]->next_sibling =3D tbl[i+1]; - tbl[n-1]->next_sibling =3D NULL; - - free(tbl); -} - -static void sort_node(struct node *node) -{ - struct node *c; - - sort_properties(node); - sort_subnodes(node); - for_each_child_withdel(node, c) - sort_node(c); -} - -void sort_tree(struct dt_info *dti) -{ - sort_reserve_entries(dti); - sort_node(dti->dt); -} - -/* utility helper to avoid code duplication */ -static struct node *build_and_name_child_node(struct node *parent, char *n= ame) -{ - struct node *node; - - node =3D build_node(NULL, NULL); - name_node(node, xstrdup(name)); - add_child(parent, node); - - return node; -} - -static struct node *build_root_node(struct node *dt, char *name) -{ - struct node *an; - - an =3D get_subnode(dt, name); - if (!an) - an =3D build_and_name_child_node(dt, name); - - if (!an) - die("Could not build root node /%s\n", name); - - return an; -} - -static bool any_label_tree(struct dt_info *dti, struct node *node) -{ - struct node *c; - - if (node->labels) - return true; - - for_each_child(node, c) - if (any_label_tree(dti, c)) - return true; - - return false; -} - -static void generate_label_tree_internal(struct dt_info *dti, - struct node *an, struct node *node, - bool allocph) -{ - struct node *dt =3D dti->dt; - struct node *c; - struct property *p; - struct label *l; - - /* if there are labels */ - if (node->labels) { - - /* now add the label in the node */ - for_each_label(node->labels, l) { - - /* check whether the label already exists */ - p =3D get_property(an, l->label); - if (p) { - fprintf(stderr, "WARNING: label %s already" - " exists in /%s", l->label, - an->name); - continue; - } - - /* insert it */ - p =3D build_property(l->label, - data_copy_mem(node->fullpath, - strlen(node->fullpath) + 1)); - add_property(an, p); - } - - /* force allocation of a phandle for this node */ - if (allocph) - (void)get_node_phandle(dt, node); - } - - for_each_child(node, c) - generate_label_tree_internal(dti, an, c, allocph); -} - -static bool any_fixup_tree(struct dt_info *dti, struct node *node) -{ - struct node *c; - struct property *prop; - struct marker *m; - - for_each_property(node, prop) { - m =3D prop->val.markers; - for_each_marker_of_type(m, REF_PHANDLE) { - if (!get_node_by_ref(dti->dt, m->ref)) - return true; - } - } - - for_each_child(node, c) { - if (any_fixup_tree(dti, c)) - return true; - } - - return false; -} - -static void add_fixup_entry(struct dt_info *dti, struct node *fn, - struct node *node, struct property *prop, - struct marker *m) -{ - char *entry; - - /* m->ref can only be a REF_PHANDLE, but check anyway */ - assert(m->type =3D=3D REF_PHANDLE); - - /* there shouldn't be any ':' in the arguments */ - if (strchr(node->fullpath, ':') || strchr(prop->name, ':')) - die("arguments should not contain ':'\n"); - - xasprintf(&entry, "%s:%s:%u", - node->fullpath, prop->name, m->offset); - append_to_property(fn, m->ref, entry, strlen(entry) + 1); - - free(entry); -} - -static void generate_fixups_tree_internal(struct dt_info *dti, - struct node *fn, - struct node *node) -{ - struct node *dt =3D dti->dt; - struct node *c; - struct property *prop; - struct marker *m; - struct node *refnode; - - for_each_property(node, prop) { - m =3D prop->val.markers; - for_each_marker_of_type(m, REF_PHANDLE) { - refnode =3D get_node_by_ref(dt, m->ref); - if (!refnode) - add_fixup_entry(dti, fn, node, prop, m); - } - } - - for_each_child(node, c) - generate_fixups_tree_internal(dti, fn, c); -} - -static bool any_local_fixup_tree(struct dt_info *dti, struct node *node) -{ - struct node *c; - struct property *prop; - struct marker *m; - - for_each_property(node, prop) { - m =3D prop->val.markers; - for_each_marker_of_type(m, REF_PHANDLE) { - if (get_node_by_ref(dti->dt, m->ref)) - return true; - } - } - - for_each_child(node, c) { - if (any_local_fixup_tree(dti, c)) - return true; - } - - return false; -} - -static void add_local_fixup_entry(struct dt_info *dti, - struct node *lfn, struct node *node, - struct property *prop, struct marker *m, - struct node *refnode) -{ - struct node *wn, *nwn; /* local fixup node, walk node, new */ - uint32_t value_32; - char **compp; - int i, depth; - - /* walk back retreiving depth */ - depth =3D 0; - for (wn =3D node; wn; wn =3D wn->parent) - depth++; - - /* allocate name array */ - compp =3D xmalloc(sizeof(*compp) * depth); - - /* store names in the array */ - for (wn =3D node, i =3D depth - 1; wn; wn =3D wn->parent, i--) - compp[i] =3D wn->name; - - /* walk the path components creating nodes if they don't exist */ - for (wn =3D lfn, i =3D 1; i < depth; i++, wn =3D nwn) { - /* if no node exists, create it */ - nwn =3D get_subnode(wn, compp[i]); - if (!nwn) - nwn =3D build_and_name_child_node(wn, compp[i]); - } - - free(compp); - - value_32 =3D cpu_to_fdt32(m->offset); - append_to_property(wn, prop->name, &value_32, sizeof(value_32)); -} - -static void generate_local_fixups_tree_internal(struct dt_info *dti, - struct node *lfn, - struct node *node) -{ - struct node *dt =3D dti->dt; - struct node *c; - struct property *prop; - struct marker *m; - struct node *refnode; - - for_each_property(node, prop) { - m =3D prop->val.markers; - for_each_marker_of_type(m, REF_PHANDLE) { - refnode =3D get_node_by_ref(dt, m->ref); - if (refnode) - add_local_fixup_entry(dti, lfn, node, prop, m, refnode); - } - } - - for_each_child(node, c) - generate_local_fixups_tree_internal(dti, lfn, c); -} - -void generate_label_tree(struct dt_info *dti, char *name, bool allocph) -{ - if (!any_label_tree(dti, dti->dt)) - return; - generate_label_tree_internal(dti, build_root_node(dti->dt, name), - dti->dt, allocph); -} - -void generate_fixups_tree(struct dt_info *dti, char *name) -{ - if (!any_fixup_tree(dti, dti->dt)) - return; - generate_fixups_tree_internal(dti, build_root_node(dti->dt, name), - dti->dt); -} - -void generate_local_fixups_tree(struct dt_info *dti, char *name) -{ - if (!any_local_fixup_tree(dti, dti->dt)) - return; - generate_local_fixups_tree_internal(dti, build_root_node(dti->dt, name), - dti->dt); -} diff --git a/scripts/dtc/srcpos.c b/scripts/dtc/srcpos.c deleted file mode 100644 index 9d38459902..0000000000 --- a/scripts/dtc/srcpos.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#define _GNU_SOURCE - -#include - -#include "dtc.h" -#include "srcpos.h" - -/* A node in our list of directories to search for source/include files */ -struct search_path { - struct search_path *next; /* next node in list, NULL for end */ - const char *dirname; /* name of directory to search */ -}; - -/* This is the list of directories that we search for source files */ -static struct search_path *search_path_head, **search_path_tail; - - -static char *get_dirname(const char *path) -{ - const char *slash =3D strrchr(path, '/'); - - if (slash) { - int len =3D slash - path; - char *dir =3D xmalloc(len + 1); - - memcpy(dir, path, len); - dir[len] =3D '\0'; - return dir; - } - return NULL; -} - -FILE *depfile; /* =3D NULL */ -struct srcfile_state *current_srcfile; /* =3D NULL */ - -/* Detect infinite include recursion. */ -#define MAX_SRCFILE_DEPTH (100) -static int srcfile_depth; /* =3D 0 */ - - -/** - * Try to open a file in a given directory. - * - * If the filename is an absolute path, then dirname is ignored. If it is a - * relative path, then we look in that directory for the file. - * - * @param dirname Directory to look in, or NULL for none - * @param fname Filename to look for - * @param fp Set to NULL if file did not open - * @return allocated filename on success (caller must free), NULL on failu= re - */ -static char *try_open(const char *dirname, const char *fname, FILE **fp) -{ - char *fullname; - - if (!dirname || fname[0] =3D=3D '/') - fullname =3D xstrdup(fname); - else - fullname =3D join_path(dirname, fname); - - *fp =3D fopen(fullname, "rb"); - if (!*fp) { - free(fullname); - fullname =3D NULL; - } - - return fullname; -} - -/** - * Open a file for read access - * - * If it is a relative filename, we search the full search path for it. - * - * @param fname Filename to open - * @param fp Returns pointer to opened FILE, or NULL on failure - * @return pointer to allocated filename, which caller must free - */ -static char *fopen_any_on_path(const char *fname, FILE **fp) -{ - const char *cur_dir =3D NULL; - struct search_path *node; - char *fullname; - - /* Try current directory first */ - assert(fp); - if (current_srcfile) - cur_dir =3D current_srcfile->dir; - fullname =3D try_open(cur_dir, fname, fp); - - /* Failing that, try each search path in turn */ - for (node =3D search_path_head; !*fp && node; node =3D node->next) - fullname =3D try_open(node->dirname, fname, fp); - - return fullname; -} - -FILE *srcfile_relative_open(const char *fname, char **fullnamep) -{ - FILE *f; - char *fullname; - - if (streq(fname, "-")) { - f =3D stdin; - fullname =3D xstrdup(""); - } else { - fullname =3D fopen_any_on_path(fname, &f); - if (!f) - die("Couldn't open \"%s\": %s\n", fname, - strerror(errno)); - } - - if (depfile) - fprintf(depfile, " %s", fullname); - - if (fullnamep) - *fullnamep =3D fullname; - else - free(fullname); - - return f; -} - -void srcfile_push(const char *fname) -{ - struct srcfile_state *srcfile; - - if (srcfile_depth++ >=3D MAX_SRCFILE_DEPTH) - die("Includes nested too deeply"); - - srcfile =3D xmalloc(sizeof(*srcfile)); - - srcfile->f =3D srcfile_relative_open(fname, &srcfile->name); - srcfile->dir =3D get_dirname(srcfile->name); - srcfile->prev =3D current_srcfile; - - srcfile->lineno =3D 1; - srcfile->colno =3D 1; - - current_srcfile =3D srcfile; -} - -bool srcfile_pop(void) -{ - struct srcfile_state *srcfile =3D current_srcfile; - - assert(srcfile); - - current_srcfile =3D srcfile->prev; - - if (fclose(srcfile->f)) - die("Error closing \"%s\": %s\n", srcfile->name, - strerror(errno)); - - /* FIXME: We allow the srcfile_state structure to leak, - * because it could still be referenced from a location - * variable being carried through the parser somewhere. To - * fix this we could either allocate all the files from a - * table, or use a pool allocator. */ - - return current_srcfile ? true : false; -} - -void srcfile_add_search_path(const char *dirname) -{ - struct search_path *node; - - /* Create the node */ - node =3D xmalloc(sizeof(*node)); - node->next =3D NULL; - node->dirname =3D xstrdup(dirname); - - /* Add to the end of our list */ - if (search_path_tail) - *search_path_tail =3D node; - else - search_path_head =3D node; - search_path_tail =3D &node->next; -} - -/* - * The empty source position. - */ - -struct srcpos srcpos_empty =3D { - .first_line =3D 0, - .first_column =3D 0, - .last_line =3D 0, - .last_column =3D 0, - .file =3D NULL, -}; - -#define TAB_SIZE 8 - -void srcpos_update(struct srcpos *pos, const char *text, int len) -{ - int i; - - pos->file =3D current_srcfile; - - pos->first_line =3D current_srcfile->lineno; - pos->first_column =3D current_srcfile->colno; - - for (i =3D 0; i < len; i++) - if (text[i] =3D=3D '\n') { - current_srcfile->lineno++; - current_srcfile->colno =3D 1; - } else if (text[i] =3D=3D '\t') { - current_srcfile->colno =3D - ALIGN(current_srcfile->colno, TAB_SIZE); - } else { - current_srcfile->colno++; - } - - pos->last_line =3D current_srcfile->lineno; - pos->last_column =3D current_srcfile->colno; -} - -struct srcpos * -srcpos_copy(struct srcpos *pos) -{ - struct srcpos *pos_new; - - pos_new =3D xmalloc(sizeof(struct srcpos)); - memcpy(pos_new, pos, sizeof(struct srcpos)); - - return pos_new; -} - -char * -srcpos_string(struct srcpos *pos) -{ - const char *fname =3D ""; - char *pos_str; - - if (pos->file && pos->file->name) - fname =3D pos->file->name; - - - if (pos->first_line !=3D pos->last_line) - xasprintf(&pos_str, "%s:%d.%d-%d.%d", fname, - pos->first_line, pos->first_column, - pos->last_line, pos->last_column); - else if (pos->first_column !=3D pos->last_column) - xasprintf(&pos_str, "%s:%d.%d-%d", fname, - pos->first_line, pos->first_column, - pos->last_column); - else - xasprintf(&pos_str, "%s:%d.%d", fname, - pos->first_line, pos->first_column); - - return pos_str; -} - -void srcpos_verror(struct srcpos *pos, const char *prefix, - const char *fmt, va_list va) -{ - char *srcstr; - - srcstr =3D srcpos_string(pos); - - fprintf(stderr, "%s: %s ", prefix, srcstr); - vfprintf(stderr, fmt, va); - fprintf(stderr, "\n"); - - free(srcstr); -} - -void srcpos_error(struct srcpos *pos, const char *prefix, - const char *fmt, ...) -{ - va_list va; - - va_start(va, fmt); - srcpos_verror(pos, prefix, fmt, va); - va_end(va); -} - -void srcpos_set_line(char *f, int l) -{ - current_srcfile->name =3D f; - current_srcfile->lineno =3D l; -} diff --git a/scripts/dtc/srcpos.h b/scripts/dtc/srcpos.h deleted file mode 100644 index 2cdfcd82e9..0000000000 --- a/scripts/dtc/srcpos.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _SRCPOS_H_ -#define _SRCPOS_H_ - -#include -#include - -struct srcfile_state { - FILE *f; - char *name; - char *dir; - int lineno, colno; - struct srcfile_state *prev; -}; - -extern FILE *depfile; /* =3D NULL */ -extern struct srcfile_state *current_srcfile; /* =3D NULL */ - -/** - * Open a source file. - * - * If the source file is a relative pathname, then it is searched for in t= he - * current directory (the directory of the last source file read) and after - * that in the search path. - * - * We work through the search path in order from the first path specified = to - * the last. - * - * If the file is not found, then this function does not return, but calls - * die(). - * - * @param fname Filename to search - * @param fullnamep If non-NULL, it is set to the allocated filename of the - * file that was opened. The caller is then responsible - * for freeing the pointer. - * @return pointer to opened FILE - */ -FILE *srcfile_relative_open(const char *fname, char **fullnamep); - -void srcfile_push(const char *fname); -bool srcfile_pop(void); - -/** - * Add a new directory to the search path for input files - * - * The new path is added at the end of the list. - * - * @param dirname Directory to add - */ -void srcfile_add_search_path(const char *dirname); - -struct srcpos { - int first_line; - int first_column; - int last_line; - int last_column; - struct srcfile_state *file; -}; - -#define YYLTYPE struct srcpos - -#define YYLLOC_DEFAULT(Current, Rhs, N) \ - do { \ - if (N) { \ - (Current).first_line =3D YYRHSLOC(Rhs, 1).first_line; \ - (Current).first_column =3D YYRHSLOC(Rhs, 1).first_column; \ - (Current).last_line =3D YYRHSLOC(Rhs, N).last_line; \ - (Current).last_column =3D YYRHSLOC (Rhs, N).last_column; \ - (Current).file =3D YYRHSLOC(Rhs, N).file; \ - } else { \ - (Current).first_line =3D (Current).last_line =3D \ - YYRHSLOC(Rhs, 0).last_line; \ - (Current).first_column =3D (Current).last_column =3D \ - YYRHSLOC(Rhs, 0).last_column; \ - (Current).file =3D YYRHSLOC (Rhs, 0).file; \ - } \ - } while (0) - - -/* - * Fictional source position used for IR nodes that are - * created without otherwise knowing a true source position. - * For example,constant definitions from the command line. - */ -extern struct srcpos srcpos_empty; - -extern void srcpos_update(struct srcpos *pos, const char *text, int len); -extern struct srcpos *srcpos_copy(struct srcpos *pos); -extern char *srcpos_string(struct srcpos *pos); - -extern void srcpos_verror(struct srcpos *pos, const char *prefix, - const char *fmt, va_list va) - __attribute__((format(printf, 3, 0))); -extern void srcpos_error(struct srcpos *pos, const char *prefix, - const char *fmt, ...) - __attribute__((format(printf, 3, 4))); - -extern void srcpos_set_line(char *f, int l); - -#endif /* _SRCPOS_H_ */ diff --git a/scripts/dtc/treesource.c b/scripts/dtc/treesource.c deleted file mode 100644 index c9d8967969..0000000000 --- a/scripts/dtc/treesource.c +++ /dev/null @@ -1,284 +0,0 @@ -/* - * (C) Copyright David Gibson , IBM Corporation. 2005. - * - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include "dtc.h" -#include "srcpos.h" - -extern FILE *yyin; -extern int yyparse(void); -extern YYLTYPE yylloc; - -struct dt_info *parser_output; -bool treesource_error; - -struct dt_info *dt_from_source(const char *fname) -{ - parser_output =3D NULL; - treesource_error =3D false; - - srcfile_push(fname); - yyin =3D current_srcfile->f; - yylloc.file =3D current_srcfile; - - if (yyparse() !=3D 0) - die("Unable to parse input tree\n"); - - if (treesource_error) - die("Syntax error parsing input tree\n"); - - return parser_output; -} - -static void write_prefix(FILE *f, int level) -{ - int i; - - for (i =3D 0; i < level; i++) - fputc('\t', f); -} - -static bool isstring(char c) -{ - return (isprint((unsigned char)c) - || (c =3D=3D '\0') - || strchr("\a\b\t\n\v\f\r", c)); -} - -static void write_propval_string(FILE *f, struct data val) -{ - const char *str =3D val.val; - int i; - struct marker *m =3D val.markers; - - assert(str[val.len-1] =3D=3D '\0'); - - while (m && (m->offset =3D=3D 0)) { - if (m->type =3D=3D LABEL) - fprintf(f, "%s: ", m->ref); - m =3D m->next; - } - fprintf(f, "\""); - - for (i =3D 0; i < (val.len-1); i++) { - char c =3D str[i]; - - switch (c) { - case '\a': - fprintf(f, "\\a"); - break; - case '\b': - fprintf(f, "\\b"); - break; - case '\t': - fprintf(f, "\\t"); - break; - case '\n': - fprintf(f, "\\n"); - break; - case '\v': - fprintf(f, "\\v"); - break; - case '\f': - fprintf(f, "\\f"); - break; - case '\r': - fprintf(f, "\\r"); - break; - case '\\': - fprintf(f, "\\\\"); - break; - case '\"': - fprintf(f, "\\\""); - break; - case '\0': - fprintf(f, "\", "); - while (m && (m->offset <=3D (i + 1))) { - if (m->type =3D=3D LABEL) { - assert(m->offset =3D=3D (i+1)); - fprintf(f, "%s: ", m->ref); - } - m =3D m->next; - } - fprintf(f, "\""); - break; - default: - if (isprint((unsigned char)c)) - fprintf(f, "%c", c); - else - fprintf(f, "\\x%02hhx", c); - } - } - fprintf(f, "\""); - - /* Wrap up any labels at the end of the value */ - for_each_marker_of_type(m, LABEL) { - assert (m->offset =3D=3D val.len); - fprintf(f, " %s:", m->ref); - } -} - -static void write_propval_cells(FILE *f, struct data val) -{ - void *propend =3D val.val + val.len; - cell_t *cp =3D (cell_t *)val.val; - struct marker *m =3D val.markers; - - fprintf(f, "<"); - for (;;) { - while (m && (m->offset <=3D ((char *)cp - val.val))) { - if (m->type =3D=3D LABEL) { - assert(m->offset =3D=3D ((char *)cp - val.val)); - fprintf(f, "%s: ", m->ref); - } - m =3D m->next; - } - - fprintf(f, "0x%x", fdt32_to_cpu(*cp++)); - if ((void *)cp >=3D propend) - break; - fprintf(f, " "); - } - - /* Wrap up any labels at the end of the value */ - for_each_marker_of_type(m, LABEL) { - assert (m->offset =3D=3D val.len); - fprintf(f, " %s:", m->ref); - } - fprintf(f, ">"); -} - -static void write_propval_bytes(FILE *f, struct data val) -{ - void *propend =3D val.val + val.len; - const char *bp =3D val.val; - struct marker *m =3D val.markers; - - fprintf(f, "["); - for (;;) { - while (m && (m->offset =3D=3D (bp-val.val))) { - if (m->type =3D=3D LABEL) - fprintf(f, "%s: ", m->ref); - m =3D m->next; - } - - fprintf(f, "%02hhx", (unsigned char)(*bp++)); - if ((const void *)bp >=3D propend) - break; - fprintf(f, " "); - } - - /* Wrap up any labels at the end of the value */ - for_each_marker_of_type(m, LABEL) { - assert (m->offset =3D=3D val.len); - fprintf(f, " %s:", m->ref); - } - fprintf(f, "]"); -} - -static void write_propval(FILE *f, struct property *prop) -{ - int len =3D prop->val.len; - const char *p =3D prop->val.val; - struct marker *m =3D prop->val.markers; - int nnotstring =3D 0, nnul =3D 0; - int nnotstringlbl =3D 0, nnotcelllbl =3D 0; - int i; - - if (len =3D=3D 0) { - fprintf(f, ";\n"); - return; - } - - for (i =3D 0; i < len; i++) { - if (! isstring(p[i])) - nnotstring++; - if (p[i] =3D=3D '\0') - nnul++; - } - - for_each_marker_of_type(m, LABEL) { - if ((m->offset > 0) && (prop->val.val[m->offset - 1] !=3D '\0')) - nnotstringlbl++; - if ((m->offset % sizeof(cell_t)) !=3D 0) - nnotcelllbl++; - } - - fprintf(f, " =3D "); - if ((p[len-1] =3D=3D '\0') && (nnotstring =3D=3D 0) && (nnul < (len-nnul)) - && (nnotstringlbl =3D=3D 0)) { - write_propval_string(f, prop->val); - } else if (((len % sizeof(cell_t)) =3D=3D 0) && (nnotcelllbl =3D=3D 0)) { - write_propval_cells(f, prop->val); - } else { - write_propval_bytes(f, prop->val); - } - - fprintf(f, ";\n"); -} - -static void write_tree_source_node(FILE *f, struct node *tree, int level) -{ - struct property *prop; - struct node *child; - struct label *l; - - write_prefix(f, level); - for_each_label(tree->labels, l) - fprintf(f, "%s: ", l->label); - if (tree->name && (*tree->name)) - fprintf(f, "%s {\n", tree->name); - else - fprintf(f, "/ {\n"); - - for_each_property(tree, prop) { - write_prefix(f, level+1); - for_each_label(prop->labels, l) - fprintf(f, "%s: ", l->label); - fprintf(f, "%s", prop->name); - write_propval(f, prop); - } - for_each_child(tree, child) { - fprintf(f, "\n"); - write_tree_source_node(f, child, level+1); - } - write_prefix(f, level); - fprintf(f, "};\n"); -} - - -void dt_to_source(FILE *f, struct dt_info *dti) -{ - struct reserve_info *re; - - fprintf(f, "/dts-v1/;\n\n"); - - for (re =3D dti->reservelist; re; re =3D re->next) { - struct label *l; - - for_each_label(re->labels, l) - fprintf(f, "%s: ", l->label); - fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n", - (unsigned long long)re->re.address, - (unsigned long long)re->re.size); - } - - write_tree_source_node(f, dti->dt, 0); -} - diff --git a/scripts/dtc/update-dtc-source.sh b/scripts/dtc/update-dtc-sour= ce.sh deleted file mode 100755 index b8ebcc6722..0000000000 --- a/scripts/dtc/update-dtc-source.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -# Simple script to update the version of DTC carried by the Linux kernel -# -# This script assumes that the dtc and the linux git trees are in the -# same directory. After building dtc in the dtc directory, it copies the -# source files and generated source files into the scripts/dtc directory -# in the kernel and creates a git commit updating them to the new -# version. -# -# Usage: from the top level Linux source tree, run: -# $ ./scripts/dtc/update-dtc-source.sh -# -# The script will change into the dtc tree, build and test dtc, copy the -# relevant files into the kernel tree and create a git commit. The commit -# message will need to be modified to reflect the version of DTC being -# imported -# -# TODO: -# This script is pretty basic, but it is seldom used so a few manual tasks -# aren't a big deal. If anyone is interested in making it more robust, the -# the following would be nice: -# * Actually fail to complete if any testcase fails. -# - The dtc "make check" target needs to return a failure -# * Extract the version number from the dtc repo for the commit message -# * Build dtc in the kernel tree -# * run 'make check" on dtc built from the kernel tree - -set -ev - -DTC_UPSTREAM_PATH=3D`pwd`/../dtc -DTC_LINUX_PATH=3D`pwd`/scripts/dtc - -DTC_SOURCE=3D"checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c s= rcpos.c \ - srcpos.h treesource.c util.c util.h version_gen.h Makefile.dtc \ - dtc-lexer.l dtc-parser.y" -DTC_GENERATED=3D"dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h" -LIBFDT_SOURCE=3D"Makefile.libfdt fdt.c fdt.h fdt_empty_tree.c fdt_ro.c fdt= _rw.c fdt_strerror.c fdt_sw.c fdt_wip.c libfdt.h libfdt_env.h libfdt_intern= al.h" - -get_last_dtc_version() { - git log --oneline scripts/dtc/ | grep 'upstream' | head -1 | sed -e 's/^.= * \(.*\)/\1/' -} - -last_dtc_ver=3D$(get_last_dtc_version) - -# Build DTC -cd $DTC_UPSTREAM_PATH -make clean -make check -dtc_version=3D$(git describe HEAD) -dtc_log=3D$(git log --oneline ${last_dtc_ver}..) - - -# Copy the files into the Linux tree -cd $DTC_LINUX_PATH -for f in $DTC_SOURCE; do - cp ${DTC_UPSTREAM_PATH}/${f} ${f} - git add ${f} -done -for f in $DTC_GENERATED; do - cp ${DTC_UPSTREAM_PATH}/$f ${f}_shipped - git add ${f}_shipped -done -for f in $LIBFDT_SOURCE; do - cp ${DTC_UPSTREAM_PATH}/libfdt/${f} libfdt/${f} - git add libfdt/${f} -done - -sed -i -- 's/#include /#include "libfdt_env.h"/g' ./libfdt/l= ibfdt.h -sed -i -- 's/#include /#include "fdt.h"/g' ./libfdt/libfdt.h -git add ./libfdt/libfdt.h - -commit_msg=3D$(cat << EOF -scripts/dtc: Update to upstream version ${dtc_version} - -This adds the following commits from upstream: - -${dtc_log} -EOF -) - -git commit -e -v -s -m "${commit_msg}" diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c deleted file mode 100644 index 3550f86bd6..0000000000 --- a/scripts/dtc/util.c +++ /dev/null @@ -1,473 +0,0 @@ -/* - * Copyright 2011 The Chromium Authors, All Rights Reserved. - * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. - * - * util_is_printable_string contributed by - * Pantelis Antoniou - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "libfdt.h" -#include "util.h" -#include "version_gen.h" - -char *xstrdup(const char *s) -{ - int len =3D strlen(s) + 1; - char *d =3D xmalloc(len); - - memcpy(d, s, len); - - return d; -} - -/* based in part from (3) vsnprintf */ -int xasprintf(char **strp, const char *fmt, ...) -{ - int n, size =3D 128; /* start with 128 bytes */ - char *p; - va_list ap; - - /* initial pointer is NULL making the fist realloc to be malloc */ - p =3D NULL; - while (1) { - p =3D xrealloc(p, size); - - /* Try to print in the allocated space. */ - va_start(ap, fmt); - n =3D vsnprintf(p, size, fmt, ap); - va_end(ap); - - /* If that worked, return the string. */ - if (n > -1 && n < size) - break; - /* Else try again with more space. */ - if (n > -1) /* glibc 2.1 */ - size =3D n + 1; /* precisely what is needed */ - else /* glibc 2.0 */ - size *=3D 2; /* twice the old size */ - } - *strp =3D p; - return strlen(p); -} - -char *join_path(const char *path, const char *name) -{ - int lenp =3D strlen(path); - int lenn =3D strlen(name); - int len; - int needslash =3D 1; - char *str; - - len =3D lenp + lenn + 2; - if ((lenp > 0) && (path[lenp-1] =3D=3D '/')) { - needslash =3D 0; - len--; - } - - str =3D xmalloc(len); - memcpy(str, path, lenp); - if (needslash) { - str[lenp] =3D '/'; - lenp++; - } - memcpy(str+lenp, name, lenn+1); - return str; -} - -bool util_is_printable_string(const void *data, int len) -{ - const char *s =3D data; - const char *ss, *se; - - /* zero length is not */ - if (len =3D=3D 0) - return 0; - - /* must terminate with zero */ - if (s[len - 1] !=3D '\0') - return 0; - - se =3D s + len; - - while (s < se) { - ss =3D s; - while (s < se && *s && isprint((unsigned char)*s)) - s++; - - /* not zero, or not done yet */ - if (*s !=3D '\0' || s =3D=3D ss) - return 0; - - s++; - } - - return 1; -} - -/* - * Parse a octal encoded character starting at index i in string s. The - * resulting character will be returned and the index i will be updated to - * point@the character directly after the end of the encoding, this may be - * the '\0' terminator of the string. - */ -static char get_oct_char(const char *s, int *i) -{ - char x[4]; - char *endx; - long val; - - x[3] =3D '\0'; - strncpy(x, s + *i, 3); - - val =3D strtol(x, &endx, 8); - - assert(endx > x); - - (*i) +=3D endx - x; - return val; -} - -/* - * Parse a hexadecimal encoded character starting at index i in string s. = The - * resulting character will be returned and the index i will be updated to - * point at the character directly after the end of the encoding, this may= be - * the '\0' terminator of the string. - */ -static char get_hex_char(const char *s, int *i) -{ - char x[3]; - char *endx; - long val; - - x[2] =3D '\0'; - strncpy(x, s + *i, 2); - - val =3D strtol(x, &endx, 16); - if (!(endx > x)) - die("\\x used with no following hex digits\n"); - - (*i) +=3D endx - x; - return val; -} - -char get_escape_char(const char *s, int *i) -{ - char c =3D s[*i]; - int j =3D *i + 1; - char val; - - switch (c) { - case 'a': - val =3D '\a'; - break; - case 'b': - val =3D '\b'; - break; - case 't': - val =3D '\t'; - break; - case 'n': - val =3D '\n'; - break; - case 'v': - val =3D '\v'; - break; - case 'f': - val =3D '\f'; - break; - case 'r': - val =3D '\r'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - j--; /* need to re-read the first digit as - * part of the octal value */ - val =3D get_oct_char(s, &j); - break; - case 'x': - val =3D get_hex_char(s, &j); - break; - default: - val =3D c; - } - - (*i) =3D j; - return val; -} - -int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len) -{ - int fd =3D 0; /* assume stdin */ - char *buf =3D NULL; - off_t bufsize =3D 1024, offset =3D 0; - int ret =3D 0; - - *buffp =3D NULL; - if (strcmp(filename, "-") !=3D 0) { - fd =3D open(filename, O_RDONLY); - if (fd < 0) - return errno; - } - - /* Loop until we have read everything */ - buf =3D xmalloc(bufsize); - do { - /* Expand the buffer to hold the next chunk */ - if (offset =3D=3D bufsize) { - bufsize *=3D 2; - buf =3D xrealloc(buf, bufsize); - } - - ret =3D read(fd, &buf[offset], bufsize - offset); - if (ret < 0) { - ret =3D errno; - break; - } - offset +=3D ret; - } while (ret !=3D 0); - - /* Clean up, including closing stdin; return errno on error */ - close(fd); - if (ret) - free(buf); - else - *buffp =3D buf; - *len =3D bufsize; - return ret; -} - -int utilfdt_read_err(const char *filename, char **buffp) -{ - off_t len; - return utilfdt_read_err_len(filename, buffp, &len); -} - -char *utilfdt_read_len(const char *filename, off_t *len) -{ - char *buff; - int ret =3D utilfdt_read_err_len(filename, &buff, len); - - if (ret) { - fprintf(stderr, "Couldn't open blob from '%s': %s\n", filename, - strerror(ret)); - return NULL; - } - /* Successful read */ - return buff; -} - -char *utilfdt_read(const char *filename) -{ - off_t len; - return utilfdt_read_len(filename, &len); -} - -int utilfdt_write_err(const char *filename, const void *blob) -{ - int fd =3D 1; /* assume stdout */ - int totalsize; - int offset; - int ret =3D 0; - const char *ptr =3D blob; - - if (strcmp(filename, "-") !=3D 0) { - fd =3D open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (fd < 0) - return errno; - } - - totalsize =3D fdt_totalsize(blob); - offset =3D 0; - - while (offset < totalsize) { - ret =3D write(fd, ptr + offset, totalsize - offset); - if (ret < 0) { - ret =3D -errno; - break; - } - offset +=3D ret; - } - /* Close the file/stdin; return errno on error */ - if (fd !=3D 1) - close(fd); - return ret < 0 ? -ret : 0; -} - - -int utilfdt_write(const char *filename, const void *blob) -{ - int ret =3D utilfdt_write_err(filename, blob); - - if (ret) { - fprintf(stderr, "Couldn't write blob to '%s': %s\n", filename, - strerror(ret)); - } - return ret ? -1 : 0; -} - -int utilfdt_decode_type(const char *fmt, int *type, int *size) -{ - int qualifier =3D 0; - - if (!*fmt) - return -1; - - /* get the conversion qualifier */ - *size =3D -1; - if (strchr("hlLb", *fmt)) { - qualifier =3D *fmt++; - if (qualifier =3D=3D *fmt) { - switch (*fmt++) { -/* TODO: case 'l': qualifier =3D 'L'; break;*/ - case 'h': - qualifier =3D 'b'; - break; - } - } - } - - /* we should now have a type */ - if ((*fmt =3D=3D '\0') || !strchr("iuxs", *fmt)) - return -1; - - /* convert qualifier (bhL) to byte size */ - if (*fmt !=3D 's') - *size =3D qualifier =3D=3D 'b' ? 1 : - qualifier =3D=3D 'h' ? 2 : - qualifier =3D=3D 'l' ? 4 : -1; - *type =3D *fmt++; - - /* that should be it! */ - if (*fmt) - return -1; - return 0; -} - -void utilfdt_print_data(const char *data, int len) -{ - int i; - const char *s; - - /* no data, don't print */ - if (len =3D=3D 0) - return; - - if (util_is_printable_string(data, len)) { - printf(" =3D "); - - s =3D data; - do { - printf("\"%s\"", s); - s +=3D strlen(s) + 1; - if (s < data + len) - printf(", "); - } while (s < data + len); - - } else if ((len % 4) =3D=3D 0) { - const uint32_t *cell =3D (const uint32_t *)data; - - printf(" =3D <"); - for (i =3D 0, len /=3D 4; i < len; i++) - printf("0x%08x%s", fdt32_to_cpu(cell[i]), - i < (len - 1) ? " " : ""); - printf(">"); - } else { - const unsigned char *p =3D (const unsigned char *)data; - printf(" =3D ["); - for (i =3D 0; i < len; i++) - printf("%02x%s", *p++, i < len - 1 ? " " : ""); - printf("]"); - } -} - -void util_version(void) -{ - printf("Version: %s\n", DTC_VERSION); - exit(0); -} - -void util_usage(const char *errmsg, const char *synopsis, - const char *short_opts, struct option const long_opts[], - const char * const opts_help[]) -{ - FILE *fp =3D errmsg ? stderr : stdout; - const char a_arg[] =3D ""; - size_t a_arg_len =3D strlen(a_arg) + 1; - size_t i; - int optlen; - - fprintf(fp, - "Usage: %s\n" - "\n" - "Options: -[%s]\n", synopsis, short_opts); - - /* prescan the --long opt length to auto-align */ - optlen =3D 0; - for (i =3D 0; long_opts[i].name; ++i) { - /* +1 is for space between --opt and help text */ - int l =3D strlen(long_opts[i].name) + 1; - if (long_opts[i].has_arg =3D=3D a_argument) - l +=3D a_arg_len; - if (optlen < l) - optlen =3D l; - } - - for (i =3D 0; long_opts[i].name; ++i) { - /* helps when adding new applets or options */ - assert(opts_help[i] !=3D NULL); - - /* first output the short flag if it has one */ - if (long_opts[i].val > '~') - fprintf(fp, " "); - else - fprintf(fp, " -%c, ", long_opts[i].val); - - /* then the long flag */ - if (long_opts[i].has_arg =3D=3D no_argument) - fprintf(fp, "--%-*s", optlen, long_opts[i].name); - else - fprintf(fp, "--%s %s%*s", long_opts[i].name, a_arg, - (int)(optlen - strlen(long_opts[i].name) - a_arg_len), ""); - - /* finally the help text */ - fprintf(fp, "%s\n", opts_help[i]); - } - - if (errmsg) { - fprintf(fp, "\nError: %s\n", errmsg); - exit(EXIT_FAILURE); - } else - exit(EXIT_SUCCESS); -} diff --git a/scripts/dtc/util.h b/scripts/dtc/util.h deleted file mode 100644 index bc3d223fa6..0000000000 --- a/scripts/dtc/util.h +++ /dev/null @@ -1,265 +0,0 @@ -#ifndef _UTIL_H -#define _UTIL_H - -#include -#include -#include - -/* - * Copyright 2011 The Chromium Authors, All Rights Reserved. - * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. - * - * This program 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 program 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 program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) - -#ifdef __GNUC__ -static inline void -__attribute__((noreturn)) __attribute__((format (printf, 1, 2))) -die(const char *str, ...) -#else -static inline void die(const char *str, ...) -#endif -{ - va_list ap; - - va_start(ap, str); - fprintf(stderr, "FATAL ERROR: "); - vfprintf(stderr, str, ap); - va_end(ap); - exit(1); -} - -static inline void *xmalloc(size_t len) -{ - void *new =3D malloc(len); - - if (!new) - die("malloc() failed\n"); - - return new; -} - -static inline void *xrealloc(void *p, size_t len) -{ - void *new =3D realloc(p, len); - - if (!new) - die("realloc() failed (len=3D%zd)\n", len); - - return new; -} - -extern char *xstrdup(const char *s); - -#ifdef __GNUC__ -extern int __attribute__((format (printf, 2, 3))) -xasprintf(char **strp, const char *fmt, ...); -#else -extern int xasprintf(char **strp, const char *fmt, ...); -#endif -extern char *join_path(const char *path, const char *name); - -/** - * Check a property of a given length to see if it is all printable and - * has a valid terminator. The property can contain either a single string, - * or multiple strings each of non-zero length. - * - * @param data The string to check - * @param len The string length including terminator - * @return 1 if a valid printable string, 0 if not - */ -bool util_is_printable_string(const void *data, int len); - -/* - * Parse an escaped character starting at index i in string s. The result= ing - * character will be returned and the index i will be updated to point at = the - * character directly after the end of the encoding, this may be the '\0' - * terminator of the string. - */ -char get_escape_char(const char *s, int *i); - -/** - * Read a device tree file into a buffer. This will report any errors on - * stderr. - * - * @param filename The filename to read, or - for stdin - * @return Pointer to allocated buffer containing fdt, or NULL on error - */ -char *utilfdt_read(const char *filename); - -/** - * Like utilfdt_read(), but also passes back the size of the file read. - * - * @param len If non-NULL, the amount of data we managed to read - */ -char *utilfdt_read_len(const char *filename, off_t *len); - -/** - * Read a device tree file into a buffer. Does not report errors, but only - * returns them. The value returned can be passed to strerror() to obtain - * an error message for the user. - * - * @param filename The filename to read, or - for stdin - * @param buffp Returns pointer to buffer containing fdt - * @return 0 if ok, else an errno value representing the error - */ -int utilfdt_read_err(const char *filename, char **buffp); - -/** - * Like utilfdt_read_err(), but also passes back the size of the file read. - * - * @param len If non-NULL, the amount of data we managed to read - */ -int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len); - -/** - * Write a device tree buffer to a file. This will report any errors on - * stderr. - * - * @param filename The filename to write, or - for stdout - * @param blob Poiner to buffer containing fdt - * @return 0 if ok, -1 on error - */ -int utilfdt_write(const char *filename, const void *blob); - -/** - * Write a device tree buffer to a file. Does not report errors, but only - * returns them. The value returned can be passed to strerror() to obtain - * an error message for the user. - * - * @param filename The filename to write, or - for stdout - * @param blob Poiner to buffer containing fdt - * @return 0 if ok, else an errno value representing the error - */ -int utilfdt_write_err(const char *filename, const void *blob); - -/** - * Decode a data type string. The purpose of this string - * - * The string consists of an optional character followed by the type: - * Modifier characters: - * hh or b 1 byte - * h 2 byte - * l 4 byte, default - * - * Type character: - * s string - * i signed integer - * u unsigned integer - * x hex - * - * TODO: Implement ll modifier (8 bytes) - * TODO: Implement o type (octal) - * - * @param fmt Format string to process - * @param type Returns type found(s/d/u/x), or 0 if none - * @param size Returns size found(1,2,4,8) or 4 if none - * @return 0 if ok, -1 on error (no type given, or other invalid format) - */ -int utilfdt_decode_type(const char *fmt, int *type, int *size); - -/* - * This is a usage message fragment for the -t option. It is the format - * supported by utilfdt_decode_type. - */ - -#define USAGE_TYPE_MSG \ - "\ts=3Dstring, i=3Dint, u=3Dunsigned, x=3Dhex\n" \ - "\tOptional modifier prefix:\n" \ - "\t\thh or b=3Dbyte, h=3D2 byte, l=3D4 byte (default)"; - -/** - * Print property data in a readable format to stdout - * - * Properties that look like strings will be printed as strings. Otherwise - * the data will be displayed either as cells (if len is a multiple of 4 - * bytes) or bytes. - * - * If len is 0 then this function does nothing. - * - * @param data Pointers to property data - * @param len Length of property data - */ -void utilfdt_print_data(const char *data, int len); - -/** - * Show source version and exit - */ -void util_version(void) __attribute__((noreturn)); - -/** - * Show usage and exit - * - * This helps standardize the output of various utils. You most likely wa= nt - * to use the usage() helper below rather than call this. - * - * @param errmsg If non-NULL, an error message to display - * @param synopsis The initial example usage text (and possible examples) - * @param short_opts The string of short options - * @param long_opts The structure of long options - * @param opts_help An array of help strings (should align with long_opts) - */ -void util_usage(const char *errmsg, const char *synopsis, - const char *short_opts, struct option const long_opts[], - const char * const opts_help[]) __attribute__((noreturn)); - -/** - * Show usage and exit - * - * If you name all your usage variables with usage_xxx, then you can call = this - * help macro rather than expanding all arguments yourself. - * - * @param errmsg If non-NULL, an error message to display - */ -#define usage(errmsg) \ - util_usage(errmsg, usage_synopsis, usage_short_opts, \ - usage_long_opts, usage_opts_help) - -/** - * Call getopt_long() with standard options - * - * Since all util code runs getopt in the same way, provide a helper. - */ -#define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \ - usage_long_opts, NULL) - -/* Helper for aligning long_opts array */ -#define a_argument required_argument - -/* Helper for usage_short_opts string constant */ -#define USAGE_COMMON_SHORT_OPTS "hV" - -/* Helper for usage_long_opts option array */ -#define USAGE_COMMON_LONG_OPTS \ - {"help", no_argument, NULL, 'h'}, \ - {"version", no_argument, NULL, 'V'}, \ - {NULL, no_argument, NULL, 0x0} - -/* Helper for usage_opts_help array */ -#define USAGE_COMMON_OPTS_HELP \ - "Print this help and exit", \ - "Print version and exit", \ - NULL - -/* Helper for getopt case statements */ -#define case_USAGE_COMMON_FLAGS \ - case 'h': usage(NULL); \ - case 'V': util_version(); \ - case '?': usage("unknown option"); - -#endif /* _UTIL_H */ diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h deleted file mode 100644 index bbbd96b1dc..0000000000 --- a/scripts/dtc/version_gen.h +++ /dev/null @@ -1 +0,0 @@ -#define DTC_VERSION "DTC 1.4.3" --=20 2.13.3