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 21int 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