xref: /netbsd-src/external/gpl2/dtc/dist/tests/integer-expressions.c (revision cc7d2833ecf67da5a5ddc470841931eb9f6723e4)
1*cc7d2833Sskrll /*	$NetBSD: integer-expressions.c,v 1.1.1.3 2019/12/22 12:34:06 skrll Exp $	*/
2d89652e2Sskrll 
3*cc7d2833Sskrll // SPDX-License-Identifier: LGPL-2.1-or-later
4b8ae3907Smacallan /*
5b8ae3907Smacallan  * Testcase for dtc expression support
6b8ae3907Smacallan  *
7b8ae3907Smacallan  * Copyright (C) 2008 David Gibson, IBM Corporation.
8b8ae3907Smacallan  */
9b8ae3907Smacallan 
10b8ae3907Smacallan #include <stdlib.h>
11b8ae3907Smacallan #include <stdio.h>
12b8ae3907Smacallan #include <string.h>
13b8ae3907Smacallan #include <stdint.h>
14b8ae3907Smacallan #include <errno.h>
15b8ae3907Smacallan 
16b8ae3907Smacallan 
17b8ae3907Smacallan #include <libfdt.h>
18b8ae3907Smacallan 
19b8ae3907Smacallan #include "tests.h"
20b8ae3907Smacallan #include "testdata.h"
21b8ae3907Smacallan 
22d89652e2Sskrll static struct test_expr {
23b8ae3907Smacallan 	const char *expr;
24b8ae3907Smacallan 	uint32_t result;
25b8ae3907Smacallan } expr_table[] = {
26b8ae3907Smacallan #define TE(expr)	{ #expr, (expr) }
27b8ae3907Smacallan 	TE(0xdeadbeef),
28b8ae3907Smacallan 	TE(-0x21524111),
29b8ae3907Smacallan 	TE(1+1),
30b8ae3907Smacallan 	TE(2*3),
31b8ae3907Smacallan 	TE(4/2),
32b8ae3907Smacallan 	TE(10/3),
33b8ae3907Smacallan 	TE(19%4),
34b8ae3907Smacallan 	TE(1 << 13),
35b8ae3907Smacallan 	TE(0x1000 >> 4),
36b8ae3907Smacallan 	TE(3*2+1), TE(3*(2+1)),
37b8ae3907Smacallan 	TE(1+2*3), TE((1+2)*3),
38b8ae3907Smacallan 	TE(1 < 2), TE(2 < 1), TE(1 < 1),
39b8ae3907Smacallan 	TE(1 <= 2), TE(2 <= 1), TE(1 <= 1),
40b8ae3907Smacallan 	TE(1 > 2), TE(2 > 1), TE(1 > 1),
41b8ae3907Smacallan 	TE(1 >= 2), TE(2 >= 1), TE(1 >= 1),
42b8ae3907Smacallan 	TE(1 == 1), TE(1 == 2),
43b8ae3907Smacallan 	TE(1 != 1), TE(1 != 2),
44b8ae3907Smacallan 	TE(0xabcdabcd & 0xffff0000),
45b8ae3907Smacallan 	TE(0xdead4110 ^ 0xf0f0f0f0),
46b8ae3907Smacallan 	TE(0xabcd0000 | 0x0000abcd),
47b8ae3907Smacallan 	TE(~0x21524110),
48b8ae3907Smacallan 	TE(~~0xdeadbeef),
49b8ae3907Smacallan 	TE(0 && 0), TE(17 && 0), TE(0 && 17), TE(17 && 17),
50b8ae3907Smacallan 	TE(0 || 0), TE(17 || 0), TE(0 || 17), TE(17 || 17),
51b8ae3907Smacallan 	TE(!0), TE(!1), TE(!17), TE(!!0), TE(!!17),
52b8ae3907Smacallan 	TE(0 ? 17 : 39), TE(1 ? 17 : 39), TE(17 ? 0xdeadbeef : 0xabcd1234),
53b8ae3907Smacallan 	TE(11 * 257 * 1321517ULL),
54b8ae3907Smacallan 	TE(123456790 - 4/2 + 17%4),
55b8ae3907Smacallan };
56b8ae3907Smacallan 
57b8ae3907Smacallan #define ARRAY_SIZE(x)	(sizeof(x) / sizeof((x)[0]))
58b8ae3907Smacallan 
main(int argc,char * argv[])59b8ae3907Smacallan int main(int argc, char *argv[])
60b8ae3907Smacallan {
61b8ae3907Smacallan 	void *fdt;
62d89652e2Sskrll 	const fdt32_t *res;
63b8ae3907Smacallan 	int reslen;
64b8ae3907Smacallan 	int i;
65b8ae3907Smacallan 
66b8ae3907Smacallan 	test_init(argc, argv);
67b8ae3907Smacallan 
68b8ae3907Smacallan 	if ((argc == 3) && (strcmp(argv[1], "-g") == 0)) {
69b8ae3907Smacallan 		FILE *f = fopen(argv[2], "w");
70b8ae3907Smacallan 
71b8ae3907Smacallan 		if (!f)
72b8ae3907Smacallan 			FAIL("Couldn't open \"%s\" for output: %s\n",
73b8ae3907Smacallan 			     argv[2], strerror(errno));
74b8ae3907Smacallan 
75b8ae3907Smacallan 		fprintf(f, "/dts-v1/;\n");
76b8ae3907Smacallan 		fprintf(f, "/ {\n");
77b8ae3907Smacallan 		fprintf(f, "\texpressions = <\n");
78b8ae3907Smacallan 		for (i = 0; i < ARRAY_SIZE(expr_table); i++)
79b8ae3907Smacallan 			fprintf(f, "\t\t(%s)\n", expr_table[i].expr);
80b8ae3907Smacallan 		fprintf(f, "\t>;\n");
81b8ae3907Smacallan 		fprintf(f, "};\n");
82b8ae3907Smacallan 		fclose(f);
83b8ae3907Smacallan 	} else {
84b8ae3907Smacallan 		fdt = load_blob_arg(argc, argv);
85b8ae3907Smacallan 
86b8ae3907Smacallan 		res = fdt_getprop(fdt, 0, "expressions", &reslen);
87b8ae3907Smacallan 
88b8ae3907Smacallan 		if (!res)
89*cc7d2833Sskrll 			FAIL("Error retrieving expression results: %s\n",
90b8ae3907Smacallan 		     fdt_strerror(reslen));
91b8ae3907Smacallan 
92b8ae3907Smacallan 		if (reslen != (ARRAY_SIZE(expr_table) * sizeof(uint32_t)))
93b8ae3907Smacallan 			FAIL("Unexpected length of results %d instead of %zd\n",
94b8ae3907Smacallan 			     reslen, ARRAY_SIZE(expr_table) * sizeof(uint32_t));
95b8ae3907Smacallan 
96b8ae3907Smacallan 		for (i = 0; i < ARRAY_SIZE(expr_table); i++)
97b8ae3907Smacallan 			if (fdt32_to_cpu(res[i]) != expr_table[i].result)
98b8ae3907Smacallan 				FAIL("Incorrect result for expression \"%s\","
99b8ae3907Smacallan 				     " 0x%x instead of 0x%x\n",
100b8ae3907Smacallan 				     expr_table[i].expr, fdt32_to_cpu(res[i]),
101b8ae3907Smacallan 				     expr_table[i].result);
102b8ae3907Smacallan 	}
103b8ae3907Smacallan 
104b8ae3907Smacallan 	PASS();
105b8ae3907Smacallan }
106