Blame view

tools/default_image.c 4.68 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * (C) Copyright 2008 Semihalf
   *
   * (C) Copyright 2000-2004
   * DENX Software Engineering
   * Wolfgang Denk, wd@denx.de
   *
   * Updated-by: Prafulla Wadaskar <prafulla@marvell.com>
   *		default_image specific code abstracted from mkimage.c
   *		some functions added to address abstraction
   *
   * All rights reserved.
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
14
   */
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
15
  #include "imagetool.h"
266217999   Guilherme Maciel Ferreira   tools: do not pri...
16
  #include "mkimage.h"
3db711085   Simon Glass   crc32: Use the cr...
17
  #include <u-boot/crc.h>
266217999   Guilherme Maciel Ferreira   tools: do not pri...
18

89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
19
  #include <image.h>
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
20
  #include <tee/optee.h>
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
21
  #include <u-boot/crc.h>
5b20d141f   Breno Matheus Lima   imx: Kconfig: Red...
22
  #include <imximage.h>
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
23
24
  
  static image_header_t header;
712fbcf38   Stephen Warren   checkpatch whites...
25
  static int image_check_image_types(uint8_t type)
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
26
  {
b9b50e89d   Stephen Warren   image: Implement ...
27
  	if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) ||
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
28
  	    (type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT))
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
29
30
31
32
  		return EXIT_SUCCESS;
  	else
  		return EXIT_FAILURE;
  }
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
33
  static int image_check_params(struct image_tool_params *params)
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
34
35
36
37
38
  {
  	return	((params->dflag && (params->fflag || params->lflag)) ||
  		(params->fflag && (params->dflag || params->lflag)) ||
  		(params->lflag && (params->dflag || params->fflag)));
  }
712fbcf38   Stephen Warren   checkpatch whites...
39
  static int image_verify_header(unsigned char *ptr, int image_size,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
40
  			struct image_tool_params *params)
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
41
42
43
44
45
46
47
48
49
50
51
52
  {
  	uint32_t len;
  	const unsigned char *data;
  	uint32_t checksum;
  	image_header_t header;
  	image_header_t *hdr = &header;
  
  	/*
  	 * create copy of header so that we can blank out the
  	 * checksum field for checking - this can't be done
  	 * on the PROT_READ mapped data.
  	 */
712fbcf38   Stephen Warren   checkpatch whites...
53
  	memcpy(hdr, ptr, sizeof(image_header_t));
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
54
55
  
  	if (be32_to_cpu(hdr->ih_magic) != IH_MAGIC) {
266217999   Guilherme Maciel Ferreira   tools: do not pri...
56
57
58
  		debug("%s: Bad Magic Number: \"%s\" is no valid image
  ",
  		      params->cmdname, params->imagefile);
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
59
60
61
62
63
64
65
66
  		return -FDT_ERR_BADMAGIC;
  	}
  
  	data = (const unsigned char *)hdr;
  	len  = sizeof(image_header_t);
  
  	checksum = be32_to_cpu(hdr->ih_hcrc);
  	hdr->ih_hcrc = cpu_to_be32(0);	/* clear for re-calculation */
712fbcf38   Stephen Warren   checkpatch whites...
67
  	if (crc32(0, data, len) != checksum) {
266217999   Guilherme Maciel Ferreira   tools: do not pri...
68
69
70
  		debug("%s: ERROR: \"%s\" has bad header checksum!
  ",
  		      params->cmdname, params->imagefile);
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
71
72
73
74
75
76
77
  		return -FDT_ERR_BADSTATE;
  	}
  
  	data = (const unsigned char *)ptr + sizeof(image_header_t);
  	len  = image_size - sizeof(image_header_t) ;
  
  	checksum = be32_to_cpu(hdr->ih_dcrc);
712fbcf38   Stephen Warren   checkpatch whites...
78
  	if (crc32(0, data, len) != checksum) {
266217999   Guilherme Maciel Ferreira   tools: do not pri...
79
80
81
  		debug("%s: ERROR: \"%s\" has corrupted data!
  ",
  		      params->cmdname, params->imagefile);
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
82
83
84
85
  		return -FDT_ERR_BADSTRUCTURE;
  	}
  	return 0;
  }
