uboot/tools/imagetool.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2013
   4 *
   5 * Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
   6 */
   7
   8#ifndef _IMAGETOOL_H_
   9#define _IMAGETOOL_H_
  10
  11#include "os_support.h"
  12#include <errno.h>
  13#include <fcntl.h>
  14#include <stdbool.h>
  15#include <stdio.h>
  16#include <stdlib.h>
  17#include <string.h>
  18#include <sys/stat.h>
  19#include <sys/types.h>
  20#include <time.h>
  21#include <unistd.h>
  22#include <u-boot/sha1.h>
  23
  24#include "fdt_host.h"
  25
  26#define ARRAY_SIZE(x)           (sizeof(x) / sizeof((x)[0]))
  27
  28#define __ALIGN_MASK(x, mask)   (((x) + (mask)) & ~(mask))
  29#define ALIGN(x, a)             __ALIGN_MASK((x), (typeof(x))(a) - 1)
  30
  31#define IH_ARCH_DEFAULT         IH_ARCH_INVALID
  32
  33/* Information about a file that needs to be placed into the FIT */
  34struct content_info {
  35        struct content_info *next;
  36        int type;               /* File type (IH_TYPE_...) */
  37        const char *fname;
  38};
  39
  40/*
  41 * This structure defines all such variables those are initialized by
  42 * mkimage and dumpimage main core and need to be referred by image
  43 * type specific functions
  44 */
  45struct image_tool_params {
  46        int dflag;
  47        int eflag;
  48        int fflag;
  49        int iflag;
  50        int lflag;
  51        int pflag;
  52        int vflag;
  53        int xflag;
  54        int skipcpy;
  55        int os;
  56        int arch;
  57        int type;
  58        int comp;
  59        char *dtc;
  60        unsigned int addr;
  61        unsigned int ep;
  62        char *imagename;
  63        char *imagename2;
  64        char *datafile;
  65        char *imagefile;
  66        char *cmdname;
  67        const char *outfile;    /* Output filename */
  68        const char *keydir;     /* Directory holding private keys */
  69        const char *keydest;    /* Destination .dtb for public key */
  70        const char *keyfile;    /* Filename of private or public key */
  71        const char *comment;    /* Comment to add to signature node */
  72        int require_keys;       /* 1 to mark signing keys as 'required' */
  73        int file_size;          /* Total size of output file */
  74        int orig_file_size;     /* Original size for file before padding */
  75        bool auto_its;          /* Automatically create the .its file */
  76        int fit_image_type;     /* Image type to put into the FIT */
  77        char *fit_ramdisk;      /* Ramdisk file to include */
  78        struct content_info *content_head;      /* List of files to include */
  79        struct content_info *content_tail;
  80        bool external_data;     /* Store data outside the FIT */
  81        bool quiet;             /* Don't output text in normal operation */
  82        unsigned int external_offset;   /* Add padding to external data */
  83        int bl_len;             /* Block length in byte for external data */
  84        const char *engine_id;  /* Engine to use for signing */
  85        bool reset_timestamp;   /* Reset the timestamp on an existing image */
  86};
  87
  88/*
  89 * image type specific variables and callback functions
  90 */
  91struct image_type_params {
  92        /* name is an identification tag string for added support */
  93        char *name;
  94        /*
  95         * header size is local to the specific image type to be supported,
  96         * mkimage core treats this as number of bytes
  97         */
  98        uint32_t header_size;
  99        /* Image type header pointer */
 100        void *hdr;
 101        /*
 102         * There are several arguments that are passed on the command line
 103         * and are registered as flags in image_tool_params structure.
 104         * This callback function can be used to check the passed arguments
 105         * are in-lined with the image type to be supported
 106         *
 107         * Returns 1 if parameter check is successful
 108         */
 109        int (*check_params) (struct image_tool_params *);
 110        /*
 111         * This function is used by list command (i.e. mkimage -l <filename>)
 112         * image type verification code must be put here
 113         *
 114         * Returns 0 if image header verification is successful
 115         * otherwise, returns respective negative error codes
 116         */
 117        int (*verify_header) (unsigned char *, int, struct image_tool_params *);
 118        /* Prints image information abstracting from image header */
 119        void (*print_header) (const void *);
 120        /*
 121         * The header or image contents need to be set as per image type to
 122         * be generated using this callback function.
 123         * further output file post processing (for ex. checksum calculation,
 124         * padding bytes etc..) can also be done in this callback function.
 125         */
 126        void (*set_header) (void *, struct stat *, int,
 127                                        struct image_tool_params *);
 128        /*
 129         * This function is used by the command to retrieve a component
 130         * (sub-image) from the image (i.e. dumpimage -p <position>
 131         * -o <component-outfile> <image>). Thus the code to extract a file
 132         * from an image must be put here.
 133         *
 134         * Returns 0 if the file was successfully retrieved from the image,
 135         * or a negative value on error.
 136         */
 137        int (*extract_subimage)(void *, struct image_tool_params *);
 138        /*
 139         * Some image generation support for ex (default image type) supports
 140         * more than one type_ids, this callback function is used to check
 141         * whether input (-T <image_type>) is supported by registered image
 142         * generation/list low level code
 143         */
 144        int (*check_image_type) (uint8_t);
 145        /* This callback function will be executed if fflag is defined */
 146        int (*fflag_handle) (struct image_tool_params *);
 147        /*
 148         * This callback function will be executed for variable size record
 149         * It is expected to build this header in memory and return its length
 150         * and a pointer to it by using image_type_params.header_size and
 151         * image_type_params.hdr. The return value shall indicate if an
 152         * additional padding should be used when copying the data image
 153         * by returning the padding length.
 154         */
 155        int (*vrec_header) (struct image_tool_params *,
 156                struct image_type_params *);
 157};
 158
 159/**
 160 * imagetool_get_type() - find the image type params for a given image type
 161 *
 162 * It scans all registers image type supports
 163 * checks the input type for each supported image type
 164 *
 165 * if successful,
 166 *     returns respective image_type_params pointer if success
 167 * if input type_id is not supported by any of image_type_support
 168 *     returns NULL
 169 */
 170struct image_type_params *imagetool_get_type(int type);
 171
 172/*
 173 * imagetool_verify_print_header() - verifies the image header
 174 *
 175 * Scan registered image types and verify the image_header for each
 176 * supported image type. If verification is successful, this prints
 177 * the respective header.
 178 *
 179 * @return 0 on success, negative if input image format does not match with
 180 * any of supported image types
 181 */
 182int imagetool_verify_print_header(
 183        void *ptr,
 184        struct stat *sbuf,
 185        struct image_type_params *tparams,
 186        struct image_tool_params *params);
 187
 188/*
 189 * imagetool_verify_print_header_by_type() - verifies the image header
 190 *
 191 * Verify the image_header for the image type given by tparams.
 192 * If verification is successful, this prints the respective header.
 193 * @ptr: pointer the the image header
 194 * @sbuf: stat information about the file pointed to by ptr
 195 * @tparams: image type parameters
 196 * @params: mkimage parameters
 197 *
 198 * @return 0 on success, negative if input image format does not match with
 199 * the given image type
 200 */
 201int imagetool_verify_print_header_by_type(
 202        void *ptr,
 203        struct stat *sbuf,
 204        struct image_type_params *tparams,
 205        struct image_tool_params *params);
 206
 207/**
 208 * imagetool_save_subimage - store data into a file
 209 * @file_name: name of the destination file
 210 * @file_data: data to be written
 211 * @file_len: the amount of data to store
 212 *
 213 * imagetool_save_subimage() store file_len bytes of data pointed by file_data
 214 * into the file name by file_name.
 215 *
 216 * returns:
 217 *     zero in case of success or a negative value if fail.
 218 */
 219int imagetool_save_subimage(
 220        const char *file_name,
 221        ulong file_data,
 222        ulong file_len);
 223
 224/**
 225 * imagetool_get_filesize() - Utility function to obtain the size of a file
 226 *
 227 * This function prints a message if an error occurs, showing the error that
 228 * was obtained.
 229 *
 230 * @params:     mkimage parameters
 231 * @fname:      filename to check
 232 * @return size of file, or -ve value on error
 233 */
 234int imagetool_get_filesize(struct image_tool_params *params, const char *fname);
 235
 236/**
 237 * imagetool_get_source_date() - Get timestamp for build output.
 238 *
 239 * Gets a timestamp for embedding it in a build output. If set
 240 * SOURCE_DATE_EPOCH is used. Else the given fallback value is returned. Prints
 241 * an error message if SOURCE_DATE_EPOCH contains an invalid value and returns
 242 * 0.
 243 *
 244 * @cmdname:    command name
 245 * @fallback:   timestamp to use if SOURCE_DATE_EPOCH isn't set
 246 * @return timestamp based on SOURCE_DATE_EPOCH
 247 */
 248time_t imagetool_get_source_date(
 249        const char *cmdname,
 250        time_t fallback);
 251
 252/*
 253 * There is a c file associated with supported image type low level code
 254 * for ex. default_image.c, fit_image.c
 255 */
 256
 257
 258void pbl_load_uboot(int fd, struct image_tool_params *mparams);
 259int zynqmpbif_copy_image(int fd, struct image_tool_params *mparams);
 260int imx8image_copy_image(int fd, struct image_tool_params *mparams);
 261int imx8mimage_copy_image(int fd, struct image_tool_params *mparams);
 262int rockchip_copy_image(int fd, struct image_tool_params *mparams);
 263
 264#define ___cat(a, b) a ## b
 265#define __cat(a, b) ___cat(a, b)
 266
 267/* we need some special handling for this host tool running eventually on
 268 * Darwin. The Mach-O section handling is a bit different than ELF section
 269 * handling. The differnces in detail are:
 270 *  a) we have segments which have sections
 271 *  b) we need a API call to get the respective section symbols */
 272#if defined(__MACH__)
 273#include <mach-o/getsect.h>
 274
 275#define INIT_SECTION(name)  do {                                        \
 276                unsigned long name ## _len;                             \
 277                char *__cat(pstart_, name) = getsectdata("__DATA",      \
 278                        #name, &__cat(name, _len));                     \
 279                char *__cat(pstop_, name) = __cat(pstart_, name) +      \
 280                        __cat(name, _len);                              \
 281                __cat(__start_, name) = (void *)__cat(pstart_, name);   \
 282                __cat(__stop_, name) = (void *)__cat(pstop_, name);     \
 283        } while (0)
 284#define SECTION(name)   __attribute__((section("__DATA, " #name)))
 285
 286struct image_type_params **__start_image_type, **__stop_image_type;
 287#else
 288#define INIT_SECTION(name) /* no-op for ELF */
 289#define SECTION(name)   __attribute__((section(#name)))
 290
 291/* We construct a table of pointers in an ELF section (pointers generally
 292 * go unpadded by gcc).  ld creates boundary syms for us. */
 293extern struct image_type_params *__start_image_type[], *__stop_image_type[];
 294#endif /* __MACH__ */
 295
 296#if !defined(__used)
 297# if __GNUC__ == 3 && __GNUC_MINOR__ < 3
 298#  define __used                        __attribute__((__unused__))
 299# else
 300#  define __used                        __attribute__((__used__))
 301# endif
 302#endif
 303
 304#define U_BOOT_IMAGE_TYPE( \
 305                _id, \
 306                _name, \
 307                _header_size, \
 308                _header, \
 309                _check_params, \
 310                _verify_header, \
 311                _print_header, \
 312                _set_header, \
 313                _extract_subimage, \
 314                _check_image_type, \
 315                _fflag_handle, \
 316                _vrec_header \
 317        ) \
 318        static struct image_type_params __cat(image_type_, _id) = \
 319        { \
 320                .name = _name, \
 321                .header_size = _header_size, \
 322                .hdr = _header, \
 323                .check_params = _check_params, \
 324                .verify_header = _verify_header, \
 325                .print_header = _print_header, \
 326                .set_header = _set_header, \
 327                .extract_subimage = _extract_subimage, \
 328                .check_image_type = _check_image_type, \
 329                .fflag_handle = _fflag_handle, \
 330                .vrec_header = _vrec_header \
 331        }; \
 332        static struct image_type_params *SECTION(image_type) __used \
 333                __cat(image_type_ptr_, _id) = &__cat(image_type_, _id)
 334
 335#endif /* _IMAGETOOL_H_ */
 336