Blame view

tools/default_image.c 4.4 KB
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
1
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.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
14
   * SPDX-License-Identifier:	GPL-2.0+
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
15
   */
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
16
  #include "imagetool.h"
266217999   Guilherme Maciel Ferreira   tools: do not pri...
17
  #include "mkimage.h"
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
18
19
20
21
  #include <image.h>
  #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;
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
89
90
  
  	image_header_t * hdr = (image_header_t *)ptr;
712fbcf38   Stephen Warren   checkpatch whites...
91
  	checksum = crc32(0,
89a4d6b12   Prafulla Wadaskar   tools: mkimage: s...
92
93
94
  			(const unsigned char *)(ptr +
  				sizeof(image_header_t)),
  			sbuf->st_size - sizeof(image_header_t));
5847084f6   Vagrant Cascadian   Respect SOURCE_DA...
95
  	time = imagetool_get_source_date(params, sbuf->st_mtime);
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
96
97
98
99
100
  	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...
101

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