Commit f86ed6a8 authored by Guilherme Maciel Ferreira's avatar Guilherme Maciel Ferreira Committed by Tom Rini

tools: moved code common to all image tools to a separated module.

In order to avoid duplicating code and keep only one point of modification,
the functions, structs and defines useful for "dumpimage" were moved from
"mkimage" to a common module called "imagetool".

This modification also weakens the coupling between image types (FIT, IMX, MXS,
and so on) and image tools (mkimage and dumpimage). Any tool may initialize the
"imagetool" through register_image_tool() function, while the image types
register themselves within an image tool using the register_image_type()
function:

                                                      +---------------+
                                               +------|   fit_image   |
 +--------------+          +-----------+       |      +---------------+
 |    mkimage   |--------> |           | <-----+
 +--------------+          |           |              +---------------+
                           | imagetool | <------------|    imximage   |
 +--------------+          |           |              +---------------+
 |  dumpimage   |--------> |           | <-----+
 +--------------+          +-----------+       |      +---------------+
                                               +------| default_image |
                                                      +---------------+

          register_image_tool()           register_image_type()

Also, the struct "mkimage_params" was renamed to "image_tool_params" to make
clear its general purpose.
Signed-off-by: default avatarGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
parent f1cc458c
......@@ -76,6 +76,7 @@ NOPED_OBJ_FILES-y += fit_image.o
NOPED_OBJ_FILES-y += image-host.o
NOPED_OBJ_FILES-y += imximage.o
NOPED_OBJ_FILES-y += kwbimage.o
NOPED_OBJ_FILES-y += imagetool.o
NOPED_OBJ_FILES-y += mkenvimage.o
NOPED_OBJ_FILES-y += mkimage.o
NOPED_OBJ_FILES-y += mxsimage.o
......@@ -212,6 +213,7 @@ $(obj)mkimage$(SFX): $(obj)aisimage.o \
$(obj)image-fit.o \
$(obj)image-host.o \
$(obj)image.o \
$(obj)imagetool.o \
$(obj)imximage.o \
$(obj)kwbimage.o \
$(obj)md5.o \
......
......@@ -5,7 +5,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include "aisimage.h"
#include <image.h>
......@@ -176,7 +176,7 @@ static uint32_t *ais_insert_cmd_header(uint32_t cmd, uint32_t nargs,
}
static uint32_t *ais_alloc_buffer(struct mkimage_params *params)
static uint32_t *ais_alloc_buffer(struct image_tool_params *params)
{
int dfd;
struct stat sbuf;
......@@ -216,7 +216,7 @@ static uint32_t *ais_alloc_buffer(struct mkimage_params *params)
return ptr;
}
static uint32_t *ais_copy_image(struct mkimage_params *params,
static uint32_t *ais_copy_image(struct image_tool_params *params,
uint32_t *aisptr)
{
......@@ -252,7 +252,7 @@ static uint32_t *ais_copy_image(struct mkimage_params *params,
}
static int aisimage_generate(struct mkimage_params *params,
static int aisimage_generate(struct image_tool_params *params,
struct image_type_params *tparams)
{
FILE *fd = NULL;
......@@ -370,7 +370,7 @@ static int aisimage_check_image_types(uint8_t type)
}
static int aisimage_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct ais_header *ais_hdr = (struct ais_header *)ptr;
......@@ -384,11 +384,11 @@ static int aisimage_verify_header(unsigned char *ptr, int image_size,
}
static void aisimage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
}
int aisimage_check_params(struct mkimage_params *params)
int aisimage_check_params(struct image_tool_params *params)
{
if (!params)
return CFG_INVALID;
......@@ -427,5 +427,5 @@ static struct image_type_params aisimage_params = {
void init_ais_image_type(void)
{
mkimage_register(&aisimage_params);
register_image_type(&aisimage_params);
}
......@@ -14,7 +14,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include <u-boot/crc.h>
......@@ -29,7 +29,7 @@ static int image_check_image_types(uint8_t type)
return EXIT_FAILURE;
}
static int image_check_params(struct mkimage_params *params)
static int image_check_params(struct image_tool_params *params)
{
return ((params->dflag && (params->fflag || params->lflag)) ||
(params->fflag && (params->dflag || params->lflag)) ||
......@@ -37,7 +37,7 @@ static int image_check_params(struct mkimage_params *params)
}
static int image_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
uint32_t len;
const unsigned char *data;
......@@ -86,7 +86,7 @@ static int image_verify_header(unsigned char *ptr, int image_size,
}
static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
uint32_t checksum;
......@@ -133,5 +133,5 @@ static struct image_type_params defimage_params = {
void init_default_image_type(void)
{
mkimage_register(&defimage_params);
register_image_type(&defimage_params);
}
......@@ -14,6 +14,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "imagetool.h"
#include "mkimage.h"
#include <image.h>
#include <u-boot/crc.h>
......@@ -21,7 +22,7 @@
static image_header_t header;
static int fit_verify_header (unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
return fdt_check_header(ptr);
}
......@@ -34,7 +35,7 @@ static int fit_check_image_types (uint8_t type)
return EXIT_FAILURE;
}
int mmap_fdt(struct mkimage_params *params, const char *fname, void **blobp,
int mmap_fdt(struct image_tool_params *params, const char *fname, void **blobp,
struct stat *sbuf)
{
void *ptr;
......@@ -88,7 +89,7 @@ int mmap_fdt(struct mkimage_params *params, const char *fname, void **blobp,
* returns:
* only on success, otherwise calls exit (EXIT_FAILURE);
*/
static int fit_handle_file (struct mkimage_params *params)
static int fit_handle_file(struct image_tool_params *params)
{
char tmpfile[MKIMAGE_MAX_TMPFILE_LEN];
char cmd[MKIMAGE_MAX_DTC_CMDLINE_LEN];
......@@ -184,7 +185,7 @@ err_system:
return -1;
}
static int fit_check_params (struct mkimage_params *params)
static int fit_check_params(struct image_tool_params *params)
{
return ((params->dflag && (params->fflag || params->lflag)) ||
(params->fflag && (params->dflag || params->lflag)) ||
......@@ -205,5 +206,5 @@ static struct image_type_params fitimage_params = {
void init_fit_image_type (void)
{
mkimage_register (&fitimage_params);
register_image_type(&fitimage_params);
}
/*
* (C) Copyright 2013
*
* Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include "imagetool.h"
/*
* Callback function to register a image type within a tool
*/
static imagetool_register_t register_func;
/*
* register_image_tool -
*
* The tool provides its own registration function in order to all image
* types initialize themselves.
*/
void register_image_tool(imagetool_register_t image_register)
{
/*
* Save the image tool callback function. It will be used to register
* image types within that tool
*/
register_func = image_register;
/* Init Freescale PBL Boot image generation/list support */
init_pbl_image_type();
/* Init Kirkwood Boot image generation/list support */
init_kwb_image_type();
/* Init Freescale imx Boot image generation/list support */
init_imx_image_type();
/* Init Freescale mxs Boot image generation/list support */
init_mxs_image_type();
/* Init FIT image generation/list support */
init_fit_image_type();
/* Init TI OMAP Boot image generation/list support */
init_omap_image_type();
/* Init Default image generation/list support */
init_default_image_type();
/* Init Davinci UBL support */
init_ubl_image_type();
/* Init Davinci AIS support */
init_ais_image_type();
}
/*
* register_image_type -
*
* Register a image type within a tool
*/
void register_image_type(struct image_type_params *tparams)
{
register_func(tparams);
}
/*
* (C) Copyright 2013
*
* Written by Guilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _IMAGETOOL_H_
#define _IMAGETOOL_H_
#include "os_support.h"
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <sha1.h>
#include "fdt_host.h"
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define IH_ARCH_DEFAULT IH_ARCH_INVALID
/*
* This structure defines all such variables those are initialized by
* mkimage and dumpimage main core and need to be referred by image
* type specific functions
*/
struct image_tool_params {
int dflag;
int eflag;
int fflag;
int lflag;
int vflag;
int xflag;
int skipcpy;
int os;
int arch;
int type;
int comp;
char *dtc;
unsigned int addr;
unsigned int ep;
char *imagename;
char *imagename2;
char *datafile;
char *imagefile;
char *cmdname;
const char *keydir; /* Directory holding private keys */
const char *keydest; /* Destination .dtb for public key */
const char *comment; /* Comment to add to signature node */
int require_keys; /* 1 to mark signing keys as 'required' */
};
/*
* image type specific variables and callback functions
*/
struct image_type_params {
/* name is an identification tag string for added support */
char *name;
/*
* header size is local to the specific image type to be supported,
* mkimage core treats this as number of bytes
*/
uint32_t header_size;
/* Image type header pointer */
void *hdr;
/*
* There are several arguments that are passed on the command line
* and are registered as flags in image_tool_params structure.
* This callback function can be used to check the passed arguments
* are in-lined with the image type to be supported
*
* Returns 1 if parameter check is successful
*/
int (*check_params) (struct image_tool_params *);
/*
* This function is used by list command (i.e. mkimage -l <filename>)
* image type verification code must be put here
*
* Returns 0 if image header verification is successful
* otherwise, returns respective negative error codes
*/
int (*verify_header) (unsigned char *, int, struct image_tool_params *);
/* Prints image information abstracting from image header */
void (*print_header) (const void *);
/*
* The header or image contents need to be set as per image type to
* be generated using this callback function.
* further output file post processing (for ex. checksum calculation,
* padding bytes etc..) can also be done in this callback function.
*/
void (*set_header) (void *, struct stat *, int,
struct image_tool_params *);
/*
* Some image generation support for ex (default image type) supports
* more than one type_ids, this callback function is used to check
* whether input (-T <image_type>) is supported by registered image
* generation/list low level code
*/
int (*check_image_type) (uint8_t);
/* This callback function will be executed if fflag is defined */
int (*fflag_handle) (struct image_tool_params *);
/*
* This callback function will be executed for variable size record
* It is expected to build this header in memory and return its length
* and a pointer to it by using image_type_params.header_size and
* image_type_params.hdr. The return value shall indicate if an
* additional padding should be used when copying the data image
* by returning the padding length.
*/
int (*vrec_header) (struct image_tool_params *,
struct image_type_params *);
/* pointer to the next registered entry in linked list */
struct image_type_params *next;
};
/*
* Tool registration function.
*/
typedef void (*imagetool_register_t)(struct image_type_params *);
/*
* Initializes all image types with the given registration callback
* function.
* An image tool uses this function to initialize all image types.
*/
void register_image_tool(imagetool_register_t image_register);
/*
* Register a image type within a tool.
* An image type uses this function to register itself within
* all tools.
*/
void register_image_type(struct image_type_params *tparams);
/*
* There is a c file associated with supported image type low level code
* for ex. default_image.c, fit_image.c
* init_xxx_type() is the only function referred by image tool core to avoid
* a single lined header file, you can define them here
*
* Supported image types init functions
*/
void init_default_image_type(void);
void init_pbl_image_type(void);
void init_ais_image_type(void);
void init_kwb_image_type(void);
void init_imx_image_type(void);
void init_mxs_image_type(void);
void init_fit_image_type(void);
void init_ubl_image_type(void);
void init_omap_image_type(void);
void pbl_load_uboot(int fd, struct image_tool_params *mparams);
#endif /* _IMAGETOOL_H_ */
......@@ -9,7 +9,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include "imximage.h"
......@@ -520,7 +520,7 @@ static int imximage_check_image_types(uint8_t type)
}
static int imximage_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct imx_header *imx_hdr = (struct imx_header *) ptr;
......@@ -549,7 +549,7 @@ static void imximage_print_header(const void *ptr)
}
static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct imx_header *imxhdr = (struct imx_header *)ptr;
uint32_t dcd_len;
......@@ -589,7 +589,7 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,
}
}
int imximage_check_params(struct mkimage_params *params)
int imximage_check_params(struct image_tool_params *params)
{
if (!params)
return CFG_INVALID;
......@@ -611,7 +611,7 @@ int imximage_check_params(struct mkimage_params *params)
(params->xflag) || !(strlen(params->imagename));
}
static int imximage_generate(struct mkimage_params *params,
static int imximage_generate(struct image_tool_params *params,
struct image_type_params *tparams)
{
struct imx_header *imxhdr;
......@@ -701,5 +701,5 @@ static struct image_type_params imximage_params = {
void init_imx_image_type(void)
{
mkimage_register(&imximage_params);
register_image_type(&imximage_params);
}
......@@ -6,7 +6,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include "kwbimage.h"
......@@ -54,7 +54,7 @@ static int lineno = -1;
/*
* Report Error if xflag is set in addition to default
*/
static int kwbimage_check_params (struct mkimage_params *params)
static int kwbimage_check_params(struct image_tool_params *params)
{
if (!strlen (params->imagename)) {
printf ("Error:%s - Configuration file not specified, "
......@@ -288,7 +288,7 @@ INVL_CMD:
}
static void kwbimage_set_header (void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct kwb_header *hdr = (struct kwb_header *)ptr;
bhr_t *mhdr = &hdr->kwb_hdr;
......@@ -322,7 +322,7 @@ static void kwbimage_set_header (void *ptr, struct stat *sbuf, int ifd,
}
static int kwbimage_verify_header (unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct kwb_header *hdr = (struct kwb_header *)ptr;
bhr_t *mhdr = &hdr->kwb_hdr;
......@@ -382,5 +382,5 @@ static struct image_type_params kwbimage_params = {
void init_kwb_image_type (void)
{
mkimage_register (&kwbimage_params);
register_image_type(&kwbimage_params);
}
......@@ -19,7 +19,7 @@ static void usage(void);
struct image_type_params *mkimage_tparams = NULL;
/* parameters initialized by core will be used by the image type code */
struct mkimage_params params = {
struct image_tool_params params = {
.os = IH_OS_LINUX,
.arch = IH_ARCH_PPC,
.type = IH_TYPE_KERNEL,
......@@ -139,24 +139,8 @@ main (int argc, char **argv)
struct image_type_params *tparams = NULL;
int pad_len = 0;
/* Init Freescale PBL Boot image generation/list support */
init_pbl_image_type();
/* Init Kirkwood Boot image generation/list support */
init_kwb_image_type ();
/* Init Freescale imx Boot image generation/list support */
init_imx_image_type ();
/* Init Freescale mxs Boot image generation/list support */
init_mxs_image_type();
/* Init FIT image generation/list support */
init_fit_image_type ();
/* Init TI OMAP Boot image generation/list support */
init_omap_image_type();
/* Init Default image generation/list support */
init_default_image_type ();
/* Init Davinci UBL support */
init_ubl_image_type();
/* Init Davinci AIS support */
init_ais_image_type();
/* Init all image generation/list support */
register_image_tool(mkimage_register);
params.cmdname = *argv;
params.addr = params.ep = 0;
......
......@@ -20,6 +20,7 @@
#include <unistd.h>
#include <sha1.h>
#include "fdt_host.h"
#include "imagetool.h"
#undef MKIMAGE_DEBUG
......@@ -29,8 +30,6 @@
#define debug(fmt,args...)
#endif /* MKIMAGE_DEBUG */
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
static inline void *map_sysmem(ulong paddr, unsigned long len)
{
return (void *)(uintptr_t)paddr;
......@@ -47,124 +46,4 @@ static inline ulong map_to_sysmem(void *ptr)
#define MKIMAGE_MAX_DTC_CMDLINE_LEN 512
#define MKIMAGE_DTC "dtc" /* assume dtc is in $PATH */
#define IH_ARCH_DEFAULT IH_ARCH_INVALID
/*
* This structure defines all such variables those are initialized by
* mkimage main core and need to be referred by image type specific
* functions
*/
struct mkimage_params {
int dflag;
int eflag;
int fflag;
int lflag;
int vflag;
int xflag;
int skipcpy;
int os;
int arch;
int type;
int comp;
char *dtc;
unsigned int addr;
unsigned int ep;
char *imagename;
char *imagename2;
char *datafile;
char *imagefile;
char *cmdname;
const char *keydir; /* Directory holding private keys */
const char *keydest; /* Destination .dtb for public key */
const char *comment; /* Comment to add to signature node */
int require_keys; /* 1 to mark signing keys as 'required' */
};
/*
* image type specific variables and callback functions
*/
struct image_type_params {
/* name is an identification tag string for added support */
char *name;
/*
* header size is local to the specific image type to be supported,
* mkimage core treats this as number of bytes
*/
uint32_t header_size;
/* Image type header pointer */
void *hdr;
/*
* There are several arguments that are passed on the command line
* and are registered as flags in mkimage_params structure.
* This callback function can be used to check the passed arguments
* are in-lined with the image type to be supported
*
* Returns 1 if parameter check is successful
*/
int (*check_params) (struct mkimage_params *);
/*
* This function is used by list command (i.e. mkimage -l <filename>)
* image type verification code must be put here
*
* Returns 0 if image header verification is successful
* otherwise, returns respective negative error codes
*/
int (*verify_header) (unsigned char *, int, struct mkimage_params *);
/* Prints image information abstracting from image header */
void (*print_header) (const void *);
/*
* The header or image contents need to be set as per image type to
* be generated using this callback function.
* further output file post processing (for ex. checksum calculation,
* padding bytes etc..) can also be done in this callback function.
*/
void (*set_header) (void *, struct stat *, int,
struct mkimage_params *);
/*
* Some image generation support for ex (default image type) supports
* more than one type_ids, this callback function is used to check
* whether input (-T <image_type>) is supported by registered image
* generation/list low level code
*/
int (*check_image_type) (uint8_t);
/* This callback function will be executed if fflag is defined */
int (*fflag_handle) (struct mkimage_params *);
/*
* This callback function will be executed for variable size record
* It is expected to build this header in memory and return its length
* and a pointer to it by using image_type_params.header_size and
* image_type_params.hdr. The return value shall indicate if an
* additional padding should be used when copying the data image
* by returning the padding length.
*/
int (*vrec_header) (struct mkimage_params *,
struct image_type_params *);
/* pointer to the next registered entry in linked list */
struct image_type_params *next;
};
/*
* Exported functions
*/
void mkimage_register (struct image_type_params *tparams);
/*
* There is a c file associated with supported image type low level code
* for ex. default_image.c, fit_image.c
* init is the only function referred by mkimage core.
* to avoid a single lined header file, you can define them here
*
* Supported image types init functions
*/
void pbl_load_uboot(int fd, struct mkimage_params *mparams);
void init_pbl_image_type(void);
void init_ais_image_type(void);
void init_kwb_image_type (void);
void init_imx_image_type (void);
void init_mxs_image_type(void);
void init_default_image_type (void);
void init_fit_image_type (void);
void init_ubl_image_type(void);
void init_omap_image_type(void);
#endif /* _MKIIMAGE_H_ */
......@@ -17,7 +17,7 @@
#include <openssl/evp.h>
#include "mkimage.h"
#include "imagetool.h"
#include "mxsimage.h"
#include <image.h>
......@@ -2148,11 +2148,11 @@ static int mxsimage_check_image_types(uint8_t type)
}
static void mxsimage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
}
int mxsimage_check_params(struct mkimage_params *params)
int mxsimage_check_params(struct image_tool_params *params)
{
if (!params)
return -1;
......@@ -2193,7 +2193,7 @@ static int mxsimage_verify_print_header(char *file, int silent)
char *imagefile;
static int mxsimage_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct sb_boot_image_header *hdr;
......@@ -2291,7 +2291,7 @@ static int sb_build_image(struct sb_image_ctx *ictx,
return 0;
}
static int mxsimage_generate(struct mkimage_params *params,
static int mxsimage_generate(struct image_tool_params *params,
struct image_type_params *tparams)
{
int ret;
......@@ -2337,7 +2337,7 @@ static struct image_type_params mxsimage_params = {
void init_mxs_image_type(void)
{
mkimage_register(&mxsimage_params);
register_image_type(&mxsimage_params);
}
#else
......
......@@ -14,7 +14,7 @@
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include "omapimage.h"
......@@ -69,7 +69,7 @@ static int valid_gph_load_addr(uint32_t load_addr)
}
static int omapimage_verify_header(unsigned char *ptr, int image_size,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct ch_toc *toc = (struct ch_toc *)ptr;
struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
......@@ -188,7 +188,7 @@ static int toc_offset(void *hdr, void *member)
}
static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd,
struct mkimage_params *params)
struct image_tool_params *params)
{
struct ch_toc *toc = (struct ch_toc *)ptr;
struct ch_settings *chs = (struct ch_settings *)
......@@ -224,7 +224,7 @@ static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd,
}
}
int omapimage_check_params(struct mkimage_params *params)
int omapimage_check_params(struct image_tool_params *params)
{
return (params->dflag && (params->fflag || params->lflag)) ||
(params->fflag && (params->dflag || params->lflag)) ||
......@@ -247,5 +247,5 @@ static struct image_type_params omapimage_params = {
void init_omap_image_type(void)
{
mkimage_register(&omapimage_params);
register_image_type(&omapimage_params);
}
......@@ -3,7 +3,7 @@
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include "mkimage.h"
#include "imagetool.h"
#include <image.h>
#include "pblimage.h"
......@@ -242,7 +242,7 @@ static void add_end_cmd(void)
}
}
void pbl_load_uboot(int ifd, struct mkimage_params *params)
void pbl_load_uboot(int ifd, struct image_tool_params *params)
{
FILE *fp_uboot;
int size;
......@@ -281,7 +281,7 @@ static int pblimage_check_image_types(uint8_t type)