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