712fbcf38   Stephen Warren   checkpatch whites...
86
  static void image_set_header(void *ptr, struct stat *sbuf, int ifd,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
87
  				struct image_tool_params *params)
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
88
89
  {
  	uint32_t checksum;
f3f431a71   Paul Kocialkowski   Reproducible U-Bo...
90
  	time_t time;
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
91
  	uint32_t imagesize;
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
92
93
  	uint32_t ep;
  	uint32_t addr;
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
94
95
  
  	image_header_t * hdr = (image_header_t *)ptr;
712fbcf38   Stephen Warren   checkpatch whites...
96
  	checksum = crc32(0,
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
97
98
99
  			(const unsigned char *)(ptr +
  				sizeof(image_header_t)),
  			sbuf->st_size - sizeof(image_header_t));
87925df2b   Alex Kiernan   mkimage: Refactor...
100
  	time = imagetool_get_source_date(params->cmdname, sbuf->st_mtime);
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
101
102
  	ep = params->ep;
  	addr = params->addr;
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
103
104
  	if (params->type == IH_TYPE_FIRMWARE_IVT)
  		/* Add size of CSF minus IVT */
5b20d141f   Breno Matheus Lima   imx: Kconfig: Red...
105
106
  		imagesize = sbuf->st_size - sizeof(image_header_t)
  			    + 0x2060 - sizeof(flash_header_v2_t);
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
107
108
  	else
  		imagesize = sbuf->st_size - sizeof(image_header_t);
f3f431a71   Paul Kocialkowski   Reproducible U-Bo...
109

45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
110
111
112
113
  	if (params->os == IH_OS_TEE) {
  		addr = optee_image_get_load_addr(hdr);
  		ep = optee_image_get_entry_point(hdr);
  	}
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
114
  	/* Build new header */
712fbcf38   Stephen Warren   checkpatch whites...
115
  	image_set_magic(hdr, IH_MAGIC);
f3f431a71   Paul Kocialkowski   Reproducible U-Bo...
116
  	image_set_time(hdr, time);
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
117
  	image_set_size(hdr, imagesize);
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
118
119
  	image_set_load(hdr, addr);
  	image_set_ep(hdr, ep);
712fbcf38   Stephen Warren   checkpatch whites...
120
121
122
123
124
125
126
127
128
  	image_set_dcrc(hdr, checksum);
  	image_set_os(hdr, params->os);
  	image_set_arch(hdr, params->arch);
  	image_set_type(hdr, params->type);
  	image_set_comp(hdr, params->comp);
  
  	image_set_name(hdr, params->imagename);
  
  	checksum = crc32(0, (const unsigned char *)hdr,
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
129
  				sizeof(image_header_t));
712fbcf38   Stephen Warren   checkpatch whites...
130
  	image_set_hcrc(hdr, checksum);
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
131
  }
67f946cd1   Guilherme Maciel Ferreira   dumpimage: replac...
132
  static int image_extract_subimage(void *ptr, struct image_tool_params *params)
a804b5ce2   Guilherme Maciel Ferreira   Add dumpimage, a ...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
  {
  	const image_header_t *hdr = (const image_header_t *)ptr;
  	ulong file_data;
  	ulong file_len;
  
  	if (image_check_type(hdr, IH_TYPE_MULTI)) {
  		ulong idx = params->pflag;
  		ulong count;
  
  		/* get the number of data files present in the image */
  		count = image_multi_count(hdr);
  
  		/* retrieve the "data file" at the idx position */
  		image_multi_getimg(hdr, idx, &file_data, &file_len);
  
  		if ((file_len == 0) || (idx >= count)) {
  			fprintf(stderr, "%s: No such data file %ld in \"%s\"
  ",
  				params->cmdname, idx, params->imagefile);
  			return -1;
  		}
  	} else {
  		file_data = image_get_data(hdr);
  		file_len = image_get_size(hdr);
  	}
  
  	/* save the "data file" into the file system */
67f946cd1   Guilherme Maciel Ferreira   dumpimage: replac...
160
  	return imagetool_save_subimage(params->outfile, file_data, file_len);
a804b5ce2   Guilherme Maciel Ferreira   Add dumpimage, a ...
161
  }
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
162
163
164
  /*
   * Default image type parameters definition
   */
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
165
166
167
168
169
170
171
172
173
  U_BOOT_IMAGE_TYPE(
  	defimage,
  	"Default Image support",
  	sizeof(image_header_t),
  	(void *)&header,
  	image_check_params,
  	image_verify_header,
  	image_print_contents,
  	image_set_header,
67f946cd1   Guilherme Maciel Ferreira   dumpimage: replac...
174
  	image_extract_subimage,
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
175
176
177
178
  	image_check_image_types,
  	NULL,
  	NULL
  );