1*6bf4ca07SHeiko Schocher /* 2*6bf4ca07SHeiko Schocher * (C) Copyright 2014 3*6bf4ca07SHeiko Schocher * DENX Software Engineering 4*6bf4ca07SHeiko Schocher * Heiko Schocher <hs@denx.de> 5*6bf4ca07SHeiko Schocher * 6*6bf4ca07SHeiko Schocher * (C) Copyright 2008 Semihalf 7*6bf4ca07SHeiko Schocher * 8*6bf4ca07SHeiko Schocher * (C) Copyright 2000-2004 9*6bf4ca07SHeiko Schocher * DENX Software Engineering 10*6bf4ca07SHeiko Schocher * Wolfgang Denk, wd@denx.de 11*6bf4ca07SHeiko Schocher * 12*6bf4ca07SHeiko Schocher * Updated-by: Prafulla Wadaskar <prafulla@marvell.com> 13*6bf4ca07SHeiko Schocher * FIT image specific code abstracted from mkimage.c 14*6bf4ca07SHeiko Schocher * some functions added to address abstraction 15*6bf4ca07SHeiko Schocher * 16*6bf4ca07SHeiko Schocher * All rights reserved. 17*6bf4ca07SHeiko Schocher * 18*6bf4ca07SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 19*6bf4ca07SHeiko Schocher */ 20*6bf4ca07SHeiko Schocher 21*6bf4ca07SHeiko Schocher #include "imagetool.h" 22*6bf4ca07SHeiko Schocher #include "mkimage.h" 23*6bf4ca07SHeiko Schocher #include "fit_common.h" 24*6bf4ca07SHeiko Schocher #include <image.h> 25*6bf4ca07SHeiko Schocher #include <u-boot/crc.h> 26*6bf4ca07SHeiko Schocher 27*6bf4ca07SHeiko Schocher int fit_verify_header(unsigned char *ptr, int image_size, 28*6bf4ca07SHeiko Schocher struct image_tool_params *params) 29*6bf4ca07SHeiko Schocher { 30*6bf4ca07SHeiko Schocher return fdt_check_header(ptr); 31*6bf4ca07SHeiko Schocher } 32*6bf4ca07SHeiko Schocher 33*6bf4ca07SHeiko Schocher int fit_check_image_types(uint8_t type) 34*6bf4ca07SHeiko Schocher { 35*6bf4ca07SHeiko Schocher if (type == IH_TYPE_FLATDT) 36*6bf4ca07SHeiko Schocher return EXIT_SUCCESS; 37*6bf4ca07SHeiko Schocher else 38*6bf4ca07SHeiko Schocher return EXIT_FAILURE; 39*6bf4ca07SHeiko Schocher } 40*6bf4ca07SHeiko Schocher 41*6bf4ca07SHeiko Schocher int mmap_fdt(char *cmdname, const char *fname, void **blobp, 42*6bf4ca07SHeiko Schocher struct stat *sbuf, int useunlink) 43*6bf4ca07SHeiko Schocher { 44*6bf4ca07SHeiko Schocher void *ptr; 45*6bf4ca07SHeiko Schocher int fd; 46*6bf4ca07SHeiko Schocher 47*6bf4ca07SHeiko Schocher /* Load FIT blob into memory (we need to write hashes/signatures) */ 48*6bf4ca07SHeiko Schocher fd = open(fname, O_RDWR | O_BINARY); 49*6bf4ca07SHeiko Schocher 50*6bf4ca07SHeiko Schocher if (fd < 0) { 51*6bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't open %s: %s\n", 52*6bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 53*6bf4ca07SHeiko Schocher if (useunlink) 54*6bf4ca07SHeiko Schocher unlink(fname); 55*6bf4ca07SHeiko Schocher return -1; 56*6bf4ca07SHeiko Schocher } 57*6bf4ca07SHeiko Schocher 58*6bf4ca07SHeiko Schocher if (fstat(fd, sbuf) < 0) { 59*6bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't stat %s: %s\n", 60*6bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 61*6bf4ca07SHeiko Schocher if (useunlink) 62*6bf4ca07SHeiko Schocher unlink(fname); 63*6bf4ca07SHeiko Schocher return -1; 64*6bf4ca07SHeiko Schocher } 65*6bf4ca07SHeiko Schocher 66*6bf4ca07SHeiko Schocher errno = 0; 67*6bf4ca07SHeiko Schocher ptr = mmap(0, sbuf->st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 68*6bf4ca07SHeiko Schocher if ((ptr == MAP_FAILED) || (errno != 0)) { 69*6bf4ca07SHeiko Schocher fprintf(stderr, "%s: Can't read %s: %s\n", 70*6bf4ca07SHeiko Schocher cmdname, fname, strerror(errno)); 71*6bf4ca07SHeiko Schocher if (useunlink) 72*6bf4ca07SHeiko Schocher unlink(fname); 73*6bf4ca07SHeiko Schocher return -1; 74*6bf4ca07SHeiko Schocher } 75*6bf4ca07SHeiko Schocher 76*6bf4ca07SHeiko Schocher /* check if ptr has a valid blob */ 77*6bf4ca07SHeiko Schocher if (fdt_check_header(ptr)) { 78*6bf4ca07SHeiko Schocher fprintf(stderr, "%s: Invalid FIT blob\n", cmdname); 79*6bf4ca07SHeiko Schocher if (useunlink) 80*6bf4ca07SHeiko Schocher unlink(fname); 81*6bf4ca07SHeiko Schocher return -1; 82*6bf4ca07SHeiko Schocher } 83*6bf4ca07SHeiko Schocher 84*6bf4ca07SHeiko Schocher *blobp = ptr; 85*6bf4ca07SHeiko Schocher return fd; 86*6bf4ca07SHeiko Schocher } 87