]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/dtc/fdt.hh
MFV r325013,r325034: 640 number_to_scaled_string is duplicated in several commands
[FreeBSD/FreeBSD.git] / usr.bin / dtc / fdt.hh
1 /*-
2  * Copyright (c) 2013 David Chisnall
3  * All rights reserved.
4  *
5  * This software was developed by SRI International and the University of
6  * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
7  * ("CTSRD"), as part of the DARPA CRASH research programme.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * $FreeBSD$
31  */
32
33 #ifndef _FDT_HH_
34 #define _FDT_HH_
35 #include <unordered_map>
36 #include <unordered_set>
37 #include <memory>
38 #include <string>
39 #include <functional>
40
41 #include "util.hh"
42 #include "input_buffer.hh"
43
44 namespace dtc
45 {
46
47 namespace dtb 
48 {
49 struct output_writer;
50 class string_table;
51 }
52
53 namespace fdt
54 {
55 class property;
56 class node;
57 /**
58  * Type for (owned) pointers to properties.
59  */
60 typedef std::shared_ptr<property> property_ptr;
61 /**
62  * Owning pointer to a node.
63  */
64 typedef std::unique_ptr<node> node_ptr;
65 /**
66  * Map from macros to property pointers.
67  */
68 typedef std::unordered_map<std::string, property_ptr> define_map;
69 /**
70  * Set of strings used for label names.
71  */
72 typedef std::unordered_set<std::string> string_set;
73 /**
74  * Properties may contain a number of different value, each with a different
75  * label.  This class encapsulates a single value.
76  */
77 struct property_value
78 {
79         /**
80          * The label for this data.  This is usually empty.
81          */
82         std::string label;
83         /**
84          * If this value is a string, or something resolved from a string (a
85          * reference) then this contains the source string.
86          */
87         std::string string_data;
88         /**
89          * The data that should be written to the final output.
90          */
91         byte_buffer byte_data;
92         /**
93          * Enumeration describing the possible types of a value.  Note that
94          * property-coded arrays will appear simply as binary (or possibly
95          * string, if they happen to be nul-terminated and printable), and must
96          * be checked separately.
97          */
98         enum value_type
99         {
100                 /**
101                  * This is a list of strings.  When read from source, string
102                  * lists become one property value for each string, however
103                  * when read from binary we have a single property value
104                  * incorporating the entire text, with nul bytes separating the
105                  * strings.
106                  */
107                 STRING_LIST,
108                 /**
109                  * This property contains a single string.
110                  */
111                 STRING,
112                 /**
113                  * This is a binary value.  Check the size of byte_data to
114                  * determine how many bytes this contains.
115                  */
116                 BINARY,
117                 /** This contains a short-form address that should be replaced
118                  * by a fully-qualified version.  This will only appear when
119                  * the input is a device tree source.  When parsed from a
120                  * device tree blob, the cross reference will have already been
121                  * resolved and the property value will be a string containing
122                  * the full path of the target node.  */
123                 CROSS_REFERENCE,
124                 /**
125                  * This is a phandle reference.  When parsed from source, the
126                  * string_data will contain the node label for the target and,
127                  * after cross references have been resolved, the binary data
128                  * will contain a 32-bit integer that should match the phandle
129                  * property of the target node.
130                  */
131                 PHANDLE,
132                 /**
133                  * An empty property value.  This will never appear on a real
134                  * property value, it is used by checkers to indicate that no
135                  * property values should exist for a property.
136                  */
137                 EMPTY,
138                 /**
139                  * The type of this property has not yet been determined.
140                  */
141                 UNKNOWN
142         };
143         /**
144          * The type of this property.
145          */
146         value_type type;
147         /**
148          * Returns true if this value is a cross reference, false otherwise.
149          */
150         inline bool is_cross_reference()
151         {
152                 return is_type(CROSS_REFERENCE);
153         }
154         /**
155          * Returns true if this value is a phandle reference, false otherwise.
156          */
157         inline bool is_phandle()
158         {
159                 return is_type(PHANDLE);
160         }
161         /**
162          * Returns true if this value is a string, false otherwise.
163          */
164         inline bool is_string()
165         {
166                 return is_type(STRING);
167         }
168         /**
169          * Returns true if this value is a string list (a nul-separated
170          * sequence of strings), false otherwise.
171          */
172         inline bool is_string_list()
173         {
174                 return is_type(STRING_LIST);
175         }
176         /**
177          * Returns true if this value is binary, false otherwise.
178          */
179         inline bool is_binary()
180         {
181                 return is_type(BINARY);
182         }
183         /**
184          * Returns this property value as a 32-bit integer.  Returns 0 if this
185          * property value is not 32 bits long.  The bytes in the property value
186          * are assumed to be in big-endian format, but the return value is in
187          * the host native endian.
188          */
189         uint32_t get_as_uint32();
190         /**
191          * Default constructor, specifying the label of the value.
192          */
193         property_value(std::string l=std::string()) : label(l), type(UNKNOWN) {}
194         /**
195          * Writes the data for this value into an output buffer.
196          */
197         void push_to_buffer(byte_buffer &buffer);
198
199         /**
200          * Writes the property value to the standard output.  This uses the
201          * following heuristics for deciding how to print the output:
202          *
203          * - If the value is nul-terminated and only contains printable
204          *   characters, it is written as a string.
205          * - If it is a multiple of 4 bytes long, then it is printed as cells.
206          * - Otherwise, it is printed as a byte buffer.
207          */
208         void write_dts(FILE *file);
209         /**
210          * Tries to merge adjacent property values, returns true if it succeeds and
211          * false otherwise.
212          */
213         bool try_to_merge(property_value &other);
214         /**
215          * Returns the size (in bytes) of this property value.
216          */
217         size_t size();
218         private:
219         /**
220          * Returns whether the value is of the specified type.  If the type of
221          * the value has not yet been determined, then this calculates it.
222          */
223         inline bool is_type(value_type v)
224         {
225                 if (type == UNKNOWN)
226                 {
227                         resolve_type();
228                 }
229                 return type == v;
230         }
231         /**
232          * Determines the type of the value based on its contents.
233          */
234         void resolve_type();
235         /**
236          * Writes the property value to the specified file as a quoted string.
237          * This is used when generating DTS.
238          */
239         void write_as_string(FILE *file);
240         /**
241          * Writes the property value to the specified file as a sequence of
242          * 32-bit big-endian cells.  This is used when generating DTS.
243          */
244         void write_as_cells(FILE *file);
245         /**
246          * Writes the property value to the specified file as a sequence of
247          * bytes.  This is used when generating DTS.
248          */
249         void write_as_bytes(FILE *file);
250 };
251
252 /**
253  * A value encapsulating a single property.  This contains a key, optionally a
254  * label, and optionally one or more values.
255  */
256 class property
257 {
258         /**
259          * The name of this property.
260          */
261         std::string key;
262         /**
263          * Zero or more labels.
264          */
265         string_set labels;
266         /**
267          * The values in this property.
268          */
269         std::vector<property_value> values;
270         /**
271          * Value indicating that this is a valid property.  If a parse error
272          * occurs, then this value is false.
273          */
274         bool valid;
275         /**
276          * Parses a string property value, i.e. a value enclosed in double quotes.
277          */
278         void parse_string(text_input_buffer &input);
279         /**
280          * Parses one or more 32-bit values enclosed in angle brackets.
281          */
282         void parse_cells(text_input_buffer &input, int cell_size);
283         /**
284          * Parses an array of bytes, contained within square brackets.
285          */
286         void parse_bytes(text_input_buffer &input);
287         /**
288          * Parses a reference.  This is a node label preceded by an ampersand
289          * symbol, which should expand to the full path to that node.
290          *
291          * Note: The specification says that the target of such a reference is
292          * a node name, however dtc assumes that it is a label, and so we
293          * follow their interpretation for compatibility.
294          */
295         void parse_reference(text_input_buffer &input);
296         /**
297          * Parse a predefined macro definition for a property.
298          */
299         void parse_define(text_input_buffer &input, define_map *defines);
300         /**
301          * Constructs a new property from two input buffers, pointing to the
302          * struct and strings tables in the device tree blob, respectively.
303          * The structs input buffer is assumed to have just consumed the
304          * FDT_PROP token.
305          */
306         property(input_buffer &structs, input_buffer &strings);
307         /**
308          * Parses a new property from the input buffer.  
309          */
310         property(text_input_buffer &input,
311                  std::string &&k,
312                  string_set &&l,
313                  bool terminated,
314                  define_map *defines);
315         public:
316         /**
317          * Creates an empty property.
318          */
319         property(std::string &&k, string_set &&l=string_set())
320                 : key(k), labels(l), valid(true) {}
321         /**
322          * Copy constructor.
323          */
324         property(property &p) : key(p.key), labels(p.labels), values(p.values),
325                 valid(p.valid) {}
326         /**
327          * Factory method for constructing a new property.  Attempts to parse a
328          * property from the input, and returns it on success.  On any parse
329          * error, this will return 0.
330          */
331         static property_ptr parse_dtb(input_buffer &structs,
332                                       input_buffer &strings);
333         /**
334          * Factory method for constructing a new property.  Attempts to parse a
335          * property from the input, and returns it on success.  On any parse
336          * error, this will return 0.
337          */
338         static property_ptr parse(text_input_buffer &input,
339                                   std::string &&key,
340                                   string_set &&labels=string_set(),
341                                   bool semicolonTerminated=true,
342                                   define_map *defines=0);
343         /**
344          * Iterator type used for accessing the values of a property.
345          */
346         typedef std::vector<property_value>::iterator value_iterator;
347         /**
348          * Returns an iterator referring to the first value in this property.
349          */
350         inline value_iterator begin()
351         {
352                 return values.begin();
353         }
354         /**
355          * Returns an iterator referring to the last value in this property.
356          */
357         inline value_iterator end()
358         {
359                 return values.end();
360         }
361         /**
362          * Adds a new value to an existing property.
363          */
364         inline void add_value(property_value v)
365         {
366                 values.push_back(v);
367         }
368         /**
369          * Returns the key for this property.
370          */
371         inline std::string get_key()
372         {
373                 return key;
374         }
375         /**
376          * Writes the property to the specified writer.  The property name is a
377          * reference into the strings table.
378          */
379         void write(dtb::output_writer &writer, dtb::string_table &strings);
380         /**
381          * Writes in DTS format to the specified file, at the given indent
382          * level.  This will begin the line with the number of tabs specified
383          * as the indent level and then write the property in the most
384          * applicable way that it can determine.
385          */
386         void write_dts(FILE *file, int indent);
387         /**
388          * Returns the byte offset of the specified property value.
389          */
390         size_t offset_of_value(property_value &val);
391 };
392
393 /**
394  * Class encapsulating a device tree node.  Nodes may contain properties and
395  * other nodes.
396  */
397 class node
398 {
399         public:
400         /**
401          * The labels for this node, if any.  Node labels are used as the
402          * targets for cross references.
403          */
404         std::unordered_set<std::string> labels;
405         /**
406          * The name of the node.
407          */
408         std::string name;
409         /**
410          * The unit address of the node, which is optionally written after the
411          * name followed by an at symbol.
412          */
413         std::string unit_address;
414         /**
415          * The type for the property vector.
416          */
417         typedef std::vector<property_ptr> property_vector;
418         /**
419          * Iterator type for child nodes.
420          */
421         typedef std::vector<node_ptr>::iterator child_iterator;
422         private:
423         /**
424          * Adaptor to use children in range-based for loops.
425          */
426         struct child_range
427         {
428                 child_range(node &nd) : n(nd) {}
429                 child_iterator begin() { return n.child_begin(); }
430                 child_iterator end() { return n.child_end(); }
431                 private:
432                 node &n;
433         };
434         /**
435          * Adaptor to use properties in range-based for loops.
436          */
437         struct property_range
438         {
439                 property_range(node &nd) : n(nd) {}
440                 property_vector::iterator begin() { return n.property_begin(); }
441                 property_vector::iterator end() { return n.property_end(); }
442                 private:
443                 node &n;
444         };
445         /**
446          * The properties contained within this node.
447          */
448         property_vector props;
449         /**
450          * The children of this node.
451          */
452         std::vector<node_ptr> children;
453         /**
454          * Children that should be deleted from this node when merging.
455          */
456         std::unordered_set<std::string> deleted_children;
457         /**
458          * Properties that should be deleted from this node when merging.
459          */
460         std::unordered_set<std::string> deleted_props;
461         /**
462          * A flag indicating whether this node is valid.  This is set to false
463          * if an error occurs during parsing.
464          */
465         bool valid;
466         /**
467          * Parses a name inside a node, writing the string passed as the last
468          * argument as an error if it fails.  
469          */
470         std::string parse_name(text_input_buffer &input,
471                                bool &is_property,
472                                const char *error);
473         /**
474          * Constructs a new node from two input buffers, pointing to the struct
475          * and strings tables in the device tree blob, respectively.
476          */
477         node(input_buffer &structs, input_buffer &strings);
478         /**
479          * Parses a new node from the specified input buffer.  This is called
480          * when the input cursor is on the open brace for the start of the
481          * node.  The name, and optionally label and unit address, should have
482          * already been parsed.
483          */
484         node(text_input_buffer &input,
485              std::string &&n,
486              std::unordered_set<std::string> &&l,
487              std::string &&a,
488              define_map*);
489         /**
490          * Creates a special node with the specified name and properties.
491          */
492         node(const std::string &n, const std::vector<property_ptr> &p);
493         /**
494          * Comparison function for properties, used when sorting the properties
495          * vector.  Orders the properties based on their names.
496          */
497         static inline bool cmp_properties(property_ptr &p1, property_ptr &p2);
498                 /*
499         {
500                 return p1->get_key() < p2->get_key();
501         }
502         */
503         /**
504          * Comparison function for nodes, used when sorting the children
505          * vector.  Orders the nodes based on their names or, if the names are
506          * the same, by the unit addresses.
507          */
508         static inline bool cmp_children(node_ptr &c1, node_ptr &c2);
509         public:
510         /**
511          * Sorts the node's properties and children into alphabetical order and
512          * recursively sorts the children.
513          */
514         void sort();
515         /**
516          * Returns an iterator for the first child of this node.
517          */
518         inline child_iterator child_begin()
519         {
520                 return children.begin();
521         }
522         /**
523          * Returns an iterator after the last child of this node.
524          */
525         inline child_iterator child_end()
526         {
527                 return children.end();
528         }
529         /**
530          * Returns a range suitable for use in a range-based for loop describing
531          * the children of this node.
532          */
533         inline child_range child_nodes()
534         {
535                 return child_range(*this);
536         }
537         /**
538          * Accessor for the deleted children.
539          */
540         inline const std::unordered_set<std::string> &deleted_child_nodes()
541         {
542                 return deleted_children;
543         }
544         /**
545          * Accessor for the deleted properties
546          */
547         inline const std::unordered_set<std::string> &deleted_properties()
548         {
549                 return deleted_props;
550         }
551         /**
552          * Returns a range suitable for use in a range-based for loop describing
553          * the properties of this node.
554          */
555         inline property_range properties()
556         {
557                 return property_range(*this);
558         }
559         /**
560          * Returns an iterator after the last property of this node.
561          */
562         inline property_vector::iterator property_begin()
563         {
564                 return props.begin();
565         }
566         /**
567          * Returns an iterator for the first property of this node.
568          */
569         inline property_vector::iterator property_end()
570         {
571                 return props.end();
572         }
573         /**
574          * Factory method for constructing a new node.  Attempts to parse a
575          * node in DTS format from the input, and returns it on success.  On
576          * any parse error, this will return 0.  This should be called with the
577          * cursor on the open brace of the property, after the name and so on
578          * have been parsed.
579          */
580         static node_ptr parse(text_input_buffer &input,
581                               std::string &&name,
582                               std::unordered_set<std::string> &&label=std::unordered_set<std::string>(),
583                               std::string &&address=std::string(),
584                               define_map *defines=0);
585         /**
586          * Factory method for constructing a new node.  Attempts to parse a
587          * node in DTB format from the input, and returns it on success.  On
588          * any parse error, this will return 0.  This should be called with the
589          * cursor on the open brace of the property, after the name and so on
590          * have been parsed.
591          */
592         static node_ptr parse_dtb(input_buffer &structs, input_buffer &strings);
593         /**
594          * Construct a new special node from a name and set of properties.
595          */
596         static node_ptr create_special_node(const std::string &name,
597                         const std::vector<property_ptr> &props);
598         /**
599          * Returns a property corresponding to the specified key, or 0 if this
600          * node does not contain a property of that name.
601          */
602         property_ptr get_property(const std::string &key);
603         /**
604          * Adds a new property to this node.
605          */
606         inline void add_property(property_ptr &p)
607         {
608                 props.push_back(p);
609         }
610         /**
611          * Adds a new child to this node.
612          */
613         inline void add_child(node_ptr &&n)
614         {
615                 children.push_back(std::move(n));
616         }
617         /**
618          * Merges a node into this one.  Any properties present in both are
619          * overridden, any properties present in only one are preserved.
620          */
621         void merge_node(node_ptr other);
622         /**
623          * Write this node to the specified output.  Although nodes do not
624          * refer to a string table directly, their properties do.  The string
625          * table passed as the second argument is used for the names of
626          * properties within this node and its children.
627          */
628         void write(dtb::output_writer &writer, dtb::string_table &strings);
629         /**
630          * Writes the current node as DTS to the specified file.  The second
631          * parameter is the indent level.  This function will start every line
632          * with this number of tabs.  
633          */
634         void write_dts(FILE *file, int indent);
635         /**
636          * Recursively visit this node and then its children.
637          */
638         void visit(std::function<void(node&)>);
639 };
640
641 /**
642  * Class encapsulating the entire parsed FDT.  This is the top-level class,
643  * which parses the entire DTS representation and write out the finished
644  * version.
645  */
646 class device_tree
647 {
648         public:
649         /**
650          * Type used for node paths.  A node path is sequence of names and unit
651          * addresses.
652          */
653         class node_path : public std::vector<std::pair<std::string,std::string>>
654         {
655                 public:
656                 /**
657                  * Converts this to a string representation.
658                  */
659                 std::string to_string() const;
660         };
661         /**
662          * Name that we should use for phandle nodes.
663          */
664         enum phandle_format
665         {
666                 /** linux,phandle */
667                 LINUX,
668                 /** phandle */
669                 EPAPR,
670                 /** Create both nodes. */
671                 BOTH
672         };
673         private:
674         /**
675          * The format that we should use for writing phandles.
676          */
677         phandle_format phandle_node_name;
678         /**
679          * Flag indicating that this tree is valid.  This will be set to false
680          * on parse errors. 
681          */
682         bool valid;
683         /**
684          * Type used for memory reservations.  A reservation is two 64-bit
685          * values indicating a base address and length in memory that the
686          * kernel should not use.  The high 32 bits are ignored on 32-bit
687          * platforms.
688          */
689         typedef std::pair<uint64_t, uint64_t> reservation;
690         /**
691          * The memory reserves table.
692          */
693         std::vector<reservation> reservations;
694         /**
695          * Root node.  All other nodes are children of this node.
696          */
697         node_ptr root;
698         /**
699          * Mapping from names to nodes.  Only unambiguous names are recorded,
700          * duplicate names are stored as (node*)-1.
701          */
702         std::unordered_map<std::string, node*> node_names;
703         /**
704          * A map from labels to node paths.  When resolving cross references,
705          * we look up referenced nodes in this and replace the cross reference
706          * with the full path to its target.
707          */
708         std::unordered_map<std::string, node_path> node_paths;
709         /**
710          * A collection of property values that are references to other nodes.
711          * These should be expanded to the full path of their targets.
712          */
713         std::vector<property_value*> cross_references;
714         /**
715          * The location of something requiring a fixup entry.
716          */
717         struct fixup
718         {
719                 /**
720                  * The path to the node.
721                  */
722                 node_path path;
723                 /**
724                  * The property containing the reference.
725                  */
726                 property_ptr prop;
727                 /**
728                  * The property value that contains the reference.
729                  */
730                 property_value &val;
731         };
732         /**
733          * A collection of property values that refer to phandles.  These will
734          * be replaced by the value of the phandle property in their
735          * destination.
736          */
737         std::vector<fixup> fixups;
738         /**
739          * The locations of all of the values that are supposed to become phandle
740          * references, but refer to things outside of this file.  
741          */
742         std::vector<std::reference_wrapper<fixup>> unresolved_fixups;
743         /**
744          * The names of nodes that target phandles.
745          */
746         std::unordered_set<std::string> phandle_targets;
747         /**
748          * A collection of input buffers that we are using.  These input
749          * buffers are the ones that own their memory, and so we must preserve
750          * them for the lifetime of the device tree.  
751          */
752         std::vector<std::unique_ptr<input_buffer>> buffers;
753         /**
754          * A map of used phandle values to nodes.  All phandles must be unique,
755          * so we keep a set of ones that the user explicitly provides in the
756          * input to ensure that we don't reuse them.
757          *
758          * This is a map, rather than a set, because we also want to be able to
759          * find phandles that were provided by the user explicitly when we are
760          * doing checking.
761          */
762         std::unordered_map<uint32_t, node*> used_phandles;
763         /**
764          * Paths to search for include files.  This contains a set of
765          * nul-terminated strings, which are not owned by this class and so
766          * must be freed separately.
767          */
768         std::vector<std::string> include_paths;
769         /**
770          * Dictionary of predefined macros provided on the command line.
771          */
772         define_map               defines;
773         /**
774          * The default boot CPU, specified in the device tree header.
775          */
776         uint32_t boot_cpu;
777         /**
778          * The number of empty reserve map entries to generate in the blob.
779          */
780         uint32_t spare_reserve_map_entries;
781         /**
782          * The minimum size in bytes of the blob.
783          */
784         uint32_t minimum_blob_size;
785         /**
786          * The number of bytes of padding to add to the end of the blob.
787          */
788         uint32_t blob_padding;
789         /**
790          * Is this tree a plugin?
791          */
792         bool is_plugin;
793         /**
794          * Visit all of the nodes recursively, and if they have labels then add
795          * them to the node_paths and node_names vectors so that they can be
796          * used in resolving cross references.  Also collects phandle
797          * properties that have been explicitly added.  
798          */
799         void collect_names_recursive(node_ptr &n, node_path &path);
800         /**
801          * Assign phandle properties to all nodes that have been referenced and
802          * require one.  This method will recursively visit the tree starting at
803          * the node that it is passed.
804          */
805         void assign_phandles(node_ptr &n, uint32_t &next);
806         /**
807          * Calls the recursive version of this method on every root node.
808          */
809         void collect_names();
810         /**
811          * Resolves all cross references.  Any properties that refer to another
812          * node must have their values replaced by either the node path or
813          * phandle value.
814          */
815         void resolve_cross_references();
816         /**
817          * Parses a dts file in the given buffer and adds the roots to the parsed
818          * set.  The `read_header` argument indicates whether the header has
819          * already been read.  Some dts files place the header in an include,
820          * rather than in the top-level file.
821          */
822         void parse_file(text_input_buffer &input,
823                         std::vector<node_ptr> &roots,
824                         bool &read_header);
825         /**
826          * Template function that writes a dtb blob using the specified writer.
827          * The writer defines the output format (assembly, blob).
828          */
829         template<class writer>
830         void write(int fd);
831         public:
832         /**
833          * Should we write the __symbols__ node (to allow overlays to be linked
834          * against this blob)?
835          */
836         bool write_symbols = false;
837         /**
838          * Returns the node referenced by the property.  If this is a tree that
839          * is in source form, then we have a string that we can use to index
840          * the cross_references array and so we can just look that up.  
841          */
842         node *referenced_node(property_value &v);
843         /**
844          * Writes this FDT as a DTB to the specified output.
845          */
846         void write_binary(int fd);
847         /**
848          * Writes this FDT as an assembly representation of the DTB to the
849          * specified output.  The result can then be assembled and linked into
850          * a program.
851          */
852         void write_asm(int fd);
853         /**
854          * Writes the tree in DTS (source) format.
855          */
856         void write_dts(int fd);
857         /**
858          * Default constructor.  Creates a valid, but empty FDT.
859          */
860         device_tree() : phandle_node_name(EPAPR), valid(true),
861                 boot_cpu(0), spare_reserve_map_entries(0),
862                 minimum_blob_size(0), blob_padding(0) {}
863         /**
864          * Constructs a device tree from the specified file name, referring to
865          * a file that contains a device tree blob.
866          */
867         void parse_dtb(const std::string &fn, FILE *depfile);
868         /**
869          * Constructs a device tree from the specified file name, referring to
870          * a file that contains device tree source.
871          */
872         void parse_dts(const std::string &fn, FILE *depfile);
873         /**
874          * Returns whether this tree is valid.
875          */
876         inline bool is_valid()
877         {
878                 return valid;
879         }
880         /**
881          * Sets the format for writing phandle properties.
882          */
883         inline void set_phandle_format(phandle_format f)
884         {
885                 phandle_node_name = f;
886         }
887         /**
888          * Returns a pointer to the root node of this tree.  No ownership
889          * transfer.
890          */
891         inline const node_ptr &get_root() const
892         {
893                 return root;
894         }
895         /**
896          * Sets the physical boot CPU.
897          */
898         void set_boot_cpu(uint32_t cpu)
899         {
900                 boot_cpu = cpu;
901         }
902         /**
903          * Sorts the tree.  Useful for debugging device trees.
904          */
905         void sort()
906         {
907                 root->sort();
908         }
909         /**
910          * Adds a path to search for include files.  The argument must be a
911          * nul-terminated string representing the path.  The device tree keeps
912          * a pointer to this string, but does not own it: the caller is
913          * responsible for freeing it if required.
914          */
915         void add_include_path(const char *path)
916         {
917                 std::string p(path);
918                 include_paths.push_back(std::move(p));
919         }
920         /**
921          * Sets the number of empty reserve map entries to add.
922          */
923         void set_empty_reserve_map_entries(uint32_t e)
924         {
925                 spare_reserve_map_entries = e;
926         }
927         /**
928          * Sets the minimum size, in bytes, of the blob.
929          */
930         void set_blob_minimum_size(uint32_t s)
931         {
932                 minimum_blob_size = s;
933         }
934         /**
935          * Sets the amount of padding to add to the blob.
936          */
937         void set_blob_padding(uint32_t p)
938         {
939                 blob_padding = p;
940         }
941         /**
942          * Parses a predefined macro value.
943          */
944         bool parse_define(const char *def);
945 };
946
947 } // namespace fdt
948
949 } // namespace dtc
950
951 #endif // !_FDT_HH_