1
2
3
4
5
6
7
8
9
10
11
12
13#define OPENSSL_API_COMPAT 0x10101000L
14
15#include "imagetool.h"
16#include <limits.h>
17#include <image.h>
18#include <stdarg.h>
19#include <stdint.h>
20#include "kwbimage.h"
21
22#include <openssl/bn.h>
23#include <openssl/rsa.h>
24#include <openssl/pem.h>
25#include <openssl/err.h>
26#include <openssl/evp.h>
27
28#if OPENSSL_VERSION_NUMBER < 0x10100000L || \
29 (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
30static void RSA_get0_key(const RSA *r,
31 const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
32{
33 if (n != NULL)
34 *n = r->n;
35 if (e != NULL)
36 *e = r->e;
37 if (d != NULL)
38 *d = r->d;
39}
40
41#elif !defined(LIBRESSL_VERSION_NUMBER)
42void EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
43{
44 EVP_MD_CTX_reset(ctx);
45}
46#endif
47
48
49static inline int fls4(int num)
50{
51 if (num & 0x8)
52 return 4;
53 else if (num & 0x4)
54 return 3;
55 else if (num & 0x2)
56 return 2;
57 else if (num & 0x1)
58 return 1;
59 else
60 return 0;
61}
62
63static struct image_cfg_element *image_cfg;
64static int cfgn;
65static int verbose_mode;
66
67struct boot_mode {
68 unsigned int id;
69 const char *name;
70};
71
72
73
74
75struct hash_v1 {
76 uint8_t hash[32];
77};
78
79struct boot_mode boot_modes[] = {
80 { IBR_HDR_I2C_ID, "i2c" },
81 { IBR_HDR_SPI_ID, "spi" },
82 { IBR_HDR_NAND_ID, "nand" },
83 { IBR_HDR_SATA_ID, "sata" },
84 { IBR_HDR_PEX_ID, "pex" },
85 { IBR_HDR_UART_ID, "uart" },
86 { IBR_HDR_SDIO_ID, "sdio" },
87 {},
88};
89
90struct nand_ecc_mode {
91 unsigned int id;
92 const char *name;
93};
94
95struct nand_ecc_mode nand_ecc_modes[] = {
96 { IBR_HDR_ECC_DEFAULT, "default" },
97 { IBR_HDR_ECC_FORCED_HAMMING, "hamming" },
98 { IBR_HDR_ECC_FORCED_RS, "rs" },
99 { IBR_HDR_ECC_DISABLED, "disabled" },
100 {},
101};
102
103
104#define ADDR_INVALID ((uint32_t)-1)
105
106#define BINARY_MAX_ARGS 255
107
108
109
110enum image_cfg_type {
111 IMAGE_CFG_VERSION = 0x1,
112 IMAGE_CFG_BOOT_FROM,
113 IMAGE_CFG_DEST_ADDR,
114 IMAGE_CFG_EXEC_ADDR,
115 IMAGE_CFG_NAND_BLKSZ,
116 IMAGE_CFG_NAND_BADBLK_LOCATION,
117 IMAGE_CFG_NAND_ECC_MODE,
118 IMAGE_CFG_NAND_PAGESZ,
119 IMAGE_CFG_CPU,
120 IMAGE_CFG_BINARY,
121 IMAGE_CFG_DATA,
122 IMAGE_CFG_DATA_DELAY,
123 IMAGE_CFG_BAUDRATE,
124 IMAGE_CFG_UART_PORT,
125 IMAGE_CFG_UART_MPP,
126 IMAGE_CFG_DEBUG,
127 IMAGE_CFG_KAK,
128 IMAGE_CFG_CSK,
129 IMAGE_CFG_CSK_INDEX,
130 IMAGE_CFG_JTAG_DELAY,
131 IMAGE_CFG_BOX_ID,
132 IMAGE_CFG_FLASH_ID,
133 IMAGE_CFG_SEC_COMMON_IMG,
134 IMAGE_CFG_SEC_SPECIALIZED_IMG,
135 IMAGE_CFG_SEC_BOOT_DEV,
136 IMAGE_CFG_SEC_FUSE_DUMP,
137
138 IMAGE_CFG_COUNT
139} type;
140
141static const char * const id_strs[] = {
142 [IMAGE_CFG_VERSION] = "VERSION",
143 [IMAGE_CFG_BOOT_FROM] = "BOOT_FROM",
144 [IMAGE_CFG_DEST_ADDR] = "DEST_ADDR",
145 [IMAGE_CFG_EXEC_ADDR] = "EXEC_ADDR",
146 [IMAGE_CFG_NAND_BLKSZ] = "NAND_BLKSZ",
147 [IMAGE_CFG_NAND_BADBLK_LOCATION] = "NAND_BADBLK_LOCATION",
148 [IMAGE_CFG_NAND_ECC_MODE] = "NAND_ECC_MODE",
149 [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE",
150 [IMAGE_CFG_CPU] = "CPU",
151 [IMAGE_CFG_BINARY] = "BINARY",
152 [IMAGE_CFG_DATA] = "DATA",
153 [IMAGE_CFG_DATA_DELAY] = "DATA_DELAY",
154 [IMAGE_CFG_BAUDRATE] = "BAUDRATE",
155 [IMAGE_CFG_UART_PORT] = "UART_PORT",
156 [IMAGE_CFG_UART_MPP] = "UART_MPP",
157 [IMAGE_CFG_DEBUG] = "DEBUG",
158 [IMAGE_CFG_KAK] = "KAK",
159 [IMAGE_CFG_CSK] = "CSK",
160 [IMAGE_CFG_CSK_INDEX] = "CSK_INDEX",
161 [IMAGE_CFG_JTAG_DELAY] = "JTAG_DELAY",
162 [IMAGE_CFG_BOX_ID] = "BOX_ID",
163 [IMAGE_CFG_FLASH_ID] = "FLASH_ID",
164 [IMAGE_CFG_SEC_COMMON_IMG] = "SEC_COMMON_IMG",
165 [IMAGE_CFG_SEC_SPECIALIZED_IMG] = "SEC_SPECIALIZED_IMG",
166 [IMAGE_CFG_SEC_BOOT_DEV] = "SEC_BOOT_DEV",
167 [IMAGE_CFG_SEC_FUSE_DUMP] = "SEC_FUSE_DUMP"
168};
169
170struct image_cfg_element {
171 enum image_cfg_type type;
172 union {
173 unsigned int version;
174 unsigned int cpu_sheeva;
175 unsigned int bootfrom;
176 struct {
177 const char *file;
178 unsigned int loadaddr;
179 unsigned int args[BINARY_MAX_ARGS];
180 unsigned int nargs;
181 } binary;
182 unsigned int dstaddr;
183 unsigned int execaddr;
184 unsigned int nandblksz;
185 unsigned int nandbadblklocation;
186 unsigned int nandeccmode;
187 unsigned int nandpagesz;
188 struct ext_hdr_v0_reg regdata;
189 unsigned int regdata_delay;
190 unsigned int baudrate;
191 unsigned int uart_port;
192 unsigned int uart_mpp;
193 unsigned int debug;
194 const char *key_name;
195 int csk_idx;
196 uint8_t jtag_delay;
197 uint32_t boxid;
198 uint32_t flashid;
199 bool sec_specialized_img;
200 unsigned int sec_boot_dev;
201 const char *name;
202 };
203};
204
205#define IMAGE_CFG_ELEMENT_MAX 256
206
207
208
209
210
211
212
213static const char *image_boot_mode_name(unsigned int id)
214{
215 int i;
216
217 for (i = 0; boot_modes[i].name; i++)
218 if (boot_modes[i].id == id)
219 return boot_modes[i].name;
220 return NULL;
221}
222
223static int image_boot_mode_id(const char *boot_mode_name)
224{
225 int i;
226
227 for (i = 0; boot_modes[i].name; i++)
228 if (!strcmp(boot_modes[i].name, boot_mode_name))
229 return boot_modes[i].id;
230
231 return -1;
232}
233
234static const char *image_nand_ecc_mode_name(unsigned int id)
235{
236 int i;
237
238 for (i = 0; nand_ecc_modes[i].name; i++)
239 if (nand_ecc_modes[i].id == id)
240 return nand_ecc_modes[i].name;
241
242 return NULL;
243}
244
245static int image_nand_ecc_mode_id(const char *nand_ecc_mode_name)
246{
247 int i;
248
249 for (i = 0; nand_ecc_modes[i].name; i++)
250 if (!strcmp(nand_ecc_modes[i].name, nand_ecc_mode_name))
251 return nand_ecc_modes[i].id;
252 return -1;
253}
254
255static struct image_cfg_element *
256image_find_option(unsigned int optiontype)
257{
258 int i;
259
260 for (i = 0; i < cfgn; i++) {
261 if (image_cfg[i].type == optiontype)
262 return &image_cfg[i];
263 }
264
265 return NULL;
266}
267
268static unsigned int
269image_count_options(unsigned int optiontype)
270{
271 int i;
272 unsigned int count = 0;
273
274 for (i = 0; i < cfgn; i++)
275 if (image_cfg[i].type == optiontype)
276 count++;
277
278 return count;
279}
280
281static int image_get_csk_index(void)
282{
283 struct image_cfg_element *e;
284
285 e = image_find_option(IMAGE_CFG_CSK_INDEX);
286 if (!e)
287 return -1;
288
289 return e->csk_idx;
290}
291
292static bool image_get_spezialized_img(void)
293{
294 struct image_cfg_element *e;
295
296 e = image_find_option(IMAGE_CFG_SEC_SPECIALIZED_IMG);
297 if (!e)
298 return false;
299
300 return e->sec_specialized_img;
301}
302
303static int image_get_bootfrom(void)
304{
305 struct image_cfg_element *e;
306
307 e = image_find_option(IMAGE_CFG_BOOT_FROM);
308 if (!e)
309
310 return IBR_HDR_SPI_ID;
311
312 return e->bootfrom;
313}
314
315static int image_is_cpu_sheeva(void)
316{
317 struct image_cfg_element *e;
318
319 e = image_find_option(IMAGE_CFG_CPU);
320 if (!e)
321 return 0;
322
323 return e->cpu_sheeva;
324}
325
326
327
328
329
330static uint8_t image_checksum8(void *start, uint32_t len)
331{
332 uint8_t csum = 0;
333 uint8_t *p = start;
334
335
336 if (!len)
337 return 0;
338
339 do {
340 csum += *p;
341 p++;
342 } while (--len);
343
344 return csum;
345}
346
347
348
349
350
351static int main_hdr_checksum_ok(void *hdr)
352{
353
354 struct main_hdr_v0 *main_hdr = (struct main_hdr_v0 *)hdr;
355 uint8_t checksum;
356
357 checksum = image_checksum8(hdr, kwbheader_size_for_csum(hdr));
358
359
360
361 checksum -= main_hdr->checksum;
362
363 return checksum == main_hdr->checksum;
364}
365
366static uint32_t image_checksum32(void *start, uint32_t len)
367{
368 uint32_t csum = 0;
369 uint32_t *p = start;
370
371
372 if (!len)
373 return 0;
374
375 if (len % sizeof(uint32_t)) {
376 fprintf(stderr, "Length %d is not in multiple of %zu\n",
377 len, sizeof(uint32_t));
378 return 0;
379 }
380
381 do {
382 csum += *p;
383 p++;
384 len -= sizeof(uint32_t);
385 } while (len > 0);
386
387 return csum;
388}
389
390static unsigned int options_to_baudrate(uint8_t options)
391{
392 switch (options & 0x7) {
393 case MAIN_HDR_V1_OPT_BAUD_2400:
394 return 2400;
395 case MAIN_HDR_V1_OPT_BAUD_4800:
396 return 4800;
397 case MAIN_HDR_V1_OPT_BAUD_9600:
398 return 9600;
399 case MAIN_HDR_V1_OPT_BAUD_19200:
400 return 19200;
401 case MAIN_HDR_V1_OPT_BAUD_38400:
402 return 38400;
403 case MAIN_HDR_V1_OPT_BAUD_57600:
404 return 57600;
405 case MAIN_HDR_V1_OPT_BAUD_115200:
406 return 115200;
407 case MAIN_HDR_V1_OPT_BAUD_DEFAULT:
408 default:
409 return 0;
410 }
411}
412
413static uint8_t baudrate_to_option(unsigned int baudrate)
414{
415 switch (baudrate) {
416 case 2400:
417 return MAIN_HDR_V1_OPT_BAUD_2400;
418 case 4800:
419 return MAIN_HDR_V1_OPT_BAUD_4800;
420 case 9600:
421 return MAIN_HDR_V1_OPT_BAUD_9600;
422 case 19200:
423 return MAIN_HDR_V1_OPT_BAUD_19200;
424 case 38400:
425 return MAIN_HDR_V1_OPT_BAUD_38400;
426 case 57600:
427 return MAIN_HDR_V1_OPT_BAUD_57600;
428 case 115200:
429 return MAIN_HDR_V1_OPT_BAUD_115200;
430 default:
431 return MAIN_HDR_V1_OPT_BAUD_DEFAULT;
432 }
433}
434
435static void kwb_msg(const char *fmt, ...)
436{
437 if (verbose_mode) {
438 va_list ap;
439
440 va_start(ap, fmt);
441 vfprintf(stdout, fmt, ap);
442 va_end(ap);
443 }
444}
445
446static int openssl_err(const char *msg)
447{
448 unsigned long ssl_err = ERR_get_error();
449
450 fprintf(stderr, "%s", msg);
451 fprintf(stderr, ": %s\n",
452 ERR_error_string(ssl_err, 0));
453
454 return -1;
455}
456
457static int kwb_load_rsa_key(const char *keydir, const char *name, RSA **p_rsa)
458{
459 char path[PATH_MAX];
460 RSA *rsa;
461 FILE *f;
462
463 if (!keydir)
464 keydir = ".";
465
466 snprintf(path, sizeof(path), "%s/%s.key", keydir, name);
467 f = fopen(path, "r");
468 if (!f) {
469 fprintf(stderr, "Couldn't open RSA private key: '%s': %s\n",
470 path, strerror(errno));
471 return -ENOENT;
472 }
473
474 rsa = PEM_read_RSAPrivateKey(f, 0, NULL, "");
475 if (!rsa) {
476 openssl_err("Failure reading private key");
477 fclose(f);
478 return -EPROTO;
479 }
480 fclose(f);
481 *p_rsa = rsa;
482
483 return 0;
484}
485
486static int kwb_load_cfg_key(struct image_tool_params *params,
487 unsigned int cfg_option, const char *key_name,
488 RSA **p_key)
489{
490 struct image_cfg_element *e_key;
491 RSA *key;
492 int res;
493
494 *p_key = NULL;
495
496 e_key = image_find_option(cfg_option);
497 if (!e_key) {
498 fprintf(stderr, "%s not configured\n", key_name);
499 return -ENOENT;
500 }
501
502 res = kwb_load_rsa_key(params->keydir, e_key->key_name, &key);
503 if (res < 0) {
504 fprintf(stderr, "Failed to load %s\n", key_name);
505 return -ENOENT;
506 }
507
508 *p_key = key;
509
510 return 0;
511}
512
513static int kwb_load_kak(struct image_tool_params *params, RSA **p_kak)
514{
515 return kwb_load_cfg_key(params, IMAGE_CFG_KAK, "KAK", p_kak);
516}
517
518static int kwb_load_csk(struct image_tool_params *params, RSA **p_csk)
519{
520 return kwb_load_cfg_key(params, IMAGE_CFG_CSK, "CSK", p_csk);
521}
522
523static int kwb_compute_pubkey_hash(struct pubkey_der_v1 *pk,
524 struct hash_v1 *hash)
525{
526 EVP_MD_CTX *ctx;
527 unsigned int key_size;
528 unsigned int hash_size;
529 int ret = 0;
530
531 if (!pk || !hash || pk->key[0] != 0x30 || pk->key[1] != 0x82)
532 return -EINVAL;
533
534 key_size = (pk->key[2] << 8) + pk->key[3] + 4;
535
536 ctx = EVP_MD_CTX_create();
537 if (!ctx)
538 return openssl_err("EVP context creation failed");
539
540 EVP_MD_CTX_init(ctx);
541 if (!EVP_DigestInit(ctx, EVP_sha256())) {
542 ret = openssl_err("Digest setup failed");
543 goto hash_err_ctx;
544 }
545
546 if (!EVP_DigestUpdate(ctx, pk->key, key_size)) {
547 ret = openssl_err("Hashing data failed");
548 goto hash_err_ctx;
549 }
550
551 if (!EVP_DigestFinal(ctx, hash->hash, &hash_size)) {
552 ret = openssl_err("Could not obtain hash");
553 goto hash_err_ctx;
554 }
555
556 EVP_MD_CTX_cleanup(ctx);
557
558hash_err_ctx:
559 EVP_MD_CTX_destroy(ctx);
560 return ret;
561}
562
563static int kwb_import_pubkey(RSA **key, struct pubkey_der_v1 *src, char *keyname)
564{
565 RSA *rsa;
566 const unsigned char *ptr;
567
568 if (!key || !src)
569 goto fail;
570
571 ptr = src->key;
572 rsa = d2i_RSAPublicKey(key, &ptr, sizeof(src->key));
573 if (!rsa) {
574 openssl_err("error decoding public key");
575 goto fail;
576 }
577
578 return 0;
579fail:
580 fprintf(stderr, "Failed to decode %s pubkey\n", keyname);
581 return -EINVAL;
582}
583
584static int kwb_export_pubkey(RSA *key, struct pubkey_der_v1 *dst, FILE *hashf,
585 char *keyname)
586{
587 int size_exp, size_mod, size_seq;
588 const BIGNUM *key_e, *key_n;
589 uint8_t *cur;
590 char *errmsg = "Failed to encode %s\n";
591
592 RSA_get0_key(key, NULL, &key_e, NULL);
593 RSA_get0_key(key, &key_n, NULL, NULL);
594
595 if (!key || !key_e || !key_n || !dst) {
596 fprintf(stderr, "export pk failed: (%p, %p, %p, %p)",
597 key, key_e, key_n, dst);
598 fprintf(stderr, errmsg, keyname);
599 return -EINVAL;
600 }
601
602
603
604
605
606
607
608
609
610
611
612 size_exp = BN_num_bytes(key_e);
613 size_mod = BN_num_bytes(key_n);
614 size_seq = 4 + size_mod + 4 + size_exp;
615
616 if (size_mod > 256) {
617 fprintf(stderr, "export pk failed: wrong mod size: %d\n",
618 size_mod);
619 fprintf(stderr, errmsg, keyname);
620 return -EINVAL;
621 }
622
623 if (4 + size_seq > sizeof(dst->key)) {
624 fprintf(stderr, "export pk failed: seq too large (%d, %zu)\n",
625 4 + size_seq, sizeof(dst->key));
626 fprintf(stderr, errmsg, keyname);
627 return -ENOBUFS;
628 }
629
630 cur = dst->key;
631
632
633 *cur++ = 0x30;
634 *cur++ = 0x82;
635 *cur++ = (size_seq >> 8) & 0xFF;
636 *cur++ = size_seq & 0xFF;
637
638 *cur++ = 0x02;
639 *cur++ = 0x82;
640 *cur++ = (size_mod >> 8) & 0xFF;
641 *cur++ = size_mod & 0xFF;
642 BN_bn2bin(key_n, cur);
643 cur += size_mod;
644
645 *cur++ = 0x02;
646 *cur++ = 0x82;
647 *cur++ = (size_exp >> 8) & 0xFF;
648 *cur++ = size_exp & 0xFF;
649 BN_bn2bin(key_e, cur);
650
651 if (hashf) {
652 struct hash_v1 pk_hash;
653 int i;
654 int ret = 0;
655
656 ret = kwb_compute_pubkey_hash(dst, &pk_hash);
657 if (ret < 0) {
658 fprintf(stderr, errmsg, keyname);
659 return ret;
660 }
661
662 fprintf(hashf, "SHA256 = ");
663 for (i = 0 ; i < sizeof(pk_hash.hash); ++i)
664 fprintf(hashf, "%02X", pk_hash.hash[i]);
665 fprintf(hashf, "\n");
666 }
667
668 return 0;
669}
670
671static int kwb_sign(RSA *key, void *data, int datasz, struct sig_v1 *sig,
672 char *signame)
673{
674 EVP_PKEY *evp_key;
675 EVP_MD_CTX *ctx;
676 unsigned int sig_size;
677 int size;
678 int ret = 0;
679
680 evp_key = EVP_PKEY_new();
681 if (!evp_key)
682 return openssl_err("EVP_PKEY object creation failed");
683
684 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
685 ret = openssl_err("EVP key setup failed");
686 goto err_key;
687 }
688
689 size = EVP_PKEY_size(evp_key);
690 if (size > sizeof(sig->sig)) {
691 fprintf(stderr, "Buffer to small for signature (%d bytes)\n",
692 size);
693 ret = -ENOBUFS;
694 goto err_key;
695 }
696
697 ctx = EVP_MD_CTX_create();
698 if (!ctx) {
699 ret = openssl_err("EVP context creation failed");
700 goto err_key;
701 }
702 EVP_MD_CTX_init(ctx);
703 if (!EVP_SignInit(ctx, EVP_sha256())) {
704 ret = openssl_err("Signer setup failed");
705 goto err_ctx;
706 }
707
708 if (!EVP_SignUpdate(ctx, data, datasz)) {
709 ret = openssl_err("Signing data failed");
710 goto err_ctx;
711 }
712
713 if (!EVP_SignFinal(ctx, sig->sig, &sig_size, evp_key)) {
714 ret = openssl_err("Could not obtain signature");
715 goto err_ctx;
716 }
717
718 EVP_MD_CTX_cleanup(ctx);
719 EVP_MD_CTX_destroy(ctx);
720 EVP_PKEY_free(evp_key);
721
722 return 0;
723
724err_ctx:
725 EVP_MD_CTX_destroy(ctx);
726err_key:
727 EVP_PKEY_free(evp_key);
728 fprintf(stderr, "Failed to create %s signature\n", signame);
729 return ret;
730}
731
732static int kwb_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
733 char *signame)
734{
735 EVP_PKEY *evp_key;
736 EVP_MD_CTX *ctx;
737 int size;
738 int ret = 0;
739
740 evp_key = EVP_PKEY_new();
741 if (!evp_key)
742 return openssl_err("EVP_PKEY object creation failed");
743
744 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
745 ret = openssl_err("EVP key setup failed");
746 goto err_key;
747 }
748
749 size = EVP_PKEY_size(evp_key);
750 if (size > sizeof(sig->sig)) {
751 fprintf(stderr, "Invalid signature size (%d bytes)\n",
752 size);
753 ret = -EINVAL;
754 goto err_key;
755 }
756
757 ctx = EVP_MD_CTX_create();
758 if (!ctx) {
759 ret = openssl_err("EVP context creation failed");
760 goto err_key;
761 }
762 EVP_MD_CTX_init(ctx);
763 if (!EVP_VerifyInit(ctx, EVP_sha256())) {
764 ret = openssl_err("Verifier setup failed");
765 goto err_ctx;
766 }
767
768 if (!EVP_VerifyUpdate(ctx, data, datasz)) {
769 ret = openssl_err("Hashing data failed");
770 goto err_ctx;
771 }
772
773 if (EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key) != 1) {
774 ret = openssl_err("Could not verify signature");
775 goto err_ctx;
776 }
777
778 EVP_MD_CTX_cleanup(ctx);
779 EVP_MD_CTX_destroy(ctx);
780 EVP_PKEY_free(evp_key);
781
782 return 0;
783
784err_ctx:
785 EVP_MD_CTX_destroy(ctx);
786err_key:
787 EVP_PKEY_free(evp_key);
788 fprintf(stderr, "Failed to verify %s signature\n", signame);
789 return ret;
790}
791
792static int kwb_sign_and_verify(RSA *key, void *data, int datasz,
793 struct sig_v1 *sig, char *signame)
794{
795 if (kwb_sign(key, data, datasz, sig, signame) < 0)
796 return -1;
797
798 if (kwb_verify(key, data, datasz, sig, signame) < 0)
799 return -1;
800
801 return 0;
802}
803
804
805static int kwb_dump_fuse_cmds_38x(FILE *out, struct secure_hdr_v1 *sec_hdr)
806{
807 struct hash_v1 kak_pub_hash;
808 struct image_cfg_element *e;
809 unsigned int fuse_line;
810 int i, idx;
811 uint8_t *ptr;
812 uint32_t val;
813 int ret = 0;
814
815 if (!out || !sec_hdr)
816 return -EINVAL;
817
818 ret = kwb_compute_pubkey_hash(&sec_hdr->kak, &kak_pub_hash);
819 if (ret < 0)
820 goto done;
821
822 fprintf(out, "# burn KAK pub key hash\n");
823 ptr = kak_pub_hash.hash;
824 for (fuse_line = 26; fuse_line <= 30; ++fuse_line) {
825 fprintf(out, "fuse prog -y %u 0 ", fuse_line);
826
827 for (i = 4; i-- > 0;)
828 fprintf(out, "%02hx", (ushort)ptr[i]);
829 ptr += 4;
830 fprintf(out, " 00");
831
832 if (fuse_line < 30) {
833 for (i = 3; i-- > 0;)
834 fprintf(out, "%02hx", (ushort)ptr[i]);
835 ptr += 3;
836 } else {
837 fprintf(out, "000000");
838 }
839
840 fprintf(out, " 1\n");
841 }
842
843 fprintf(out, "# burn CSK selection\n");
844
845 idx = image_get_csk_index();
846 if (idx < 0 || idx > 15) {
847 ret = -EINVAL;
848 goto done;
849 }
850 if (idx > 0) {
851 for (fuse_line = 31; fuse_line < 31 + idx; ++fuse_line)
852 fprintf(out, "fuse prog -y %u 0 00000001 00000000 1\n",
853 fuse_line);
854 } else {
855 fprintf(out, "# CSK index is 0; no mods needed\n");
856 }
857
858 e = image_find_option(IMAGE_CFG_BOX_ID);
859 if (e) {
860 fprintf(out, "# set box ID\n");
861 fprintf(out, "fuse prog -y 48 0 %08x 00000000 1\n", e->boxid);
862 }
863
864 e = image_find_option(IMAGE_CFG_FLASH_ID);
865 if (e) {
866 fprintf(out, "# set flash ID\n");
867 fprintf(out, "fuse prog -y 47 0 %08x 00000000 1\n", e->flashid);
868 }
869
870 fprintf(out, "# enable secure mode ");
871 fprintf(out, "(must be the last fuse line written)\n");
872
873 val = 1;
874 e = image_find_option(IMAGE_CFG_SEC_BOOT_DEV);
875 if (!e) {
876 fprintf(stderr, "ERROR: secured mode boot device not given\n");
877 ret = -EINVAL;
878 goto done;
879 }
880
881 if (e->sec_boot_dev > 0xff) {
882 fprintf(stderr, "ERROR: secured mode boot device invalid\n");
883 ret = -EINVAL;
884 goto done;
885 }
886
887 val |= (e->sec_boot_dev << 8);
888
889 fprintf(out, "fuse prog -y 24 0 %08x 0103e0a9 1\n", val);
890
891 fprintf(out, "# lock (unused) fuse lines (0-23)s\n");
892 for (fuse_line = 0; fuse_line < 24; ++fuse_line)
893 fprintf(out, "fuse prog -y %u 2 1\n", fuse_line);
894
895 fprintf(out, "# OK, that's all :-)\n");
896
897done:
898 return ret;
899}
900
901static int kwb_dump_fuse_cmds(struct secure_hdr_v1 *sec_hdr)
902{
903 int ret = 0;
904 struct image_cfg_element *e;
905
906 e = image_find_option(IMAGE_CFG_SEC_FUSE_DUMP);
907 if (!e)
908 return 0;
909
910 if (!strcmp(e->name, "a38x")) {
911 FILE *out = fopen("kwb_fuses_a38x.txt", "w+");
912
913 if (!out) {
914 fprintf(stderr, "Couldn't open eFuse settings: '%s': %s\n",
915 "kwb_fuses_a38x.txt", strerror(errno));
916 return -ENOENT;
917 }
918
919 kwb_dump_fuse_cmds_38x(out, sec_hdr);
920 fclose(out);
921 goto done;
922 }
923
924 ret = -ENOSYS;
925
926done:
927 return ret;
928}
929
930static size_t image_headersz_align(size_t headersz, uint8_t blockid)
931{
932
933
934
935
936
937
938
939
940
941 if (blockid == IBR_HDR_UART_ID)
942 return ALIGN(headersz, 128);
943 else if (blockid == IBR_HDR_NAND_ID)
944 return ALIGN(headersz, 256);
945 else if (blockid == IBR_HDR_SATA_ID || blockid == IBR_HDR_SDIO_ID)
946 return ALIGN(headersz, 512);
947 else
948 return headersz;
949}
950
951static size_t image_headersz_v0(int *hasext)
952{
953 size_t headersz;
954
955 headersz = sizeof(struct main_hdr_v0);
956 if (image_count_options(IMAGE_CFG_DATA) > 0) {
957 headersz += sizeof(struct ext_hdr_v0);
958 if (hasext)
959 *hasext = 1;
960 }
961
962 return image_headersz_align(headersz, image_get_bootfrom());
963}
964
965static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
966 int payloadsz)
967{
968 struct image_cfg_element *e;
969 size_t headersz;
970 struct main_hdr_v0 *main_hdr;
971 uint8_t *image;
972 int has_ext = 0;
973
974
975
976
977
978 headersz = image_headersz_v0(&has_ext);
979
980 image = malloc(headersz);
981 if (!image) {
982 fprintf(stderr, "Cannot allocate memory for image\n");
983 return NULL;
984 }
985
986 memset(image, 0, headersz);
987
988 main_hdr = (struct main_hdr_v0 *)image;
989
990
991 main_hdr->blocksize =
992 cpu_to_le32(payloadsz);
993 main_hdr->srcaddr = cpu_to_le32(headersz);
994 main_hdr->ext = has_ext;
995 main_hdr->version = 0;
996 main_hdr->destaddr = cpu_to_le32(params->addr);
997 main_hdr->execaddr = cpu_to_le32(params->ep);
998 main_hdr->blockid = image_get_bootfrom();
999
1000 e = image_find_option(IMAGE_CFG_NAND_ECC_MODE);
1001 if (e)
1002 main_hdr->nandeccmode = e->nandeccmode;
1003 e = image_find_option(IMAGE_CFG_NAND_BLKSZ);
1004 if (e)
1005 main_hdr->nandblocksize = e->nandblksz / (64 * 1024);
1006 e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
1007 if (e)
1008 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
1009 e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
1010 if (e)
1011 main_hdr->nandbadblklocation = e->nandbadblklocation;
1012 main_hdr->checksum = image_checksum8(image,
1013 sizeof(struct main_hdr_v0));
1014
1015
1016
1017
1018
1019
1020
1021 if (main_hdr->blockid == IBR_HDR_SATA_ID)
1022 main_hdr->srcaddr = cpu_to_le32(headersz / 512 + 1);
1023
1024
1025
1026
1027
1028
1029
1030 if (main_hdr->blockid == IBR_HDR_SDIO_ID)
1031 main_hdr->srcaddr = cpu_to_le32(headersz / 512);
1032
1033
1034 if (main_hdr->blockid == IBR_HDR_PEX_ID)
1035 main_hdr->srcaddr = cpu_to_le32(0xFFFFFFFF);
1036
1037
1038 if (has_ext) {
1039 struct ext_hdr_v0 *ext_hdr;
1040 int cfgi, datai;
1041
1042 ext_hdr = (struct ext_hdr_v0 *)
1043 (image + sizeof(struct main_hdr_v0));
1044 ext_hdr->offset = cpu_to_le32(0x40);
1045
1046 for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
1047 e = &image_cfg[cfgi];
1048 if (e->type != IMAGE_CFG_DATA)
1049 continue;
1050
1051 ext_hdr->rcfg[datai].raddr =
1052 cpu_to_le32(e->regdata.raddr);
1053 ext_hdr->rcfg[datai].rdata =
1054 cpu_to_le32(e->regdata.rdata);
1055 datai++;
1056 }
1057
1058 ext_hdr->checksum = image_checksum8(ext_hdr,
1059 sizeof(struct ext_hdr_v0));
1060 }
1061
1062 *imagesz = headersz;
1063 return image;
1064}
1065
1066static size_t image_headersz_v1(int *hasext)
1067{
1068 struct image_cfg_element *e;
1069 unsigned int count;
1070 size_t headersz;
1071 int cpu_sheeva;
1072 struct stat s;
1073 int cfgi;
1074 int ret;
1075
1076
1077
1078
1079
1080 headersz = sizeof(struct main_hdr_v1);
1081
1082 if (image_get_csk_index() >= 0) {
1083 headersz += sizeof(struct secure_hdr_v1);
1084 if (hasext)
1085 *hasext = 1;
1086 }
1087
1088 cpu_sheeva = image_is_cpu_sheeva();
1089
1090 count = 0;
1091 for (cfgi = 0; cfgi < cfgn; cfgi++) {
1092 e = &image_cfg[cfgi];
1093
1094 if (e->type == IMAGE_CFG_DATA)
1095 count++;
1096
1097 if (e->type == IMAGE_CFG_DATA_DELAY ||
1098 (e->type == IMAGE_CFG_BINARY && count > 0)) {
1099 headersz += sizeof(struct register_set_hdr_v1) + 8 * count + 4;
1100 count = 0;
1101 }
1102
1103 if (e->type != IMAGE_CFG_BINARY)
1104 continue;
1105
1106 ret = stat(e->binary.file, &s);
1107 if (ret < 0) {
1108 char cwd[PATH_MAX];
1109 char *dir = cwd;
1110
1111 memset(cwd, 0, sizeof(cwd));
1112 if (!getcwd(cwd, sizeof(cwd))) {
1113 dir = "current working directory";
1114 perror("getcwd() failed");
1115 }
1116
1117 fprintf(stderr,
1118 "Didn't find the file '%s' in '%s' which is mandatory to generate the image\n"
1119 "This file generally contains the DDR3 training code, and should be extracted from an existing bootable\n"
1120 "image for your board. Use 'dumpimage -T kwbimage -p 1' to extract it from an existing image.\n",
1121 e->binary.file, dir);
1122 return 0;
1123 }
1124
1125 headersz += sizeof(struct opt_hdr_v1) + sizeof(uint32_t) +
1126 (e->binary.nargs) * sizeof(uint32_t);
1127
1128 if (e->binary.loadaddr) {
1129
1130
1131
1132
1133
1134
1135
1136 unsigned int base_addr, low_addr, high_addr;
1137
1138 base_addr = cpu_sheeva ? 0x40004000 : 0x40000000;
1139 low_addr = base_addr + headersz;
1140 high_addr = low_addr +
1141 (BINARY_MAX_ARGS - e->binary.nargs) * sizeof(uint32_t);
1142
1143 if (cpu_sheeva && e->binary.loadaddr % 16) {
1144 fprintf(stderr,
1145 "Invalid LOAD_ADDRESS 0x%08x for BINARY %s with %d args.\n"
1146 "Address for CPU SHEEVA must be 16-byte aligned.\n",
1147 e->binary.loadaddr, e->binary.file, e->binary.nargs);
1148 return 0;
1149 }
1150
1151 if (e->binary.loadaddr % 4 || e->binary.loadaddr < low_addr ||
1152 e->binary.loadaddr > high_addr) {
1153 fprintf(stderr,
1154 "Invalid LOAD_ADDRESS 0x%08x for BINARY %s with %d args.\n"
1155 "Address must be 4-byte aligned and in range 0x%08x-0x%08x.\n",
1156 e->binary.loadaddr, e->binary.file,
1157 e->binary.nargs, low_addr, high_addr);
1158 return 0;
1159 }
1160 headersz = e->binary.loadaddr - base_addr;
1161 } else if (cpu_sheeva) {
1162 headersz = ALIGN(headersz, 16);
1163 } else {
1164 headersz = ALIGN(headersz, 4);
1165 }
1166
1167 headersz += ALIGN(s.st_size, 4) + sizeof(uint32_t);
1168 if (hasext)
1169 *hasext = 1;
1170 }
1171
1172 if (count > 0)
1173 headersz += sizeof(struct register_set_hdr_v1) + 8 * count + 4;
1174
1175 return image_headersz_align(headersz, image_get_bootfrom());
1176}
1177
1178static int add_binary_header_v1(uint8_t **cur, uint8_t **next_ext,
1179 struct image_cfg_element *binarye,
1180 struct main_hdr_v1 *main_hdr)
1181{
1182 struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)*cur;
1183 uint32_t base_addr;
1184 uint32_t add_args;
1185 uint32_t offset;
1186 uint32_t *args;
1187 size_t binhdrsz;
1188 int cpu_sheeva;
1189 struct stat s;
1190 int argi;
1191 FILE *bin;
1192 int ret;
1193
1194 hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
1195
1196 bin = fopen(binarye->binary.file, "r");
1197 if (!bin) {
1198 fprintf(stderr, "Cannot open binary file %s\n",
1199 binarye->binary.file);
1200 return -1;
1201 }
1202
1203 if (fstat(fileno(bin), &s)) {
1204 fprintf(stderr, "Cannot stat binary file %s\n",
1205 binarye->binary.file);
1206 goto err_close;
1207 }
1208
1209 *cur += sizeof(struct opt_hdr_v1);
1210
1211 args = (uint32_t *)*cur;
1212 *args = cpu_to_le32(binarye->binary.nargs);
1213 args++;
1214 for (argi = 0; argi < binarye->binary.nargs; argi++)
1215 args[argi] = cpu_to_le32(binarye->binary.args[argi]);
1216
1217 *cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227 cpu_sheeva = image_is_cpu_sheeva();
1228 base_addr = cpu_sheeva ? 0x40004000 : 0x40000000;
1229 offset = *cur - (uint8_t *)main_hdr;
1230 if (binarye->binary.loadaddr)
1231 add_args = (binarye->binary.loadaddr - base_addr - offset) / sizeof(uint32_t);
1232 else if (cpu_sheeva)
1233 add_args = ((16 - offset % 16) % 16) / sizeof(uint32_t);
1234 else
1235 add_args = 0;
1236 if (add_args) {
1237 *(args - 1) = cpu_to_le32(binarye->binary.nargs + add_args);
1238 *cur += add_args * sizeof(uint32_t);
1239 }
1240
1241 ret = fread(*cur, s.st_size, 1, bin);
1242 if (ret != 1) {
1243 fprintf(stderr,
1244 "Could not read binary image %s\n",
1245 binarye->binary.file);
1246 goto err_close;
1247 }
1248
1249 fclose(bin);
1250
1251 *cur += ALIGN(s.st_size, 4);
1252
1253 *((uint32_t *)*cur) = 0x00000000;
1254 **next_ext = 1;
1255 *next_ext = *cur;
1256
1257 *cur += sizeof(uint32_t);
1258
1259 binhdrsz = sizeof(struct opt_hdr_v1) +
1260 (binarye->binary.nargs + add_args + 2) * sizeof(uint32_t) +
1261 ALIGN(s.st_size, 4);
1262 hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
1263 hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
1264
1265 return 0;
1266
1267err_close:
1268 fclose(bin);
1269
1270 return -1;
1271}
1272
1273static int export_pub_kak_hash(RSA *kak, struct secure_hdr_v1 *secure_hdr)
1274{
1275 FILE *hashf;
1276 int res;
1277
1278 hashf = fopen("pub_kak_hash.txt", "w");
1279 if (!hashf) {
1280 fprintf(stderr, "Couldn't open hash file: '%s': %s\n",
1281 "pub_kak_hash.txt", strerror(errno));
1282 return 1;
1283 }
1284
1285 res = kwb_export_pubkey(kak, &secure_hdr->kak, hashf, "KAK");
1286
1287 fclose(hashf);
1288
1289 return res < 0 ? 1 : 0;
1290}
1291
1292static int kwb_sign_csk_with_kak(struct image_tool_params *params,
1293 struct secure_hdr_v1 *secure_hdr, RSA *csk)
1294{
1295 RSA *kak = NULL;
1296 RSA *kak_pub = NULL;
1297 int csk_idx = image_get_csk_index();
1298 struct sig_v1 tmp_sig;
1299
1300 if (csk_idx < 0 || csk_idx > 15) {
1301 fprintf(stderr, "Invalid CSK index %d\n", csk_idx);
1302 return 1;
1303 }
1304
1305 if (kwb_load_kak(params, &kak) < 0)
1306 return 1;
1307
1308 if (export_pub_kak_hash(kak, secure_hdr))
1309 return 1;
1310
1311 if (kwb_import_pubkey(&kak_pub, &secure_hdr->kak, "KAK") < 0)
1312 return 1;
1313
1314 if (kwb_export_pubkey(csk, &secure_hdr->csk[csk_idx], NULL, "CSK") < 0)
1315 return 1;
1316
1317 if (kwb_sign_and_verify(kak, &secure_hdr->csk,
1318 sizeof(secure_hdr->csk) +
1319 sizeof(secure_hdr->csksig),
1320 &tmp_sig, "CSK") < 0)
1321 return 1;
1322
1323 if (kwb_verify(kak_pub, &secure_hdr->csk,
1324 sizeof(secure_hdr->csk) +
1325 sizeof(secure_hdr->csksig),
1326 &tmp_sig, "CSK (2)") < 0)
1327 return 1;
1328
1329 secure_hdr->csksig = tmp_sig;
1330
1331 return 0;
1332}
1333
1334static int add_secure_header_v1(struct image_tool_params *params, uint8_t *ptr,
1335 int payloadsz, size_t headersz, uint8_t *image,
1336 struct secure_hdr_v1 *secure_hdr)
1337{
1338 struct image_cfg_element *e_jtagdelay;
1339 struct image_cfg_element *e_boxid;
1340 struct image_cfg_element *e_flashid;
1341 RSA *csk = NULL;
1342 unsigned char *image_ptr;
1343 size_t image_size;
1344 struct sig_v1 tmp_sig;
1345 bool specialized_img = image_get_spezialized_img();
1346
1347 kwb_msg("Create secure header content\n");
1348
1349 e_jtagdelay = image_find_option(IMAGE_CFG_JTAG_DELAY);
1350 e_boxid = image_find_option(IMAGE_CFG_BOX_ID);
1351 e_flashid = image_find_option(IMAGE_CFG_FLASH_ID);
1352
1353 if (kwb_load_csk(params, &csk) < 0)
1354 return 1;
1355
1356 secure_hdr->headertype = OPT_HDR_V1_SECURE_TYPE;
1357 secure_hdr->headersz_msb = 0;
1358 secure_hdr->headersz_lsb = cpu_to_le16(sizeof(struct secure_hdr_v1));
1359 if (e_jtagdelay)
1360 secure_hdr->jtag_delay = e_jtagdelay->jtag_delay;
1361 if (e_boxid && specialized_img)
1362 secure_hdr->boxid = cpu_to_le32(e_boxid->boxid);
1363 if (e_flashid && specialized_img)
1364 secure_hdr->flashid = cpu_to_le32(e_flashid->flashid);
1365
1366 if (kwb_sign_csk_with_kak(params, secure_hdr, csk))
1367 return 1;
1368
1369 image_ptr = ptr + headersz;
1370 image_size = payloadsz - headersz;
1371
1372 if (kwb_sign_and_verify(csk, image_ptr, image_size,
1373 &secure_hdr->imgsig, "image") < 0)
1374 return 1;
1375
1376 if (kwb_sign_and_verify(csk, image, headersz, &tmp_sig, "header") < 0)
1377 return 1;
1378
1379 secure_hdr->hdrsig = tmp_sig;
1380
1381 kwb_dump_fuse_cmds(secure_hdr);
1382
1383 return 0;
1384}
1385
1386static void finish_register_set_header_v1(uint8_t **cur, uint8_t **next_ext,
1387 struct register_set_hdr_v1 *register_set_hdr,
1388 int *datai, uint8_t delay)
1389{
1390 int size = sizeof(struct register_set_hdr_v1) + 8 * (*datai) + 4;
1391
1392 register_set_hdr->headertype = OPT_HDR_V1_REGISTER_TYPE;
1393 register_set_hdr->headersz_lsb = cpu_to_le16(size & 0xFFFF);
1394 register_set_hdr->headersz_msb = size >> 16;
1395 register_set_hdr->data[*datai].last_entry.delay = delay;
1396 *cur += size;
1397 **next_ext = 1;
1398 *next_ext = ®ister_set_hdr->data[*datai].last_entry.next;
1399 *datai = 0;
1400}
1401
1402static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
1403 uint8_t *ptr, int payloadsz)
1404{
1405 struct image_cfg_element *e;
1406 struct main_hdr_v1 *main_hdr;
1407 struct opt_hdr_v1 *ohdr;
1408 struct register_set_hdr_v1 *register_set_hdr;
1409 struct secure_hdr_v1 *secure_hdr = NULL;
1410 size_t headersz;
1411 uint8_t *image, *cur;
1412 int hasext = 0;
1413 uint8_t *next_ext = NULL;
1414 int cfgi, datai;
1415 uint8_t delay;
1416
1417
1418
1419
1420
1421 headersz = image_headersz_v1(&hasext);
1422 if (headersz == 0)
1423 return NULL;
1424
1425 image = malloc(headersz);
1426 if (!image) {
1427 fprintf(stderr, "Cannot allocate memory for image\n");
1428 return NULL;
1429 }
1430
1431 memset(image, 0, headersz);
1432
1433 main_hdr = (struct main_hdr_v1 *)image;
1434 cur = image;
1435 cur += sizeof(struct main_hdr_v1);
1436 next_ext = &main_hdr->ext;
1437
1438
1439 main_hdr->blocksize =
1440 cpu_to_le32(payloadsz);
1441 main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
1442 main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
1443 main_hdr->destaddr = cpu_to_le32(params->addr);
1444 main_hdr->execaddr = cpu_to_le32(params->ep);
1445 main_hdr->srcaddr = cpu_to_le32(headersz);
1446 main_hdr->ext = hasext;
1447 main_hdr->version = 1;
1448 main_hdr->blockid = image_get_bootfrom();
1449
1450 e = image_find_option(IMAGE_CFG_NAND_BLKSZ);
1451 if (e)
1452 main_hdr->nandblocksize = e->nandblksz / (64 * 1024);
1453 e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
1454 if (e)
1455 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
1456 e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
1457 if (e)
1458 main_hdr->nandbadblklocation = e->nandbadblklocation;
1459 e = image_find_option(IMAGE_CFG_BAUDRATE);
1460 if (e)
1461 main_hdr->options |= baudrate_to_option(e->baudrate);
1462 e = image_find_option(IMAGE_CFG_UART_PORT);
1463 if (e)
1464 main_hdr->options |= (e->uart_port & 3) << 3;
1465 e = image_find_option(IMAGE_CFG_UART_MPP);
1466 if (e)
1467 main_hdr->options |= (e->uart_mpp & 7) << 5;
1468 e = image_find_option(IMAGE_CFG_DEBUG);
1469 if (e)
1470 main_hdr->flags = e->debug ? 0x1 : 0;
1471
1472
1473
1474
1475
1476
1477
1478 if (main_hdr->blockid == IBR_HDR_SATA_ID)
1479 main_hdr->srcaddr = cpu_to_le32(headersz / 512 + 1);
1480
1481
1482
1483
1484
1485
1486
1487 if (main_hdr->blockid == IBR_HDR_SDIO_ID)
1488 main_hdr->srcaddr = cpu_to_le32(headersz / 512);
1489
1490
1491 if (main_hdr->blockid == IBR_HDR_PEX_ID)
1492 main_hdr->srcaddr = cpu_to_le32(0xFFFFFFFF);
1493
1494 if (image_get_csk_index() >= 0) {
1495
1496
1497
1498
1499 secure_hdr = (struct secure_hdr_v1 *)cur;
1500 cur += sizeof(struct secure_hdr_v1);
1501 *next_ext = 1;
1502 next_ext = &secure_hdr->next;
1503 }
1504
1505 datai = 0;
1506 for (cfgi = 0; cfgi < cfgn; cfgi++) {
1507 e = &image_cfg[cfgi];
1508 if (e->type != IMAGE_CFG_DATA &&
1509 e->type != IMAGE_CFG_DATA_DELAY &&
1510 e->type != IMAGE_CFG_BINARY)
1511 continue;
1512
1513 if (datai == 0)
1514 register_set_hdr = (struct register_set_hdr_v1 *)cur;
1515
1516
1517 if (e->type == IMAGE_CFG_DATA_DELAY)
1518 delay = e->regdata_delay;
1519 else
1520 delay = REGISTER_SET_HDR_OPT_DELAY_MS(0);
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530 if (e->type == IMAGE_CFG_DATA_DELAY ||
1531 (e->type == IMAGE_CFG_BINARY && datai != 0))
1532 finish_register_set_header_v1(&cur, &next_ext, register_set_hdr,
1533 &datai, delay);
1534
1535 if (e->type == IMAGE_CFG_DATA) {
1536 register_set_hdr->data[datai].entry.address =
1537 cpu_to_le32(e->regdata.raddr);
1538 register_set_hdr->data[datai].entry.value =
1539 cpu_to_le32(e->regdata.rdata);
1540 datai++;
1541 }
1542
1543 if (e->type == IMAGE_CFG_BINARY) {
1544 if (add_binary_header_v1(&cur, &next_ext, e, main_hdr))
1545 return NULL;
1546 }
1547 }
1548 if (datai != 0) {
1549
1550 delay = REGISTER_SET_HDR_OPT_DELAY_MS(0);
1551 finish_register_set_header_v1(&cur, &next_ext, register_set_hdr,
1552 &datai, delay);
1553 }
1554
1555 if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz + headersz,
1556 headersz, image, secure_hdr))
1557 return NULL;
1558
1559 *imagesz = headersz;
1560
1561
1562 headersz = sizeof(*main_hdr);
1563 for_each_opt_hdr_v1 (ohdr, main_hdr)
1564 headersz += opt_hdr_v1_size(ohdr);
1565 main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
1566 main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
1567
1568
1569 main_hdr->checksum = image_checksum8(main_hdr, headersz);
1570
1571 return image;
1572}
1573
1574static int recognize_keyword(char *keyword)
1575{
1576 int kw_id;
1577
1578 for (kw_id = 1; kw_id < IMAGE_CFG_COUNT; ++kw_id)
1579 if (!strcmp(keyword, id_strs[kw_id]))
1580 return kw_id;
1581
1582 return 0;
1583}
1584
1585static int image_create_config_parse_oneline(char *line,
1586 struct image_cfg_element *el)
1587{
1588 char *keyword, *saveptr, *value1, *value2;
1589 char delimiters[] = " \t";
1590 int keyword_id, ret, argi;
1591 char *unknown_msg = "Ignoring unknown line '%s'\n";
1592
1593 keyword = strtok_r(line, delimiters, &saveptr);
1594 keyword_id = recognize_keyword(keyword);
1595
1596 if (!keyword_id) {
1597 fprintf(stderr, unknown_msg, line);
1598 return 0;
1599 }
1600
1601 el->type = keyword_id;
1602
1603 value1 = strtok_r(NULL, delimiters, &saveptr);
1604
1605 if (!value1) {
1606 fprintf(stderr, "Parameter missing in line '%s'\n", line);
1607 return -1;
1608 }
1609
1610 switch (keyword_id) {
1611 case IMAGE_CFG_VERSION:
1612 el->version = atoi(value1);
1613 break;
1614 case IMAGE_CFG_CPU:
1615 if (strcmp(value1, "FEROCEON") == 0)
1616 el->cpu_sheeva = 0;
1617 else if (strcmp(value1, "SHEEVA") == 0)
1618 el->cpu_sheeva = 1;
1619 else if (strcmp(value1, "A9") == 0)
1620 el->cpu_sheeva = 0;
1621 else {
1622 fprintf(stderr, "Invalid CPU %s\n", value1);
1623 return -1;
1624 }
1625 break;
1626 case IMAGE_CFG_BOOT_FROM:
1627 ret = image_boot_mode_id(value1);
1628
1629 if (ret < 0) {
1630 fprintf(stderr, "Invalid boot media '%s'\n", value1);
1631 return -1;
1632 }
1633 el->bootfrom = ret;
1634 break;
1635 case IMAGE_CFG_NAND_BLKSZ:
1636 el->nandblksz = strtoul(value1, NULL, 16);
1637 break;
1638 case IMAGE_CFG_NAND_BADBLK_LOCATION:
1639 el->nandbadblklocation = strtoul(value1, NULL, 16);
1640 break;
1641 case IMAGE_CFG_NAND_ECC_MODE:
1642 ret = image_nand_ecc_mode_id(value1);
1643
1644 if (ret < 0) {
1645 fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value1);
1646 return -1;
1647 }
1648 el->nandeccmode = ret;
1649 break;
1650 case IMAGE_CFG_NAND_PAGESZ:
1651 el->nandpagesz = strtoul(value1, NULL, 16);
1652 break;
1653 case IMAGE_CFG_BINARY:
1654 argi = 0;
1655
1656 el->binary.file = strdup(value1);
1657 while (1) {
1658 char *value = strtok_r(NULL, delimiters, &saveptr);
1659 char *endptr;
1660
1661 if (!value)
1662 break;
1663
1664 if (!strcmp(value, "LOAD_ADDRESS")) {
1665 value = strtok_r(NULL, delimiters, &saveptr);
1666 if (!value) {
1667 fprintf(stderr,
1668 "Missing address argument for BINARY LOAD_ADDRESS\n");
1669 return -1;
1670 }
1671 el->binary.loadaddr = strtoul(value, &endptr, 16);
1672 if (*endptr) {
1673 fprintf(stderr,
1674 "Invalid argument '%s' for BINARY LOAD_ADDRESS\n",
1675 value);
1676 return -1;
1677 }
1678 value = strtok_r(NULL, delimiters, &saveptr);
1679 if (value) {
1680 fprintf(stderr,
1681 "Unexpected argument '%s' after BINARY LOAD_ADDRESS\n",
1682 value);
1683 return -1;
1684 }
1685 break;
1686 }
1687
1688 el->binary.args[argi] = strtoul(value, &endptr, 16);
1689 if (*endptr) {
1690 fprintf(stderr, "Invalid argument '%s' for BINARY\n", value);
1691 return -1;
1692 }
1693 argi++;
1694 if (argi >= BINARY_MAX_ARGS) {
1695 fprintf(stderr,
1696 "Too many arguments for BINARY\n");
1697 return -1;
1698 }
1699 }
1700 el->binary.nargs = argi;
1701 break;
1702 case IMAGE_CFG_DATA:
1703 value2 = strtok_r(NULL, delimiters, &saveptr);
1704
1705 if (!value1 || !value2) {
1706 fprintf(stderr,
1707 "Invalid number of arguments for DATA\n");
1708 return -1;
1709 }
1710
1711 el->regdata.raddr = strtoul(value1, NULL, 16);
1712 el->regdata.rdata = strtoul(value2, NULL, 16);
1713 break;
1714 case IMAGE_CFG_DATA_DELAY:
1715 if (!strcmp(value1, "SDRAM_SETUP"))
1716 el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP;
1717 else
1718 el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_MS(strtoul(value1, NULL, 10));
1719 if (el->regdata_delay > 255) {
1720 fprintf(stderr, "Maximal DATA_DELAY is 255\n");
1721 return -1;
1722 }
1723 break;
1724 case IMAGE_CFG_BAUDRATE:
1725 el->baudrate = strtoul(value1, NULL, 10);
1726 break;
1727 case IMAGE_CFG_UART_PORT:
1728 el->uart_port = strtoul(value1, NULL, 16);
1729 break;
1730 case IMAGE_CFG_UART_MPP:
1731 el->uart_mpp = strtoul(value1, NULL, 16);
1732 break;
1733 case IMAGE_CFG_DEBUG:
1734 el->debug = strtoul(value1, NULL, 10);
1735 break;
1736 case IMAGE_CFG_KAK:
1737 el->key_name = strdup(value1);
1738 break;
1739 case IMAGE_CFG_CSK:
1740 el->key_name = strdup(value1);
1741 break;
1742 case IMAGE_CFG_CSK_INDEX:
1743 el->csk_idx = strtol(value1, NULL, 0);
1744 break;
1745 case IMAGE_CFG_JTAG_DELAY:
1746 el->jtag_delay = strtoul(value1, NULL, 0);
1747 break;
1748 case IMAGE_CFG_BOX_ID:
1749 el->boxid = strtoul(value1, NULL, 0);
1750 break;
1751 case IMAGE_CFG_FLASH_ID:
1752 el->flashid = strtoul(value1, NULL, 0);
1753 break;
1754 case IMAGE_CFG_SEC_SPECIALIZED_IMG:
1755 el->sec_specialized_img = true;
1756 break;
1757 case IMAGE_CFG_SEC_COMMON_IMG:
1758 el->sec_specialized_img = false;
1759 break;
1760 case IMAGE_CFG_SEC_BOOT_DEV:
1761 el->sec_boot_dev = strtoul(value1, NULL, 0);
1762 break;
1763 case IMAGE_CFG_SEC_FUSE_DUMP:
1764 el->name = strdup(value1);
1765 break;
1766 default:
1767 fprintf(stderr, unknown_msg, line);
1768 }
1769
1770 return 0;
1771}
1772
1773
1774
1775
1776
1777
1778static int image_create_config_parse(FILE *fcfg)
1779{
1780 int ret;
1781 int cfgi = 0;
1782
1783
1784 while (!feof(fcfg)) {
1785 char *line;
1786 char buf[256];
1787
1788
1789 memset(buf, 0, sizeof(buf));
1790 line = fgets(buf, sizeof(buf), fcfg);
1791 if (!line)
1792 break;
1793
1794
1795 if (line[0] == '\n' || line[0] == '#')
1796 continue;
1797
1798
1799 if (line[strlen(line) - 1] == '\n')
1800 line[strlen(line) - 1] = 0;
1801
1802
1803 ret = image_create_config_parse_oneline(line,
1804 &image_cfg[cfgi]);
1805 if (ret)
1806 return ret;
1807
1808 cfgi++;
1809
1810 if (cfgi >= IMAGE_CFG_ELEMENT_MAX) {
1811 fprintf(stderr,
1812 "Too many configuration elements in .cfg file\n");
1813 return -1;
1814 }
1815 }
1816
1817 cfgn = cfgi;
1818 return 0;
1819}
1820
1821static int image_get_version(void)
1822{
1823 struct image_cfg_element *e;
1824
1825 e = image_find_option(IMAGE_CFG_VERSION);
1826 if (!e)
1827 return -1;
1828
1829 return e->version;
1830}
1831
1832static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
1833 struct image_tool_params *params)
1834{
1835 FILE *fcfg;
1836 void *image = NULL;
1837 int version;
1838 size_t headersz = 0;
1839 size_t datasz;
1840 uint32_t checksum;
1841 struct stat s;
1842 int ret;
1843
1844
1845
1846
1847
1848 if (stat(params->datafile, &s)) {
1849 fprintf(stderr, "Could not stat data file %s: %s\n",
1850 params->datafile, strerror(errno));
1851 exit(EXIT_FAILURE);
1852 }
1853 datasz = ALIGN(s.st_size, 4);
1854
1855 fcfg = fopen(params->imagename, "r");
1856 if (!fcfg) {
1857 fprintf(stderr, "Could not open input file %s\n",
1858 params->imagename);
1859 exit(EXIT_FAILURE);
1860 }
1861
1862 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1863 sizeof(struct image_cfg_element));
1864 if (!image_cfg) {
1865 fprintf(stderr, "Cannot allocate memory\n");
1866 fclose(fcfg);
1867 exit(EXIT_FAILURE);
1868 }
1869
1870 memset(image_cfg, 0,
1871 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1872 rewind(fcfg);
1873
1874 ret = image_create_config_parse(fcfg);
1875 fclose(fcfg);
1876 if (ret) {
1877 free(image_cfg);
1878 exit(EXIT_FAILURE);
1879 }
1880
1881 version = image_get_version();
1882 switch (version) {
1883
1884
1885
1886
1887 case -1:
1888 case 0:
1889 image = image_create_v0(&headersz, params, datasz + 4);
1890 break;
1891
1892 case 1:
1893 image = image_create_v1(&headersz, params, ptr, datasz + 4);
1894 break;
1895
1896 default:
1897 fprintf(stderr, "Unsupported version %d\n", version);
1898 free(image_cfg);
1899 exit(EXIT_FAILURE);
1900 }
1901
1902 if (!image) {
1903 fprintf(stderr, "Could not create image\n");
1904 free(image_cfg);
1905 exit(EXIT_FAILURE);
1906 }
1907
1908 free(image_cfg);
1909
1910
1911 checksum = cpu_to_le32(image_checksum32((uint8_t *)ptr + headersz,
1912 datasz));
1913 memcpy((uint8_t *)ptr + headersz + datasz, &checksum, sizeof(uint32_t));
1914
1915
1916 memcpy(ptr, image, headersz);
1917
1918 free(image);
1919}
1920
1921static void kwbimage_print_header(const void *ptr)
1922{
1923 struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1924 struct bin_hdr_v0 *bhdr;
1925 struct opt_hdr_v1 *ohdr;
1926
1927 printf("Image Type: MVEBU Boot from %s Image\n",
1928 image_boot_mode_name(mhdr->blockid));
1929 printf("Image version:%d\n", kwbimage_version(ptr));
1930
1931 for_each_opt_hdr_v1 (ohdr, mhdr) {
1932 if (ohdr->headertype == OPT_HDR_V1_BINARY_TYPE) {
1933 printf("BIN Img Size: ");
1934 genimg_print_size(opt_hdr_v1_size(ohdr) - 12 -
1935 4 * ohdr->data[0]);
1936 printf("BIN Img Offs: %08x\n",
1937 (unsigned)((uint8_t *)ohdr - (uint8_t *)mhdr) +
1938 8 + 4 * ohdr->data[0]);
1939 }
1940 }
1941
1942 for_each_bin_hdr_v0(bhdr, mhdr) {
1943 printf("BIN Img Size: ");
1944 genimg_print_size(le32_to_cpu(bhdr->size));
1945 printf("BIN Img Addr: %08x\n", le32_to_cpu(bhdr->destaddr));
1946 printf("BIN Img Entr: %08x\n", le32_to_cpu(bhdr->execaddr));
1947 }
1948
1949 printf("Data Size: ");
1950 genimg_print_size(mhdr->blocksize - sizeof(uint32_t));
1951 printf("Load Address: %08x\n", mhdr->destaddr);
1952 printf("Entry Point: %08x\n", mhdr->execaddr);
1953}
1954
1955static int kwbimage_check_image_types(uint8_t type)
1956{
1957 if (type == IH_TYPE_KWBIMAGE)
1958 return EXIT_SUCCESS;
1959
1960 return EXIT_FAILURE;
1961}
1962
1963static int kwbimage_verify_header(unsigned char *ptr, int image_size,
1964 struct image_tool_params *params)
1965{
1966 size_t header_size = kwbheader_size(ptr);
1967 uint8_t blockid;
1968 uint32_t offset;
1969 uint32_t size;
1970 uint8_t csum;
1971
1972 if (header_size > 192*1024)
1973 return -FDT_ERR_BADSTRUCTURE;
1974
1975 if (header_size > image_size)
1976 return -FDT_ERR_BADSTRUCTURE;
1977
1978 if (!main_hdr_checksum_ok(ptr))
1979 return -FDT_ERR_BADSTRUCTURE;
1980
1981
1982 if (kwbimage_version(ptr) == 0) {
1983 struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1984 struct ext_hdr_v0 *ext_hdr;
1985 struct bin_hdr_v0 *bhdr;
1986
1987 for_each_ext_hdr_v0(ext_hdr, ptr) {
1988 csum = image_checksum8(ext_hdr, sizeof(*ext_hdr) - 1);
1989 if (csum != ext_hdr->checksum)
1990 return -FDT_ERR_BADSTRUCTURE;
1991 }
1992
1993 for_each_bin_hdr_v0(bhdr, ptr) {
1994 csum = image_checksum8(bhdr, (uint8_t *)&bhdr->checksum - (uint8_t *)bhdr - 1);
1995 if (csum != bhdr->checksum)
1996 return -FDT_ERR_BADSTRUCTURE;
1997
1998 if (bhdr->offset > sizeof(*bhdr) || bhdr->offset % 4 != 0)
1999 return -FDT_ERR_BADSTRUCTURE;
2000
2001 if (bhdr->offset + bhdr->size + 4 > sizeof(*bhdr) || bhdr->size % 4 != 0)
2002 return -FDT_ERR_BADSTRUCTURE;
2003
2004 if (image_checksum32((uint8_t *)bhdr + bhdr->offset, bhdr->size) !=
2005 *(uint32_t *)((uint8_t *)bhdr + bhdr->offset + bhdr->size))
2006 return -FDT_ERR_BADSTRUCTURE;
2007 }
2008
2009 blockid = mhdr->blockid;
2010 offset = le32_to_cpu(mhdr->srcaddr);
2011 size = le32_to_cpu(mhdr->blocksize);
2012 } else if (kwbimage_version(ptr) == 1) {
2013 struct main_hdr_v1 *mhdr = (struct main_hdr_v1 *)ptr;
2014 const uint8_t *mhdr_end;
2015 struct opt_hdr_v1 *ohdr;
2016
2017 mhdr_end = (uint8_t *)mhdr + header_size;
2018 for_each_opt_hdr_v1 (ohdr, ptr)
2019 if (!opt_hdr_v1_valid_size(ohdr, mhdr_end))
2020 return -FDT_ERR_BADSTRUCTURE;
2021
2022 blockid = mhdr->blockid;
2023 offset = le32_to_cpu(mhdr->srcaddr);
2024 size = le32_to_cpu(mhdr->blocksize);
2025 } else {
2026 return -FDT_ERR_BADSTRUCTURE;
2027 }
2028
2029
2030
2031
2032
2033
2034
2035 if (blockid == IBR_HDR_SATA_ID) {
2036 if (offset < 1)
2037 return -FDT_ERR_BADSTRUCTURE;
2038 offset -= 1;
2039 offset *= 512;
2040 }
2041
2042
2043
2044
2045
2046
2047 if (blockid == IBR_HDR_SDIO_ID)
2048 offset *= 512;
2049
2050
2051
2052
2053
2054 if (blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
2055 offset = header_size;
2056
2057 if (offset > image_size || offset % 4 != 0)
2058 return -FDT_ERR_BADSTRUCTURE;
2059
2060 if (size < 4 || offset + size > image_size || size % 4 != 0)
2061 return -FDT_ERR_BADSTRUCTURE;
2062
2063 if (image_checksum32(ptr + offset, size - 4) !=
2064 *(uint32_t *)(ptr + offset + size - 4))
2065 return -FDT_ERR_BADSTRUCTURE;
2066
2067 return 0;
2068}
2069
2070static int kwbimage_generate(struct image_tool_params *params,
2071 struct image_type_params *tparams)
2072{
2073 FILE *fcfg;
2074 struct stat s;
2075 int alloc_len;
2076 int bootfrom;
2077 int version;
2078 void *hdr;
2079 int ret;
2080
2081 fcfg = fopen(params->imagename, "r");
2082 if (!fcfg) {
2083 fprintf(stderr, "Could not open input file %s\n",
2084 params->imagename);
2085 exit(EXIT_FAILURE);
2086 }
2087
2088 if (stat(params->datafile, &s)) {
2089 fprintf(stderr, "Could not stat data file %s: %s\n",
2090 params->datafile, strerror(errno));
2091 exit(EXIT_FAILURE);
2092 }
2093
2094 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
2095 sizeof(struct image_cfg_element));
2096 if (!image_cfg) {
2097 fprintf(stderr, "Cannot allocate memory\n");
2098 fclose(fcfg);
2099 exit(EXIT_FAILURE);
2100 }
2101
2102 memset(image_cfg, 0,
2103 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
2104 rewind(fcfg);
2105
2106 ret = image_create_config_parse(fcfg);
2107 fclose(fcfg);
2108 if (ret) {
2109 free(image_cfg);
2110 exit(EXIT_FAILURE);
2111 }
2112
2113 bootfrom = image_get_bootfrom();
2114 version = image_get_version();
2115 switch (version) {
2116
2117
2118
2119
2120 case -1:
2121 case 0:
2122 alloc_len = image_headersz_v0(NULL);
2123 break;
2124
2125 case 1:
2126 alloc_len = image_headersz_v1(NULL);
2127 if (!alloc_len) {
2128 free(image_cfg);
2129 exit(EXIT_FAILURE);
2130 }
2131 if (alloc_len > 192*1024) {
2132 fprintf(stderr, "Header is too big (%u bytes), maximal kwbimage header size is %u bytes\n", alloc_len, 192*1024);
2133 free(image_cfg);
2134 exit(EXIT_FAILURE);
2135 }
2136 break;
2137
2138 default:
2139 fprintf(stderr, "Unsupported version %d\n", version);
2140 free(image_cfg);
2141 exit(EXIT_FAILURE);
2142 }
2143
2144 free(image_cfg);
2145
2146 hdr = malloc(alloc_len);
2147 if (!hdr) {
2148 fprintf(stderr, "%s: malloc return failure: %s\n",
2149 params->cmdname, strerror(errno));
2150 exit(EXIT_FAILURE);
2151 }
2152
2153 memset(hdr, 0, alloc_len);
2154 tparams->header_size = alloc_len;
2155 tparams->hdr = hdr;
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165 if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID)
2166 return 4 + (256 - (alloc_len + s.st_size + 4) % 256) % 256;
2167 else if (bootfrom == IBR_HDR_SATA_ID || bootfrom == IBR_HDR_SDIO_ID)
2168 return 4 + (512 - (alloc_len + s.st_size + 4) % 512) % 512;
2169 else if (bootfrom == IBR_HDR_UART_ID)
2170 return 4 + (128 - (alloc_len + s.st_size + 4) % 128) % 128;
2171 else
2172 return 4 + (4 - s.st_size % 4) % 4;
2173}
2174
2175static int kwbimage_generate_config(void *ptr, struct image_tool_params *params)
2176{
2177 struct main_hdr_v0 *mhdr0 = (struct main_hdr_v0 *)ptr;
2178 struct main_hdr_v1 *mhdr = (struct main_hdr_v1 *)ptr;
2179 size_t header_size = kwbheader_size(ptr);
2180 struct register_set_hdr_v1 *regset_hdr;
2181 struct ext_hdr_v0_reg *regdata;
2182 struct ext_hdr_v0 *ehdr0;
2183 struct bin_hdr_v0 *bhdr0;
2184 struct opt_hdr_v1 *ohdr;
2185 int params_count;
2186 unsigned offset;
2187 int is_v0_ext;
2188 int cur_idx;
2189 int version;
2190 FILE *f;
2191 int i;
2192
2193 f = fopen(params->outfile, "w");
2194 if (!f) {
2195 fprintf(stderr, "Can't open \"%s\": %s\n", params->outfile, strerror(errno));
2196 return -1;
2197 }
2198
2199 version = kwbimage_version(ptr);
2200
2201 is_v0_ext = 0;
2202 if (version == 0) {
2203 if (mhdr0->ext > 1 || mhdr0->bin ||
2204 ((ehdr0 = ext_hdr_v0_first(ptr)) &&
2205 (ehdr0->match_addr || ehdr0->match_mask || ehdr0->match_value)))
2206 is_v0_ext = 1;
2207 }
2208
2209 if (version != 0)
2210 fprintf(f, "VERSION %d\n", version);
2211
2212 fprintf(f, "BOOT_FROM %s\n", image_boot_mode_name(mhdr->blockid) ?: "<unknown>");
2213
2214 if (version == 0 && mhdr->blockid == IBR_HDR_NAND_ID)
2215 fprintf(f, "NAND_ECC_MODE %s\n", image_nand_ecc_mode_name(mhdr0->nandeccmode));
2216
2217 if (mhdr->blockid == IBR_HDR_NAND_ID)
2218 fprintf(f, "NAND_PAGE_SIZE 0x%x\n", (unsigned)mhdr->nandpagesize);
2219
2220 if (version != 0 && mhdr->blockid == IBR_HDR_NAND_ID)
2221 fprintf(f, "NAND_BLKSZ 0x%x\n", (unsigned)mhdr->nandblocksize);
2222
2223 if (mhdr->blockid == IBR_HDR_NAND_ID && (mhdr->nandbadblklocation != 0 || is_v0_ext))
2224 fprintf(f, "NAND_BADBLK_LOCATION 0x%x\n", (unsigned)mhdr->nandbadblklocation);
2225
2226 if (version == 0 && mhdr->blockid == IBR_HDR_SATA_ID)
2227 fprintf(f, "SATA_PIO_MODE %u\n", (unsigned)mhdr0->satapiomode);
2228
2229
2230
2231
2232
2233
2234 if (version != 0)
2235 fprintf(f, "#HEADER_SIZE 0x%x\n",
2236 ((unsigned)mhdr->headersz_msb << 8) | le16_to_cpu(mhdr->headersz_lsb));
2237
2238 fprintf(f, "#SRC_ADDRESS 0x%x\n", le32_to_cpu(mhdr->srcaddr));
2239 fprintf(f, "#BLOCK_SIZE 0x%x\n", le32_to_cpu(mhdr->blocksize));
2240 fprintf(f, "#DEST_ADDRESS 0x%08x\n", le32_to_cpu(mhdr->destaddr));
2241 fprintf(f, "#EXEC_ADDRESS 0x%08x\n", le32_to_cpu(mhdr->execaddr));
2242
2243 if (version != 0) {
2244 if (options_to_baudrate(mhdr->options))
2245 fprintf(f, "BAUDRATE %u\n", options_to_baudrate(mhdr->options));
2246 if (options_to_baudrate(mhdr->options) ||
2247 ((mhdr->options >> 3) & 0x3) || ((mhdr->options >> 5) & 0x7)) {
2248 fprintf(f, "UART_PORT %u\n", (unsigned)((mhdr->options >> 3) & 0x3));
2249 fprintf(f, "UART_MPP 0x%x\n", (unsigned)((mhdr->options >> 5) & 0x7));
2250 }
2251 if (mhdr->flags & 0x1)
2252 fprintf(f, "DEBUG 1\n");
2253 }
2254
2255 cur_idx = 1;
2256 for_each_opt_hdr_v1(ohdr, ptr) {
2257 if (ohdr->headertype == OPT_HDR_V1_SECURE_TYPE) {
2258 fprintf(f, "#SECURE_HEADER\n");
2259 } else if (ohdr->headertype == OPT_HDR_V1_BINARY_TYPE) {
2260 fprintf(f, "BINARY binary%d.bin", cur_idx);
2261 for (i = 0; i < ohdr->data[0]; i++)
2262 fprintf(f, " 0x%x", le32_to_cpu(((uint32_t *)ohdr->data)[i + 1]));
2263 offset = (unsigned)((uint8_t *)ohdr - (uint8_t *)mhdr) + 8 + 4 * ohdr->data[0];
2264 fprintf(f, " LOAD_ADDRESS 0x%08x\n", 0x40000000 + offset);
2265 fprintf(f, " # for CPU SHEEVA: LOAD_ADDRESS 0x%08x\n", 0x40004000 + offset);
2266 cur_idx++;
2267 } else if (ohdr->headertype == OPT_HDR_V1_REGISTER_TYPE) {
2268 regset_hdr = (struct register_set_hdr_v1 *)ohdr;
2269 for (i = 0;
2270 i < opt_hdr_v1_size(ohdr) - sizeof(struct opt_hdr_v1) -
2271 sizeof(regset_hdr->data[0].last_entry);
2272 i++)
2273 fprintf(f, "DATA 0x%08x 0x%08x\n",
2274 le32_to_cpu(regset_hdr->data[i].entry.address),
2275 le32_to_cpu(regset_hdr->data[i].entry.value));
2276 if (opt_hdr_v1_size(ohdr) - sizeof(struct opt_hdr_v1) >=
2277 sizeof(regset_hdr->data[0].last_entry)) {
2278 if (regset_hdr->data[0].last_entry.delay)
2279 fprintf(f, "DATA_DELAY %u\n",
2280 (unsigned)regset_hdr->data[0].last_entry.delay);
2281 else
2282 fprintf(f, "DATA_DELAY SDRAM_SETUP\n");
2283 }
2284 }
2285 }
2286
2287 if (version == 0 && !is_v0_ext && le16_to_cpu(mhdr0->ddrinitdelay))
2288 fprintf(f, "DDR_INIT_DELAY %u\n", (unsigned)le16_to_cpu(mhdr0->ddrinitdelay));
2289
2290 for_each_ext_hdr_v0(ehdr0, ptr) {
2291 if (is_v0_ext) {
2292 fprintf(f, "\nMATCH ADDRESS 0x%08x MASK 0x%08x VALUE 0x%08x\n",
2293 le32_to_cpu(ehdr0->match_addr),
2294 le32_to_cpu(ehdr0->match_mask),
2295 le32_to_cpu(ehdr0->match_value));
2296 if (ehdr0->rsvd1[0] || ehdr0->rsvd1[1] || ehdr0->rsvd1[2] ||
2297 ehdr0->rsvd1[3] || ehdr0->rsvd1[4] || ehdr0->rsvd1[5] ||
2298 ehdr0->rsvd1[6] || ehdr0->rsvd1[7])
2299 fprintf(f, "#DDR_RSVD1 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
2300 ehdr0->rsvd1[0], ehdr0->rsvd1[1], ehdr0->rsvd1[2],
2301 ehdr0->rsvd1[3], ehdr0->rsvd1[4], ehdr0->rsvd1[5],
2302 ehdr0->rsvd1[6], ehdr0->rsvd1[7]);
2303 if (ehdr0->rsvd2[0] || ehdr0->rsvd2[1] || ehdr0->rsvd2[2] ||
2304 ehdr0->rsvd2[3] || ehdr0->rsvd2[4] || ehdr0->rsvd2[5] ||
2305 ehdr0->rsvd2[6])
2306 fprintf(f, "#DDR_RSVD2 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
2307 ehdr0->rsvd2[0], ehdr0->rsvd2[1], ehdr0->rsvd2[2],
2308 ehdr0->rsvd2[3], ehdr0->rsvd2[4], ehdr0->rsvd2[5],
2309 ehdr0->rsvd2[6]);
2310 if (ehdr0->ddrwritetype)
2311 fprintf(f, "DDR_WRITE_TYPE %u\n", (unsigned)ehdr0->ddrwritetype);
2312 if (ehdr0->ddrresetmpp)
2313 fprintf(f, "DDR_RESET_MPP 0x%x\n", (unsigned)ehdr0->ddrresetmpp);
2314 if (ehdr0->ddrclkenmpp)
2315 fprintf(f, "DDR_CLKEN_MPP 0x%x\n", (unsigned)ehdr0->ddrclkenmpp);
2316 if (ehdr0->ddrinitdelay)
2317 fprintf(f, "DDR_INIT_DELAY %u\n", (unsigned)ehdr0->ddrinitdelay);
2318 }
2319
2320 if (ehdr0->offset) {
2321 for (regdata = (struct ext_hdr_v0_reg *)((uint8_t *)ptr + ehdr0->offset);
2322 (uint8_t *)regdata < (uint8_t *)ptr + header_size &&
2323 (regdata->raddr || regdata->rdata);
2324 regdata++)
2325 fprintf(f, "DATA 0x%08x 0x%08x\n", le32_to_cpu(regdata->raddr),
2326 le32_to_cpu(regdata->rdata));
2327 if ((uint8_t *)regdata != (uint8_t *)ptr + ehdr0->offset)
2328 fprintf(f, "DATA 0x0 0x0\n");
2329 }
2330
2331 if (le32_to_cpu(ehdr0->enddelay))
2332 fprintf(f, "DATA_DELAY %u\n", le32_to_cpu(ehdr0->enddelay));
2333 else if (is_v0_ext)
2334 fprintf(f, "DATA_DELAY SDRAM_SETUP\n");
2335 }
2336
2337 cur_idx = 1;
2338 for_each_bin_hdr_v0(bhdr0, ptr) {
2339 fprintf(f, "\nMATCH ADDRESS 0x%08x MASK 0x%08x VALUE 0x%08x\n",
2340 le32_to_cpu(bhdr0->match_addr),
2341 le32_to_cpu(bhdr0->match_mask),
2342 le32_to_cpu(bhdr0->match_value));
2343
2344 fprintf(f, "BINARY binary%d.bin", cur_idx);
2345 params_count = fls4(bhdr0->params_flags & 0xF);
2346 for (i = 0; i < params_count; i++)
2347 fprintf(f, " 0x%x", (bhdr0->params[i] & (1 << i)) ? bhdr0->params[i] : 0);
2348 fprintf(f, " LOAD_ADDRESS 0x%08x", le32_to_cpu(bhdr0->destaddr));
2349 fprintf(f, " EXEC_ADDRESS 0x%08x", le32_to_cpu(bhdr0->execaddr));
2350 fprintf(f, "\n");
2351
2352 fprintf(f, "#BINARY_OFFSET 0x%x\n", le32_to_cpu(bhdr0->offset));
2353 fprintf(f, "#BINARY_SIZE 0x%x\n", le32_to_cpu(bhdr0->size));
2354
2355 if (bhdr0->rsvd1)
2356 fprintf(f, "#BINARY_RSVD1 0x%x\n", (unsigned)bhdr0->rsvd1);
2357 if (bhdr0->rsvd2)
2358 fprintf(f, "#BINARY_RSVD2 0x%x\n", (unsigned)bhdr0->rsvd2);
2359
2360 cur_idx++;
2361 }
2362
2363
2364
2365 if (version == 0 && (mhdr0->rsvd1[0] || mhdr0->rsvd1[1] || mhdr0->rsvd1[2]))
2366 fprintf(f, "#RSVD1 0x%x 0x%x 0x%x\n", (unsigned)mhdr0->rsvd1[0],
2367 (unsigned)mhdr0->rsvd1[1], (unsigned)mhdr0->rsvd1[2]);
2368
2369 if (version == 0 && le16_to_cpu(mhdr0->rsvd2))
2370 fprintf(f, "#RSVD2 0x%x\n", (unsigned)le16_to_cpu(mhdr0->rsvd2));
2371
2372 if (version != 0 && mhdr->reserved4)
2373 fprintf(f, "#RESERVED4 0x%x\n", (unsigned)mhdr->reserved4);
2374
2375 if (version != 0 && mhdr->reserved5)
2376 fprintf(f, "#RESERVED5 0x%x\n", (unsigned)le16_to_cpu(mhdr->reserved5));
2377
2378 fclose(f);
2379
2380 return 0;
2381}
2382
2383static int kwbimage_extract_subimage(void *ptr, struct image_tool_params *params)
2384{
2385 struct main_hdr_v1 *mhdr = (struct main_hdr_v1 *)ptr;
2386 size_t header_size = kwbheader_size(ptr);
2387 struct bin_hdr_v0 *bhdr;
2388 struct opt_hdr_v1 *ohdr;
2389 int idx = params->pflag;
2390 int cur_idx;
2391 uint32_t offset;
2392 ulong image;
2393 ulong size;
2394
2395
2396 if (idx == -1)
2397 return kwbimage_generate_config(ptr, params);
2398
2399 image = 0;
2400 size = 0;
2401
2402 if (idx == 0) {
2403
2404 offset = le32_to_cpu(mhdr->srcaddr);
2405
2406 if (mhdr->blockid == IBR_HDR_SATA_ID) {
2407 offset -= 1;
2408 offset *= 512;
2409 }
2410
2411 if (mhdr->blockid == IBR_HDR_SDIO_ID)
2412 offset *= 512;
2413
2414 if (mhdr->blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
2415 offset = header_size;
2416
2417 image = (ulong)((uint8_t *)ptr + offset);
2418 size = le32_to_cpu(mhdr->blocksize) - 4;
2419 } else {
2420
2421 cur_idx = 1;
2422 for_each_opt_hdr_v1(ohdr, ptr) {
2423 if (ohdr->headertype != OPT_HDR_V1_BINARY_TYPE)
2424 continue;
2425
2426 if (idx == cur_idx) {
2427 image = (ulong)&ohdr->data[4 + 4 * ohdr->data[0]];
2428 size = opt_hdr_v1_size(ohdr) - 12 - 4 * ohdr->data[0];
2429 break;
2430 }
2431
2432 ++cur_idx;
2433 }
2434 for_each_bin_hdr_v0(bhdr, ptr) {
2435 if (idx == cur_idx) {
2436 image = (ulong)bhdr + bhdr->offset;
2437 size = bhdr->size;
2438 break;
2439 }
2440 ++cur_idx;
2441 }
2442
2443 if (!image) {
2444 fprintf(stderr, "Argument -p %d is invalid\n", idx);
2445 fprintf(stderr, "Available subimages:\n");
2446 fprintf(stderr, " -p -1 - kwbimage config file\n");
2447 fprintf(stderr, " -p 0 - data image\n");
2448 if (cur_idx - 1 > 0)
2449 fprintf(stderr, " -p N - Nth binary header image (totally: %d)\n",
2450 cur_idx - 1);
2451 return -1;
2452 }
2453 }
2454
2455 return imagetool_save_subimage(params->outfile, image, size);
2456}
2457
2458
2459
2460
2461static int kwbimage_check_params(struct image_tool_params *params)
2462{
2463 if (!params->lflag && !params->iflag && !params->pflag &&
2464 (!params->imagename || !strlen(params->imagename))) {
2465 char *msg = "Configuration file for kwbimage creation omitted";
2466
2467 fprintf(stderr, "Error:%s - %s\n", params->cmdname, msg);
2468 return 1;
2469 }
2470
2471 return (params->dflag && (params->fflag || params->lflag)) ||
2472 (params->fflag && (params->dflag || params->lflag)) ||
2473 (params->lflag && (params->dflag || params->fflag)) ||
2474 (params->xflag);
2475}
2476
2477
2478
2479
2480U_BOOT_IMAGE_TYPE(
2481 kwbimage,
2482 "Marvell MVEBU Boot Image support",
2483 0,
2484 NULL,
2485 kwbimage_check_params,
2486 kwbimage_verify_header,
2487 kwbimage_print_header,
2488 kwbimage_set_header,
2489 kwbimage_extract_subimage,
2490 kwbimage_check_image_types,
2491 NULL,
2492 kwbimage_generate
2493);
2494