| #include <fdt.h> |
| #include "testdata.h" |
| |
| .macro fdtlong val |
| .byte ((\val) >> 24) & 0xff |
| .byte ((\val) >> 16) & 0xff |
| .byte ((\val) >> 8) & 0xff |
| .byte (\val) & 0xff |
| .endm |
| |
| .macro treehdr tree |
| .balign 8 |
| .globl \tree |
| \tree : |
| fdtlong FDT_MAGIC |
| fdtlong (\tree\()_end - \tree) |
| fdtlong (\tree\()_struct - \tree) |
| fdtlong (\tree\()_strings - \tree) |
| fdtlong (\tree\()_rsvmap - \tree) |
| fdtlong 0x11 |
| fdtlong 0x10 |
| fdtlong 0 |
| fdtlong (\tree\()_strings_end - \tree\()_strings) |
| fdtlong (\tree\()_struct_end - \tree\()_struct) |
| .endm |
| |
| .macro rsvmape addrh, addrl, lenh, lenl |
| fdtlong \addrh |
| fdtlong \addrl |
| fdtlong \lenh |
| fdtlong \lenl |
| .endm |
| |
| .macro empty_rsvmap tree |
| .balign 8 |
| \tree\()_rsvmap: |
| rsvmape 0, 0, 0, 0 |
| \tree\()_rsvmap_end: |
| .endm |
| |
| .macro prophdr tree, name, len |
| fdtlong FDT_PROP |
| fdtlong \len |
| fdtlong (\tree\()_\name - \tree\()_strings) |
| .endm |
| |
| .macro propnil tree, name |
| prophdr \tree, \name, 0 |
| .endm |
| |
| .macro propu32 tree, name, val |
| prophdr \tree, \name, 4 |
| fdtlong \val |
| .endm |
| |
| .macro propu64 tree, name, valh, vall |
| prophdr \tree, \name, 8 |
| fdtlong \valh |
| fdtlong \vall |
| .endm |
| |
| .macro propstr tree, name, str:vararg |
| prophdr \tree, \name, (55f - 54f) |
| 54: |
| .asciz \str |
| 55: |
| .balign 4 |
| .endm |
| |
| .macro beginn name:vararg |
| fdtlong FDT_BEGIN_NODE |
| .asciz \name |
| .balign 4 |
| .endm |
| |
| .macro endn |
| fdtlong FDT_END_NODE |
| .endm |
| |
| .macro string tree, name, str:vararg |
| \tree\()_\name : |
| .asciz \str |
| .endm |
| |
| |
| .data |
| |
| treehdr test_tree1 |
| |
| .balign 8 |
| test_tree1_rsvmap: |
| rsvmape TEST_ADDR_1H, TEST_ADDR_1L, TEST_SIZE_1H, TEST_SIZE_1L |
| rsvmape TEST_ADDR_2H, TEST_ADDR_2L, TEST_SIZE_2H, TEST_SIZE_2L |
| rsvmape 0, 0, 0, 0 |
| test_tree1_rsvmap_end: |
| |
| test_tree1_struct: |
| beginn "" |
| propstr test_tree1, compatible, "test_tree1" |
| propu32 test_tree1, prop_int, TEST_VALUE_1 |
| propu64 test_tree1, prop_int64, TEST_VALUE64_1H, TEST_VALUE64_1L |
| propstr test_tree1, prop_str, TEST_STRING_1 |
| propu32 test_tree1, address_cells, 1 |
| propu32 test_tree1, size_cells, 0 |
| |
| beginn "subnode@1" |
| propstr test_tree1, compatible, "subnode1" |
| propu32 test_tree1, reg, 1 |
| propu32 test_tree1, prop_int, TEST_VALUE_1 |
| |
| beginn "subsubnode" |
| propstr test_tree1, compatible, "subsubnode1\0subsubnode" |
| propstr test_tree1, placeholder, "this is a placeholder string\0string2" |
| propu32 test_tree1, prop_int, TEST_VALUE_1 |
| endn |
| |
| beginn "ss1" |
| endn |
| |
| endn |
| |
| beginn "subnode@2" |
| propu32 test_tree1, reg, 2 |
| propu32 test_tree1, linux_phandle, PHANDLE_1 |
| propu32 test_tree1, prop_int, TEST_VALUE_2 |
| propu32 test_tree1, address_cells, 1 |
| propu32 test_tree1, size_cells, 0 |
| |
| beginn "subsubnode@0" |
| propu32 test_tree1, reg, 0 |
| propu32 test_tree1, phandle, PHANDLE_2 |
| propstr test_tree1, compatible, "subsubnode2\0subsubnode" |
| propu32 test_tree1, prop_int, TEST_VALUE_2 |
| endn |
| |
| beginn "ss2" |
| endn |
| |
| endn |
| |
| endn |
| fdtlong FDT_END |
| test_tree1_struct_end: |
| |
| test_tree1_strings: |
| string test_tree1, compatible, "compatible" |
| string test_tree1, prop_int, "prop-int" |
| string test_tree1, prop_int64, "prop-int64" |
| string test_tree1, prop_str, "prop-str" |
| string test_tree1, linux_phandle, "linux,phandle" |
| string test_tree1, phandle, "phandle" |
| string test_tree1, reg, "reg" |
| string test_tree1, placeholder, "placeholder" |
| string test_tree1, address_cells, "#address-cells" |
| string test_tree1, size_cells, "#size-cells" |
| test_tree1_strings_end: |
| test_tree1_end: |
| |
| |
| treehdr truncated_property |
| empty_rsvmap truncated_property |
| |
| truncated_property_struct: |
| beginn "" |
| prophdr truncated_property, prop_truncated, 4 |
| /* Oops, no actual property data here */ |
| truncated_property_struct_end: |
| |
| truncated_property_strings: |
| string truncated_property, prop_truncated, "truncated" |
| truncated_property_strings_end: |
| |
| truncated_property_end: |
| |
| |
| treehdr bad_node_char |
| empty_rsvmap bad_node_char |
| |
| bad_node_char_struct: |
| beginn "" |
| beginn "sub$node" |
| endn |
| endn |
| fdtlong FDT_END |
| bad_node_char_struct_end: |
| |
| bad_node_char_strings: |
| bad_node_char_strings_end: |
| bad_node_char_end: |
| |
| |
| treehdr bad_node_format |
| empty_rsvmap bad_node_format |
| |
| bad_node_format_struct: |
| beginn "" |
| beginn "subnode@1@2" |
| endn |
| endn |
| fdtlong FDT_END |
| bad_node_format_struct_end: |
| |
| bad_node_format_strings: |
| bad_node_format_strings_end: |
| bad_node_format_end: |
| |
| |
| treehdr bad_prop_char |
| empty_rsvmap bad_prop_char |
| |
| bad_prop_char_struct: |
| beginn "" |
| propu32 bad_prop_char, prop, TEST_VALUE_1 |
| endn |
| fdtlong FDT_END |
| bad_prop_char_struct_end: |
| |
| bad_prop_char_strings: |
| string bad_prop_char, prop, "prop$erty" |
| bad_prop_char_strings_end: |
| bad_prop_char_end: |
| |
| |
| /* overflow_size_strings */ |
| .balign 8 |
| .globl ovf_size_strings |
| ovf_size_strings: |
| fdtlong FDT_MAGIC |
| fdtlong (ovf_size_strings_end - ovf_size_strings) |
| fdtlong (ovf_size_strings_struct - ovf_size_strings) |
| fdtlong (ovf_size_strings_strings - ovf_size_strings) |
| fdtlong (ovf_size_strings_rsvmap - ovf_size_strings) |
| fdtlong 0x11 |
| fdtlong 0x10 |
| fdtlong 0 |
| fdtlong 0xffffffff |
| fdtlong (ovf_size_strings_struct_end - ovf_size_strings_struct) |
| empty_rsvmap ovf_size_strings |
| |
| ovf_size_strings_struct: |
| beginn "" |
| propu32 ovf_size_strings, bad_string, 0 |
| endn |
| fdtlong FDT_END |
| ovf_size_strings_struct_end: |
| |
| ovf_size_strings_strings: |
| string ovf_size_strings, x, "x" |
| ovf_size_strings_bad_string = ovf_size_strings_strings + 0x10000000 |
| ovf_size_strings_strings_end: |
| ovf_size_strings_end: |
| |
| |
| /* truncated_string */ |
| treehdr truncated_string |
| empty_rsvmap truncated_string |
| |
| truncated_string_struct: |
| beginn "" |
| propnil truncated_string, good_string |
| propnil truncated_string, bad_string |
| endn |
| fdtlong FDT_END |
| truncated_string_struct_end: |
| |
| truncated_string_strings: |
| string truncated_string, good_string, "good" |
| truncated_string_bad_string: |
| .ascii "bad" |
| /* NOTE: terminating \0 deliberately missing */ |
| truncated_string_strings_end: |
| truncated_string_end: |
| |
| |
| /* truncated_memrsv */ |
| treehdr truncated_memrsv |
| |
| truncated_memrsv_struct: |
| beginn "" |
| endn |
| fdtlong FDT_END |
| truncated_memrsv_struct_end: |
| |
| truncated_memrsv_strings: |
| truncated_memrsv_strings_end: |
| |
| .balign 8 |
| truncated_memrsv_rsvmap: |
| rsvmape TEST_ADDR_1H, TEST_ADDR_1L, TEST_SIZE_1H, TEST_SIZE_1L |
| truncated_memrsv_rsvmap_end: |
| |
| truncated_memrsv_end: |
| |
| |
| /* two root nodes */ |
| treehdr two_roots |
| empty_rsvmap two_roots |
| |
| two_roots_struct: |
| beginn "" |
| endn |
| beginn "" |
| endn |
| fdtlong FDT_END |
| two_roots_struct_end: |
| |
| two_roots_strings: |
| two_roots_strings_end: |
| |
| two_roots_end: |
| |
| |
| /* root node with a non-empty name */ |
| treehdr named_root |
| empty_rsvmap named_root |
| |
| named_root_struct: |
| beginn "fake" |
| endn |
| fdtlong FDT_END |
| named_root_struct_end: |
| |
| named_root_strings: |
| named_root_strings_end: |
| |
| named_root_end: |