|  | /* | 
|  | * libfdt - Flat Device Tree manipulation | 
|  | * Copyright (C) 2006 David Gibson, IBM Corporation. | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public License | 
|  | * as published by the Free Software Foundation; either version 2.1 of | 
|  | * the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, but | 
|  | * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 
|  | */ | 
|  | #include "libfdt_env.h" | 
|  |  | 
|  | #include <fdt.h> | 
|  | #include <libfdt.h> | 
|  |  | 
|  | #include "libfdt_internal.h" | 
|  |  | 
|  | int fdt_check_header(const void *fdt) | 
|  | { | 
|  | if (fdt_magic(fdt) == FDT_MAGIC) { | 
|  | /* Complete tree */ | 
|  | if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION) | 
|  | return -FDT_ERR_BADVERSION; | 
|  | if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION) | 
|  | return -FDT_ERR_BADVERSION; | 
|  | } else if (fdt_magic(fdt) == SW_MAGIC) { | 
|  | /* Unfinished sequential-write blob */ | 
|  | if (fdt_size_dt_struct(fdt) == 0) | 
|  | return -FDT_ERR_BADSTATE; | 
|  | } else { | 
|  | return -FDT_ERR_BADMAGIC; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void *fdt_offset_ptr(const void *fdt, int offset, int len) | 
|  | { | 
|  | void *p; | 
|  |  | 
|  | if (fdt_version(fdt) >= 0x11) | 
|  | if (((offset + len) < offset) | 
|  | || ((offset + len) > fdt_size_dt_struct(fdt))) | 
|  | return NULL; | 
|  |  | 
|  | p = _fdt_offset_ptr(fdt, offset); | 
|  |  | 
|  | if (p + len < p) | 
|  | return NULL; | 
|  | return p; | 
|  | } | 
|  |  | 
|  | const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) | 
|  | { | 
|  | int len = strlen(s) + 1; | 
|  | const char *last = strtab + tabsize - len; | 
|  | const char *p; | 
|  |  | 
|  | for (p = strtab; p <= last; p++) | 
|  | if (memeq(p, s, len)) | 
|  | return p; | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | int fdt_move(const void *fdt, void *buf, int bufsize) | 
|  | { | 
|  | int err = fdt_check_header(fdt); | 
|  |  | 
|  | if (err) | 
|  | return err; | 
|  |  | 
|  | if (fdt_totalsize(fdt) > bufsize) | 
|  | return -FDT_ERR_NOSPACE; | 
|  |  | 
|  | memmove(buf, fdt, fdt_totalsize(fdt)); | 
|  | return 0; | 
|  | } |