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

