Blame view
common/image.c
36.7 KB
b97a2a0a2 [new uImage] Defi... |
1 2 3 4 5 6 |
/* * (C) Copyright 2008 Semihalf * * (C) Copyright 2000-2006 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
1a4596601 Add GPL-2.0+ SPDX... |
7 |
* SPDX-License-Identifier: GPL-2.0+ |
b97a2a0a2 [new uImage] Defi... |
8 |
*/ |
ceaed2b1e [new uImage] Move... |
9 |
|
b97a2a0a2 [new uImage] Defi... |
10 |
#ifndef USE_HOSTCC |
5ad03eb38 [new uImage] Fact... |
11 12 13 14 15 16 17 18 19 20 |
#include <common.h> #include <watchdog.h> #ifdef CONFIG_SHOW_BOOT_PROGRESS #include <status_led.h> #endif #ifdef CONFIG_HAS_DATAFLASH #include <dataflash.h> #endif |
95d449ad4 Avoid initrd and ... |
21 22 23 |
#ifdef CONFIG_LOGBUFFER #include <logbuff.h> #endif |
2242f5369 [new uImage] Rena... |
24 |
#include <rtc.h> |
2242f5369 [new uImage] Rena... |
25 |
|
1cf0a8b2f env: Add a loadad... |
26 |
#include <environment.h> |
5dfb52138 [new uImage] New ... |
27 |
#include <image.h> |
0eb25b619 common: Make sure... |
28 |
#include <mapmem.h> |
5dfb52138 [new uImage] New ... |
29 |
|
aa34fbc08 fdt: Allow libfdt... |
30 |
#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT |
fff888a19 [new uImage] Add ... |
31 32 |
#include <libfdt.h> #include <fdt_support.h> |
c87796483 [new uImage] Add ... |
33 |
#endif |
20a14a42a Rename include/md... |
34 |
#include <u-boot/md5.h> |
2b9912e6a includes: move op... |
35 |
#include <u-boot/sha1.h> |
a51ec63b8 image: Use fit_im... |
36 |
#include <asm/errno.h> |
35e7b0f17 sandbox: image: A... |
37 |
#include <asm/io.h> |
c87796483 [new uImage] Add ... |
38 |
|
b6b0fe646 [new uImage] Clea... |
39 |
#ifdef CONFIG_CMD_BDI |
54841ab50 Make sure that ar... |
40 |
extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); |
b6b0fe646 [new uImage] Clea... |
41 42 43 |
#endif DECLARE_GLOBAL_DATA_PTR; |
8a5ea3e61 [new uImage] Move... |
44 |
|
21d29f7f9 bootm: make use o... |
45 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
712fbcf38 checkpatch whites... |
46 |
static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, |
d985c8498 [new uImage] Remo... |
47 |
int verify); |
21d29f7f9 bootm: make use o... |
48 |
#endif |
b97a2a0a2 [new uImage] Defi... |
49 |
#else |
5ad03eb38 [new uImage] Fact... |
50 |
#include "mkimage.h" |
20a14a42a Rename include/md... |
51 |
#include <u-boot/md5.h> |
5dfb52138 [new uImage] New ... |
52 |
#include <time.h> |
b97a2a0a2 [new uImage] Defi... |
53 |
#include <image.h> |
80402f34f spl, common, seri... |
54 55 56 57 |
#ifndef __maybe_unused # define __maybe_unused /* unimplemented */ #endif |
5dfb52138 [new uImage] New ... |
58 |
#endif /* !USE_HOSTCC*/ |
b97a2a0a2 [new uImage] Defi... |
59 |
|
0ccff500c image: Use crc he... |
60 |
#include <u-boot/crc.h> |
13d06981a image: Add device... |
61 62 63 |
#ifndef CONFIG_SYS_BARGSIZE #define CONFIG_SYS_BARGSIZE 512 #endif |
7edb186fc image: constify l... |
64 |
static const table_entry_t uimage_arch[] = { |
570abb0ad [new uImage] Shar... |
65 66 67 68 69 70 71 72 73 |
{ IH_ARCH_INVALID, NULL, "Invalid ARCH", }, { IH_ARCH_ALPHA, "alpha", "Alpha", }, { IH_ARCH_ARM, "arm", "ARM", }, { IH_ARCH_I386, "x86", "Intel x86", }, { IH_ARCH_IA64, "ia64", "IA64", }, { IH_ARCH_M68K, "m68k", "M68K", }, { IH_ARCH_MICROBLAZE, "microblaze", "MicroBlaze", }, { IH_ARCH_MIPS, "mips", "MIPS", }, { IH_ARCH_MIPS64, "mips64", "MIPS 64 Bit", }, |
570abb0ad [new uImage] Shar... |
74 |
{ IH_ARCH_NIOS2, "nios2", "NIOS II", }, |
e419e12d0 Recognize 'powerp... |
75 |
{ IH_ARCH_PPC, "powerpc", "PowerPC", }, |
570abb0ad [new uImage] Shar... |
76 77 78 79 80 81 82 |
{ IH_ARCH_PPC, "ppc", "PowerPC", }, { IH_ARCH_S390, "s390", "IBM S390", }, { IH_ARCH_SH, "sh", "SuperH", }, { IH_ARCH_SPARC, "sparc", "SPARC", }, { IH_ARCH_SPARC64, "sparc64", "SPARC 64 Bit", }, { IH_ARCH_BLACKFIN, "blackfin", "Blackfin", }, { IH_ARCH_AVR32, "avr32", "AVR32", }, |
64d614617 nds32: common bdi... |
83 |
{ IH_ARCH_NDS32, "nds32", "NDS32", }, |
3ddcaccda openrisc: Add arc... |
84 |
{ IH_ARCH_OPENRISC, "or1k", "OpenRISC 1000",}, |
35e7b0f17 sandbox: image: A... |
85 |
{ IH_ARCH_SANDBOX, "sandbox", "Sandbox", }, |
0ae765312 arm64: core support |
86 |
{ IH_ARCH_ARM64, "arm64", "AArch64", }, |
bc5d54288 arc: bdinfo, imag... |
87 |
{ IH_ARCH_ARC, "arc", "ARC", }, |
5bda35cff x86: image: Add n... |
88 |
{ IH_ARCH_X86_64, "x86_64", "AMD x86_64", }, |
570abb0ad [new uImage] Shar... |
89 90 |
{ -1, "", "", }, }; |
7edb186fc image: constify l... |
91 |
static const table_entry_t uimage_os[] = { |
570abb0ad [new uImage] Shar... |
92 |
{ IH_OS_INVALID, NULL, "Invalid OS", }, |
570abb0ad [new uImage] Shar... |
93 94 95 96 97 |
{ IH_OS_LINUX, "linux", "Linux", }, #if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC) { IH_OS_LYNXOS, "lynxos", "LynxOS", }, #endif { IH_OS_NETBSD, "netbsd", "NetBSD", }, |
3df619579 Add support for o... |
98 |
{ IH_OS_OSE, "ose", "Enea OSE", }, |
04d414090 image: Add suppor... |
99 |
{ IH_OS_PLAN9, "plan9", "Plan 9", }, |
570abb0ad [new uImage] Shar... |
100 101 |
{ IH_OS_RTEMS, "rtems", "RTEMS", }, { IH_OS_U_BOOT, "u-boot", "U-Boot", }, |
68b15e831 common/image.c: m... |
102 |
{ IH_OS_VXWORKS, "vxworks", "VxWorks", }, |
570abb0ad [new uImage] Shar... |
103 104 |
#if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC) { IH_OS_QNX, "qnx", "QNX", }, |
570abb0ad [new uImage] Shar... |
105 |
#endif |
f5ed9e390 Add support for b... |
106 107 108 |
#if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC) { IH_OS_INTEGRITY,"integrity", "INTEGRITY", }, #endif |
570abb0ad [new uImage] Shar... |
109 110 111 112 113 114 115 116 117 118 119 120 121 |
#ifdef USE_HOSTCC { IH_OS_4_4BSD, "4_4bsd", "4_4BSD", }, { IH_OS_DELL, "dell", "Dell", }, { IH_OS_ESIX, "esix", "Esix", }, { IH_OS_FREEBSD, "freebsd", "FreeBSD", }, { IH_OS_IRIX, "irix", "Irix", }, { IH_OS_NCR, "ncr", "NCR", }, { IH_OS_OPENBSD, "openbsd", "OpenBSD", }, { IH_OS_PSOS, "psos", "pSOS", }, { IH_OS_SCO, "sco", "SCO", }, { IH_OS_SOLARIS, "solaris", "Solaris", }, { IH_OS_SVR4, "svr4", "SVR4", }, #endif |
67ddd955f image: bootm: Add... |
122 123 124 |
#if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC) { IH_OS_OPENRTOS, "openrtos", "OpenRTOS", }, #endif |
570abb0ad [new uImage] Shar... |
125 126 |
{ -1, "", "", }, }; |
7edb186fc image: constify l... |
127 |
static const table_entry_t uimage_type[] = { |
4962e38e9 mkimage: adding s... |
128 |
{ IH_TYPE_AISIMAGE, "aisimage", "Davinci AIS image",}, |
570abb0ad [new uImage] Shar... |
129 130 |
{ IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image", }, { IH_TYPE_FIRMWARE, "firmware", "Firmware", }, |
3decb14ab mkimage: Add OMAP... |
131 |
{ IH_TYPE_FLATDT, "flat_dt", "Flat Device Tree", }, |
bf411ea9f tools: mkimage: a... |
132 |
{ IH_TYPE_GPIMAGE, "gpimage", "TI Keystone SPL Image",}, |
570abb0ad [new uImage] Shar... |
133 |
{ IH_TYPE_KERNEL, "kernel", "Kernel Image", }, |
b9b50e89d image: Implement ... |
134 |
{ IH_TYPE_KERNEL_NOLOAD, "kernel_noload", "Kernel Image (no loading done)", }, |
4962e38e9 mkimage: adding s... |
135 136 137 |
{ IH_TYPE_KWBIMAGE, "kwbimage", "Kirkwood Boot Image",}, { IH_TYPE_IMXIMAGE, "imximage", "Freescale i.MX Boot Image",}, { IH_TYPE_INVALID, NULL, "Invalid Image", }, |
570abb0ad [new uImage] Shar... |
138 |
{ IH_TYPE_MULTI, "multi", "Multi-File Image", }, |
4962e38e9 mkimage: adding s... |
139 |
{ IH_TYPE_OMAPIMAGE, "omapimage", "TI OMAP SPL With GP CH",}, |
5d898a00f powerpc/CoreNet: ... |
140 |
{ IH_TYPE_PBLIMAGE, "pblimage", "Freescale PBL Boot Image",}, |
570abb0ad [new uImage] Shar... |
141 142 |
{ IH_TYPE_RAMDISK, "ramdisk", "RAMDisk Image", }, { IH_TYPE_SCRIPT, "script", "Script", }, |
832472a94 tools: socfpga: A... |
143 |
{ IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SOCFPGA preloader",}, |
570abb0ad [new uImage] Shar... |
144 |
{ IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, |
7816f2cf8 mkimage: add UBL ... |
145 |
{ IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",}, |
bce883707 ARM: mxs: tools: ... |
146 |
{ IH_TYPE_MXSIMAGE, "mxsimage", "Freescale MXS Boot Image",}, |
7b1a41174 mkimage: add atme... |
147 |
{ IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",}, |
90268b878 x86: Support load... |
148 |
{ IH_TYPE_X86_SETUP, "x86_setup", "x86 setup.bin", }, |
39f520bb6 lpc32xx: add lpc3... |
149 |
{ IH_TYPE_LPC32XXIMAGE, "lpc32xximage", "LPC32XX Boot Image", }, |
a131c1f44 rockchip: Add the... |
150 |
{ IH_TYPE_RKIMAGE, "rkimage", "Rockchip Boot Image" }, |
f9a3c278b rockchip: Add sup... |
151 |
{ IH_TYPE_RKSD, "rksd", "Rockchip SD Boot Image" }, |
10b84fe1b rockchip: Add sup... |
152 |
{ IH_TYPE_RKSPI, "rkspi", "Rockchip SPI Boot Image" }, |
66eef1e78 tools: zynqimage:... |
153 |
{ IH_TYPE_ZYNQIMAGE, "zynqimage", "Xilinx Zynq Boot Image" }, |
570abb0ad [new uImage] Shar... |
154 155 |
{ -1, "", "", }, }; |
7edb186fc image: constify l... |
156 |
static const table_entry_t uimage_comp[] = { |
570abb0ad [new uImage] Shar... |
157 158 159 |
{ IH_COMP_NONE, "none", "uncompressed", }, { IH_COMP_BZIP2, "bzip2", "bzip2 compressed", }, { IH_COMP_GZIP, "gzip", "gzip compressed", }, |
fc9c1727b Add support for L... |
160 |
{ IH_COMP_LZMA, "lzma", "lzma compressed", }, |
20dde48bc add lzop decompre... |
161 |
{ IH_COMP_LZO, "lzo", "lzo compressed", }, |
027b728d4 Add support for L... |
162 |
{ IH_COMP_LZ4, "lz4", "lz4 compressed", }, |
570abb0ad [new uImage] Shar... |
163 164 |
{ -1, "", "", }, }; |
9a4daad0a [new uImage] Upda... |
165 166 167 |
/*****************************************************************************/ /* Legacy format routines */ /*****************************************************************************/ |
712fbcf38 checkpatch whites... |
168 |
int image_check_hcrc(const image_header_t *hdr) |
b97a2a0a2 [new uImage] Defi... |
169 170 |
{ ulong hcrc; |
712fbcf38 checkpatch whites... |
171 |
ulong len = image_get_header_size(); |
b97a2a0a2 [new uImage] Defi... |
172 173 174 |
image_header_t header; /* Copy header so we can blank CRC field for re-calculation */ |
712fbcf38 checkpatch whites... |
175 176 |
memmove(&header, (char *)hdr, image_get_header_size()); image_set_hcrc(&header, 0); |
b97a2a0a2 [new uImage] Defi... |
177 |
|
712fbcf38 checkpatch whites... |
178 |
hcrc = crc32(0, (unsigned char *)&header, len); |
b97a2a0a2 [new uImage] Defi... |
179 |
|
712fbcf38 checkpatch whites... |
180 |
return (hcrc == image_get_hcrc(hdr)); |
b97a2a0a2 [new uImage] Defi... |
181 |
} |
712fbcf38 checkpatch whites... |
182 |
int image_check_dcrc(const image_header_t *hdr) |
b97a2a0a2 [new uImage] Defi... |
183 |
{ |
712fbcf38 checkpatch whites... |
184 185 186 |
ulong data = image_get_data(hdr); ulong len = image_get_data_size(hdr); ulong dcrc = crc32_wd(0, (unsigned char *)data, len, CHUNKSZ_CRC32); |
b97a2a0a2 [new uImage] Defi... |
187 |
|
712fbcf38 checkpatch whites... |
188 |
return (dcrc == image_get_dcrc(hdr)); |
b97a2a0a2 [new uImage] Defi... |
189 |
} |
f13e7b2e9 [new uImage] Clea... |
190 191 192 193 194 195 196 197 198 199 200 201 202 |
/** * image_multi_count - get component (sub-image) count * @hdr: pointer to the header of the multi component image * * image_multi_count() returns number of components in a multi * component image. * * Note: no checking of the image type is done, caller must pass * a valid multi component image. * * returns: * number of components */ |
712fbcf38 checkpatch whites... |
203 |
ulong image_multi_count(const image_header_t *hdr) |
f13e7b2e9 [new uImage] Clea... |
204 205 |
{ ulong i, count = 0; |
df6f1b895 [new uImage] Fix ... |
206 |
uint32_t *size; |
f13e7b2e9 [new uImage] Clea... |
207 208 209 |
/* get start of the image payload, which in case of multi * component images that points to a table of component sizes */ |
712fbcf38 checkpatch whites... |
210 |
size = (uint32_t *)image_get_data(hdr); |
f13e7b2e9 [new uImage] Clea... |
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
/* count non empty slots */ for (i = 0; size[i]; ++i) count++; return count; } /** * image_multi_getimg - get component data address and size * @hdr: pointer to the header of the multi component image * @idx: index of the requested component * @data: pointer to a ulong variable, will hold component data address * @len: pointer to a ulong variable, will hold component size * * image_multi_getimg() returns size and data address for the requested * component in a multi component image. * * Note: no checking of the image type is done, caller must pass * a valid multi component image. * * returns: * data address and size of the component, if idx is valid * 0 in data and len, if idx is out of range */ |
712fbcf38 checkpatch whites... |
236 |
void image_multi_getimg(const image_header_t *hdr, ulong idx, |
f13e7b2e9 [new uImage] Clea... |
237 238 239 |
ulong *data, ulong *len) { int i; |
df6f1b895 [new uImage] Fix ... |
240 |
uint32_t *size; |
02b9b2244 Fix offset calcul... |
241 |
ulong offset, count, img_data; |
f13e7b2e9 [new uImage] Clea... |
242 243 |
/* get number of component */ |
712fbcf38 checkpatch whites... |
244 |
count = image_multi_count(hdr); |
f13e7b2e9 [new uImage] Clea... |
245 246 247 |
/* get start of the image payload, which in case of multi * component images that points to a table of component sizes */ |
712fbcf38 checkpatch whites... |
248 |
size = (uint32_t *)image_get_data(hdr); |
f13e7b2e9 [new uImage] Clea... |
249 250 251 |
/* get address of the proper component data start, which means * skipping sizes table (add 1 for last, null entry) */ |
712fbcf38 checkpatch whites... |
252 |
img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t); |
f13e7b2e9 [new uImage] Clea... |
253 254 |
if (idx < count) { |
712fbcf38 checkpatch whites... |
255 |
*len = uimage_to_cpu(size[idx]); |
f13e7b2e9 [new uImage] Clea... |
256 |
offset = 0; |
f13e7b2e9 [new uImage] Clea... |
257 258 259 |
/* go over all indices preceding requested component idx */ for (i = 0; i < idx; i++) { |
02b9b2244 Fix offset calcul... |
260 |
/* add up i-th component size, rounding up to 4 bytes */ |
712fbcf38 checkpatch whites... |
261 |
offset += (uimage_to_cpu(size[i]) + 3) & ~3 ; |
f13e7b2e9 [new uImage] Clea... |
262 263 264 |
} /* calculate idx-th component data address */ |
02b9b2244 Fix offset calcul... |
265 |
*data = img_data + offset; |
f13e7b2e9 [new uImage] Clea... |
266 267 268 269 270 |
} else { *len = 0; *data = 0; } } |
42b73e8ee [new uImage] Fact... |
271 |
|
712fbcf38 checkpatch whites... |
272 |
static void image_print_type(const image_header_t *hdr) |
9a4daad0a [new uImage] Upda... |
273 |
{ |
80402f34f spl, common, seri... |
274 |
const char __maybe_unused *os, *arch, *type, *comp; |
9a4daad0a [new uImage] Upda... |
275 |
|
712fbcf38 checkpatch whites... |
276 277 278 279 |
os = genimg_get_os_name(image_get_os(hdr)); arch = genimg_get_arch_name(image_get_arch(hdr)); type = genimg_get_type_name(image_get_type(hdr)); comp = genimg_get_comp_name(image_get_comp(hdr)); |
9a4daad0a [new uImage] Upda... |
280 |
|
712fbcf38 checkpatch whites... |
281 282 |
printf("%s %s %s (%s) ", arch, os, type, comp); |
9a4daad0a [new uImage] Upda... |
283 |
} |
5dfb52138 [new uImage] New ... |
284 |
/** |
edbed247a Memory footprint ... |
285 |
* image_print_contents - prints out the contents of the legacy format image |
3a2003f61 tools/mkimage: fi... |
286 |
* @ptr: pointer to the legacy format image header |
5dfb52138 [new uImage] New ... |
287 288 |
* @p: pointer to prefix string * |
edbed247a Memory footprint ... |
289 |
* image_print_contents() formats a multi line legacy image contents description. |
5dfb52138 [new uImage] New ... |
290 291 292 293 294 295 |
* The routine prints out all header fields followed by the size/offset data * for MULTI/SCRIPT images. * * returns: * no returned results */ |
712fbcf38 checkpatch whites... |
296 |
void image_print_contents(const void *ptr) |
9a4daad0a [new uImage] Upda... |
297 |
{ |
3a2003f61 tools/mkimage: fi... |
298 |
const image_header_t *hdr = (const image_header_t *)ptr; |
80402f34f spl, common, seri... |
299 |
const char __maybe_unused *p; |
edbed247a Memory footprint ... |
300 |
|
1fe7d9389 image: Remove rem... |
301 |
p = IMAGE_INDENT_STRING; |
712fbcf38 checkpatch whites... |
302 303 |
printf("%sImage Name: %.*s ", p, IH_NMLEN, image_get_name(hdr)); |
859e92b77 image: Move times... |
304 305 306 307 |
if (IMAGE_ENABLE_TIMESTAMP) { printf("%sCreated: ", p); genimg_print_time((time_t)image_get_time(hdr)); } |
712fbcf38 checkpatch whites... |
308 309 310 311 312 313 314 315 316 317 318 |
printf("%sImage Type: ", p); image_print_type(hdr); printf("%sData Size: ", p); genimg_print_size(image_get_data_size(hdr)); printf("%sLoad Address: %08x ", p, image_get_load(hdr)); printf("%sEntry Point: %08x ", p, image_get_ep(hdr)); if (image_check_type(hdr, IH_TYPE_MULTI) || image_check_type(hdr, IH_TYPE_SCRIPT)) { |
9a4daad0a [new uImage] Upda... |
319 320 |
int i; ulong data, len; |
712fbcf38 checkpatch whites... |
321 |
ulong count = image_multi_count(hdr); |
9a4daad0a [new uImage] Upda... |
322 |
|
712fbcf38 checkpatch whites... |
323 324 |
printf("%sContents: ", p); |
9a4daad0a [new uImage] Upda... |
325 |
for (i = 0; i < count; i++) { |
712fbcf38 checkpatch whites... |
326 |
image_multi_getimg(hdr, i, &data, &len); |
570abb0ad [new uImage] Shar... |
327 |
|
712fbcf38 checkpatch whites... |
328 329 |
printf("%s Image %d: ", p, i); genimg_print_size(len); |
570abb0ad [new uImage] Shar... |
330 |
|
712fbcf38 checkpatch whites... |
331 |
if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) { |
570abb0ad [new uImage] Shar... |
332 333 334 335 336 |
/* * the user may need to know offsets * if planning to do something with * multiple files */ |
712fbcf38 checkpatch whites... |
337 338 |
printf("%s Offset = 0x%08lx ", p, data); |
570abb0ad [new uImage] Shar... |
339 |
} |
9a4daad0a [new uImage] Upda... |
340 341 342 |
} } } |
570abb0ad [new uImage] Shar... |
343 344 |
#ifndef USE_HOSTCC |
21d29f7f9 bootm: make use o... |
345 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
9a4daad0a [new uImage] Upda... |
346 347 |
/** * image_get_ramdisk - get and verify ramdisk image |
9a4daad0a [new uImage] Upda... |
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
* @rd_addr: ramdisk image start address * @arch: expected ramdisk architecture * @verify: checksum verification flag * * image_get_ramdisk() returns a pointer to the verified ramdisk image * header. Routine receives image start address and expected architecture * flag. Verification done covers data and header integrity and os/type/arch * fields checking. * * If dataflash support is enabled routine checks for dataflash addresses * and handles required dataflash reads. * * returns: * pointer to a ramdisk image header, if image was found and valid * otherwise, return NULL */ |
712fbcf38 checkpatch whites... |
364 |
static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, |
d985c8498 [new uImage] Remo... |
365 |
int verify) |
9a4daad0a [new uImage] Upda... |
366 |
{ |
3a2003f61 tools/mkimage: fi... |
367 |
const image_header_t *rd_hdr = (const image_header_t *)rd_addr; |
9a4daad0a [new uImage] Upda... |
368 |
|
712fbcf38 checkpatch whites... |
369 370 371 |
if (!image_check_magic(rd_hdr)) { puts("Bad Magic Number "); |
770605e4f bootstage: Replac... |
372 |
bootstage_error(BOOTSTAGE_ID_RD_MAGIC); |
9a4daad0a [new uImage] Upda... |
373 374 |
return NULL; } |
712fbcf38 checkpatch whites... |
375 376 377 |
if (!image_check_hcrc(rd_hdr)) { puts("Bad Header Checksum "); |
770605e4f bootstage: Replac... |
378 |
bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM); |
9a4daad0a [new uImage] Upda... |
379 380 |
return NULL; } |
770605e4f bootstage: Replac... |
381 |
bootstage_mark(BOOTSTAGE_ID_RD_MAGIC); |
712fbcf38 checkpatch whites... |
382 |
image_print_contents(rd_hdr); |
9a4daad0a [new uImage] Upda... |
383 384 385 |
if (verify) { puts(" Verifying Checksum ... "); |
712fbcf38 checkpatch whites... |
386 387 388 |
if (!image_check_dcrc(rd_hdr)) { puts("Bad Data CRC "); |
770605e4f bootstage: Replac... |
389 |
bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM); |
9a4daad0a [new uImage] Upda... |
390 391 392 393 394 |
return NULL; } puts("OK "); } |
770605e4f bootstage: Replac... |
395 |
bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM); |
9a4daad0a [new uImage] Upda... |
396 |
|
712fbcf38 checkpatch whites... |
397 398 399 400 401 |
if (!image_check_os(rd_hdr, IH_OS_LINUX) || !image_check_arch(rd_hdr, arch) || !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) { printf("No Linux %s Ramdisk Image ", |
9a4daad0a [new uImage] Upda... |
402 |
genimg_get_arch_name(arch)); |
770605e4f bootstage: Replac... |
403 |
bootstage_error(BOOTSTAGE_ID_RAMDISK); |
9a4daad0a [new uImage] Upda... |
404 405 406 407 408 |
return NULL; } return rd_hdr; } |
21d29f7f9 bootm: make use o... |
409 |
#endif |
570abb0ad [new uImage] Shar... |
410 |
#endif /* !USE_HOSTCC */ |
9a4daad0a [new uImage] Upda... |
411 412 413 414 |
/*****************************************************************************/ /* Shared dual-format routines */ /*****************************************************************************/ |
570abb0ad [new uImage] Shar... |
415 |
#ifndef USE_HOSTCC |
1cf0a8b2f env: Add a loadad... |
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
ulong load_addr = CONFIG_SYS_LOAD_ADDR; /* Default Load Address */ ulong save_addr; /* Default Save Address */ ulong save_size; /* Default Save Size (in bytes) */ static int on_loadaddr(const char *name, const char *value, enum env_op op, int flags) { switch (op) { case env_op_create: case env_op_overwrite: load_addr = simple_strtoul(value, NULL, 16); break; default: break; } return 0; } U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr); |
9a4daad0a [new uImage] Upda... |
435 436 |
ulong getenv_bootm_low(void) { |
712fbcf38 checkpatch whites... |
437 |
char *s = getenv("bootm_low"); |
9a4daad0a [new uImage] Upda... |
438 |
if (s) { |
712fbcf38 checkpatch whites... |
439 |
ulong tmp = simple_strtoul(s, NULL, 16); |
9a4daad0a [new uImage] Upda... |
440 441 |
return tmp; } |
6d0f6bcf3 rename CFG_ macro... |
442 443 |
#if defined(CONFIG_SYS_SDRAM_BASE) return CONFIG_SYS_SDRAM_BASE; |
afe45c87e [new uImage] Fix ... |
444 445 |
#elif defined(CONFIG_ARM) return gd->bd->bi_dram[0].start; |
9a4daad0a [new uImage] Upda... |
446 447 448 449 |
#else return 0; #endif } |
391fd93ab Change lmb to use... |
450 |
phys_size_t getenv_bootm_size(void) |
9a4daad0a [new uImage] Upda... |
451 |
{ |
0cb389dd1 image: fix getenv... |
452 453 |
phys_size_t tmp, size; phys_addr_t start; |
712fbcf38 checkpatch whites... |
454 |
char *s = getenv("bootm_size"); |
9a4daad0a [new uImage] Upda... |
455 |
if (s) { |
712fbcf38 checkpatch whites... |
456 |
tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
9a4daad0a [new uImage] Upda... |
457 458 |
return tmp; } |
0cb389dd1 image: fix getenv... |
459 460 461 462 463 464 465 466 |
#if defined(CONFIG_ARM) && defined(CONFIG_NR_DRAM_BANKS) start = gd->bd->bi_dram[0].start; size = gd->bd->bi_dram[0].size; #else start = gd->bd->bi_memstart; size = gd->bd->bi_memsize; #endif |
c519facc6 Fix condition whe... |
467 468 |
s = getenv("bootm_low"); if (s) |
712fbcf38 checkpatch whites... |
469 |
tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
c519facc6 Fix condition whe... |
470 |
else |
0cb389dd1 image: fix getenv... |
471 |
tmp = start; |
9a4daad0a [new uImage] Upda... |
472 |
|
0cb389dd1 image: fix getenv... |
473 |
return size - (tmp - start); |
9a4daad0a [new uImage] Upda... |
474 |
} |
c3624e6ed Default to bootm_... |
475 476 477 |
phys_size_t getenv_bootm_mapsize(void) { phys_size_t tmp; |
712fbcf38 checkpatch whites... |
478 |
char *s = getenv("bootm_mapsize"); |
c3624e6ed Default to bootm_... |
479 |
if (s) { |
712fbcf38 checkpatch whites... |
480 |
tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
c3624e6ed Default to bootm_... |
481 482 483 484 485 486 487 488 489 |
return tmp; } #if defined(CONFIG_SYS_BOOTMAPSZ) return CONFIG_SYS_BOOTMAPSZ; #else return getenv_bootm_size(); #endif } |
712fbcf38 checkpatch whites... |
490 |
void memmove_wd(void *to, void *from, size_t len, ulong chunksz) |
9a4daad0a [new uImage] Upda... |
491 |
{ |
54fa2c5b5 Move test for unn... |
492 493 |
if (to == from) return; |
9a4daad0a [new uImage] Upda... |
494 |
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) |
22cfddc2a memmove_wd: copy ... |
495 496 497 498 |
if (to > from) { from += len; to += len; } |
9a4daad0a [new uImage] Upda... |
499 500 |
while (len > 0) { size_t tail = (len > chunksz) ? chunksz : len; |
712fbcf38 checkpatch whites... |
501 |
WATCHDOG_RESET(); |
22cfddc2a memmove_wd: copy ... |
502 503 504 505 |
if (to > from) { to -= tail; from -= tail; } |
712fbcf38 checkpatch whites... |
506 |
memmove(to, from, tail); |
22cfddc2a memmove_wd: copy ... |
507 508 509 510 |
if (to < from) { to += tail; from += tail; } |
9a4daad0a [new uImage] Upda... |
511 512 513 |
len -= tail; } #else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */ |
712fbcf38 checkpatch whites... |
514 |
memmove(to, from, len); |
9a4daad0a [new uImage] Upda... |
515 516 |
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */ } |
570abb0ad [new uImage] Shar... |
517 |
#endif /* !USE_HOSTCC */ |
9a4daad0a [new uImage] Upda... |
518 |
|
712fbcf38 checkpatch whites... |
519 |
void genimg_print_size(uint32_t size) |
42b73e8ee [new uImage] Fact... |
520 |
{ |
570abb0ad [new uImage] Shar... |
521 |
#ifndef USE_HOSTCC |
712fbcf38 checkpatch whites... |
522 523 524 |
printf("%d Bytes = ", size); print_size(size, " "); |
570abb0ad [new uImage] Shar... |
525 |
#else |
712fbcf38 checkpatch whites... |
526 527 |
printf("%d Bytes = %.2f kB = %.2f MB ", |
570abb0ad [new uImage] Shar... |
528 529 |
size, (double)size / 1.024e3, (double)size / 1.048576e6); |
42b73e8ee [new uImage] Fact... |
530 |
#endif |
570abb0ad [new uImage] Shar... |
531 |
} |
859e92b77 image: Move times... |
532 533 |
#if IMAGE_ENABLE_TIMESTAMP void genimg_print_time(time_t timestamp) |
570abb0ad [new uImage] Shar... |
534 535 536 |
{ #ifndef USE_HOSTCC struct rtc_time tm; |
9f9276c34 dm: rtc: Rename t... |
537 |
rtc_to_tm(timestamp, &tm); |
712fbcf38 checkpatch whites... |
538 539 |
printf("%4d-%02d-%02d %2d:%02d:%02d UTC ", |
570abb0ad [new uImage] Shar... |
540 541 542 |
tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); #else |
712fbcf38 checkpatch whites... |
543 |
printf("%s", ctime(×tamp)); |
42b73e8ee [new uImage] Fact... |
544 |
#endif |
570abb0ad [new uImage] Shar... |
545 |
} |
859e92b77 image: Move times... |
546 |
#endif |
42b73e8ee [new uImage] Fact... |
547 |
|
5b9d44df2 mkimage: Display ... |
548 549 550 551 552 553 554 555 |
const table_entry_t *get_table_entry(const table_entry_t *table, int id) { for (; table->id >= 0; ++table) { if (table->id == id) return table; } return NULL; } |
570abb0ad [new uImage] Shar... |
556 557 558 559 560 561 562 563 564 565 566 567 568 569 |
/** * get_table_entry_name - translate entry id to long name * @table: pointer to a translation table for entries of a specific type * @msg: message to be returned when translation fails * @id: entry id to be translated * * get_table_entry_name() will go over translation table trying to find * entry that matches given id. If matching entry is found, its long * name is returned to the caller. * * returns: * long entry name if translation succeeds * msg otherwise */ |
7edb186fc image: constify l... |
570 |
char *get_table_entry_name(const table_entry_t *table, char *msg, int id) |
570abb0ad [new uImage] Shar... |
571 |
{ |
5b9d44df2 mkimage: Display ... |
572 573 574 |
table = get_table_entry(table, id); if (!table) return msg; |
2e5167cca Replace CONFIG_RE... |
575 |
#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC) |
5b9d44df2 mkimage: Display ... |
576 |
return table->lname; |
e3d1ac7bb common/image.c: R... |
577 |
#else |
5b9d44df2 mkimage: Display ... |
578 |
return table->lname + gd->reloc_off; |
e3d1ac7bb common/image.c: R... |
579 |
#endif |
570abb0ad [new uImage] Shar... |
580 |
} |
42b73e8ee [new uImage] Fact... |
581 |
|
712fbcf38 checkpatch whites... |
582 |
const char *genimg_get_os_name(uint8_t os) |
570abb0ad [new uImage] Shar... |
583 |
{ |
712fbcf38 checkpatch whites... |
584 |
return (get_table_entry_name(uimage_os, "Unknown OS", os)); |
42b73e8ee [new uImage] Fact... |
585 |
} |
712fbcf38 checkpatch whites... |
586 |
const char *genimg_get_arch_name(uint8_t arch) |
42b73e8ee [new uImage] Fact... |
587 |
{ |
712fbcf38 checkpatch whites... |
588 589 |
return (get_table_entry_name(uimage_arch, "Unknown Architecture", arch)); |
570abb0ad [new uImage] Shar... |
590 |
} |
42b73e8ee [new uImage] Fact... |
591 |
|
712fbcf38 checkpatch whites... |
592 |
const char *genimg_get_type_name(uint8_t type) |
570abb0ad [new uImage] Shar... |
593 |
{ |
712fbcf38 checkpatch whites... |
594 |
return (get_table_entry_name(uimage_type, "Unknown Image", type)); |
570abb0ad [new uImage] Shar... |
595 |
} |
42b73e8ee [new uImage] Fact... |
596 |
|
cef2e5148 image: Add functi... |
597 |
static const char *genimg_get_short_name(const table_entry_t *table, int val) |
5b9d44df2 mkimage: Display ... |
598 |
{ |
cef2e5148 image: Add functi... |
599 |
table = get_table_entry(table, val); |
5b9d44df2 mkimage: Display ... |
600 601 602 603 604 605 606 607 |
if (!table) return "unknown"; #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC) return table->sname; #else return table->sname + gd->reloc_off; #endif } |
cef2e5148 image: Add functi... |
608 609 610 611 |
const char *genimg_get_type_short_name(uint8_t type) { return genimg_get_short_name(uimage_type, type); } |
712fbcf38 checkpatch whites... |
612 |
const char *genimg_get_comp_name(uint8_t comp) |
570abb0ad [new uImage] Shar... |
613 |
{ |
712fbcf38 checkpatch whites... |
614 615 |
return (get_table_entry_name(uimage_comp, "Unknown Compression", comp)); |
42b73e8ee [new uImage] Fact... |
616 |
} |
cef2e5148 image: Add functi... |
617 618 619 620 621 622 623 624 625 626 627 628 629 630 |
const char *genimg_get_comp_short_name(uint8_t comp) { return genimg_get_short_name(uimage_comp, comp); } const char *genimg_get_os_short_name(uint8_t os) { return genimg_get_short_name(uimage_os, os); } const char *genimg_get_arch_short_name(uint8_t arch) { return genimg_get_short_name(uimage_arch, arch); } |
570abb0ad [new uImage] Shar... |
631 632 633 634 635 636 637 638 639 640 641 642 643 644 |
/** * get_table_entry_id - translate short entry name to id * @table: pointer to a translation table for entries of a specific type * @table_name: to be used in case of error * @name: entry short name to be translated * * get_table_entry_id() will go over translation table trying to find * entry that matches given short name. If matching entry is found, * its id returned to the caller. * * returns: * entry id if translation succeeds * -1 otherwise */ |
7edb186fc image: constify l... |
645 |
int get_table_entry_id(const table_entry_t *table, |
570abb0ad [new uImage] Shar... |
646 |
const char *table_name, const char *name) |
42b73e8ee [new uImage] Fact... |
647 |
{ |
7edb186fc image: constify l... |
648 |
const table_entry_t *t; |
42b73e8ee [new uImage] Fact... |
649 |
|
570abb0ad [new uImage] Shar... |
650 |
for (t = table; t->id >= 0; ++t) { |
2e5167cca Replace CONFIG_RE... |
651 |
#ifdef CONFIG_NEEDS_MANUAL_RELOC |
5b9d44df2 mkimage: Display ... |
652 |
if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0) |
2e5167cca Replace CONFIG_RE... |
653 |
#else |
5b9d44df2 mkimage: Display ... |
654 |
if (t->sname && strcasecmp(t->sname, name) == 0) |
521af04d8 Conditionally per... |
655 |
#endif |
570abb0ad [new uImage] Shar... |
656 657 |
return (t->id); } |
712fbcf38 checkpatch whites... |
658 659 |
debug("Invalid %s Type: %s ", table_name, name); |
5b9d44df2 mkimage: Display ... |
660 661 |
return -1; |
570abb0ad [new uImage] Shar... |
662 |
} |
712fbcf38 checkpatch whites... |
663 |
int genimg_get_os_id(const char *name) |
570abb0ad [new uImage] Shar... |
664 |
{ |
712fbcf38 checkpatch whites... |
665 |
return (get_table_entry_id(uimage_os, "OS", name)); |
570abb0ad [new uImage] Shar... |
666 |
} |
712fbcf38 checkpatch whites... |
667 |
int genimg_get_arch_id(const char *name) |
570abb0ad [new uImage] Shar... |
668 |
{ |
712fbcf38 checkpatch whites... |
669 |
return (get_table_entry_id(uimage_arch, "CPU", name)); |
42b73e8ee [new uImage] Fact... |
670 |
} |
5ad03eb38 [new uImage] Fact... |
671 |
|
712fbcf38 checkpatch whites... |
672 |
int genimg_get_type_id(const char *name) |
570abb0ad [new uImage] Shar... |
673 |
{ |
712fbcf38 checkpatch whites... |
674 |
return (get_table_entry_id(uimage_type, "Image", name)); |
570abb0ad [new uImage] Shar... |
675 |
} |
712fbcf38 checkpatch whites... |
676 |
int genimg_get_comp_id(const char *name) |
570abb0ad [new uImage] Shar... |
677 |
{ |
712fbcf38 checkpatch whites... |
678 |
return (get_table_entry_id(uimage_comp, "Compression", name)); |
570abb0ad [new uImage] Shar... |
679 680 681 |
} #ifndef USE_HOSTCC |
5ad03eb38 [new uImage] Fact... |
682 |
/** |
6c454fedf image: fix bootm ... |
683 684 |
* genimg_get_kernel_addr_fit - get the real kernel address and return 2 * FIT strings |
0f64140b6 image: introduce ... |
685 |
* @img_addr: a string might contain real image address |
6c454fedf image: fix bootm ... |
686 687 688 689 |
* @fit_uname_config: double pointer to a char, will hold pointer to a * configuration unit name * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage * name |
0f64140b6 image: introduce ... |
690 |
* |
6c454fedf image: fix bootm ... |
691 |
* genimg_get_kernel_addr_fit get the real kernel start address from a string |
0f64140b6 image: introduce ... |
692 693 694 695 696 |
* which is normally the first argv of bootm/bootz * * returns: * kernel start address */ |
6c454fedf image: fix bootm ... |
697 698 699 |
ulong genimg_get_kernel_addr_fit(char * const img_addr, const char **fit_uname_config, const char **fit_uname_kernel) |
0f64140b6 image: introduce ... |
700 |
{ |
0f64140b6 image: introduce ... |
701 702 703 704 705 706 707 708 |
ulong kernel_addr; /* find out kernel image address */ if (!img_addr) { kernel_addr = load_addr; debug("* kernel: default image load address = 0x%08lx ", load_addr); |
73223f0e1 Kconfig: Move CON... |
709 |
#if CONFIG_IS_ENABLED(FIT) |
0f64140b6 image: introduce ... |
710 |
} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr, |
6c454fedf image: fix bootm ... |
711 |
fit_uname_config)) { |
0f64140b6 image: introduce ... |
712 713 |
debug("* kernel: config '%s' from image at 0x%08lx ", |
6c454fedf image: fix bootm ... |
714 |
*fit_uname_config, kernel_addr); |
0f64140b6 image: introduce ... |
715 |
} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr, |
6c454fedf image: fix bootm ... |
716 |
fit_uname_kernel)) { |
0f64140b6 image: introduce ... |
717 718 |
debug("* kernel: subimage '%s' from image at 0x%08lx ", |
6c454fedf image: fix bootm ... |
719 |
*fit_uname_kernel, kernel_addr); |
0f64140b6 image: introduce ... |
720 721 722 723 724 725 726 727 728 729 730 731 |
#endif } else { kernel_addr = simple_strtoul(img_addr, NULL, 16); debug("* kernel: cmdline image address = 0x%08lx ", kernel_addr); } return kernel_addr; } /** |
6c454fedf image: fix bootm ... |
732 733 734 735 736 737 738 739 740 741 742 743 744 |
* genimg_get_kernel_addr() is the simple version of * genimg_get_kernel_addr_fit(). It ignores those return FIT strings */ ulong genimg_get_kernel_addr(char * const img_addr) { const char *fit_uname_config = NULL; const char *fit_uname_kernel = NULL; return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config, &fit_uname_kernel); } /** |
9a4daad0a [new uImage] Upda... |
745 |
* genimg_get_format - get image format type |
fff888a19 [new uImage] Add ... |
746 747 |
* @img_addr: image start address * |
9a4daad0a [new uImage] Upda... |
748 |
* genimg_get_format() checks whether provided address points to a valid |
fff888a19 [new uImage] Add ... |
749 750 |
* legacy or FIT image. * |
4efbe9dbb [new uImage] Corr... |
751 752 |
* New uImage format and FDT blob are based on a libfdt. FDT blob * may be passed directly or embedded in a FIT image. In both situations |
9a4daad0a [new uImage] Upda... |
753 |
* genimg_get_format() must be able to dectect libfdt header. |
4efbe9dbb [new uImage] Corr... |
754 |
* |
fff888a19 [new uImage] Add ... |
755 756 757 |
* returns: * image format type or IMAGE_FORMAT_INVALID if no image is present */ |
35e7b0f17 sandbox: image: A... |
758 |
int genimg_get_format(const void *img_addr) |
fff888a19 [new uImage] Add ... |
759 |
{ |
21d29f7f9 bootm: make use o... |
760 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
3a2003f61 tools/mkimage: fi... |
761 |
const image_header_t *hdr; |
fff888a19 [new uImage] Add ... |
762 |
|
3a2003f61 tools/mkimage: fi... |
763 |
hdr = (const image_header_t *)img_addr; |
fff888a19 [new uImage] Add ... |
764 |
if (image_check_magic(hdr)) |
21d29f7f9 bootm: make use o... |
765 766 |
return IMAGE_FORMAT_LEGACY; #endif |
aa34fbc08 fdt: Allow libfdt... |
767 |
#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT |
21d29f7f9 bootm: make use o... |
768 769 |
if (fdt_check_header(img_addr) == 0) return IMAGE_FORMAT_FIT; |
9ace3fc81 image: add suppor... |
770 771 |
#endif #ifdef CONFIG_ANDROID_BOOT_IMAGE |
21d29f7f9 bootm: make use o... |
772 773 |
if (android_image_check_header(img_addr) == 0) return IMAGE_FORMAT_ANDROID; |
fff888a19 [new uImage] Add ... |
774 |
#endif |
21d29f7f9 bootm: make use o... |
775 |
return IMAGE_FORMAT_INVALID; |
fff888a19 [new uImage] Add ... |
776 777 778 |
} /** |
9a4daad0a [new uImage] Upda... |
779 |
* genimg_get_image - get image from special storage (if necessary) |
fff888a19 [new uImage] Add ... |
780 781 |
* @img_addr: image start address * |
067d15607 imagetool: make t... |
782 |
* genimg_get_image() checks if provided image start address is located |
fff888a19 [new uImage] Add ... |
783 784 785 786 787 |
* in a dataflash storage. If so, image is moved to a system RAM memory. * * returns: * image start address after possible relocation from special storage */ |
712fbcf38 checkpatch whites... |
788 |
ulong genimg_get_image(ulong img_addr) |
fff888a19 [new uImage] Add ... |
789 |
{ |
6f0f9dfc4 [new uImage] Opti... |
790 |
ulong ram_addr = img_addr; |
fff888a19 [new uImage] Add ... |
791 792 |
#ifdef CONFIG_HAS_DATAFLASH |
6f0f9dfc4 [new uImage] Opti... |
793 |
ulong h_size, d_size; |
712fbcf38 checkpatch whites... |
794 |
if (addr_dataflash(img_addr)) { |
35e7b0f17 sandbox: image: A... |
795 |
void *buf; |
6f0f9dfc4 [new uImage] Opti... |
796 |
/* ger RAM address */ |
6d0f6bcf3 rename CFG_ macro... |
797 |
ram_addr = CONFIG_SYS_LOAD_ADDR; |
6f0f9dfc4 [new uImage] Opti... |
798 799 |
/* get header size */ |
712fbcf38 checkpatch whites... |
800 |
h_size = image_get_header_size(); |
73223f0e1 Kconfig: Move CON... |
801 |
#if IMAGE_ENABLE_FIT |
6f0f9dfc4 [new uImage] Opti... |
802 803 804 805 806 |
if (sizeof(struct fdt_header) > h_size) h_size = sizeof(struct fdt_header); #endif /* read in header */ |
712fbcf38 checkpatch whites... |
807 |
debug(" Reading image header from dataflash address " |
fff888a19 [new uImage] Add ... |
808 809 |
"%08lx to RAM address %08lx ", img_addr, ram_addr); |
fff888a19 [new uImage] Add ... |
810 |
|
35e7b0f17 sandbox: image: A... |
811 812 |
buf = map_sysmem(ram_addr, 0); read_dataflash(img_addr, h_size, buf); |
fff888a19 [new uImage] Add ... |
813 |
|
6f0f9dfc4 [new uImage] Opti... |
814 |
/* get data size */ |
35e7b0f17 sandbox: image: A... |
815 |
switch (genimg_get_format(buf)) { |
21d29f7f9 bootm: make use o... |
816 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
6f0f9dfc4 [new uImage] Opti... |
817 |
case IMAGE_FORMAT_LEGACY: |
35e7b0f17 sandbox: image: A... |
818 |
d_size = image_get_data_size(buf); |
712fbcf38 checkpatch whites... |
819 820 821 |
debug(" Legacy format image found at 0x%08lx, " "size 0x%08lx ", |
6f0f9dfc4 [new uImage] Opti... |
822 823 |
ram_addr, d_size); break; |
21d29f7f9 bootm: make use o... |
824 |
#endif |
73223f0e1 Kconfig: Move CON... |
825 |
#if IMAGE_ENABLE_FIT |
6f0f9dfc4 [new uImage] Opti... |
826 |
case IMAGE_FORMAT_FIT: |
35e7b0f17 sandbox: image: A... |
827 |
d_size = fit_get_size(buf) - h_size; |
712fbcf38 checkpatch whites... |
828 829 830 |
debug(" FIT/FDT format image found at 0x%08lx, " "size 0x%08lx ", |
6f0f9dfc4 [new uImage] Opti... |
831 832 |
ram_addr, d_size); break; |
fff888a19 [new uImage] Add ... |
833 |
#endif |
6f0f9dfc4 [new uImage] Opti... |
834 |
default: |
712fbcf38 checkpatch whites... |
835 836 837 |
printf(" No valid image found at 0x%08lx ", img_addr); |
6f0f9dfc4 [new uImage] Opti... |
838 839 |
return ram_addr; } |
fff888a19 [new uImage] Add ... |
840 |
|
6f0f9dfc4 [new uImage] Opti... |
841 |
/* read in image data */ |
712fbcf38 checkpatch whites... |
842 |
debug(" Reading image remaining data from dataflash address " |
fff888a19 [new uImage] Add ... |
843 844 845 |
"%08lx to RAM address %08lx ", img_addr + h_size, ram_addr + h_size); |
712fbcf38 checkpatch whites... |
846 |
read_dataflash(img_addr + h_size, d_size, |
35e7b0f17 sandbox: image: A... |
847 |
(char *)(buf + h_size)); |
6f0f9dfc4 [new uImage] Opti... |
848 |
|
fff888a19 [new uImage] Add ... |
849 |
} |
6f0f9dfc4 [new uImage] Opti... |
850 |
#endif /* CONFIG_HAS_DATAFLASH */ |
fff888a19 [new uImage] Add ... |
851 852 853 854 855 |
return ram_addr; } /** |
f773bea8e [new uImage] Add ... |
856 857 858 859 860 861 862 863 864 865 |
* fit_has_config - check if there is a valid FIT configuration * @images: pointer to the bootm command headers structure * * fit_has_config() checks if there is a FIT configuration in use * (if FTI support is present). * * returns: * 0, no FIT support or no configuration found * 1, configuration found */ |
712fbcf38 checkpatch whites... |
866 |
int genimg_has_config(bootm_headers_t *images) |
f773bea8e [new uImage] Add ... |
867 |
{ |
73223f0e1 Kconfig: Move CON... |
868 |
#if IMAGE_ENABLE_FIT |
f773bea8e [new uImage] Add ... |
869 870 871 872 873 874 875 |
if (images->fit_uname_cfg) return 1; #endif return 0; } /** |
9a4daad0a [new uImage] Upda... |
876 |
* boot_get_ramdisk - main ramdisk handling routine |
5ad03eb38 [new uImage] Fact... |
877 878 |
* @argc: command argument count * @argv: command argument list |
8a5ea3e61 [new uImage] Move... |
879 |
* @images: pointer to the bootm images structure |
5ad03eb38 [new uImage] Fact... |
880 881 882 883 |
* @arch: expected ramdisk architecture * @rd_start: pointer to a ulong variable, will hold ramdisk start address * @rd_end: pointer to a ulong variable, will hold ramdisk end * |
9a4daad0a [new uImage] Upda... |
884 |
* boot_get_ramdisk() is responsible for finding a valid ramdisk image. |
5ad03eb38 [new uImage] Fact... |
885 886 887 888 889 |
* Curently supported are the following ramdisk sources: * - multicomponent kernel/ramdisk image, * - commandline provided address of decicated ramdisk image. * * returns: |
d985c8498 [new uImage] Remo... |
890 |
* 0, if ramdisk image was found and valid, or skiped |
5ad03eb38 [new uImage] Fact... |
891 892 |
* rd_start and rd_end are set to ramdisk start/end addresses if * ramdisk image is found and valid |
d985c8498 [new uImage] Remo... |
893 |
* |
ea86b9e64 Prevent crash if ... |
894 |
* 1, if ramdisk image is found but corrupted, or invalid |
5ad03eb38 [new uImage] Fact... |
895 |
* rd_start and rd_end are set to 0 if no ramdisk exists |
5ad03eb38 [new uImage] Fact... |
896 |
*/ |
712fbcf38 checkpatch whites... |
897 |
int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, |
d985c8498 [new uImage] Remo... |
898 |
uint8_t arch, ulong *rd_start, ulong *rd_end) |
5ad03eb38 [new uImage] Fact... |
899 |
{ |
d5934ad77 [new uImage] Add ... |
900 |
ulong rd_addr, rd_load; |
5ad03eb38 [new uImage] Fact... |
901 |
ulong rd_data, rd_len; |
21d29f7f9 bootm: make use o... |
902 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
3a2003f61 tools/mkimage: fi... |
903 |
const image_header_t *rd_hdr; |
21d29f7f9 bootm: make use o... |
904 |
#endif |
35e7b0f17 sandbox: image: A... |
905 |
void *buf; |
57d40ab70 RAMDISK: Fix unus... |
906 |
#ifdef CONFIG_SUPPORT_RAW_INITRD |
017e1f3f9 BOOT: Add RAW ram... |
907 |
char *end; |
57d40ab70 RAMDISK: Fix unus... |
908 |
#endif |
73223f0e1 Kconfig: Move CON... |
909 |
#if IMAGE_ENABLE_FIT |
f320a4d84 bootm: Use select... |
910 |
const char *fit_uname_config = images->fit_uname_cfg; |
d5934ad77 [new uImage] Add ... |
911 912 |
const char *fit_uname_ramdisk = NULL; ulong default_addr; |
c87796483 [new uImage] Add ... |
913 |
int rd_noffset; |
d5934ad77 [new uImage] Add ... |
914 |
#endif |
983c72f47 Clarify bootm OS ... |
915 |
const char *select = NULL; |
5ad03eb38 [new uImage] Fact... |
916 |
|
c87796483 [new uImage] Add ... |
917 918 |
*rd_start = 0; *rd_end = 0; |
1fec3c5d8 common/image.c: M... |
919 920 921 922 923 |
#ifdef CONFIG_ANDROID_BOOT_IMAGE /* * Look for an Android boot image. */ buf = map_sysmem(images->os.start, 0); |
c139b5ff0 image.c: Fix non-... |
924 |
if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID) |
1fec3c5d8 common/image.c: M... |
925 926 |
select = argv[0]; #endif |
983c72f47 Clarify bootm OS ... |
927 928 |
if (argc >= 2) select = argv[1]; |
2dd46328f image: fix Androi... |
929 |
|
d5934ad77 [new uImage] Add ... |
930 931 932 933 |
/* * Look for a '-' which indicates to ignore the * ramdisk argument */ |
983c72f47 Clarify bootm OS ... |
934 |
if (select && strcmp(select, "-") == 0) { |
712fbcf38 checkpatch whites... |
935 936 |
debug("## Skipping init Ramdisk "); |
d5934ad77 [new uImage] Add ... |
937 |
rd_len = rd_data = 0; |
983c72f47 Clarify bootm OS ... |
938 |
} else if (select || genimg_has_config(images)) { |
73223f0e1 Kconfig: Move CON... |
939 |
#if IMAGE_ENABLE_FIT |
983c72f47 Clarify bootm OS ... |
940 |
if (select) { |
f773bea8e [new uImage] Add ... |
941 942 943 944 945 946 947 948 949 950 |
/* * If the init ramdisk comes from the FIT image and * the FIT image address is omitted in the command * line argument, try to use os FIT image address or * default load address. */ if (images->fit_uname_os) default_addr = (ulong)images->fit_hdr_os; else default_addr = load_addr; |
983c72f47 Clarify bootm OS ... |
951 952 |
if (fit_parse_conf(select, default_addr, &rd_addr, &fit_uname_config)) { |
712fbcf38 checkpatch whites... |
953 954 955 |
debug("* ramdisk: config '%s' from image at " "0x%08lx ", |
f773bea8e [new uImage] Add ... |
956 |
fit_uname_config, rd_addr); |
983c72f47 Clarify bootm OS ... |
957 |
} else if (fit_parse_subimage(select, default_addr, |
f773bea8e [new uImage] Add ... |
958 |
&rd_addr, &fit_uname_ramdisk)) { |
712fbcf38 checkpatch whites... |
959 960 961 |
debug("* ramdisk: subimage '%s' from image at " "0x%08lx ", |
f773bea8e [new uImage] Add ... |
962 963 |
fit_uname_ramdisk, rd_addr); } else |
d5934ad77 [new uImage] Add ... |
964 |
#endif |
f773bea8e [new uImage] Add ... |
965 |
{ |
983c72f47 Clarify bootm OS ... |
966 |
rd_addr = simple_strtoul(select, NULL, 16); |
712fbcf38 checkpatch whites... |
967 968 969 |
debug("* ramdisk: cmdline image address = " "0x%08lx ", |
f773bea8e [new uImage] Add ... |
970 971 |
rd_addr); } |
73223f0e1 Kconfig: Move CON... |
972 |
#if IMAGE_ENABLE_FIT |
f773bea8e [new uImage] Add ... |
973 974 |
} else { /* use FIT configuration provided in first bootm |
a51ec63b8 image: Use fit_im... |
975 976 |
* command argument. If the property is not defined, * quit silently. |
f773bea8e [new uImage] Add ... |
977 |
*/ |
35e7b0f17 sandbox: image: A... |
978 |
rd_addr = map_to_sysmem(images->fit_hdr_os); |
a51ec63b8 image: Use fit_im... |
979 980 981 |
rd_noffset = fit_get_node_from_config(images, FIT_RAMDISK_PROP, rd_addr); if (rd_noffset == -ENOLINK) |
41266c9b5 FIT: Fix handling... |
982 |
return 0; |
a51ec63b8 image: Use fit_im... |
983 984 |
else if (rd_noffset < 0) return 1; |
d5934ad77 [new uImage] Add ... |
985 |
} |
f773bea8e [new uImage] Add ... |
986 |
#endif |
d5934ad77 [new uImage] Add ... |
987 988 |
/* copy from dataflash if needed */ |
712fbcf38 checkpatch whites... |
989 |
rd_addr = genimg_get_image(rd_addr); |
d5934ad77 [new uImage] Add ... |
990 991 992 993 994 995 |
/* * Check if there is an initrd image at the * address provided in the second bootm argument * check image type, for FIT images get FIT node. */ |
35e7b0f17 sandbox: image: A... |
996 997 |
buf = map_sysmem(rd_addr, 0); switch (genimg_get_format(buf)) { |
21d29f7f9 bootm: make use o... |
998 |
#if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
d5934ad77 [new uImage] Add ... |
999 |
case IMAGE_FORMAT_LEGACY: |
712fbcf38 checkpatch whites... |
1000 |
printf("## Loading init Ramdisk from Legacy " |
c87796483 [new uImage] Add ... |
1001 1002 |
"Image at %08lx ... ", rd_addr); |
5ad03eb38 [new uImage] Fact... |
1003 |
|
770605e4f bootstage: Replac... |
1004 |
bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK); |
712fbcf38 checkpatch whites... |
1005 |
rd_hdr = image_get_ramdisk(rd_addr, arch, |
d985c8498 [new uImage] Remo... |
1006 |
images->verify); |
5ad03eb38 [new uImage] Fact... |
1007 |
|
c87796483 [new uImage] Add ... |
1008 |
if (rd_hdr == NULL) |
274cea2bd [new uImage] rewo... |
1009 |
return 1; |
274cea2bd [new uImage] rewo... |
1010 |
|
712fbcf38 checkpatch whites... |
1011 1012 1013 |
rd_data = image_get_data(rd_hdr); rd_len = image_get_data_size(rd_hdr); rd_load = image_get_load(rd_hdr); |
d5934ad77 [new uImage] Add ... |
1014 |
break; |
21d29f7f9 bootm: make use o... |
1015 |
#endif |
73223f0e1 Kconfig: Move CON... |
1016 |
#if IMAGE_ENABLE_FIT |
d5934ad77 [new uImage] Add ... |
1017 |
case IMAGE_FORMAT_FIT: |
126cc8642 image: Remove the... |
1018 |
rd_noffset = fit_image_load(images, |
a51ec63b8 image: Use fit_im... |
1019 |
rd_addr, &fit_uname_ramdisk, |
f320a4d84 bootm: Use select... |
1020 |
&fit_uname_config, arch, |
a51ec63b8 image: Use fit_im... |
1021 1022 |
IH_TYPE_RAMDISK, BOOTSTAGE_ID_FIT_RD_START, |
fe20a81a6 Fix test failure ... |
1023 1024 |
FIT_LOAD_OPTIONAL_NON_ZERO, &rd_data, &rd_len); |
a51ec63b8 image: Use fit_im... |
1025 |
if (rd_noffset < 0) |
c78fce699 FIS: repare incor... |
1026 |
return 1; |
c87796483 [new uImage] Add ... |
1027 |
|
a51ec63b8 image: Use fit_im... |
1028 |
images->fit_hdr_rd = map_sysmem(rd_addr, 0); |
c87796483 [new uImage] Add ... |
1029 |
images->fit_uname_rd = fit_uname_ramdisk; |
3dfe11014 [new uImage] Add ... |
1030 |
images->fit_noffset_rd = rd_noffset; |
c87796483 [new uImage] Add ... |
1031 |
break; |
d5934ad77 [new uImage] Add ... |
1032 |
#endif |
2dd46328f image: fix Androi... |
1033 1034 1035 1036 1037 1038 |
#ifdef CONFIG_ANDROID_BOOT_IMAGE case IMAGE_FORMAT_ANDROID: android_image_get_ramdisk((void *)images->os.start, &rd_data, &rd_len); break; #endif |
d5934ad77 [new uImage] Add ... |
1039 |
default: |
017e1f3f9 BOOT: Add RAW ram... |
1040 |
#ifdef CONFIG_SUPPORT_RAW_INITRD |
983c72f47 Clarify bootm OS ... |
1041 1042 1043 1044 |
end = NULL; if (select) end = strchr(select, ':'); if (end) { |
017e1f3f9 BOOT: Add RAW ram... |
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 |
rd_len = simple_strtoul(++end, NULL, 16); rd_data = rd_addr; } else #endif { puts("Wrong Ramdisk Image Format "); rd_data = rd_len = rd_load = 0; return 1; } |
d5934ad77 [new uImage] Add ... |
1055 |
} |
d5934ad77 [new uImage] Add ... |
1056 |
} else if (images->legacy_hdr_valid && |
712fbcf38 checkpatch whites... |
1057 1058 |
image_check_type(&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) { |
5ad03eb38 [new uImage] Fact... |
1059 |
/* |
d5934ad77 [new uImage] Add ... |
1060 1061 |
* Now check if we have a legacy mult-component image, * get second entry data start address and len. |
5ad03eb38 [new uImage] Fact... |
1062 |
*/ |
770605e4f bootstage: Replac... |
1063 |
bootstage_mark(BOOTSTAGE_ID_RAMDISK); |
712fbcf38 checkpatch whites... |
1064 |
printf("## Loading init Ramdisk from multi component " |
c87796483 [new uImage] Add ... |
1065 1066 |
"Legacy Image at %08lx ... ", |
d5934ad77 [new uImage] Add ... |
1067 |
(ulong)images->legacy_hdr_os); |
712fbcf38 checkpatch whites... |
1068 |
image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len); |
2dd46328f image: fix Androi... |
1069 |
} else { |
5ad03eb38 [new uImage] Fact... |
1070 1071 1072 |
/* * no initrd image */ |
770605e4f bootstage: Replac... |
1073 |
bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK); |
5ad03eb38 [new uImage] Fact... |
1074 1075 1076 1077 |
rd_len = rd_data = 0; } if (!rd_data) { |
712fbcf38 checkpatch whites... |
1078 1079 |
debug("## No init Ramdisk "); |
5ad03eb38 [new uImage] Fact... |
1080 1081 1082 1083 |
} else { *rd_start = rd_data; *rd_end = rd_data + rd_len; } |
712fbcf38 checkpatch whites... |
1084 1085 |
debug(" ramdisk start = 0x%08lx, ramdisk end = 0x%08lx ", |
5ad03eb38 [new uImage] Fact... |
1086 |
*rd_start, *rd_end); |
274cea2bd [new uImage] rewo... |
1087 1088 |
return 0; |
5ad03eb38 [new uImage] Fact... |
1089 |
} |
ceaed2b1e [new uImage] Move... |
1090 |
|
fca43cc80 boot: change some... |
1091 |
#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH |
ceaed2b1e [new uImage] Move... |
1092 |
/** |
9a4daad0a [new uImage] Upda... |
1093 |
* boot_ramdisk_high - relocate init ramdisk |
e822d7fc4 [new uImage] Use ... |
1094 |
* @lmb: pointer to lmb handle, will be used for memory mgmt |
ceaed2b1e [new uImage] Move... |
1095 1096 |
* @rd_data: ramdisk data start address * @rd_len: ramdisk data length |
ceaed2b1e [new uImage] Move... |
1097 1098 1099 1100 1101 |
* @initrd_start: pointer to a ulong variable, will hold final init ramdisk * start address (after possible relocation) * @initrd_end: pointer to a ulong variable, will hold final init ramdisk * end address (after possible relocation) * |
1bce2aeb6 Cosmetic: Fix a n... |
1102 |
* boot_ramdisk_high() takes a relocation hint from "initrd_high" environment |
ceaed2b1e [new uImage] Move... |
1103 1104 |
* variable and if requested ramdisk data is moved to a specified location. * |
9a4daad0a [new uImage] Upda... |
1105 1106 1107 1108 |
* Initrd_start and initrd_end are set to final (after relocation) ramdisk * start/end addresses if ramdisk image start and len were provided, * otherwise set initrd_start and initrd_end set to zeros. * |
ceaed2b1e [new uImage] Move... |
1109 |
* returns: |
9a4daad0a [new uImage] Upda... |
1110 1111 |
* 0 - success * -1 - failure |
ceaed2b1e [new uImage] Move... |
1112 |
*/ |
712fbcf38 checkpatch whites... |
1113 |
int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, |
e822d7fc4 [new uImage] Use ... |
1114 |
ulong *initrd_start, ulong *initrd_end) |
ceaed2b1e [new uImage] Move... |
1115 1116 1117 1118 |
{ char *s; ulong initrd_high; int initrd_copy_to_ram = 1; |
712fbcf38 checkpatch whites... |
1119 |
if ((s = getenv("initrd_high")) != NULL) { |
ceaed2b1e [new uImage] Move... |
1120 1121 1122 |
/* a value of "no" or a similar string will act like 0, * turning the "load high" feature off. This is intentional. */ |
712fbcf38 checkpatch whites... |
1123 |
initrd_high = simple_strtoul(s, NULL, 16); |
ceaed2b1e [new uImage] Move... |
1124 1125 1126 |
if (initrd_high == ~0) initrd_copy_to_ram = 0; } else { |
20e072f37 image: check "boo... |
1127 |
initrd_high = getenv_bootm_mapsize() + getenv_bootm_low(); |
ceaed2b1e [new uImage] Move... |
1128 |
} |
95d449ad4 Avoid initrd and ... |
1129 1130 1131 1132 1133 |
#ifdef CONFIG_LOGBUFFER /* Prevent initrd from overwriting logbuffer */ lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE); #endif |
712fbcf38 checkpatch whites... |
1134 1135 |
debug("## initrd_high = 0x%08lx, copy_to_ram = %d ", |
ceaed2b1e [new uImage] Move... |
1136 1137 1138 1139 |
initrd_high, initrd_copy_to_ram); if (rd_data) { if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */ |
712fbcf38 checkpatch whites... |
1140 1141 |
debug(" in-place initrd "); |
ceaed2b1e [new uImage] Move... |
1142 1143 |
*initrd_start = rd_data; *initrd_end = rd_data + rd_len; |
e822d7fc4 [new uImage] Use ... |
1144 |
lmb_reserve(lmb, rd_data, rd_len); |
ceaed2b1e [new uImage] Move... |
1145 |
} else { |
e822d7fc4 [new uImage] Use ... |
1146 |
if (initrd_high) |
712fbcf38 checkpatch whites... |
1147 1148 |
*initrd_start = (ulong)lmb_alloc_base(lmb, rd_len, 0x1000, initrd_high); |
e822d7fc4 [new uImage] Use ... |
1149 |
else |
712fbcf38 checkpatch whites... |
1150 1151 |
*initrd_start = (ulong)lmb_alloc(lmb, rd_len, 0x1000); |
e822d7fc4 [new uImage] Use ... |
1152 1153 |
if (*initrd_start == 0) { |
712fbcf38 checkpatch whites... |
1154 1155 |
puts("ramdisk - allocation error "); |
e822d7fc4 [new uImage] Use ... |
1156 |
goto error; |
ceaed2b1e [new uImage] Move... |
1157 |
} |
770605e4f bootstage: Replac... |
1158 |
bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK); |
ceaed2b1e [new uImage] Move... |
1159 1160 |
*initrd_end = *initrd_start + rd_len; |
712fbcf38 checkpatch whites... |
1161 |
printf(" Loading Ramdisk to %08lx, end %08lx ... ", |
ceaed2b1e [new uImage] Move... |
1162 |
*initrd_start, *initrd_end); |
712fbcf38 checkpatch whites... |
1163 |
memmove_wd((void *)*initrd_start, |
ceaed2b1e [new uImage] Move... |
1164 |
(void *)rd_data, rd_len, CHUNKSZ); |
3b2001105 powerpc/bootm: Fl... |
1165 1166 1167 1168 1169 1170 1171 1172 |
#ifdef CONFIG_MP /* * Ensure the image is flushed to memory to handle * AMP boot scenarios in which we might not be * HW cache coherent */ flush_cache((unsigned long)*initrd_start, rd_len); #endif |
712fbcf38 checkpatch whites... |
1173 1174 |
puts("OK "); |
ceaed2b1e [new uImage] Move... |
1175 1176 1177 1178 1179 |
} } else { *initrd_start = 0; *initrd_end = 0; } |
712fbcf38 checkpatch whites... |
1180 1181 |
debug(" ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx ", |
ceaed2b1e [new uImage] Move... |
1182 |
*initrd_start, *initrd_end); |
9a4daad0a [new uImage] Upda... |
1183 |
|
e822d7fc4 [new uImage] Use ... |
1184 |
return 0; |
b6b0fe646 [new uImage] Clea... |
1185 |
|
e822d7fc4 [new uImage] Use ... |
1186 1187 |
error: return -1; |
b6b0fe646 [new uImage] Clea... |
1188 |
} |
fca43cc80 boot: change some... |
1189 |
#endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */ |
b6b0fe646 [new uImage] Clea... |
1190 |
|
90268b878 x86: Support load... |
1191 1192 1193 |
int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start, ulong *setup_len) { |
73223f0e1 Kconfig: Move CON... |
1194 |
#if IMAGE_ENABLE_FIT |
90268b878 x86: Support load... |
1195 1196 1197 1198 1199 |
return boot_get_setup_fit(images, arch, setup_start, setup_len); #else return -ENOENT; #endif } |
73223f0e1 Kconfig: Move CON... |
1200 |
#if IMAGE_ENABLE_FIT |
84a07dbfd add boot_get_load... |
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 |
int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images, uint8_t arch, const ulong *ld_start, ulong * const ld_len) { /* * These variables are used to hold the current image location * in system memory. */ ulong tmp_img_addr; /* * These two variables are requirements for fit_image_load, but * their values are not used */ ulong img_data, img_len; void *buf; int loadables_index; int conf_noffset; int fit_img_result; char *uname; /* Check to see if the images struct has a FIT configuration */ if (!genimg_has_config(images)) { debug("## FIT configuration was not specified "); return 0; } /* * Obtain the os FIT header from the images struct * copy from dataflash if needed */ tmp_img_addr = map_to_sysmem(images->fit_hdr_os); tmp_img_addr = genimg_get_image(tmp_img_addr); buf = map_sysmem(tmp_img_addr, 0); /* * Check image type. For FIT images get FIT node * and attempt to locate a generic binary. */ switch (genimg_get_format(buf)) { case IMAGE_FORMAT_FIT: conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg); for (loadables_index = 0; |
9734b97f7 image: Fix loop c... |
1243 |
fdt_get_string_index(buf, conf_noffset, |
84a07dbfd add boot_get_load... |
1244 1245 |
FIT_LOADABLE_PROP, loadables_index, |
9734b97f7 image: Fix loop c... |
1246 |
(const char **)&uname) == 0; |
84a07dbfd add boot_get_load... |
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 |
loadables_index++) { fit_img_result = fit_image_load(images, tmp_img_addr, (const char **)&uname, &(images->fit_uname_cfg), arch, IH_TYPE_LOADABLE, BOOTSTAGE_ID_FIT_LOADABLE_START, FIT_LOAD_OPTIONAL_NON_ZERO, &img_data, &img_len); if (fit_img_result < 0) { /* Something went wrong! */ return fit_img_result; } } break; default: printf("The given image format is not supported (corrupt?) "); return 1; } return 0; } #endif |
fca43cc80 boot: change some... |
1272 |
#ifdef CONFIG_SYS_BOOT_GET_CMDLINE |
b6b0fe646 [new uImage] Clea... |
1273 |
/** |
9a4daad0a [new uImage] Upda... |
1274 |
* boot_get_cmdline - allocate and initialize kernel cmdline |
e822d7fc4 [new uImage] Use ... |
1275 |
* @lmb: pointer to lmb handle, will be used for memory mgmt |
b6b0fe646 [new uImage] Clea... |
1276 1277 1278 |
* @cmd_start: pointer to a ulong variable, will hold cmdline start * @cmd_end: pointer to a ulong variable, will hold cmdline end * |
9a4daad0a [new uImage] Upda... |
1279 |
* boot_get_cmdline() allocates space for kernel command line below |
a187559e3 Use correct spell... |
1280 |
* BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-Boot environemnt |
b6b0fe646 [new uImage] Clea... |
1281 1282 1283 1284 |
* variable is present its contents is copied to allocated kernel * command line. * * returns: |
e822d7fc4 [new uImage] Use ... |
1285 1286 |
* 0 - success * -1 - failure |
b6b0fe646 [new uImage] Clea... |
1287 |
*/ |
712fbcf38 checkpatch whites... |
1288 |
int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end) |
b6b0fe646 [new uImage] Clea... |
1289 1290 1291 |
{ char *cmdline; char *s; |
6d0f6bcf3 rename CFG_ macro... |
1292 |
cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf, |
c3624e6ed Default to bootm_... |
1293 |
getenv_bootm_mapsize() + getenv_bootm_low()); |
e822d7fc4 [new uImage] Use ... |
1294 1295 1296 |
if (cmdline == NULL) return -1; |
b6b0fe646 [new uImage] Clea... |
1297 1298 1299 1300 1301 1302 1303 1304 |
if ((s = getenv("bootargs")) == NULL) s = ""; strcpy(cmdline, s); *cmd_start = (ulong) & cmdline[0]; *cmd_end = *cmd_start + strlen(cmdline); |
712fbcf38 checkpatch whites... |
1305 1306 |
debug("## cmdline at 0x%08lx ... 0x%08lx ", *cmd_start, *cmd_end); |
b6b0fe646 [new uImage] Clea... |
1307 |
|
e822d7fc4 [new uImage] Use ... |
1308 |
return 0; |
b6b0fe646 [new uImage] Clea... |
1309 |
} |
fca43cc80 boot: change some... |
1310 |
#endif /* CONFIG_SYS_BOOT_GET_CMDLINE */ |
b6b0fe646 [new uImage] Clea... |
1311 |
|
fca43cc80 boot: change some... |
1312 |
#ifdef CONFIG_SYS_BOOT_GET_KBD |
b6b0fe646 [new uImage] Clea... |
1313 |
/** |
9a4daad0a [new uImage] Upda... |
1314 |
* boot_get_kbd - allocate and initialize kernel copy of board info |
e822d7fc4 [new uImage] Use ... |
1315 |
* @lmb: pointer to lmb handle, will be used for memory mgmt |
b6b0fe646 [new uImage] Clea... |
1316 1317 |
* @kbd: double pointer to board info data * |
9a4daad0a [new uImage] Upda... |
1318 |
* boot_get_kbd() allocates space for kernel copy of board info data below |
590d3cacb Stop passing arou... |
1319 1320 |
* BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized * with the current u-boot board info data. |
b6b0fe646 [new uImage] Clea... |
1321 1322 |
* * returns: |
e822d7fc4 [new uImage] Use ... |
1323 1324 |
* 0 - success * -1 - failure |
b6b0fe646 [new uImage] Clea... |
1325 |
*/ |
712fbcf38 checkpatch whites... |
1326 |
int boot_get_kbd(struct lmb *lmb, bd_t **kbd) |
b6b0fe646 [new uImage] Clea... |
1327 |
{ |
391fd93ab Change lmb to use... |
1328 |
*kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, |
c3624e6ed Default to bootm_... |
1329 |
getenv_bootm_mapsize() + getenv_bootm_low()); |
e822d7fc4 [new uImage] Use ... |
1330 1331 |
if (*kbd == NULL) return -1; |
b6b0fe646 [new uImage] Clea... |
1332 |
**kbd = *(gd->bd); |
712fbcf38 checkpatch whites... |
1333 1334 |
debug("## kernel board info at 0x%08lx ", (ulong)*kbd); |
b6b0fe646 [new uImage] Clea... |
1335 1336 1337 1338 |
#if defined(DEBUG) && defined(CONFIG_CMD_BDI) do_bdinfo(NULL, 0, 0, NULL); #endif |
e822d7fc4 [new uImage] Use ... |
1339 |
return 0; |
ceaed2b1e [new uImage] Move... |
1340 |
} |
fca43cc80 boot: change some... |
1341 |
#endif /* CONFIG_SYS_BOOT_GET_KBD */ |
13d06981a image: Add device... |
1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 |
#ifdef CONFIG_LMB int image_setup_linux(bootm_headers_t *images) { ulong of_size = images->ft_len; char **of_flat_tree = &images->ft_addr; ulong *initrd_start = &images->initrd_start; ulong *initrd_end = &images->initrd_end; struct lmb *lmb = &images->lmb; ulong rd_len; int ret; if (IMAGE_ENABLE_OF_LIBFDT) boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree); if (IMAGE_BOOT_GET_CMDLINE) { ret = boot_get_cmdline(lmb, &images->cmdline_start, &images->cmdline_end); if (ret) { puts("ERROR with allocation of cmdline "); return ret; } } if (IMAGE_ENABLE_RAMDISK_HIGH) { rd_len = images->rd_end - images->rd_start; ret = boot_ramdisk_high(lmb, images->rd_start, rd_len, initrd_start, initrd_end); if (ret) return ret; } if (IMAGE_ENABLE_OF_LIBFDT) { ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size); if (ret) return ret; } if (IMAGE_ENABLE_OF_LIBFDT && of_size) { ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb); if (ret) return ret; } return 0; } #endif /* CONFIG_LMB */ |
5dfb52138 [new uImage] New ... |
1389 |
#endif /* !USE_HOSTCC */ |