xref: /aosp_15_r20/external/dtc/tests/check_header.c (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
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