Blame view

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

45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
106
107
108
109
  	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...
110
  	/* Build new header */
712fbcf38   Stephen Warren   checkpatch whites...
111
  	image_set_magic(hdr, IH_MAGIC);
f3f431a71   Paul Kocialkowski   Reproducible U-Bo...
112
  	image_set_time(hdr, time);
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
113
  	image_set_size(hdr, imagesize);
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
114
115
  	image_set_load(hdr, addr);
  	image_set_ep(hdr, ep);
712fbcf38   Stephen Warren   checkpatch whites...
116
117
118
119
120
121
122
123
124
  	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...
125
  				sizeof(image_header_t));
712fbcf38   Stephen Warren   checkpatch whites...
126
  	image_set_hcrc(hdr, checksum);
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
127
  }
67f946cd1   Guilherme Maciel Ferreira   dumpimage: replac...
128
  static int image_extract_subimage(void *ptr, struct image_tool_params *params)
a804b5ce2   Guilherme Maciel Ferreira   Add dumpimage, a ...
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  {
  	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...
156
  	return imagetool_save_subimage(params->outfile, file_data, file_len);
a804b5ce2   Guilherme Maciel Ferreira   Add dumpimage, a ...
157
  }
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
158
159
160
  /*
   * Default image type parameters definition
   */
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
161
162
163
164
165
166
167
168
169
  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...
170
  	image_extract_subimage,
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
171
172
173
174
  	image_check_image_types,
  	NULL,
  	NULL
  );