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 <map> 36 37 #include "util.hh" 38 #include "string.hh" 39 40 namespace dtc 41 { 42 43 namespace dtb 44 { 45 struct output_writer; 46 class string_table; 47 } 48 49 namespace fdt 50 { 51 class property; 52 typedef std::map<string, property*> define_map; 53 /** 54 * Properties may contain a number of different value, each with a different 55 * label. This class encapsulates a single value. 56 */ 57 struct property_value 58 { 59 /** 60 * The label for this data. This is usually empty. 61 */ 62 string label; 63 /** 64 * If this value is a string, or something resolved from a string (a 65 * reference) then this contains the source string. 66 */ 67 string string_data; 68 /** 69 * The data that should be written to the final output. 70 */ 71 byte_buffer byte_data; 72 /** 73 * Enumeration describing the possible types of a value. Note that 74 * property-coded arrays will appear simply as binary (or possibly 75 * string, if they happen to be nul-terminated and printable), and must 76 * be checked separately. 77 */ 78 enum value_type 79 { 80 /** 81 * This is a list of strings. When read from source, string 82 * lists become one property value for each string, however 83 * when read from binary we have a single property value 84 * incorporating the entire text, with nul bytes separating the 85 * strings. 86 */ 87 STRING_LIST, 88 /** 89 * This property contains a single string. 90 */ 91 STRING, 92 /** 93 * This is a binary value. Check the size of byte_data to 94 * determine how many bytes this contains. 95 */ 96 BINARY, 97 /** This contains a short-form address that should be replaced 98 * by a fully-qualified version. This will only appear when 99 * the input is a device tree source. When parsed from a 100 * device tree blob, the cross reference will have already been 101 * resolved and the property value will be a string containing 102 * the full path of the target node. */ 103 CROSS_REFERENCE, 104 /** 105 * This is a phandle reference. When parsed from source, the 106 * string_data will contain the node label for the target and, 107 * after cross references have been resolved, the binary data 108 * will contain a 32-bit integer that should match the phandle 109 * property of the target node. 110 */ 111 PHANDLE, 112 /** 113 * An empty property value. This will never appear on a real 114 * property value, it is used by checkers to indicate that no 115 * property values should exist for a property. 116 */ 117 EMPTY, 118 /** 119 * The type of this property has not yet been determined. 120 */ 121 UNKNOWN 122 }; 123 /** 124 * The type of this property. 125 */ 126 value_type type; 127 /** 128 * Returns true if this value is a cross reference, false otherwise. 129 */ 130 inline bool is_cross_reference() 131 { 132 return is_type(CROSS_REFERENCE); 133 } 134 /** 135 * Returns true if this value is a phandle reference, false otherwise. 136 */ 137 inline bool is_phandle() 138 { 139 return is_type(PHANDLE); 140 } 141 /** 142 * Returns true if this value is a string, false otherwise. 143 */ 144 inline bool is_string() 145 { 146 return is_type(STRING); 147 } 148 /** 149 * Returns true if this value is a string list (a nul-separated 150 * sequence of strings), false otherwise. 151 */ 152 inline bool is_string_list() 153 { 154 return is_type(STRING_LIST); 155 } 156 /** 157 * Returns true if this value is binary, false otherwise. 158 */ 159 inline bool is_binary() 160 { 161 return is_type(BINARY); 162 } 163 /** 164 * Returns this property value as a 32-bit integer. Returns 0 if this 165 * property value is not 32 bits long. The bytes in the property value 166 * are assumed to be in big-endian format, but the return value is in 167 * the host native endian. 168 */ 169 uint32_t get_as_uint32(); 170 /** 171 * Default constructor, specifying the label of the value. 172 */ 173 property_value(string l=string()) : label(l), type(UNKNOWN) {} 174 /** 175 * Writes the data for this value into an output buffer. 176 */ 177 void push_to_buffer(byte_buffer &buffer); 178 179 /** 180 * Writes the property value to the standard output. This uses the 181 * following heuristics for deciding how to print the output: 182 * 183 * - If the value is nul-terminated and only contains printable 184 * characters, it is written as a string. 185 * - If it is a multiple of 4 bytes long, then it is printed as cells. 186 * - Otherwise, it is printed as a byte buffer. 187 */ 188 void write_dts(FILE *file); 189 private: 190 /** 191 * Returns whether the value is of the specified type. If the type of 192 * the value has not yet been determined, then this calculates it. 193 */ 194 inline bool is_type(value_type v) 195 { 196 if (type == UNKNOWN) 197 { 198 resolve_type(); 199 } 200 return type == v; 201 } 202 /** 203 * Determines the type of the value based on its contents. 204 */ 205 void resolve_type(); 206 /** 207 * Writes the property value to the specified file as a quoted string. 208 * This is used when generating DTS. 209 */ 210 void write_as_string(FILE *file); 211 /** 212 * Writes the property value to the specified file as a sequence of 213 * 32-bit big-endian cells. This is used when generating DTS. 214 */ 215 void write_as_cells(FILE *file); 216 /** 217 * Writes the property value to the specified file as a sequence of 218 * bytes. This is used when generating DTS. 219 */ 220 void write_as_bytes(FILE *file); 221 }; 222 223 /** 224 * A value encapsulating a single property. This contains a key, optionally a 225 * label, and optionally one or more values. 226 */ 227 class property 228 { 229 /** 230 * The name of this property. 231 */ 232 string key; 233 /** 234 * An optional label. 235 */ 236 string label; 237 /** 238 * The values in this property. 239 */ 240 std::vector<property_value> values; 241 /** 242 * Value indicating that this is a valid property. If a parse error 243 * occurs, then this value is false. 244 */ 245 bool valid; 246 /** 247 * Parses a string property value, i.e. a value enclosed in double quotes. 248 */ 249 void parse_string(input_buffer &input); 250 /** 251 * Parses one or more 32-bit values enclosed in angle brackets. 252 */ 253 void parse_cells(input_buffer &input); 254 /** 255 * Parses an array of bytes, contained within square brackets. 256 */ 257 void parse_bytes(input_buffer &input); 258 /** 259 * Parses a reference. This is a node label preceded by an ampersand 260 * symbol, which should expand to the full path to that node. 261 * 262 * Note: The specification says that the target of such a reference is 263 * a node name, however dtc assumes that it is a label, and so we 264 * follow their interpretation for compatibility. 265 */ 266 void parse_reference(input_buffer &input); 267 /** 268 * Parse a predefined macro definition for a property. 269 */ 270 void parse_define(input_buffer &input, define_map *defines); 271 /** 272 * Constructs a new property from two input buffers, pointing to the 273 * struct and strings tables in the device tree blob, respectively. 274 * The structs input buffer is assumed to have just consumed the 275 * FDT_PROP token. 276 */ 277 property(input_buffer &structs, input_buffer &strings); 278 /** 279 * Parses a new property from the input buffer. 280 */ 281 property(input_buffer &input, 282 string k, 283 string l, 284 bool terminated, 285 define_map *defines); 286 public: 287 /** 288 * Creates an empty property. 289 */ 290 property(string k, string l=string()) : key(k), label(l), valid(true) 291 {} 292 /** 293 * Copy constructor. 294 */ 295 property(property &p) : key(p.key), label(p.label), values(p.values), 296 valid(p.valid) {} 297 /** 298 * Factory method for constructing a new property. Attempts to parse a 299 * property from the input, and returns it on success. On any parse 300 * error, this will return 0. 301 */ 302 static property* parse_dtb(input_buffer &structs, 303 input_buffer &strings); 304 /** 305 * Factory method for constructing a new property. Attempts to parse a 306 * property from the input, and returns it on success. On any parse 307 * error, this will return 0. 308 */ 309 static property* parse(input_buffer &input, 310 string key, 311 string label=string(), 312 bool semicolonTerminated=true, 313 define_map *defines=0); 314 /** 315 * Iterator type used for accessing the values of a property. 316 */ 317 typedef std::vector<property_value>::iterator value_iterator; 318 /** 319 * Returns an iterator referring to the first value in this property. 320 */ 321 inline value_iterator begin() 322 { 323 return values.begin(); 324 } 325 /** 326 * Returns an iterator referring to the last value in this property. 327 */ 328 inline value_iterator end() 329 { 330 return values.end(); 331 } 332 /** 333 * Adds a new value to an existing property. 334 */ 335 inline void add_value(property_value v) 336 { 337 values.push_back(v); 338 } 339 /** 340 * Returns the key for this property. 341 */ 342 inline string get_key() 343 { 344 return key; 345 } 346 /** 347 * Writes the property to the specified writer. The property name is a 348 * reference into the strings table. 349 */ 350 void write(dtb::output_writer &writer, dtb::string_table &strings); 351 /** 352 * Writes in DTS format to the specified file, at the given indent 353 * level. This will begin the line with the number of tabs specified 354 * as the indent level and then write the property in the most 355 * applicable way that it can determine. 356 */ 357 void write_dts(FILE *file, int indent); 358 }; 359 360 /** 361 * Class encapsulating a device tree node. Nodes may contain properties and 362 * other nodes. 363 */ 364 class node 365 { 366 public: 367 /** 368 * The label for this node, if any. Node labels are used as the 369 * targets for cross references. 370 */ 371 string label; 372 /** 373 * The name of the node. 374 */ 375 string name; 376 /** 377 * The unit address of the node, which is optionally written after the 378 * name followed by an at symbol. 379 */ 380 string unit_address; 381 private: 382 /** 383 * The properties contained within this node. 384 */ 385 std::vector<property*> properties; 386 /** 387 * The children of this node. 388 */ 389 std::vector<node*> children; 390 /** 391 * A flag indicating whether this node is valid. This is set to false 392 * if an error occurs during parsing. 393 */ 394 bool valid; 395 /** 396 * Parses a name inside a node, writing the string passed as the last 397 * argument as an error if it fails. 398 */ 399 string parse_name(input_buffer &input, 400 bool &is_property, 401 const char *error); 402 /** 403 * Constructs a new node from two input buffers, pointing to the struct 404 * and strings tables in the device tree blob, respectively. 405 */ 406 node(input_buffer &structs, input_buffer &strings); 407 /** 408 * Parses a new node from the specified input buffer. This is called 409 * when the input cursor is on the open brace for the start of the 410 * node. The name, and optionally label and unit address, should have 411 * already been parsed. 412 */ 413 node(input_buffer &input, string n, string l, string a, define_map*); 414 /** 415 * Comparison function for properties, used when sorting the properties 416 * vector. Orders the properties based on their names. 417 */ 418 static inline bool cmp_properties(property *p1, property *p2); 419 /* 420 { 421 return p1->get_key() < p2->get_key(); 422 } 423 */ 424 /** 425 * Comparison function for nodes, used when sorting the children 426 * vector. Orders the nodes based on their names or, if the names are 427 * the same, by the unit addresses. 428 */ 429 static inline bool cmp_children(node *c1, node *c2); 430 /* 431 { 432 if (c1->name == c2->name) 433 { 434 return c1->unit_address < c2->unit_address; 435 } 436 return c1->name < c2->name; 437 } 438 */ 439 public: 440 /** 441 * Sorts the node's properties and children into alphabetical order and 442 * recursively sorts the children. 443 */ 444 void sort(); 445 /** 446 * Iterator type for child nodes. 447 */ 448 typedef std::vector<node*>::iterator child_iterator; 449 /** 450 * Returns an iterator for the first child of this node. 451 */ 452 inline child_iterator child_begin() 453 { 454 return children.begin(); 455 } 456 /** 457 * Returns an iterator after the last child of this node. 458 */ 459 inline child_iterator child_end() 460 { 461 return children.end(); 462 } 463 /** 464 * Iterator type for properties of a node. 465 */ 466 typedef std::vector<property*>::iterator property_iterator; 467 /** 468 * Returns an iterator after the last property of this node. 469 */ 470 inline property_iterator property_begin() 471 { 472 return properties.begin(); 473 } 474 /** 475 * Returns an iterator for the first property of this node. 476 */ 477 inline property_iterator property_end() 478 { 479 return properties.end(); 480 } 481 /** 482 * Factory method for constructing a new node. Attempts to parse a 483 * node in DTS format from the input, and returns it on success. On 484 * any parse error, this will return 0. This should be called with the 485 * cursor on the open brace of the property, after the name and so on 486 * have been parsed. 487 */ 488 static node* parse(input_buffer &input, 489 string name, 490 string label=string(), 491 string address=string(), 492 define_map *defines=0); 493 /** 494 * Factory method for constructing a new node. Attempts to parse a 495 * node in DTB format from the input, and returns it on success. On 496 * any parse error, this will return 0. This should be called with the 497 * cursor on the open brace of the property, after the name and so on 498 * have been parsed. 499 */ 500 static node* parse_dtb(input_buffer &structs, input_buffer &strings); 501 /** 502 * Destroys the node, recursively deleting all of its properties and 503 * children. 504 */ 505 ~node(); 506 /** 507 * Returns a property corresponding to the specified key, or 0 if this 508 * node does not contain a property of that name. 509 */ 510 property *get_property(string key); 511 /** 512 * Adds a new property to this node. 513 */ 514 inline void add_property(property *p) 515 { 516 properties.push_back(p); 517 } 518 /** 519 * Merges a node into this one. Any properties present in both are 520 * overridden, any properties present in only one are preserved. 521 */ 522 void merge_node(node *other); 523 /** 524 * Write this node to the specified output. Although nodes do not 525 * refer to a string table directly, their properties do. The string 526 * table passed as the second argument is used for the names of 527 * properties within this node and its children. 528 */ 529 void write(dtb::output_writer &writer, dtb::string_table &strings); 530 /** 531 * Writes the current node as DTS to the specified file. The second 532 * parameter is the indent level. This function will start every line 533 * with this number of tabs. 534 */ 535 void write_dts(FILE *file, int indent); 536 }; 537 538 /** 539 * Class encapsulating the entire parsed FDT. This is the top-level class, 540 * which parses the entire DTS representation and write out the finished 541 * version. 542 */ 543 class device_tree 544 { 545 public: 546 /** 547 * Type used for node paths. A node path is sequence of names and unit 548 * addresses. 549 */ 550 typedef std::vector<std::pair<string,string> > node_path; 551 /** 552 * Name that we should use for phandle nodes. 553 */ 554 enum phandle_format 555 { 556 /** linux,phandle */ 557 LINUX, 558 /** phandle */ 559 EPAPR, 560 /** Create both nodes. */ 561 BOTH 562 }; 563 private: 564 /** 565 * The format that we should use for writing phandles. 566 */ 567 phandle_format phandle_node_name; 568 /** 569 * Flag indicating that this tree is valid. This will be set to false 570 * on parse errors. 571 */ 572 bool valid; 573 /** 574 * Type used for memory reservations. A reservation is two 64-bit 575 * values indicating a base address and length in memory that the 576 * kernel should not use. The high 32 bits are ignored on 32-bit 577 * platforms. 578 */ 579 typedef std::pair<uint64_t, uint64_t> reservation; 580 /** 581 * The memory reserves table. 582 */ 583 std::vector<reservation> reservations; 584 /** 585 * Root node. All other nodes are children of this node. 586 */ 587 node *root; 588 /** 589 * Mapping from names to nodes. Only unambiguous names are recorded, 590 * duplicate names are stored as (node*)-1. 591 */ 592 std::map<string, node*> node_names; 593 /** 594 * A map from labels to node paths. When resolving cross references, 595 * we look up referenced nodes in this and replace the cross reference 596 * with the full path to its target. 597 */ 598 std::map<string, node_path> node_paths; 599 /** 600 * A collection of property values that are references to other nodes. 601 * These should be expanded to the full path of their targets. 602 */ 603 std::vector<property_value*> cross_references; 604 /** 605 * A collection of property values that refer to phandles. These will 606 * be replaced by the value of the phandle property in their 607 * destination. 608 */ 609 std::vector<property_value*> phandles; 610 /** 611 * A collection of input buffers that we are using. These input 612 * buffers are the ones that own their memory, and so we must preserve 613 * them for the lifetime of the device tree. 614 */ 615 std::vector<input_buffer*> buffers; 616 /** 617 * A map of used phandle values to nodes. All phandles must be unique, 618 * so we keep a set of ones that the user explicitly provides in the 619 * input to ensure that we don't reuse them. 620 * 621 * This is a map, rather than a set, because we also want to be able to 622 * find phandles that were provided by the user explicitly when we are 623 * doing checking. 624 */ 625 std::map<uint32_t, node*> used_phandles; 626 /** 627 * Paths to search for include files. This contains a set of 628 * nul-terminated strings, which are not owned by this class and so 629 * must be freed separately. 630 */ 631 std::vector<const char*> include_paths; 632 /** 633 * Dictionary of predefined macros provided on the command line. 634 */ 635 define_map defines; 636 /** 637 * The default boot CPU, specified in the device tree header. 638 */ 639 uint32_t boot_cpu; 640 /** 641 * The number of empty reserve map entries to generate in the blob. 642 */ 643 uint32_t spare_reserve_map_entries; 644 /** 645 * The minimum size in bytes of the blob. 646 */ 647 uint32_t minimum_blob_size; 648 /** 649 * The number of bytes of padding to add to the end of the blob. 650 */ 651 uint32_t blob_padding; 652 /** 653 * Visit all of the nodes recursively, and if they have labels then add 654 * them to the node_paths and node_names vectors so that they can be 655 * used in resolving cross references. Also collects phandle 656 * properties that have been explicitly added. 657 */ 658 void collect_names_recursive(node* n, node_path &path); 659 /** 660 * Calls the recursive version of this method on every root node. 661 */ 662 void collect_names(); 663 /** 664 * Resolves all cross references. Any properties that refer to another 665 * node must have their values replaced by either the node path or 666 * phandle value. 667 */ 668 void resolve_cross_references(); 669 /** 670 * Parses root nodes from the top level of a dts file. 671 */ 672 void parse_roots(input_buffer &input, std::vector<node*> &roots); 673 /** 674 * Allocates a new mmap()'d input buffer for use in parsing. This 675 * object then keeps a reference to it, ensuring that it is not 676 * deallocated until the device tree is destroyed. 677 */ 678 input_buffer *buffer_for_file(const char *path); 679 /** 680 * Template function that writes a dtb blob using the specified writer. 681 * The writer defines the output format (assembly, blob). 682 */ 683 template<class writer> 684 void write(int fd); 685 public: 686 /** 687 * Returns the node referenced by the property. If this is a tree that 688 * is in source form, then we have a string that we can use to index 689 * the cross_references array and so we can just look that up. 690 */ 691 node *referenced_node(property_value &v); 692 /** 693 * Writes this FDT as a DTB to the specified output. 694 */ 695 void write_binary(int fd); 696 /** 697 * Writes this FDT as an assembly representation of the DTB to the 698 * specified output. The result can then be assembled and linked into 699 * a program. 700 */ 701 void write_asm(int fd); 702 /** 703 * Writes the tree in DTS (source) format. 704 */ 705 void write_dts(int fd); 706 /** 707 * Default constructor. Creates a valid, but empty FDT. 708 */ 709 device_tree() : phandle_node_name(EPAPR), valid(true), root(0), 710 boot_cpu(0), spare_reserve_map_entries(0), 711 minimum_blob_size(0), blob_padding(0) {} 712 /** 713 * Constructs a device tree from the specified file name, referring to 714 * a file that contains a device tree blob. 715 */ 716 void parse_dtb(const char *fn, FILE *depfile); 717 /** 718 * Constructs a device tree from the specified file name, referring to 719 * a file that contains device tree source. 720 */ 721 void parse_dts(const char *fn, FILE *depfile); 722 /** 723 * Destroy the tree and any input buffers that it holds. 724 */ 725 ~device_tree(); 726 /** 727 * Returns whether this tree is valid. 728 */ 729 inline bool is_valid() 730 { 731 return valid; 732 } 733 /** 734 * Sets the format for writing phandle properties. 735 */ 736 inline void set_phandle_format(phandle_format f) 737 { 738 phandle_node_name = f; 739 } 740 /** 741 * Returns a pointer to the root node of this tree. No ownership 742 * transfer. 743 */ 744 inline node *get_root() const 745 { 746 return root; 747 } 748 /** 749 * Sets the physical boot CPU. 750 */ 751 void set_boot_cpu(uint32_t cpu) 752 { 753 boot_cpu = cpu; 754 } 755 /** 756 * Sorts the tree. Useful for debugging device trees. 757 */ 758 void sort() 759 { 760 root->sort(); 761 } 762 /** 763 * Adds a path to search for include files. The argument must be a 764 * nul-terminated string representing the path. The device tree keeps 765 * a pointer to this string, but does not own it: the caller is 766 * responsible for freeing it if required. 767 */ 768 void add_include_path(const char *path) 769 { 770 include_paths.push_back(path); 771 } 772 /** 773 * Sets the number of empty reserve map entries to add. 774 */ 775 void set_empty_reserve_map_entries(uint32_t e) 776 { 777 spare_reserve_map_entries = e; 778 } 779 /** 780 * Sets the minimum size, in bytes, of the blob. 781 */ 782 void set_blob_minimum_size(uint32_t s) 783 { 784 minimum_blob_size = s; 785 } 786 /** 787 * Sets the amount of padding to add to the blob. 788 */ 789 void set_blob_padding(uint32_t p) 790 { 791 blob_padding = p; 792 } 793 /** 794 * Parses a predefined macro value. 795 */ 796 bool parse_define(const char *def); 797 }; 798 799 } // namespace fdt 800 801 } // namespace dtc 802 803 #endif // !_FDT_HH_ 804