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/tool constructing an fs tree for further test
5*cd60bc56SAndroid Build Coastguard Worker * Copyright (C) 2018 David Gibson, Red Hat Inc.
6*cd60bc56SAndroid Build Coastguard Worker */
7*cd60bc56SAndroid Build Coastguard Worker
8*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
9*cd60bc56SAndroid Build Coastguard Worker #include <stdio.h>
10*cd60bc56SAndroid Build Coastguard Worker #include <string.h>
11*cd60bc56SAndroid Build Coastguard Worker #include <limits.h>
12*cd60bc56SAndroid Build Coastguard Worker #include <stdint.h>
13*cd60bc56SAndroid Build Coastguard Worker #include <sys/stat.h>
14*cd60bc56SAndroid Build Coastguard Worker #include <errno.h>
15*cd60bc56SAndroid Build Coastguard Worker #include <unistd.h>
16*cd60bc56SAndroid Build Coastguard Worker #include <fcntl.h>
17*cd60bc56SAndroid Build Coastguard Worker
18*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
19*cd60bc56SAndroid Build Coastguard Worker
20*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
21*cd60bc56SAndroid Build Coastguard Worker #include "testdata.h"
22*cd60bc56SAndroid Build Coastguard Worker
start_dir(const char * name)23*cd60bc56SAndroid Build Coastguard Worker static void start_dir(const char *name)
24*cd60bc56SAndroid Build Coastguard Worker {
25*cd60bc56SAndroid Build Coastguard Worker int rc;
26*cd60bc56SAndroid Build Coastguard Worker
27*cd60bc56SAndroid Build Coastguard Worker rc = mkdir(name, 0777);
28*cd60bc56SAndroid Build Coastguard Worker if (rc != 0)
29*cd60bc56SAndroid Build Coastguard Worker FAIL("mkdir(\"%s\"): %s", name, strerror(errno));
30*cd60bc56SAndroid Build Coastguard Worker
31*cd60bc56SAndroid Build Coastguard Worker rc = chdir(name);
32*cd60bc56SAndroid Build Coastguard Worker if (rc != 0)
33*cd60bc56SAndroid Build Coastguard Worker FAIL("chdir(\"%s\"): %s", name, strerror(errno));
34*cd60bc56SAndroid Build Coastguard Worker }
35*cd60bc56SAndroid Build Coastguard Worker
end_dir(void)36*cd60bc56SAndroid Build Coastguard Worker static void end_dir(void)
37*cd60bc56SAndroid Build Coastguard Worker {
38*cd60bc56SAndroid Build Coastguard Worker int rc;
39*cd60bc56SAndroid Build Coastguard Worker
40*cd60bc56SAndroid Build Coastguard Worker rc = chdir("..");
41*cd60bc56SAndroid Build Coastguard Worker if (rc != 0)
42*cd60bc56SAndroid Build Coastguard Worker FAIL("chdir(..): %s", strerror(errno));
43*cd60bc56SAndroid Build Coastguard Worker }
44*cd60bc56SAndroid Build Coastguard Worker
mkfile(const char * name,void * data,size_t len)45*cd60bc56SAndroid Build Coastguard Worker static void mkfile(const char *name, void *data, size_t len)
46*cd60bc56SAndroid Build Coastguard Worker {
47*cd60bc56SAndroid Build Coastguard Worker int fd;
48*cd60bc56SAndroid Build Coastguard Worker int rc;
49*cd60bc56SAndroid Build Coastguard Worker
50*cd60bc56SAndroid Build Coastguard Worker fd = open(name, O_WRONLY|O_CREAT, 0666);
51*cd60bc56SAndroid Build Coastguard Worker if (fd < 0)
52*cd60bc56SAndroid Build Coastguard Worker FAIL("open(\"%s\"): %s", name, strerror(errno));
53*cd60bc56SAndroid Build Coastguard Worker
54*cd60bc56SAndroid Build Coastguard Worker rc = write(fd, data, len);
55*cd60bc56SAndroid Build Coastguard Worker if (rc < 0)
56*cd60bc56SAndroid Build Coastguard Worker FAIL("write(\"%s\"): %s", name, strerror(errno));
57*cd60bc56SAndroid Build Coastguard Worker if ((unsigned)rc != len)
58*cd60bc56SAndroid Build Coastguard Worker FAIL("write(\"%s\"): short write", name);
59*cd60bc56SAndroid Build Coastguard Worker
60*cd60bc56SAndroid Build Coastguard Worker rc = close(fd);
61*cd60bc56SAndroid Build Coastguard Worker if (rc != 0)
62*cd60bc56SAndroid Build Coastguard Worker FAIL("close(\"%s\"): %s", name, strerror(errno));
63*cd60bc56SAndroid Build Coastguard Worker }
64*cd60bc56SAndroid Build Coastguard Worker
65*cd60bc56SAndroid Build Coastguard Worker #define mkfile_str(name, s) \
66*cd60bc56SAndroid Build Coastguard Worker do { \
67*cd60bc56SAndroid Build Coastguard Worker char str[] = s; \
68*cd60bc56SAndroid Build Coastguard Worker mkfile((name), str, sizeof(str)); \
69*cd60bc56SAndroid Build Coastguard Worker } while (0)
70*cd60bc56SAndroid Build Coastguard Worker
mkfile_u32(const char * name,uint32_t val)71*cd60bc56SAndroid Build Coastguard Worker static void mkfile_u32(const char *name, uint32_t val)
72*cd60bc56SAndroid Build Coastguard Worker {
73*cd60bc56SAndroid Build Coastguard Worker val = cpu_to_fdt32(val);
74*cd60bc56SAndroid Build Coastguard Worker mkfile(name, &val, sizeof(val));
75*cd60bc56SAndroid Build Coastguard Worker }
76*cd60bc56SAndroid Build Coastguard Worker
mkfile_u64(const char * name,uint64_t val)77*cd60bc56SAndroid Build Coastguard Worker static void mkfile_u64(const char *name, uint64_t val)
78*cd60bc56SAndroid Build Coastguard Worker {
79*cd60bc56SAndroid Build Coastguard Worker val = cpu_to_fdt64(val);
80*cd60bc56SAndroid Build Coastguard Worker mkfile(name, &val, sizeof(val));
81*cd60bc56SAndroid Build Coastguard Worker }
82*cd60bc56SAndroid Build Coastguard Worker
main(int argc,char * argv[])83*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
84*cd60bc56SAndroid Build Coastguard Worker {
85*cd60bc56SAndroid Build Coastguard Worker const char *base;
86*cd60bc56SAndroid Build Coastguard Worker
87*cd60bc56SAndroid Build Coastguard Worker test_init(argc, argv);
88*cd60bc56SAndroid Build Coastguard Worker if (argc != 2)
89*cd60bc56SAndroid Build Coastguard Worker CONFIG("Usage: %s <path>", argv[0]);
90*cd60bc56SAndroid Build Coastguard Worker
91*cd60bc56SAndroid Build Coastguard Worker base = argv[1];
92*cd60bc56SAndroid Build Coastguard Worker
93*cd60bc56SAndroid Build Coastguard Worker start_dir(base);
94*cd60bc56SAndroid Build Coastguard Worker mkfile_str("compatible", "test_tree1");
95*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("prop-int", TEST_VALUE_1);
96*cd60bc56SAndroid Build Coastguard Worker mkfile_u64("prop-int64", 0xdeadbeef01abcdefULL);
97*cd60bc56SAndroid Build Coastguard Worker mkfile_str("prop-str", "hello world");
98*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("#address-cells", 1);
99*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("#size-cells", 0);
100*cd60bc56SAndroid Build Coastguard Worker
101*cd60bc56SAndroid Build Coastguard Worker {
102*cd60bc56SAndroid Build Coastguard Worker start_dir("subnode@1");
103*cd60bc56SAndroid Build Coastguard Worker
104*cd60bc56SAndroid Build Coastguard Worker mkfile_str("compatible", "subnode1");
105*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("reg", 1);
106*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("prop-int", TEST_VALUE_1);
107*cd60bc56SAndroid Build Coastguard Worker
108*cd60bc56SAndroid Build Coastguard Worker {
109*cd60bc56SAndroid Build Coastguard Worker start_dir("subsubnode");
110*cd60bc56SAndroid Build Coastguard Worker
111*cd60bc56SAndroid Build Coastguard Worker mkfile_str("compatible", "subsubnode1\0subsubnode");
112*cd60bc56SAndroid Build Coastguard Worker mkfile_str("placeholder", "this is a placeholder string\0string2");
113*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("prop-int", TEST_VALUE_1);
114*cd60bc56SAndroid Build Coastguard Worker
115*cd60bc56SAndroid Build Coastguard Worker end_dir();
116*cd60bc56SAndroid Build Coastguard Worker }
117*cd60bc56SAndroid Build Coastguard Worker
118*cd60bc56SAndroid Build Coastguard Worker {
119*cd60bc56SAndroid Build Coastguard Worker start_dir("ss1");
120*cd60bc56SAndroid Build Coastguard Worker end_dir();
121*cd60bc56SAndroid Build Coastguard Worker }
122*cd60bc56SAndroid Build Coastguard Worker
123*cd60bc56SAndroid Build Coastguard Worker end_dir();
124*cd60bc56SAndroid Build Coastguard Worker }
125*cd60bc56SAndroid Build Coastguard Worker
126*cd60bc56SAndroid Build Coastguard Worker {
127*cd60bc56SAndroid Build Coastguard Worker start_dir("subnode@2");
128*cd60bc56SAndroid Build Coastguard Worker
129*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("reg", 2);
130*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("linux,phandle", 0x2000);
131*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("prop-int", TEST_VALUE_2);
132*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("#address-cells", 1);
133*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("#size-cells", 0);
134*cd60bc56SAndroid Build Coastguard Worker
135*cd60bc56SAndroid Build Coastguard Worker {
136*cd60bc56SAndroid Build Coastguard Worker start_dir("subsubnode@0");
137*cd60bc56SAndroid Build Coastguard Worker
138*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("reg", 0);
139*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("phandle", 0x2001);
140*cd60bc56SAndroid Build Coastguard Worker mkfile_str("compatible", "subsubnode2\0subsubnode");
141*cd60bc56SAndroid Build Coastguard Worker mkfile_u32("prop-int", TEST_VALUE_2);
142*cd60bc56SAndroid Build Coastguard Worker
143*cd60bc56SAndroid Build Coastguard Worker end_dir();
144*cd60bc56SAndroid Build Coastguard Worker }
145*cd60bc56SAndroid Build Coastguard Worker
146*cd60bc56SAndroid Build Coastguard Worker {
147*cd60bc56SAndroid Build Coastguard Worker start_dir("ss2");
148*cd60bc56SAndroid Build Coastguard Worker end_dir();
149*cd60bc56SAndroid Build Coastguard Worker }
150*cd60bc56SAndroid Build Coastguard Worker
151*cd60bc56SAndroid Build Coastguard Worker end_dir();
152*cd60bc56SAndroid Build Coastguard Worker }
153*cd60bc56SAndroid Build Coastguard Worker
154*cd60bc56SAndroid Build Coastguard Worker PASS();
155*cd60bc56SAndroid Build Coastguard Worker }
156