xref: /netbsd-src/external/gpl2/dtc/dist/tests/move_and_save.c (revision 7cdf52c4e116cff01c811ade809106cc07d84795)
1 /*	$NetBSD: move_and_save.c,v 1.4 2019/12/22 12:38:24 skrll Exp $	*/
2 
3 // SPDX-License-Identifier: LGPL-2.1-or-later
4 /*
5  * libfdt - Flat Device Tree manipulation
6  *	Basic testcase for read-only access
7  * Copyright (C) 2006 David Gibson, IBM Corporation.
8  */
9 
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <limits.h>
14 #include <stdint.h>
15 
16 #include <libfdt.h>
17 
18 #include "tests.h"
19 #include "testdata.h"
20 
main(int argc,char * argv[])21 int main(int argc, char *argv[])
22 {
23 	void *fdt, *fdt1, *fdt2, *fdt3;
24 	char *buf;
25 	int shuntsize;
26 	int bufsize;
27 	int err;
28 	const char *inname;
29 	char outname[PATH_MAX];
30 
31 	test_init(argc, argv);
32 	fdt = load_blob_arg(argc, argv);
33 	inname = argv[1];
34 
35 	shuntsize = FDTALIGN2(fdt_totalsize(fdt) / 2, sizeof(uint64_t));
36 	bufsize = fdt_totalsize(fdt) + shuntsize;
37 	buf = xmalloc(bufsize);
38 
39 	fdt1 = buf;
40 	err = fdt_move(fdt, fdt1, bufsize);
41 	if (err)
42 		FAIL("Failed to move tree into new buffer: %s",
43 		     fdt_strerror(err));
44 	sprintf(outname, "moved.%s", inname);
45 	save_blob(outname, fdt1);
46 
47 	fdt2 = buf + shuntsize;
48 	err = fdt_move(fdt1, fdt2, bufsize-shuntsize);
49 	if (err)
50 		FAIL("Failed to shunt tree %d bytes: %s",
51 		     shuntsize, fdt_strerror(err));
52 	sprintf(outname, "shunted.%s", inname);
53 	save_blob(outname, fdt2);
54 
55 	fdt3 = buf;
56 	err = fdt_move(fdt2, fdt3, bufsize);
57 	if (err)
58 		FAIL("Failed to deshunt tree %d bytes: %s",
59 		     shuntsize, fdt_strerror(err));
60 	sprintf(outname, "deshunted.%s", inname);
61 	save_blob(outname, fdt3);
62 
63 	PASS();
64 }
65