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