1/* $NetBSD: sw_states.c,v 1.1.1.1 2019/12/22 12:34:06 skrll Exp $ */ 2 3// SPDX-License-Identifier: LGPL-2.1-or-later 4/* 5 * libfdt - Flat Device Tree manipulation 6 * Testcase for error handling with sequential write states 7 * Copyright (C) 2018 David Gibson, Red Hat Inc. 8 */ 9 10#include <stdlib.h> 11#include <stdio.h> 12#include <string.h> 13#include <ctype.h> 14#include <stdint.h> 15 16#include <libfdt.h> 17 18#include "tests.h" 19#include "testdata.h" 20 21#define SPACE 65536 22 23#define CHECK_OK(code) \ 24 do { \ 25 verbose_printf(" OK: %s\n", #code); \ 26 err = (code); \ 27 if (err) \ 28 FAIL(#code ": %s", fdt_strerror(err)); \ 29 } while (0) 30 31#define CHECK_BADSTATE(code) \ 32 do { \ 33 verbose_printf("BAD: %s\n", #code); \ 34 err = (code); \ 35 if (err == 0) \ 36 FAIL(#code ": succeeded in bad state"); \ 37 else if (err != -FDT_ERR_BADSTATE) \ 38 FAIL(#code ": %s", fdt_strerror(err)); \ 39 } while (0) 40 41int main(int argc, char *argv[]) 42{ 43 void *fdt = NULL; 44 int err; 45 46 test_init(argc, argv); 47 48 fdt = xmalloc(SPACE); 49 50 err = fdt_create(fdt, SPACE); 51 if (err) 52 FAIL("fdt_create(): %s", fdt_strerror(err)); 53 54 /* Memory reserve state */ 55 56 CHECK_BADSTATE(fdt_begin_node(fdt, "")); 57 CHECK_BADSTATE(fdt_property_string(fdt, "bad-str", "TEST_STRING_1")); 58 CHECK_BADSTATE(fdt_end_node(fdt)); 59 CHECK_BADSTATE(fdt_finish(fdt)); 60 61 CHECK_OK(fdt_add_reservemap_entry(fdt, TEST_ADDR_1, TEST_SIZE_1)); 62 CHECK_OK(fdt_add_reservemap_entry(fdt, TEST_ADDR_2, TEST_SIZE_2)); 63 64 CHECK_BADSTATE(fdt_begin_node(fdt, "")); 65 CHECK_BADSTATE(fdt_property_string(fdt, "bad-str", "TEST_STRING_1")); 66 CHECK_BADSTATE(fdt_end_node(fdt)); 67 CHECK_BADSTATE(fdt_finish(fdt)); 68 69 CHECK_OK(fdt_finish_reservemap(fdt)); 70 71 /* Structure state */ 72 73 CHECK_BADSTATE(fdt_add_reservemap_entry(fdt, TEST_ADDR_1, TEST_SIZE_1)); 74 CHECK_BADSTATE(fdt_finish_reservemap(fdt)); 75 76 CHECK_OK(fdt_begin_node(fdt, "")); 77 CHECK_OK(fdt_property_string(fdt, "compatible", "test_tree1")); 78 CHECK_OK(fdt_property_u32(fdt, "prop-int", TEST_VALUE_1)); 79 CHECK_OK(fdt_property_u64(fdt, "prop-int64", TEST_VALUE64_1)); 80 CHECK_OK(fdt_property_string(fdt, "prop-str", TEST_STRING_1)); 81 CHECK_OK(fdt_property_u32(fdt, "#address-cells", 1)); 82 CHECK_OK(fdt_property_u32(fdt, "#size-cells", 0)); 83 84 CHECK_OK(fdt_begin_node(fdt, "subnode@1")); 85 CHECK_OK(fdt_property_string(fdt, "compatible", "subnode1")); 86 CHECK_OK(fdt_property_u32(fdt, "reg", 1)); 87 CHECK_OK(fdt_property_cell(fdt, "prop-int", TEST_VALUE_1)); 88 CHECK_OK(fdt_begin_node(fdt, "subsubnode")); 89 CHECK_OK(fdt_property(fdt, "compatible", "subsubnode1\0subsubnode", 90 23)); 91 CHECK_OK(fdt_property_cell(fdt, "prop-int", TEST_VALUE_1)); 92 CHECK_OK(fdt_end_node(fdt)); 93 CHECK_OK(fdt_begin_node(fdt, "ss1")); 94 CHECK_OK(fdt_end_node(fdt)); 95 CHECK_OK(fdt_end_node(fdt)); 96 97 CHECK_OK(fdt_begin_node(fdt, "subnode@2")); 98 CHECK_OK(fdt_property_u32(fdt, "reg", 2)); 99 CHECK_OK(fdt_property_cell(fdt, "linux,phandle", PHANDLE_1)); 100 CHECK_OK(fdt_property_cell(fdt, "prop-int", TEST_VALUE_2)); 101 CHECK_OK(fdt_property_u32(fdt, "#address-cells", 1)); 102 CHECK_OK(fdt_property_u32(fdt, "#size-cells", 0)); 103 CHECK_OK(fdt_begin_node(fdt, "subsubnode@0")); 104 CHECK_OK(fdt_property_u32(fdt, "reg", 0)); 105 CHECK_OK(fdt_property_cell(fdt, "phandle", PHANDLE_2)); 106 CHECK_OK(fdt_property(fdt, "compatible", "subsubnode2\0subsubnode", 107 23)); 108 CHECK_OK(fdt_property_cell(fdt, "prop-int", TEST_VALUE_2)); 109 CHECK_OK(fdt_end_node(fdt)); 110 CHECK_OK(fdt_begin_node(fdt, "ss2")); 111 CHECK_OK(fdt_end_node(fdt)); 112 113 CHECK_OK(fdt_end_node(fdt)); 114 115 CHECK_OK(fdt_end_node(fdt)); 116 117 CHECK_OK(fdt_finish(fdt)); 118 119 /* Completed state */ 120 121 CHECK_BADSTATE(fdt_add_reservemap_entry(fdt, TEST_ADDR_1, TEST_SIZE_1)); 122 CHECK_BADSTATE(fdt_finish_reservemap(fdt)); 123 CHECK_BADSTATE(fdt_begin_node(fdt, "")); 124 CHECK_BADSTATE(fdt_property_string(fdt, "bad-str", "TEST_STRING_1")); 125 CHECK_BADSTATE(fdt_end_node(fdt)); 126 CHECK_BADSTATE(fdt_finish(fdt)); 127 128 PASS(); 129} 130