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
27
28#define CONFIG_FIT 1
29#define CONFIG_OF_LIBFDT 1
30#define CONFIG_FIT_VERBOSE 1
31
32#define IMAGE_ENABLE_IGNORE 0
33#define IMAGE_INDENT_STRING ""
34
35#else
36
37#include <lmb.h>
38#include <asm/u-boot.h>
39#include <command.h>
40
41
42#define IMAGE_ENABLE_IGNORE 1
43#define IMAGE_INDENT_STRING " "
44
45#endif
46
47#if defined(CONFIG_FIT)
48#include <libfdt.h>
49#include <fdt_support.h>
50# ifdef CONFIG_SPL_BUILD
51# ifdef CONFIG_SPL_CRC32_SUPPORT
52# define IMAGE_ENABLE_CRC32 1
53# endif
54# ifdef CONFIG_SPL_MD5_SUPPORT
55# define IMAGE_ENABLE_MD5 1
56# endif
57# ifdef CONFIG_SPL_SHA1_SUPPORT
58# define IMAGE_ENABLE_SHA1 1
59# endif
60# else
61# define CONFIG_CRC32
62# define CONFIG_MD5
63# define CONFIG_SHA1
64# define IMAGE_ENABLE_CRC32 1
65# define IMAGE_ENABLE_MD5 1
66# define IMAGE_ENABLE_SHA1 1
67# endif
68
69#ifndef IMAGE_ENABLE_CRC32
70#define IMAGE_ENABLE_CRC32 0
71#endif
72
73#ifndef IMAGE_ENABLE_MD5
74#define IMAGE_ENABLE_MD5 0
75#endif
76
77#ifndef IMAGE_ENABLE_SHA1
78#define IMAGE_ENABLE_SHA1 0
79#endif
80
81#endif
82
83#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
84# define IMAGE_ENABLE_RAMDISK_HIGH 1
85#else
86# define IMAGE_ENABLE_RAMDISK_HIGH 0
87#endif
88
89#ifdef CONFIG_OF_LIBFDT
90# define IMAGE_ENABLE_OF_LIBFDT 1
91#else
92# define IMAGE_ENABLE_OF_LIBFDT 0
93#endif
94
95#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
96# define IMAGE_BOOT_GET_CMDLINE 1
97#else
98# define IMAGE_BOOT_GET_CMDLINE 0
99#endif
100
101#ifdef CONFIG_OF_BOARD_SETUP
102# define IMAGE_OF_BOARD_SETUP 1
103#else
104# define IMAGE_OF_BOARD_SETUP 0
105#endif
106
107
108
109
110#define IH_OS_INVALID 0
111#define IH_OS_OPENBSD 1
112#define IH_OS_NETBSD 2
113#define IH_OS_FREEBSD 3
114#define IH_OS_4_4BSD 4
115#define IH_OS_LINUX 5
116#define IH_OS_SVR4 6
117#define IH_OS_ESIX 7
118#define IH_OS_SOLARIS 8
119#define IH_OS_IRIX 9
120#define IH_OS_SCO 10
121#define IH_OS_DELL 11
122#define IH_OS_NCR 12
123#define IH_OS_LYNXOS 13
124#define IH_OS_VXWORKS 14
125#define IH_OS_PSOS 15
126#define IH_OS_QNX 16
127#define IH_OS_U_BOOT 17
128#define IH_OS_RTEMS 18
129#define IH_OS_ARTOS 19
130#define IH_OS_UNITY 20
131#define IH_OS_INTEGRITY 21
132#define IH_OS_OSE 22
133#define IH_OS_PLAN9 23
134
135
136
137
138#define IH_ARCH_INVALID 0
139#define IH_ARCH_ALPHA 1
140#define IH_ARCH_ARM 2
141#define IH_ARCH_I386 3
142#define IH_ARCH_IA64 4
143#define IH_ARCH_MIPS 5
144#define IH_ARCH_MIPS64 6
145#define IH_ARCH_PPC 7
146#define IH_ARCH_S390 8
147#define IH_ARCH_SH 9
148#define IH_ARCH_SPARC 10
149#define IH_ARCH_SPARC64 11
150#define IH_ARCH_M68K 12
151#define IH_ARCH_MICROBLAZE 14
152#define IH_ARCH_NIOS2 15
153#define IH_ARCH_BLACKFIN 16
154#define IH_ARCH_AVR32 17
155#define IH_ARCH_ST200 18
156#define IH_ARCH_SANDBOX 19
157#define IH_ARCH_NDS32 20
158#define IH_ARCH_OPENRISC 21
159#define IH_ARCH_ARM64 22
160#define IH_ARCH_ARC 23
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201#define IH_TYPE_INVALID 0
202#define IH_TYPE_STANDALONE 1
203#define IH_TYPE_KERNEL 2
204#define IH_TYPE_RAMDISK 3
205#define IH_TYPE_MULTI 4
206#define IH_TYPE_FIRMWARE 5
207#define IH_TYPE_SCRIPT 6
208#define IH_TYPE_FILESYSTEM 7
209#define IH_TYPE_FLATDT 8
210#define IH_TYPE_KWBIMAGE 9
211#define IH_TYPE_IMXIMAGE 10
212#define IH_TYPE_UBLIMAGE 11
213#define IH_TYPE_OMAPIMAGE 12
214#define IH_TYPE_AISIMAGE 13
215#define IH_TYPE_KERNEL_NOLOAD 14
216#define IH_TYPE_PBLIMAGE 15
217#define IH_TYPE_MXSIMAGE 16
218
219
220
221
222#define IH_COMP_NONE 0
223#define IH_COMP_GZIP 1
224#define IH_COMP_BZIP2 2
225#define IH_COMP_LZMA 3
226#define IH_COMP_LZO 4
227
228#define IH_MAGIC 0x27051956
229#define IH_NMLEN 32
230
231
232#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
233
234
235
236
237
238typedef struct image_header {
239 __be32 ih_magic;
240 __be32 ih_hcrc;
241 __be32 ih_time;
242 __be32 ih_size;
243 __be32 ih_load;
244 __be32 ih_ep;
245 __be32 ih_dcrc;
246 uint8_t ih_os;
247 uint8_t ih_arch;
248 uint8_t ih_type;
249 uint8_t ih_comp;
250 uint8_t ih_name[IH_NMLEN];
251} image_header_t;
252
253typedef struct image_info {
254 ulong start, end;
255 ulong image_start, image_len;
256 ulong load;
257 uint8_t comp, type, os;
258} image_info_t;
259
260
261
262
263
264typedef struct bootm_headers {
265
266
267
268
269
270 image_header_t *legacy_hdr_os;
271 image_header_t legacy_hdr_os_copy;
272 ulong legacy_hdr_valid;
273
274#if defined(CONFIG_FIT)
275 const char *fit_uname_cfg;
276
277 void *fit_hdr_os;
278 const char *fit_uname_os;
279 int fit_noffset_os;
280
281 void *fit_hdr_rd;
282 const char *fit_uname_rd;
283 int fit_noffset_rd;
284
285 void *fit_hdr_fdt;
286 const char *fit_uname_fdt;
287 int fit_noffset_fdt;
288#endif
289
290#ifndef USE_HOSTCC
291 image_info_t os;
292 ulong ep;
293
294 ulong rd_start, rd_end;
295
296 char *ft_addr;
297 ulong ft_len;
298
299 ulong initrd_start;
300 ulong initrd_end;
301 ulong cmdline_start;
302 ulong cmdline_end;
303 bd_t *kbd;
304#endif
305
306 int verify;
307
308#define BOOTM_STATE_START (0x00000001)
309#define BOOTM_STATE_FINDOS (0x00000002)
310#define BOOTM_STATE_FINDOTHER (0x00000004)
311#define BOOTM_STATE_LOADOS (0x00000008)
312#define BOOTM_STATE_RAMDISK (0x00000010)
313#define BOOTM_STATE_FDT (0x00000020)
314#define BOOTM_STATE_OS_CMDLINE (0x00000040)
315#define BOOTM_STATE_OS_BD_T (0x00000080)
316#define BOOTM_STATE_OS_PREP (0x00000100)
317#define BOOTM_STATE_OS_FAKE_GO (0x00000200)
318#define BOOTM_STATE_OS_GO (0x00000400)
319 int state;
320
321#ifdef CONFIG_LMB
322 struct lmb lmb;
323#endif
324} bootm_headers_t;
325
326extern bootm_headers_t images;
327
328
329
330
331
332
333#ifndef CHUNKSZ
334#define CHUNKSZ (64 * 1024)
335#endif
336
337#ifndef CHUNKSZ_CRC32
338#define CHUNKSZ_CRC32 (64 * 1024)
339#endif
340
341#ifndef CHUNKSZ_MD5
342#define CHUNKSZ_MD5 (64 * 1024)
343#endif
344
345#ifndef CHUNKSZ_SHA1
346#define CHUNKSZ_SHA1 (64 * 1024)
347#endif
348
349#define uimage_to_cpu(x) be32_to_cpu(x)
350#define cpu_to_uimage(x) cpu_to_be32(x)
351
352
353
354
355
356typedef struct table_entry {
357 int id;
358 char *sname;
359 char *lname;
360} table_entry_t;
361
362
363
364
365
366
367int get_table_entry_id(const table_entry_t *table,
368 const char *table_name, const char *name);
369
370
371
372
373
374char *get_table_entry_name(const table_entry_t *table, char *msg, int id);
375
376const char *genimg_get_os_name(uint8_t os);
377const char *genimg_get_arch_name(uint8_t arch);
378const char *genimg_get_type_name(uint8_t type);
379const char *genimg_get_comp_name(uint8_t comp);
380int genimg_get_os_id(const char *name);
381int genimg_get_arch_id(const char *name);
382int genimg_get_type_id(const char *name);
383int genimg_get_comp_id(const char *name);
384void genimg_print_size(uint32_t size);
385
386#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \
387 defined(USE_HOSTCC)
388#define IMAGE_ENABLE_TIMESTAMP 1
389#else
390#define IMAGE_ENABLE_TIMESTAMP 0
391#endif
392void genimg_print_time(time_t timestamp);
393
394
395enum fit_load_op {
396 FIT_LOAD_IGNORED,
397 FIT_LOAD_OPTIONAL,
398 FIT_LOAD_REQUIRED,
399};
400
401#ifndef USE_HOSTCC
402
403#define IMAGE_FORMAT_INVALID 0x00
404#define IMAGE_FORMAT_LEGACY 0x01
405#define IMAGE_FORMAT_FIT 0x02
406
407int genimg_get_format(const void *img_addr);
408int genimg_has_config(bootm_headers_t *images);
409ulong genimg_get_image(ulong img_addr);
410
411int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
412 uint8_t arch, ulong *rd_start, ulong *rd_end);
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
443 const char **fit_unamep, const char **fit_uname_configp,
444 int arch, int image_type, int bootstage_id,
445 enum fit_load_op load_op, ulong *datap, ulong *lenp);
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
475 ulong addr);
476
477int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
478 bootm_headers_t *images,
479 char **of_flat_tree, ulong *of_size);
480void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
481int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
482
483int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
484 ulong *initrd_start, ulong *initrd_end);
485int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end);
486#ifdef CONFIG_SYS_BOOT_GET_KBD
487int boot_get_kbd(struct lmb *lmb, bd_t **kbd);
488#endif
489#endif
490
491
492
493
494static inline uint32_t image_get_header_size(void)
495{
496 return (sizeof(image_header_t));
497}
498
499#define image_get_hdr_l(f) \
500 static inline uint32_t image_get_##f(const image_header_t *hdr) \
501 { \
502 return uimage_to_cpu(hdr->ih_##f); \
503 }
504image_get_hdr_l(magic)
505image_get_hdr_l(hcrc)
506image_get_hdr_l(time)
507image_get_hdr_l(size)
508image_get_hdr_l(load)
509image_get_hdr_l(ep)
510image_get_hdr_l(dcrc)
511
512#define image_get_hdr_b(f) \
513 static inline uint8_t image_get_##f(const image_header_t *hdr) \
514 { \
515 return hdr->ih_##f; \
516 }
517image_get_hdr_b(os)
518image_get_hdr_b(arch)
519image_get_hdr_b(type)
520image_get_hdr_b(comp)
521
522static inline char *image_get_name(const image_header_t *hdr)
523{
524 return (char *)hdr->ih_name;
525}
526
527static inline uint32_t image_get_data_size(const image_header_t *hdr)
528{
529 return image_get_size(hdr);
530}
531
532
533
534
535
536
537
538
539
540
541
542
543static inline ulong image_get_data(const image_header_t *hdr)
544{
545 return ((ulong)hdr + image_get_header_size());
546}
547
548static inline uint32_t image_get_image_size(const image_header_t *hdr)
549{
550 return (image_get_size(hdr) + image_get_header_size());
551}
552static inline ulong image_get_image_end(const image_header_t *hdr)
553{
554 return ((ulong)hdr + image_get_image_size(hdr));
555}
556
557#define image_set_hdr_l(f) \
558 static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
559 { \
560 hdr->ih_##f = cpu_to_uimage(val); \
561 }
562image_set_hdr_l(magic)
563image_set_hdr_l(hcrc)
564image_set_hdr_l(time)
565image_set_hdr_l(size)
566image_set_hdr_l(load)
567image_set_hdr_l(ep)
568image_set_hdr_l(dcrc)
569
570#define image_set_hdr_b(f) \
571 static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
572 { \
573 hdr->ih_##f = val; \
574 }
575image_set_hdr_b(os)
576image_set_hdr_b(arch)
577image_set_hdr_b(type)
578image_set_hdr_b(comp)
579
580static inline void image_set_name(image_header_t *hdr, const char *name)
581{
582 strncpy(image_get_name(hdr), name, IH_NMLEN);
583}
584
585int image_check_hcrc(const image_header_t *hdr);
586int image_check_dcrc(const image_header_t *hdr);
587#ifndef USE_HOSTCC
588ulong getenv_bootm_low(void);
589phys_size_t getenv_bootm_size(void);
590phys_size_t getenv_bootm_mapsize(void);
591void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
592#endif
593
594static inline int image_check_magic(const image_header_t *hdr)
595{
596 return (image_get_magic(hdr) == IH_MAGIC);
597}
598static inline int image_check_type(const image_header_t *hdr, uint8_t type)
599{
600 return (image_get_type(hdr) == type);
601}
602static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
603{
604 return (image_get_arch(hdr) == arch);
605}
606static inline int image_check_os(const image_header_t *hdr, uint8_t os)
607{
608 return (image_get_os(hdr) == os);
609}
610
611ulong image_multi_count(const image_header_t *hdr);
612void image_multi_getimg(const image_header_t *hdr, ulong idx,
613 ulong *data, ulong *len);
614
615void image_print_contents(const void *hdr);
616
617#ifndef USE_HOSTCC
618static inline int image_check_target_arch(const image_header_t *hdr)
619{
620#ifndef IH_ARCH_DEFAULT
621# error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h"
622#endif
623 return image_check_arch(hdr, IH_ARCH_DEFAULT);
624}
625#endif
626
627
628
629
630
631
632
633
634
635
636
637
638int image_setup_libfdt(bootm_headers_t *images, void *blob,
639 int of_size, struct lmb *lmb);
640
641
642
643
644
645
646
647
648
649
650int image_setup_linux(bootm_headers_t *images);
651
652
653
654
655
656
657
658
659
660int bootz_setup(ulong image, ulong *start, ulong *end);
661
662
663
664
665
666#if defined(CONFIG_FIT)
667
668#define FIT_IMAGES_PATH "/images"
669#define FIT_CONFS_PATH "/configurations"
670
671
672#define FIT_HASH_NODENAME "hash"
673#define FIT_ALGO_PROP "algo"
674#define FIT_VALUE_PROP "value"
675#define FIT_IGNORE_PROP "uboot-ignore"
676#define FIT_SIG_NODENAME "signature"
677
678
679#define FIT_DATA_PROP "data"
680#define FIT_TIMESTAMP_PROP "timestamp"
681#define FIT_DESC_PROP "description"
682#define FIT_ARCH_PROP "arch"
683#define FIT_TYPE_PROP "type"
684#define FIT_OS_PROP "os"
685#define FIT_COMP_PROP "compression"
686#define FIT_ENTRY_PROP "entry"
687#define FIT_LOAD_PROP "load"
688
689
690#define FIT_KERNEL_PROP "kernel"
691#define FIT_RAMDISK_PROP "ramdisk"
692#define FIT_FDT_PROP "fdt"
693#define FIT_DEFAULT_PROP "default"
694
695#define FIT_MAX_HASH_LEN 20
696
697
698int fit_parse_conf(const char *spec, ulong addr_curr,
699 ulong *addr, const char **conf_name);
700int fit_parse_subimage(const char *spec, ulong addr_curr,
701 ulong *addr, const char **image_name);
702
703void fit_print_contents(const void *fit);
704void fit_image_print(const void *fit, int noffset, const char *p);
705
706
707
708
709
710
711
712
713static inline ulong fit_get_size(const void *fit)
714{
715 return fdt_totalsize(fit);
716}
717
718
719
720
721
722
723
724
725static inline ulong fit_get_end(const void *fit)
726{
727 return (ulong)fit + fdt_totalsize(fit);
728}
729
730
731
732
733
734
735
736
737
738static inline const char *fit_get_name(const void *fit_hdr,
739 int noffset, int *len)
740{
741 return fdt_get_name(fit_hdr, noffset, len);
742}
743
744int fit_get_desc(const void *fit, int noffset, char **desc);
745int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp);
746
747int fit_image_get_node(const void *fit, const char *image_uname);
748int fit_image_get_os(const void *fit, int noffset, uint8_t *os);
749int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch);
750int fit_image_get_type(const void *fit, int noffset, uint8_t *type);
751int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp);
752int fit_image_get_load(const void *fit, int noffset, ulong *load);
753int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
754int fit_image_get_data(const void *fit, int noffset,
755 const void **data, size_t *size);
756
757int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
758int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
759 int *value_len);
760
761int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782int fit_add_verification_data(const char *keydir, void *keydest, void *fit,
783 const char *comment, int require_keys);
784
785int fit_image_verify(const void *fit, int noffset);
786int fit_config_verify(const void *fit, int conf_noffset);
787int fit_all_image_verify(const void *fit);
788int fit_image_check_os(const void *fit, int noffset, uint8_t os);
789int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
790int fit_image_check_type(const void *fit, int noffset, uint8_t type);
791int fit_image_check_comp(const void *fit, int noffset, uint8_t comp);
792int fit_check_format(const void *fit);
793
794int fit_conf_find_compat(const void *fit, const void *fdt);
795int fit_conf_get_node(const void *fit, const char *conf_uname);
796
797
798
799
800
801
802
803
804
805
806
807
808int fit_conf_get_prop_node(const void *fit, int noffset,
809 const char *prop_name);
810
811void fit_conf_print(const void *fit, int noffset, const char *p);
812
813int fit_check_ramdisk(const void *fit, int os_noffset,
814 uint8_t arch, int verify);
815
816int calculate_hash(const void *data, int data_len, const char *algo,
817 uint8_t *value, int *value_len);
818
819
820
821
822
823#if defined(CONFIG_FIT_SIGNATURE)
824# ifdef USE_HOSTCC
825# define IMAGE_ENABLE_SIGN 1
826# define IMAGE_ENABLE_VERIFY 0
827#else
828# define IMAGE_ENABLE_SIGN 0
829# define IMAGE_ENABLE_VERIFY 1
830# endif
831#else
832# define IMAGE_ENABLE_SIGN 0
833# define IMAGE_ENABLE_VERIFY 0
834#endif
835
836#ifdef USE_HOSTCC
837# define gd_fdt_blob() NULL
838#else
839# define gd_fdt_blob() (gd->fdt_blob)
840#endif
841
842#ifdef CONFIG_FIT_BEST_MATCH
843#define IMAGE_ENABLE_BEST_MATCH 1
844#else
845#define IMAGE_ENABLE_BEST_MATCH 0
846#endif
847
848
849struct image_sign_info {
850 const char *keydir;
851 const char *keyname;
852 void *fit;
853 int node_offset;
854 struct image_sig_algo *algo;
855 const void *fdt_blob;
856 int required_keynode;
857 const char *require_keys;
858};
859
860
861struct image_region {
862 const void *data;
863 int size;
864};
865
866struct image_sig_algo {
867 const char *name;
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886 int (*sign)(struct image_sign_info *info,
887 const struct image_region region[],
888 int region_count, uint8_t **sigp, uint *sig_len);
889
890
891
892
893
894
895
896
897
898
899
900
901 int (*add_verify_data)(struct image_sign_info *info, void *keydest);
902
903
904
905
906
907
908
909
910
911
912
913 int (*verify)(struct image_sign_info *info,
914 const struct image_region region[], int region_count,
915 uint8_t *sig, uint sig_len);
916};
917
918
919
920
921
922
923
924struct image_sig_algo *image_get_sig_algo(const char *name);
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940int fit_image_verify_required_sigs(const void *fit, int image_noffset,
941 const char *data, size_t size, const void *sig_blob,
942 int *no_sigsp);
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959int fit_image_check_sig(const void *fit, int noffset, const void *data,
960 size_t size, int required_keynode, char **err_msgp);
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975struct image_region *fit_region_make_list(const void *fit,
976 struct fdt_region *fdt_regions, int count,
977 struct image_region *region);
978
979static inline int fit_image_check_target_arch(const void *fdt, int node)
980{
981 return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
982}
983
984#ifdef CONFIG_FIT_VERBOSE
985#define fit_unsupported(msg) printf("! %s:%d " \
986 "FIT images not supported for '%s'\n", \
987 __FILE__, __LINE__, (msg))
988
989#define fit_unsupported_reset(msg) printf("! %s:%d " \
990 "FIT images not supported for '%s' " \
991 "- must reset board to recover!\n", \
992 __FILE__, __LINE__, (msg))
993#else
994#define fit_unsupported(msg)
995#define fit_unsupported_reset(msg)
996#endif
997#endif
998
999#endif
1000