1*cd60bc56SAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1-or-later
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker * libfdt - Flat Device Tree manipulation
4*cd60bc56SAndroid Build Coastguard Worker * Testcase for fdt_check_header
5*cd60bc56SAndroid Build Coastguard Worker * Copyright (C) 2018 David Gibson
6*cd60bc56SAndroid Build Coastguard Worker */
7*cd60bc56SAndroid Build Coastguard Worker
8*cd60bc56SAndroid Build Coastguard Worker #include <stdio.h>
9*cd60bc56SAndroid Build Coastguard Worker
10*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
11*cd60bc56SAndroid Build Coastguard Worker
12*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
13*cd60bc56SAndroid Build Coastguard Worker
dtdup(void * dt)14*cd60bc56SAndroid Build Coastguard Worker static void *dtdup(void *dt)
15*cd60bc56SAndroid Build Coastguard Worker {
16*cd60bc56SAndroid Build Coastguard Worker size_t bufsize = fdt_totalsize(dt);
17*cd60bc56SAndroid Build Coastguard Worker void *buf = xmalloc(bufsize);
18*cd60bc56SAndroid Build Coastguard Worker fdt_move(dt, buf, bufsize);
19*cd60bc56SAndroid Build Coastguard Worker return buf;
20*cd60bc56SAndroid Build Coastguard Worker }
21*cd60bc56SAndroid Build Coastguard Worker
22*cd60bc56SAndroid Build Coastguard Worker #define CHECK_MANGLE(exerr, code) \
23*cd60bc56SAndroid Build Coastguard Worker do { \
24*cd60bc56SAndroid Build Coastguard Worker void *fdt = dtdup(template); \
25*cd60bc56SAndroid Build Coastguard Worker { code } \
26*cd60bc56SAndroid Build Coastguard Worker err = fdt_check_header(fdt); \
27*cd60bc56SAndroid Build Coastguard Worker verbose_printf("\"%s\" => %s\n", #code, fdt_strerror(err)); \
28*cd60bc56SAndroid Build Coastguard Worker if (err != (exerr)) \
29*cd60bc56SAndroid Build Coastguard Worker FAIL("fdt_check_header() didn't catch mangle %s", \
30*cd60bc56SAndroid Build Coastguard Worker #code); \
31*cd60bc56SAndroid Build Coastguard Worker free(fdt); \
32*cd60bc56SAndroid Build Coastguard Worker } while (0)
33*cd60bc56SAndroid Build Coastguard Worker
main(int argc,char * argv[])34*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
35*cd60bc56SAndroid Build Coastguard Worker {
36*cd60bc56SAndroid Build Coastguard Worker void *template;
37*cd60bc56SAndroid Build Coastguard Worker int err;
38*cd60bc56SAndroid Build Coastguard Worker
39*cd60bc56SAndroid Build Coastguard Worker test_init(argc, argv);
40*cd60bc56SAndroid Build Coastguard Worker template = load_blob(argv[1]);
41*cd60bc56SAndroid Build Coastguard Worker
42*cd60bc56SAndroid Build Coastguard Worker /* Check that the base dt is valid before mangling it */
43*cd60bc56SAndroid Build Coastguard Worker err = fdt_check_header(template);
44*cd60bc56SAndroid Build Coastguard Worker if (err != 0)
45*cd60bc56SAndroid Build Coastguard Worker FAIL("Base tree fails: %s", fdt_strerror(err));
46*cd60bc56SAndroid Build Coastguard Worker
47*cd60bc56SAndroid Build Coastguard Worker /* Check a no-op mangle doesn't break things */
48*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(0, ; );
49*cd60bc56SAndroid Build Coastguard Worker
50*cd60bc56SAndroid Build Coastguard Worker /* Mess up the magic number */
51*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_BADMAGIC,
52*cd60bc56SAndroid Build Coastguard Worker fdt_set_magic(fdt, fdt_magic(fdt) ^ 0x1);
53*cd60bc56SAndroid Build Coastguard Worker );
54*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_BADMAGIC,
55*cd60bc56SAndroid Build Coastguard Worker fdt_set_magic(fdt, fdt_magic(fdt) ^ 0x80000000);
56*cd60bc56SAndroid Build Coastguard Worker );
57*cd60bc56SAndroid Build Coastguard Worker
58*cd60bc56SAndroid Build Coastguard Worker /* Mess up the version */
59*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_BADVERSION,
60*cd60bc56SAndroid Build Coastguard Worker fdt_set_version(fdt, FDT_FIRST_SUPPORTED_VERSION - 1);
61*cd60bc56SAndroid Build Coastguard Worker fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION - 1);
62*cd60bc56SAndroid Build Coastguard Worker );
63*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_BADVERSION,
64*cd60bc56SAndroid Build Coastguard Worker fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION + 1);
65*cd60bc56SAndroid Build Coastguard Worker fdt_set_last_comp_version(fdt, FDT_LAST_SUPPORTED_VERSION + 1);
66*cd60bc56SAndroid Build Coastguard Worker );
67*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_BADVERSION,
68*cd60bc56SAndroid Build Coastguard Worker fdt_set_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
69*cd60bc56SAndroid Build Coastguard Worker fdt_set_last_comp_version(fdt, FDT_LAST_SUPPORTED_VERSION);
70*cd60bc56SAndroid Build Coastguard Worker );
71*cd60bc56SAndroid Build Coastguard Worker
72*cd60bc56SAndroid Build Coastguard Worker /* Out of bounds sizes */
73*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
74*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, FDT_V1_SIZE - 1);
75*cd60bc56SAndroid Build Coastguard Worker );
76*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
77*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, (uint32_t)INT_MAX + 1);
78*cd60bc56SAndroid Build Coastguard Worker );
79*cd60bc56SAndroid Build Coastguard Worker
80*cd60bc56SAndroid Build Coastguard Worker /* Truncate within various blocks */
81*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
82*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_dt_struct(fdt) - 1);
83*cd60bc56SAndroid Build Coastguard Worker );
84*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
85*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_dt_strings(fdt) - 1);
86*cd60bc56SAndroid Build Coastguard Worker );
87*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
88*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_mem_rsvmap(fdt) - 1);
89*cd60bc56SAndroid Build Coastguard Worker );
90*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
91*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_dt_struct(fdt) + 1);
92*cd60bc56SAndroid Build Coastguard Worker );
93*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
94*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_dt_strings(fdt) + 1);
95*cd60bc56SAndroid Build Coastguard Worker );
96*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
97*cd60bc56SAndroid Build Coastguard Worker fdt_set_totalsize(fdt, fdt_off_mem_rsvmap(fdt) + 1);
98*cd60bc56SAndroid Build Coastguard Worker );
99*cd60bc56SAndroid Build Coastguard Worker
100*cd60bc56SAndroid Build Coastguard Worker /* Negative block sizes */
101*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
102*cd60bc56SAndroid Build Coastguard Worker fdt_set_size_dt_struct(fdt, (uint32_t)-1);
103*cd60bc56SAndroid Build Coastguard Worker );
104*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
105*cd60bc56SAndroid Build Coastguard Worker fdt_set_size_dt_strings(fdt, (uint32_t)-1);
106*cd60bc56SAndroid Build Coastguard Worker );
107*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
108*cd60bc56SAndroid Build Coastguard Worker fdt_set_size_dt_struct(fdt, (uint32_t)INT_MIN);
109*cd60bc56SAndroid Build Coastguard Worker );
110*cd60bc56SAndroid Build Coastguard Worker CHECK_MANGLE(-FDT_ERR_TRUNCATED,
111*cd60bc56SAndroid Build Coastguard Worker fdt_set_size_dt_strings(fdt, (uint32_t)INT_MIN);
112*cd60bc56SAndroid Build Coastguard Worker );
113*cd60bc56SAndroid Build Coastguard Worker
114*cd60bc56SAndroid Build Coastguard Worker PASS();
115*cd60bc56SAndroid Build Coastguard Worker }
116