d24cc189dc
tests/trees.S is a weird thing: a portable aseembler file, used to produce a specific binary output. Currently it uses CPP macros quite heavily to construct the dtbs we want (including some partial and broken trees). Using cpp has the side effect that we need to use ; separators between instructions (or, rather, pseudo-ops), because cpp won't expand newlines. However, it turns out that while ; is a suitable separator on most targets, it doesn't work for all of them (e.g. HP PA-RISC). Switch to using the assembler's inbuilt macros rather than CPP, so that we can use genuine newlines. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
326 lines
6.4 KiB
ArmAsm
326 lines
6.4 KiB
ArmAsm
#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:
|