1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef __IMAGE_H__
17#define __IMAGE_H__
18
19#include "compiler.h"
20#include <asm/byteorder.h>
21
22
23struct lmb;
24
25#ifdef USE_HOSTCC
26#include <sys/types.h>
27
28
29#define IMAGE_ENABLE_FIT 1
30#define IMAGE_ENABLE_OF_LIBFDT 1
31#define CONFIG_FIT_VERBOSE 1
32
33#define IMAGE_ENABLE_IGNORE 0
34#define IMAGE_INDENT_STRING ""
35
36#else
37
38#include <lmb.h>
39#include <asm/u-boot.h>
40#include <command.h>
41
42
43#define IMAGE_ENABLE_IGNORE 1
44#define IMAGE_INDENT_STRING " "
45
46#define IMAGE_ENABLE_FIT CONFIG_IS_ENABLED(FIT)
47#define IMAGE_ENABLE_OF_LIBFDT CONFIG_IS_ENABLED(OF_LIBFDT)
48
49#endif
50
51#if IMAGE_ENABLE_FIT
52#include <hash.h>
53#include <libfdt.h>
54#include <fdt_support.h>
55# ifdef CONFIG_SPL_BUILD
56# ifdef CONFIG_SPL_CRC32_SUPPORT
57# define IMAGE_ENABLE_CRC32 1
58# endif
59# ifdef CONFIG_SPL_MD5_SUPPORT
60# define IMAGE_ENABLE_MD5 1
61# endif
62# ifdef CONFIG_SPL_SHA1_SUPPORT
63# define IMAGE_ENABLE_SHA1 1
64# endif
65# ifdef CONFIG_SPL_SHA256_SUPPORT
66# define IMAGE_ENABLE_SHA256 1
67# endif
68# else
69# define CONFIG_CRC32
70# define CONFIG_SHA1
71# define CONFIG_SHA256
72# define IMAGE_ENABLE_CRC32 1
73# define IMAGE_ENABLE_MD5 1
74# define IMAGE_ENABLE_SHA1 1
75# define IMAGE_ENABLE_SHA256 1
76# endif
77
78#ifdef CONFIG_FIT_DISABLE_SHA256
79#undef CONFIG_SHA256
80#undef IMAGE_ENABLE_SHA256
81#endif
82
83#ifndef IMAGE_ENABLE_CRC32
84#define IMAGE_ENABLE_CRC32 0
85#endif
86
87#ifndef IMAGE_ENABLE_MD5
88#define IMAGE_ENABLE_MD5 0
89#endif
90
91#ifndef IMAGE_ENABLE_SHA1
92#define IMAGE_ENABLE_SHA1 0
93#endif
94
95#ifndef IMAGE_ENABLE_SHA256
96#define IMAGE_ENABLE_SHA256 0
97#endif
98
99#endif
100
101#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
102# define IMAGE_BOOT_GET_CMDLINE 1
103#else
104# define IMAGE_BOOT_GET_CMDLINE 0
105#endif
106
107#ifdef CONFIG_OF_BOARD_SETUP
108# define IMAGE_OF_BOARD_SETUP 1
109#else
110# define IMAGE_OF_BOARD_SETUP 0
111#endif
112
113#ifdef CONFIG_OF_SYSTEM_SETUP
114# define IMAGE_OF_SYSTEM_SETUP 1
115#else
116# define IMAGE_OF_SYSTEM_SETUP 0
117#endif
118
119enum ih_category {
120 IH_ARCH,
121 IH_COMP,
122 IH_OS,
123 IH_TYPE,
124
125 IH_COUNT,
126};
127
128
129
130
131
132
133
134enum {
135 IH_OS_INVALID = 0,
136 IH_OS_OPENBSD,
137 IH_OS_NETBSD,
138 IH_OS_FREEBSD,
139 IH_OS_4_4BSD,
140 IH_OS_LINUX,
141 IH_OS_SVR4,
142 IH_OS_ESIX,
143 IH_OS_SOLARIS,
144 IH_OS_IRIX,
145 IH_OS_SCO,
146 IH_OS_DELL,
147 IH_OS_NCR,
148 IH_OS_LYNXOS,
149 IH_OS_VXWORKS,
150 IH_OS_PSOS,
151 IH_OS_QNX,
152 IH_OS_U_BOOT,
153 IH_OS_RTEMS,
154 IH_OS_ARTOS,
155 IH_OS_UNITY,
156 IH_OS_INTEGRITY,
157 IH_OS_OSE,
158 IH_OS_PLAN9,
159 IH_OS_OPENRTOS,
160
161 IH_OS_COUNT,
162};
163
164
165
166
167
168
169
170enum {
171 IH_ARCH_INVALID = 0,
172 IH_ARCH_ALPHA,
173 IH_ARCH_ARM,
174 IH_ARCH_I386,
175 IH_ARCH_IA64,
176 IH_ARCH_MIPS,
177 IH_ARCH_MIPS64,
178 IH_ARCH_PPC,
179 IH_ARCH_S390,
180 IH_ARCH_SH,
181 IH_ARCH_SPARC,
182 IH_ARCH_SPARC64,
183 IH_ARCH_M68K,
184 IH_ARCH_NIOS,
185 IH_ARCH_MICROBLAZE,
186 IH_ARCH_NIOS2,
187 IH_ARCH_BLACKFIN,
188 IH_ARCH_AVR32,
189 IH_ARCH_ST200,
190 IH_ARCH_SANDBOX,
191 IH_ARCH_NDS32,
192 IH_ARCH_OPENRISC,
193 IH_ARCH_ARM64,
194 IH_ARCH_ARC,
195 IH_ARCH_X86_64,
196 IH_ARCH_XTENSA,
197
198 IH_ARCH_COUNT,
199};
200
201
202
203
204
205
206
207
208
209
210
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
236
237
238
239
240
241
242
243enum {
244 IH_TYPE_INVALID = 0,
245 IH_TYPE_STANDALONE,
246 IH_TYPE_KERNEL,
247 IH_TYPE_RAMDISK,
248 IH_TYPE_MULTI,
249 IH_TYPE_FIRMWARE,
250 IH_TYPE_SCRIPT,
251 IH_TYPE_FILESYSTEM,
252 IH_TYPE_FLATDT,
253 IH_TYPE_KWBIMAGE,
254 IH_TYPE_IMXIMAGE,
255 IH_TYPE_UBLIMAGE,
256 IH_TYPE_OMAPIMAGE,
257 IH_TYPE_AISIMAGE,
258
259 IH_TYPE_KERNEL_NOLOAD,
260 IH_TYPE_PBLIMAGE,
261 IH_TYPE_MXSIMAGE,
262 IH_TYPE_GPIMAGE,
263 IH_TYPE_ATMELIMAGE,
264 IH_TYPE_SOCFPGAIMAGE,
265 IH_TYPE_X86_SETUP,
266 IH_TYPE_LPC32XXIMAGE,
267 IH_TYPE_LOADABLE,
268 IH_TYPE_RKIMAGE,
269 IH_TYPE_RKSD,
270 IH_TYPE_RKSPI,
271 IH_TYPE_ZYNQIMAGE,
272 IH_TYPE_ZYNQMPIMAGE,
273 IH_TYPE_FPGA,
274 IH_TYPE_VYBRIDIMAGE,
275 IH_TYPE_TEE,
276 IH_TYPE_FIRMWARE_IVT,
277
278 IH_TYPE_COUNT,
279};
280
281
282
283
284
285
286
287enum {
288 IH_COMP_NONE = 0,
289 IH_COMP_GZIP,
290 IH_COMP_BZIP2,
291 IH_COMP_LZMA,
292 IH_COMP_LZO,
293 IH_COMP_LZ4,
294
295 IH_COMP_COUNT,
296};
297
298#define IH_MAGIC 0x27051956
299#define IH_NMLEN 32
300
301
302#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
303
304
305
306
307
308typedef struct image_header {
309 __be32 ih_magic;
310 __be32 ih_hcrc;
311 __be32 ih_time;
312 __be32 ih_size;
313 __be32 ih_load;
314 __be32 ih_ep;
315 __be32 ih_dcrc;
316 uint8_t ih_os;
317 uint8_t ih_arch;
318 uint8_t ih_type;
319 uint8_t ih_comp;
320 uint8_t ih_name[IH_NMLEN];
321} image_header_t;
322
323typedef struct image_info {
324 ulong start, end;
325 ulong image_start, image_len;
326 ulong load;
327 uint8_t comp, type, os;
328 uint8_t arch;
329} image_info_t;
330
331
332
333
334
335typedef struct bootm_headers {
336
337
338
339
340
341 image_header_t *legacy_hdr_os;
342 image_header_t legacy_hdr_os_copy;
343 ulong legacy_hdr_valid;
344
345#if IMAGE_ENABLE_FIT
346 const char *fit_uname_cfg;
347
348 void *fit_hdr_os;
349 const char *fit_uname_os;
350 int fit_noffset_os;
351
352 void *fit_hdr_rd;
353 const char *fit_uname_rd;
354 int fit_noffset_rd;
355
356 void *fit_hdr_fdt;
357 const char *fit_uname_fdt;
358 int fit_noffset_fdt;
359
360 void *fit_hdr_setup;
361 const char *fit_uname_setup;
362 int fit_noffset_setup;
363#endif
364
365#ifndef USE_HOSTCC
366 image_info_t os;
367 ulong ep;
368
369 ulong rd_start, rd_end;
370
371 char *ft_addr;
372 ulong ft_len;
373
374 ulong initrd_start;
375 ulong initrd_end;
376 ulong cmdline_start;
377 ulong cmdline_end;
378 bd_t *kbd;
379#endif
380
381 int verify;
382
383#define BOOTM_STATE_START (0x00000001)
384#define BOOTM_STATE_FINDOS (0x00000002)
385#define BOOTM_STATE_FINDOTHER (0x00000004)
386#define BOOTM_STATE_LOADOS (0x00000008)
387#define BOOTM_STATE_RAMDISK (0x00000010)
388#define BOOTM_STATE_FDT (0x00000020)
389#define BOOTM_STATE_OS_CMDLINE (0x00000040)
390#define BOOTM_STATE_OS_BD_T (0x00000080)
391#define BOOTM_STATE_OS_PREP (0x00000100)
392#define BOOTM_STATE_OS_FAKE_GO (0x00000200)
393#define BOOTM_STATE_OS_GO (0x00000400)
394 int state;
395
396#ifdef CONFIG_LMB
397 struct lmb lmb;
398#endif
399} bootm_headers_t;
400
401extern bootm_headers_t images;
402
403
404
405
406
407
408#ifndef CHUNKSZ
409#define CHUNKSZ (64 * 1024)
410#endif
411
412#ifndef CHUNKSZ_CRC32
413#define CHUNKSZ_CRC32 (64 * 1024)
414#endif
415
416#ifndef CHUNKSZ_MD5
417#define CHUNKSZ_MD5 (64 * 1024)
418#endif
419
420#ifndef CHUNKSZ_SHA1
421#define CHUNKSZ_SHA1 (64 * 1024)
422#endif
423
424#define uimage_to_cpu(x) be32_to_cpu(x)
425#define cpu_to_uimage(x) cpu_to_be32(x)
426
427
428
429
430
431typedef struct table_entry {
432 int id;
433 char *sname;
434 char *lname;
435} table_entry_t;
436
437
438
439
440
441
442int get_table_entry_id(const table_entry_t *table,
443 const char *table_name, const char *name);
444
445
446
447
448
449char *get_table_entry_name(const table_entry_t *table, char *msg, int id);
450
451const char *genimg_get_os_name(uint8_t os);
452
453
454
455
456
457
458
459const char *genimg_get_os_short_name(uint8_t comp);
460
461const char *genimg_get_arch_name(uint8_t arch);
462
463
464
465
466
467
468
469const char *genimg_get_arch_short_name(uint8_t arch);
470
471const char *genimg_get_type_name(uint8_t type);
472
473
474
475
476
477
478
479const char *genimg_get_type_short_name(uint8_t type);
480
481const char *genimg_get_comp_name(uint8_t comp);
482
483
484
485
486
487
488
489const char *genimg_get_comp_short_name(uint8_t comp);
490
491
492
493
494
495
496
497
498const char *genimg_get_cat_name(enum ih_category category, uint id);
499
500
501
502
503
504
505
506
507const char *genimg_get_cat_short_name(enum ih_category category, uint id);
508
509
510
511
512
513
514
515int genimg_get_cat_count(enum ih_category category);
516
517
518
519
520
521
522
523const char *genimg_get_cat_desc(enum ih_category category);
524
525int genimg_get_os_id(const char *name);
526int genimg_get_arch_id(const char *name);
527int genimg_get_type_id(const char *name);
528int genimg_get_comp_id(const char *name);
529void genimg_print_size(uint32_t size);
530
531#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \
532 defined(USE_HOSTCC)
533#define IMAGE_ENABLE_TIMESTAMP 1
534#else
535#define IMAGE_ENABLE_TIMESTAMP 0
536#endif
537void genimg_print_time(time_t timestamp);
538
539
540enum fit_load_op {
541 FIT_LOAD_IGNORED,
542 FIT_LOAD_OPTIONAL,
543 FIT_LOAD_OPTIONAL_NON_ZERO,
544 FIT_LOAD_REQUIRED,
545};
546
547int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start,
548 ulong *setup_len);
549
550#ifndef USE_HOSTCC
551
552#define IMAGE_FORMAT_INVALID 0x00
553#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
554#define IMAGE_FORMAT_LEGACY 0x01
555#endif
556#define IMAGE_FORMAT_FIT 0x02
557#define IMAGE_FORMAT_ANDROID 0x03
558
559ulong genimg_get_kernel_addr_fit(char * const img_addr,
560 const char **fit_uname_config,
561 const char **fit_uname_kernel);
562ulong genimg_get_kernel_addr(char * const img_addr);
563int genimg_get_format(const void *img_addr);
564int genimg_has_config(bootm_headers_t *images);
565ulong genimg_get_image(ulong img_addr);
566
567int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
568 uint8_t arch, const ulong *ld_start, ulong * const ld_len);
569int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
570 uint8_t arch, ulong *rd_start, ulong *rd_end);
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
594 uint8_t arch, const ulong *ld_start, ulong * const ld_len);
595#endif
596
597int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
598 ulong *setup_start, ulong *setup_len);
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630int fit_image_load(bootm_headers_t *images, ulong addr,
631 const char **fit_unamep, const char **fit_uname_configp,
632 int arch, int image_type, int bootstage_id,
633 enum fit_load_op load_op, ulong *datap, ulong *lenp);
634
635#ifndef USE_HOSTCC
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
664 ulong addr);
665
666int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
667 bootm_headers_t *images,
668 char **of_flat_tree, ulong *of_size);
669void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
670int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
671
672int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
673 ulong *initrd_start, ulong *initrd_end);
674int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end);
675#ifdef CONFIG_SYS_BOOT_GET_KBD
676int boot_get_kbd(struct lmb *lmb, bd_t **kbd);
677#endif
678#endif
679
680
681
682
683static inline uint32_t image_get_header_size(void)
684{
685 return (sizeof(image_header_t));
686}
687
688#define image_get_hdr_l(f) \
689 static inline uint32_t image_get_##f(const image_header_t *hdr) \
690 { \
691 return uimage_to_cpu(hdr->ih_##f); \
692 }
693image_get_hdr_l(magic)
694image_get_hdr_l(hcrc)
695image_get_hdr_l(time)
696image_get_hdr_l(size)
697image_get_hdr_l(load)
698image_get_hdr_l(ep)
699image_get_hdr_l(dcrc)
700
701#define image_get_hdr_b(f) \
702 static inline uint8_t image_get_##f(const image_header_t *hdr) \
703 { \
704 return hdr->ih_##f; \
705 }
706image_get_hdr_b(os)
707image_get_hdr_b(arch)
708image_get_hdr_b(type)
709image_get_hdr_b(comp)
710
711static inline char *image_get_name(const image_header_t *hdr)
712{
713 return (char *)hdr->ih_name;
714}
715
716static inline uint32_t image_get_data_size(const image_header_t *hdr)
717{
718 return image_get_size(hdr);
719}
720
721
722
723
724
725
726
727
728
729
730
731
732static inline ulong image_get_data(const image_header_t *hdr)
733{
734 return ((ulong)hdr + image_get_header_size());
735}
736
737static inline uint32_t image_get_image_size(const image_header_t *hdr)
738{
739 return (image_get_size(hdr) + image_get_header_size());
740}
741static inline ulong image_get_image_end(const image_header_t *hdr)
742{
743 return ((ulong)hdr + image_get_image_size(hdr));
744}
745
746#define image_set_hdr_l(f) \
747 static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
748 { \
749 hdr->ih_##f = cpu_to_uimage(val); \
750 }
751image_set_hdr_l(magic)
752image_set_hdr_l(hcrc)
753image_set_hdr_l(time)
754image_set_hdr_l(size)
755image_set_hdr_l(load)
756image_set_hdr_l(ep)
757image_set_hdr_l(dcrc)
758
759#define image_set_hdr_b(f) \
760 static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
761 { \
762 hdr->ih_##f = val; \
763 }
764image_set_hdr_b(os)
765image_set_hdr_b(arch)
766image_set_hdr_b(type)
767image_set_hdr_b(comp)
768
769static inline void image_set_name(image_header_t *hdr, const char *name)
770{
771 strncpy(image_get_name(hdr), name, IH_NMLEN);
772}
773
774int image_check_hcrc(const image_header_t *hdr);
775int image_check_dcrc(const image_header_t *hdr);
776#ifndef USE_HOSTCC
777ulong getenv_bootm_low(void);
778phys_size_t getenv_bootm_size(void);
779phys_size_t getenv_bootm_mapsize(void);
780#endif
781void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
782
783static inline int image_check_magic(const image_header_t *hdr)
784{
785 return (image_get_magic(hdr) == IH_MAGIC);
786}
787static inline int image_check_type(const image_header_t *hdr, uint8_t type)
788{
789 return (image_get_type(hdr) == type);
790}
791static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
792{
793 return (image_get_arch(hdr) == arch);
794}
795static inline int image_check_os(const image_header_t *hdr, uint8_t os)
796{
797 return (image_get_os(hdr) == os);
798}
799
800ulong image_multi_count(const image_header_t *hdr);
801void image_multi_getimg(const image_header_t *hdr, ulong idx,
802 ulong *data, ulong *len);
803
804void image_print_contents(const void *hdr);
805
806#ifndef USE_HOSTCC
807static inline int image_check_target_arch(const image_header_t *hdr)
808{
809#ifndef IH_ARCH_DEFAULT
810# error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h"
811#endif
812 return image_check_arch(hdr, IH_ARCH_DEFAULT);
813}
814#endif
815
816
817
818
819
820
821
822
823
824
825
826
827int image_setup_libfdt(bootm_headers_t *images, void *blob,
828 int of_size, struct lmb *lmb);
829
830
831
832
833
834
835
836
837
838
839int image_setup_linux(bootm_headers_t *images);
840
841
842
843
844
845
846
847
848
849int bootz_setup(ulong image, ulong *start, ulong *end);
850
851
852
853
854
855
856#define FIT_IMAGES_PATH "/images"
857#define FIT_CONFS_PATH "/configurations"
858
859
860#define FIT_HASH_NODENAME "hash"
861#define FIT_ALGO_PROP "algo"
862#define FIT_VALUE_PROP "value"
863#define FIT_IGNORE_PROP "uboot-ignore"
864#define FIT_SIG_NODENAME "signature"
865
866
867#define FIT_DATA_PROP "data"
868#define FIT_DATA_OFFSET_PROP "data-offset"
869#define FIT_DATA_SIZE_PROP "data-size"
870#define FIT_TIMESTAMP_PROP "timestamp"
871#define FIT_DESC_PROP "description"
872#define FIT_ARCH_PROP "arch"
873#define FIT_TYPE_PROP "type"
874#define FIT_OS_PROP "os"
875#define FIT_COMP_PROP "compression"
876#define FIT_ENTRY_PROP "entry"
877#define FIT_LOAD_PROP "load"
878
879
880#define FIT_KERNEL_PROP "kernel"
881#define FIT_RAMDISK_PROP "ramdisk"
882#define FIT_FDT_PROP "fdt"
883#define FIT_LOADABLE_PROP "loadables"
884#define FIT_DEFAULT_PROP "default"
885#define FIT_SETUP_PROP "setup"
886#define FIT_FPGA_PROP "fpga"
887
888#define FIT_MAX_HASH_LEN HASH_MAX_DIGEST_SIZE
889
890#if IMAGE_ENABLE_FIT
891
892int fit_parse_conf(const char *spec, ulong addr_curr,
893 ulong *addr, const char **conf_name);
894int fit_parse_subimage(const char *spec, ulong addr_curr,
895 ulong *addr, const char **image_name);
896
897int fit_get_subimage_count(const void *fit, int images_noffset);
898void fit_print_contents(const void *fit);
899void fit_image_print(const void *fit, int noffset, const char *p);
900
901
902
903
904
905
906
907
908static inline ulong fit_get_size(const void *fit)
909{
910 return fdt_totalsize(fit);
911}
912
913
914
915
916
917
918
919
920ulong fit_get_end(const void *fit);
921
922
923
924
925
926
927
928
929
930static inline const char *fit_get_name(const void *fit_hdr,
931 int noffset, int *len)
932{
933 return fdt_get_name(fit_hdr, noffset, len);
934}
935
936int fit_get_desc(const void *fit, int noffset, char **desc);
937int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp);
938
939int fit_image_get_node(const void *fit, const char *image_uname);
940int fit_image_get_os(const void *fit, int noffset, uint8_t *os);
941int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch);
942int fit_image_get_type(const void *fit, int noffset, uint8_t *type);
943int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp);
944int fit_image_get_load(const void *fit, int noffset, ulong *load);
945int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
946int fit_image_get_data(const void *fit, int noffset,
947 const void **data, size_t *size);
948int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
949int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
950
951int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
952int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
953 int *value_len);
954
955int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977int fit_add_verification_data(const char *keydir, void *keydest, void *fit,
978 const char *comment, int require_keys,
979 const char *engine_id);
980
981int fit_image_verify(const void *fit, int noffset);
982int fit_config_verify(const void *fit, int conf_noffset);
983int fit_all_image_verify(const void *fit);
984int fit_image_check_os(const void *fit, int noffset, uint8_t os);
985int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
986int fit_image_check_type(const void *fit, int noffset, uint8_t type);
987int fit_image_check_comp(const void *fit, int noffset, uint8_t comp);
988int fit_check_format(const void *fit);
989
990int fit_conf_find_compat(const void *fit, const void *fdt);
991int fit_conf_get_node(const void *fit, const char *conf_uname);
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004int fit_conf_get_prop_node(const void *fit, int noffset,
1005 const char *prop_name);
1006
1007void fit_conf_print(const void *fit, int noffset, const char *p);
1008
1009int fit_check_ramdisk(const void *fit, int os_noffset,
1010 uint8_t arch, int verify);
1011
1012int calculate_hash(const void *data, int data_len, const char *algo,
1013 uint8_t *value, int *value_len);
1014
1015
1016
1017
1018
1019#if defined(CONFIG_FIT_SIGNATURE)
1020# ifdef USE_HOSTCC
1021# define IMAGE_ENABLE_SIGN 1
1022# define IMAGE_ENABLE_VERIFY 1
1023# include <openssl/evp.h>
1024#else
1025# define IMAGE_ENABLE_SIGN 0
1026# define IMAGE_ENABLE_VERIFY 1
1027# endif
1028#else
1029# define IMAGE_ENABLE_SIGN 0
1030# define IMAGE_ENABLE_VERIFY 0
1031#endif
1032
1033#ifdef USE_HOSTCC
1034void *image_get_host_blob(void);
1035void image_set_host_blob(void *host_blob);
1036# define gd_fdt_blob() image_get_host_blob()
1037#else
1038# define gd_fdt_blob() (gd->fdt_blob)
1039#endif
1040
1041#ifdef CONFIG_FIT_BEST_MATCH
1042#define IMAGE_ENABLE_BEST_MATCH 1
1043#else
1044#define IMAGE_ENABLE_BEST_MATCH 0
1045#endif
1046
1047
1048struct image_sign_info {
1049 const char *keydir;
1050 const char *keyname;
1051 void *fit;
1052 int node_offset;
1053 const char *name;
1054 struct checksum_algo *checksum;
1055 struct crypto_algo *crypto;
1056 const void *fdt_blob;
1057 int required_keynode;
1058 const char *require_keys;
1059 const char *engine_id;
1060};
1061#endif
1062
1063
1064struct image_region {
1065 const void *data;
1066 int size;
1067};
1068
1069#if IMAGE_ENABLE_FIT
1070
1071#if IMAGE_ENABLE_VERIFY
1072# include <u-boot/rsa-checksum.h>
1073#endif
1074struct checksum_algo {
1075 const char *name;
1076 const int checksum_len;
1077 const int der_len;
1078 const uint8_t *der_prefix;
1079#if IMAGE_ENABLE_SIGN
1080 const EVP_MD *(*calculate_sign)(void);
1081#endif
1082 int (*calculate)(const char *name,
1083 const struct image_region region[],
1084 int region_count, uint8_t *checksum);
1085};
1086
1087struct crypto_algo {
1088 const char *name;
1089 const int key_len;
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108 int (*sign)(struct image_sign_info *info,
1109 const struct image_region region[],
1110 int region_count, uint8_t **sigp, uint *sig_len);
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123 int (*add_verify_data)(struct image_sign_info *info, void *keydest);
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135 int (*verify)(struct image_sign_info *info,
1136 const struct image_region region[], int region_count,
1137 uint8_t *sig, uint sig_len);
1138};
1139
1140
1141
1142
1143
1144
1145
1146struct checksum_algo *image_get_checksum_algo(const char *full_name);
1147
1148
1149
1150
1151
1152
1153
1154struct crypto_algo *image_get_crypto_algo(const char *full_name);
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170int fit_image_verify_required_sigs(const void *fit, int image_noffset,
1171 const char *data, size_t size, const void *sig_blob,
1172 int *no_sigsp);
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189int fit_image_check_sig(const void *fit, int noffset, const void *data,
1190 size_t size, int required_keynode, char **err_msgp);
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205struct image_region *fit_region_make_list(const void *fit,
1206 struct fdt_region *fdt_regions, int count,
1207 struct image_region *region);
1208
1209static inline int fit_image_check_target_arch(const void *fdt, int node)
1210{
1211#ifndef USE_HOSTCC
1212 return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
1213#else
1214 return 0;
1215#endif
1216}
1217
1218#ifdef CONFIG_FIT_VERBOSE
1219#define fit_unsupported(msg) printf("! %s:%d " \
1220 "FIT images not supported for '%s'\n", \
1221 __FILE__, __LINE__, (msg))
1222
1223#define fit_unsupported_reset(msg) printf("! %s:%d " \
1224 "FIT images not supported for '%s' " \
1225 "- must reset board to recover!\n", \
1226 __FILE__, __LINE__, (msg))
1227#else
1228#define fit_unsupported(msg)
1229#define fit_unsupported_reset(msg)
1230#endif
1231#endif
1232
1233#if defined(CONFIG_ANDROID_BOOT_IMAGE)
1234struct andr_img_hdr;
1235int android_image_check_header(const struct andr_img_hdr *hdr);
1236int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
1237 ulong *os_data, ulong *os_len);
1238int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
1239 ulong *rd_data, ulong *rd_len);
1240ulong android_image_get_end(const struct andr_img_hdr *hdr);
1241ulong android_image_get_kload(const struct andr_img_hdr *hdr);
1242void android_print_contents(const struct andr_img_hdr *hdr);
1243
1244#endif
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257int board_fit_config_name_match(const char *name);
1258
1259#if defined(CONFIG_SPL_FIT_IMAGE_POST_PROCESS) || \
1260 defined(CONFIG_FIT_IMAGE_POST_PROCESS)
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274void board_fit_image_post_process(void **p_image, size_t *p_size);
1275#endif
1276
1277
1278
1279
1280
1281
1282
1283
1284struct fit_loadable_tbl {
1285 int type;
1286
1287
1288
1289
1290
1291
1292 void (*handler)(ulong data, size_t size);
1293};
1294
1295
1296
1297
1298
1299
1300
1301#define U_BOOT_FIT_LOADABLE_HANDLER(_type, _handler) \
1302 ll_entry_declare(struct fit_loadable_tbl, _function, fit_loadable) = { \
1303 .type = _type, \
1304 .handler = _handler, \
1305 }
1306
1307#endif
1308