fdt.hh revision 318093
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: stable/11/usr.bin/dtc/fdt.hh 318093 2017-05-09 18:46:49Z gonzo $
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
44namespace dtc
45{
46
47namespace dtb
48{
49struct output_writer;
50class string_table;
51}
52
53namespace fdt
54{
55class property;
56class node;
57/**
58 * Type for (owned) pointers to properties.
59 */
60typedef std::shared_ptr<property> property_ptr;
61/**
62 * Owning pointer to a node.
63 */
64typedef std::unique_ptr<node> node_ptr;
65/**
66 * Map from macros to property pointers.
67 */
68typedef std::unordered_map<std::string, property_ptr> define_map;
69/**
70 * Set of strings used for label names.
71 */
72typedef 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 */
77struct 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 */
256class 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 */
397class 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 */
646class 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_
952