16bf4ca07SHeiko Schocher /* 26bf4ca07SHeiko Schocher * (C) Copyright 2014 36bf4ca07SHeiko Schocher * DENX Software Engineering 46bf4ca07SHeiko Schocher * Heiko Schocher <hs@denx.de> 56bf4ca07SHeiko Schocher * 66bf4ca07SHeiko Schocher * (C) Copyright 2008 Semihalf 76bf4ca07SHeiko Schocher * 86bf4ca07SHeiko Schocher * (C) Copyright 2000-2004 96bf4ca07SHeiko Schocher * DENX Software Engineering 106bf4ca07SHeiko Schocher * Wolfgang Denk, wd@denx.de 116bf4ca07SHeiko Schocher * 126bf4ca07SHeiko Schocher * Updated-by: Prafulla Wadaskar <prafulla@marvell.com> 136bf4ca07SHeiko Schocher * FIT image specific code abstracted from mkimage.c 146bf4ca07SHeiko Schocher * some functions added to address abstraction 156bf4ca07SHeiko Schocher * 166bf4ca07SHeiko Schocher * All rights reserved. 176bf4ca07SHeiko Schocher * 186bf4ca07SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 196bf4ca07SHeiko Schocher */ 206bf4ca07SHeiko Schocher 216bf4ca07SHeiko Schocher #include "imagetool.h" 226bf4ca07SHeiko Schocher #include "mkimage.h" 236bf4ca07SHeiko Schocher #include "fit_common.h" 246bf4ca07SHeiko Schocher #include <image.h> 256bf4ca07SHeiko Schocher #include <u-boot/crc.h> 266bf4ca07SHeiko Schocher 276bf4ca07SHeiko Schocher int fit_verify_header(unsigned char *ptr, int image_size, 286bf4ca07SHeiko Schocher struct image_tool_params *params) 296bf4ca07SHeiko Schocher { 306bf4ca07SHeiko Schocher return fdt_check_header(ptr); 316bf4ca07SHeiko Schocher } 326bf4ca07SHeiko Schocher 336bf4ca07SHeiko Schocher int fit_check_image_types(uint8_t type) 346bf4ca07SHeiko Schocher { 356bf4ca07SHeiko Schocher if (type == IH_TYPE_FLATDT) 366bf4ca07SHeiko Schocher return EXIT_SUCCESS; 376bf4ca07SHeiko Schocher else 386bf4ca07SHeiko Schocher return EXIT_FAILURE; 396bf4ca07SHeiko Schocher } 406bf4ca07SHeiko Schocher 41*ef0af64bSSimon Glass int mmap_fdt(const char *cmdname, const char *fname, void **blobp, 42*ef0af64bSSimon Glass struct stat *sbuf, bool delete_on_error) 436bf4ca07SHeiko Schocher { 446bf4ca07SHeiko Schocher void *ptr; 456bf4ca07SHeiko Schocher int fd; 466bf4ca07SHeiko Schocher 476bf4ca07SHeiko Schocher /* Load FIT blob into memory (we need to write hashes/signatures) */ 486bf4ca07SHeiko Schocher fd = open(fname, O_RDWR | O_BINARY); 496bf4ca07SHeiko Schocher 506bf4ca07SHeiko Schocher if (fd < 0) { 516bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't open %s: %s\n", 526bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 53*ef0af64bSSimon Glass goto err; 546bf4ca07SHeiko Schocher } 556bf4ca07SHeiko Schocher 566bf4ca07SHeiko Schocher if (fstat(fd, sbuf) < 0) { 576bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't stat %s: %s\n", 586bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 59*ef0af64bSSimon Glass goto err; 606bf4ca07SHeiko Schocher } 616bf4ca07SHeiko Schocher 626bf4ca07SHeiko Schocher errno = 0; 636bf4ca07SHeiko Schocher ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 646bf4ca07SHeiko Schocher if ((ptr == MAP_FAILED) || (errno != 0)) { 656bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't read %s: %s\n", 666bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 67*ef0af64bSSimon Glass goto err; 686bf4ca07SHeiko Schocher } 696bf4ca07SHeiko Schocher 706bf4ca07SHeiko Schocher /* check if ptr has a valid blob */ 716bf4ca07SHeiko Schocher if (fdt_check_header(ptr)) { 726bf4ca07SHeiko Schocher fprintf(stderr, "%s: Invalid FIT blob\n", cmdname); 73*ef0af64bSSimon Glass goto err; 746bf4ca07SHeiko Schocher } 756bf4ca07SHeiko Schocher 766bf4ca07SHeiko Schocher *blobp = ptr; 776bf4ca07SHeiko Schocher return fd; 78*ef0af64bSSimon Glass 79*ef0af64bSSimon Glass err: 80*ef0af64bSSimon Glass if (fd >= 0) 81*ef0af64bSSimon Glass close(fd); 82*ef0af64bSSimon Glass if (delete_on_error) 83*ef0af64bSSimon Glass unlink(fname); 84*ef0af64bSSimon Glass 85*ef0af64bSSimon Glass return -1; 866bf4ca07SHeiko Schocher } 87