1 // SPDX-License-Identifier: GPL-2.0+
3 * Image manipulator for Marvell SoCs
4 * supports Kirkwood, Dove, Armada 370, Armada XP, Armada 375, Armada 38x and
7 * (C) Copyright 2013 Thomas Petazzoni
11 #include "imagetool.h"
18 #include <openssl/bn.h>
19 #include <openssl/rsa.h>
20 #include <openssl/pem.h>
21 #include <openssl/err.h>
22 #include <openssl/evp.h>
24 #if OPENSSL_VERSION_NUMBER < 0x10100000L || \
25 (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL)
26 static void RSA_get0_key(const RSA *r,
27 const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)
37 #elif !defined(LIBRESSL_VERSION_NUMBER)
38 void EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
40 EVP_MD_CTX_reset(ctx);
44 static struct image_cfg_element *image_cfg;
46 static int verbose_mode;
60 struct boot_mode boot_modes[] = {
61 { IBR_HDR_I2C_ID, "i2c" },
62 { IBR_HDR_SPI_ID, "spi" },
63 { IBR_HDR_NAND_ID, "nand" },
64 { IBR_HDR_SATA_ID, "sata" },
65 { IBR_HDR_PEX_ID, "pex" },
66 { IBR_HDR_UART_ID, "uart" },
67 { IBR_HDR_SDIO_ID, "sdio" },
71 struct nand_ecc_mode {
76 struct nand_ecc_mode nand_ecc_modes[] = {
77 { IBR_HDR_ECC_DEFAULT, "default" },
78 { IBR_HDR_ECC_FORCED_HAMMING, "hamming" },
79 { IBR_HDR_ECC_FORCED_RS, "rs" },
80 { IBR_HDR_ECC_DISABLED, "disabled" },
84 /* Used to identify an undefined execution or destination address */
85 #define ADDR_INVALID ((uint32_t)-1)
87 #define BINARY_MAX_ARGS 255
89 /* In-memory representation of a line of the configuration file */
92 IMAGE_CFG_VERSION = 0x1,
97 IMAGE_CFG_NAND_BADBLK_LOCATION,
98 IMAGE_CFG_NAND_ECC_MODE,
99 IMAGE_CFG_NAND_PAGESZ,
102 IMAGE_CFG_DATA_DELAY,
110 IMAGE_CFG_JTAG_DELAY,
113 IMAGE_CFG_SEC_COMMON_IMG,
114 IMAGE_CFG_SEC_SPECIALIZED_IMG,
115 IMAGE_CFG_SEC_BOOT_DEV,
116 IMAGE_CFG_SEC_FUSE_DUMP,
121 static const char * const id_strs[] = {
122 [IMAGE_CFG_VERSION] = "VERSION",
123 [IMAGE_CFG_BOOT_FROM] = "BOOT_FROM",
124 [IMAGE_CFG_DEST_ADDR] = "DEST_ADDR",
125 [IMAGE_CFG_EXEC_ADDR] = "EXEC_ADDR",
126 [IMAGE_CFG_NAND_BLKSZ] = "NAND_BLKSZ",
127 [IMAGE_CFG_NAND_BADBLK_LOCATION] = "NAND_BADBLK_LOCATION",
128 [IMAGE_CFG_NAND_ECC_MODE] = "NAND_ECC_MODE",
129 [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE",
130 [IMAGE_CFG_BINARY] = "BINARY",
131 [IMAGE_CFG_DATA] = "DATA",
132 [IMAGE_CFG_DATA_DELAY] = "DATA_DELAY",
133 [IMAGE_CFG_BAUDRATE] = "BAUDRATE",
134 [IMAGE_CFG_UART_PORT] = "UART_PORT",
135 [IMAGE_CFG_UART_MPP] = "UART_MPP",
136 [IMAGE_CFG_DEBUG] = "DEBUG",
137 [IMAGE_CFG_KAK] = "KAK",
138 [IMAGE_CFG_CSK] = "CSK",
139 [IMAGE_CFG_CSK_INDEX] = "CSK_INDEX",
140 [IMAGE_CFG_JTAG_DELAY] = "JTAG_DELAY",
141 [IMAGE_CFG_BOX_ID] = "BOX_ID",
142 [IMAGE_CFG_FLASH_ID] = "FLASH_ID",
143 [IMAGE_CFG_SEC_COMMON_IMG] = "SEC_COMMON_IMG",
144 [IMAGE_CFG_SEC_SPECIALIZED_IMG] = "SEC_SPECIALIZED_IMG",
145 [IMAGE_CFG_SEC_BOOT_DEV] = "SEC_BOOT_DEV",
146 [IMAGE_CFG_SEC_FUSE_DUMP] = "SEC_FUSE_DUMP"
149 struct image_cfg_element {
150 enum image_cfg_type type;
152 unsigned int version;
153 unsigned int bootfrom;
156 unsigned int args[BINARY_MAX_ARGS];
159 unsigned int dstaddr;
160 unsigned int execaddr;
161 unsigned int nandblksz;
162 unsigned int nandbadblklocation;
163 unsigned int nandeccmode;
164 unsigned int nandpagesz;
165 struct ext_hdr_v0_reg regdata;
166 unsigned int regdata_delay;
167 unsigned int baudrate;
168 unsigned int uart_port;
169 unsigned int uart_mpp;
171 const char *key_name;
176 bool sec_specialized_img;
177 unsigned int sec_boot_dev;
182 #define IMAGE_CFG_ELEMENT_MAX 256
185 * Utility functions to manipulate boot mode and ecc modes (convert
186 * them back and forth between description strings and the
187 * corresponding numerical identifiers).
190 static const char *image_boot_mode_name(unsigned int id)
194 for (i = 0; boot_modes[i].name; i++)
195 if (boot_modes[i].id == id)
196 return boot_modes[i].name;
200 int image_boot_mode_id(const char *boot_mode_name)
204 for (i = 0; boot_modes[i].name; i++)
205 if (!strcmp(boot_modes[i].name, boot_mode_name))
206 return boot_modes[i].id;
211 int image_nand_ecc_mode_id(const char *nand_ecc_mode_name)
215 for (i = 0; nand_ecc_modes[i].name; i++)
216 if (!strcmp(nand_ecc_modes[i].name, nand_ecc_mode_name))
217 return nand_ecc_modes[i].id;
221 static struct image_cfg_element *
222 image_find_option(unsigned int optiontype)
226 for (i = 0; i < cfgn; i++) {
227 if (image_cfg[i].type == optiontype)
228 return &image_cfg[i];
235 image_count_options(unsigned int optiontype)
238 unsigned int count = 0;
240 for (i = 0; i < cfgn; i++)
241 if (image_cfg[i].type == optiontype)
247 static int image_get_csk_index(void)
249 struct image_cfg_element *e;
251 e = image_find_option(IMAGE_CFG_CSK_INDEX);
258 static bool image_get_spezialized_img(void)
260 struct image_cfg_element *e;
262 e = image_find_option(IMAGE_CFG_SEC_SPECIALIZED_IMG);
266 return e->sec_specialized_img;
269 static int image_get_bootfrom(void)
271 struct image_cfg_element *e;
273 e = image_find_option(IMAGE_CFG_BOOT_FROM);
275 /* fallback to SPI if no BOOT_FROM is not provided */
276 return IBR_HDR_SPI_ID;
282 * Compute a 8-bit checksum of a memory area. This algorithm follows
283 * the requirements of the Marvell SoC BootROM specifications.
285 static uint8_t image_checksum8(void *start, uint32_t len)
290 /* check len and return zero checksum if invalid */
303 * Verify checksum over a complete header that includes the checksum field.
304 * Return 1 when OK, otherwise 0.
306 static int main_hdr_checksum_ok(void *hdr)
308 /* Offsets of checksum in v0 and v1 headers are the same */
309 struct main_hdr_v0 *main_hdr = (struct main_hdr_v0 *)hdr;
312 checksum = image_checksum8(hdr, kwbheader_size_for_csum(hdr));
313 /* Calculated checksum includes the header checksum field. Compensate
316 checksum -= main_hdr->checksum;
318 return checksum == main_hdr->checksum;
321 static uint32_t image_checksum32(void *start, uint32_t len)
326 /* check len and return zero checksum if invalid */
330 if (len % sizeof(uint32_t)) {
331 fprintf(stderr, "Length %d is not in multiple of %zu\n",
332 len, sizeof(uint32_t));
339 len -= sizeof(uint32_t);
345 static uint8_t baudrate_to_option(unsigned int baudrate)
349 return MAIN_HDR_V1_OPT_BAUD_2400;
351 return MAIN_HDR_V1_OPT_BAUD_4800;
353 return MAIN_HDR_V1_OPT_BAUD_9600;
355 return MAIN_HDR_V1_OPT_BAUD_19200;
357 return MAIN_HDR_V1_OPT_BAUD_38400;
359 return MAIN_HDR_V1_OPT_BAUD_57600;
361 return MAIN_HDR_V1_OPT_BAUD_115200;
363 return MAIN_HDR_V1_OPT_BAUD_DEFAULT;
367 static void kwb_msg(const char *fmt, ...)
373 vfprintf(stdout, fmt, ap);
378 static int openssl_err(const char *msg)
380 unsigned long ssl_err = ERR_get_error();
382 fprintf(stderr, "%s", msg);
383 fprintf(stderr, ": %s\n",
384 ERR_error_string(ssl_err, 0));
389 static int kwb_load_rsa_key(const char *keydir, const char *name, RSA **p_rsa)
398 snprintf(path, sizeof(path), "%s/%s.key", keydir, name);
399 f = fopen(path, "r");
401 fprintf(stderr, "Couldn't open RSA private key: '%s': %s\n",
402 path, strerror(errno));
406 rsa = PEM_read_RSAPrivateKey(f, 0, NULL, "");
408 openssl_err("Failure reading private key");
418 static int kwb_load_cfg_key(struct image_tool_params *params,
419 unsigned int cfg_option, const char *key_name,
422 struct image_cfg_element *e_key;
428 e_key = image_find_option(cfg_option);
430 fprintf(stderr, "%s not configured\n", key_name);
434 res = kwb_load_rsa_key(params->keydir, e_key->key_name, &key);
436 fprintf(stderr, "Failed to load %s\n", key_name);
445 static int kwb_load_kak(struct image_tool_params *params, RSA **p_kak)
447 return kwb_load_cfg_key(params, IMAGE_CFG_KAK, "KAK", p_kak);
450 static int kwb_load_csk(struct image_tool_params *params, RSA **p_csk)
452 return kwb_load_cfg_key(params, IMAGE_CFG_CSK, "CSK", p_csk);
455 static int kwb_compute_pubkey_hash(struct pubkey_der_v1 *pk,
456 struct hash_v1 *hash)
459 unsigned int key_size;
460 unsigned int hash_size;
463 if (!pk || !hash || pk->key[0] != 0x30 || pk->key[1] != 0x82)
466 key_size = (pk->key[2] << 8) + pk->key[3] + 4;
468 ctx = EVP_MD_CTX_create();
470 return openssl_err("EVP context creation failed");
472 EVP_MD_CTX_init(ctx);
473 if (!EVP_DigestInit(ctx, EVP_sha256())) {
474 ret = openssl_err("Digest setup failed");
478 if (!EVP_DigestUpdate(ctx, pk->key, key_size)) {
479 ret = openssl_err("Hashing data failed");
483 if (!EVP_DigestFinal(ctx, hash->hash, &hash_size)) {
484 ret = openssl_err("Could not obtain hash");
488 EVP_MD_CTX_cleanup(ctx);
491 EVP_MD_CTX_destroy(ctx);
495 static int kwb_import_pubkey(RSA **key, struct pubkey_der_v1 *src, char *keyname)
498 const unsigned char *ptr;
504 rsa = d2i_RSAPublicKey(key, &ptr, sizeof(src->key));
506 openssl_err("error decoding public key");
512 fprintf(stderr, "Failed to decode %s pubkey\n", keyname);
516 static int kwb_export_pubkey(RSA *key, struct pubkey_der_v1 *dst, FILE *hashf,
519 int size_exp, size_mod, size_seq;
520 const BIGNUM *key_e, *key_n;
522 char *errmsg = "Failed to encode %s\n";
524 RSA_get0_key(key, NULL, &key_e, NULL);
525 RSA_get0_key(key, &key_n, NULL, NULL);
527 if (!key || !key_e || !key_n || !dst) {
528 fprintf(stderr, "export pk failed: (%p, %p, %p, %p)",
529 key, key_e, key_n, dst);
530 fprintf(stderr, errmsg, keyname);
535 * According to the specs, the key should be PKCS#1 DER encoded.
536 * But unfortunately the really required encoding seems to be different;
537 * it violates DER...! (But it still conformes to BER.)
538 * (Length always in long form w/ 2 byte length code; no leading zero
539 * when MSB of first byte is set...)
540 * So we cannot use the encoding func provided by OpenSSL and have to
541 * do the encoding manually.
544 size_exp = BN_num_bytes(key_e);
545 size_mod = BN_num_bytes(key_n);
546 size_seq = 4 + size_mod + 4 + size_exp;
548 if (size_mod > 256) {
549 fprintf(stderr, "export pk failed: wrong mod size: %d\n",
551 fprintf(stderr, errmsg, keyname);
555 if (4 + size_seq > sizeof(dst->key)) {
556 fprintf(stderr, "export pk failed: seq too large (%d, %zu)\n",
557 4 + size_seq, sizeof(dst->key));
558 fprintf(stderr, errmsg, keyname);
564 /* PKCS#1 (RFC3447) RSAPublicKey structure */
565 *cur++ = 0x30; /* SEQUENCE */
567 *cur++ = (size_seq >> 8) & 0xFF;
568 *cur++ = size_seq & 0xFF;
570 *cur++ = 0x02; /* INTEGER */
572 *cur++ = (size_mod >> 8) & 0xFF;
573 *cur++ = size_mod & 0xFF;
574 BN_bn2bin(key_n, cur);
577 *cur++ = 0x02; /* INTEGER */
579 *cur++ = (size_exp >> 8) & 0xFF;
580 *cur++ = size_exp & 0xFF;
581 BN_bn2bin(key_e, cur);
584 struct hash_v1 pk_hash;
588 ret = kwb_compute_pubkey_hash(dst, &pk_hash);
590 fprintf(stderr, errmsg, keyname);
594 fprintf(hashf, "SHA256 = ");
595 for (i = 0 ; i < sizeof(pk_hash.hash); ++i)
596 fprintf(hashf, "%02X", pk_hash.hash[i]);
597 fprintf(hashf, "\n");
603 int kwb_sign(RSA *key, void *data, int datasz, struct sig_v1 *sig, char *signame)
607 unsigned int sig_size;
611 evp_key = EVP_PKEY_new();
613 return openssl_err("EVP_PKEY object creation failed");
615 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
616 ret = openssl_err("EVP key setup failed");
620 size = EVP_PKEY_size(evp_key);
621 if (size > sizeof(sig->sig)) {
622 fprintf(stderr, "Buffer to small for signature (%d bytes)\n",
628 ctx = EVP_MD_CTX_create();
630 ret = openssl_err("EVP context creation failed");
633 EVP_MD_CTX_init(ctx);
634 if (!EVP_SignInit(ctx, EVP_sha256())) {
635 ret = openssl_err("Signer setup failed");
639 if (!EVP_SignUpdate(ctx, data, datasz)) {
640 ret = openssl_err("Signing data failed");
644 if (!EVP_SignFinal(ctx, sig->sig, &sig_size, evp_key)) {
645 ret = openssl_err("Could not obtain signature");
649 EVP_MD_CTX_cleanup(ctx);
650 EVP_MD_CTX_destroy(ctx);
651 EVP_PKEY_free(evp_key);
656 EVP_MD_CTX_destroy(ctx);
658 EVP_PKEY_free(evp_key);
659 fprintf(stderr, "Failed to create %s signature\n", signame);
663 int kwb_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
671 evp_key = EVP_PKEY_new();
673 return openssl_err("EVP_PKEY object creation failed");
675 if (!EVP_PKEY_set1_RSA(evp_key, key)) {
676 ret = openssl_err("EVP key setup failed");
680 size = EVP_PKEY_size(evp_key);
681 if (size > sizeof(sig->sig)) {
682 fprintf(stderr, "Invalid signature size (%d bytes)\n",
688 ctx = EVP_MD_CTX_create();
690 ret = openssl_err("EVP context creation failed");
693 EVP_MD_CTX_init(ctx);
694 if (!EVP_VerifyInit(ctx, EVP_sha256())) {
695 ret = openssl_err("Verifier setup failed");
699 if (!EVP_VerifyUpdate(ctx, data, datasz)) {
700 ret = openssl_err("Hashing data failed");
704 if (EVP_VerifyFinal(ctx, sig->sig, sizeof(sig->sig), evp_key) != 1) {
705 ret = openssl_err("Could not verify signature");
709 EVP_MD_CTX_cleanup(ctx);
710 EVP_MD_CTX_destroy(ctx);
711 EVP_PKEY_free(evp_key);
716 EVP_MD_CTX_destroy(ctx);
718 EVP_PKEY_free(evp_key);
719 fprintf(stderr, "Failed to verify %s signature\n", signame);
723 int kwb_sign_and_verify(RSA *key, void *data, int datasz, struct sig_v1 *sig,
726 if (kwb_sign(key, data, datasz, sig, signame) < 0)
729 if (kwb_verify(key, data, datasz, sig, signame) < 0)
736 int kwb_dump_fuse_cmds_38x(FILE *out, struct secure_hdr_v1 *sec_hdr)
738 struct hash_v1 kak_pub_hash;
739 struct image_cfg_element *e;
740 unsigned int fuse_line;
746 if (!out || !sec_hdr)
749 ret = kwb_compute_pubkey_hash(&sec_hdr->kak, &kak_pub_hash);
753 fprintf(out, "# burn KAK pub key hash\n");
754 ptr = kak_pub_hash.hash;
755 for (fuse_line = 26; fuse_line <= 30; ++fuse_line) {
756 fprintf(out, "fuse prog -y %u 0 ", fuse_line);
758 for (i = 4; i-- > 0;)
759 fprintf(out, "%02hx", (ushort)ptr[i]);
763 if (fuse_line < 30) {
764 for (i = 3; i-- > 0;)
765 fprintf(out, "%02hx", (ushort)ptr[i]);
768 fprintf(out, "000000");
771 fprintf(out, " 1\n");
774 fprintf(out, "# burn CSK selection\n");
776 idx = image_get_csk_index();
777 if (idx < 0 || idx > 15) {
782 for (fuse_line = 31; fuse_line < 31 + idx; ++fuse_line)
783 fprintf(out, "fuse prog -y %u 0 00000001 00000000 1\n",
786 fprintf(out, "# CSK index is 0; no mods needed\n");
789 e = image_find_option(IMAGE_CFG_BOX_ID);
791 fprintf(out, "# set box ID\n");
792 fprintf(out, "fuse prog -y 48 0 %08x 00000000 1\n", e->boxid);
795 e = image_find_option(IMAGE_CFG_FLASH_ID);
797 fprintf(out, "# set flash ID\n");
798 fprintf(out, "fuse prog -y 47 0 %08x 00000000 1\n", e->flashid);
801 fprintf(out, "# enable secure mode ");
802 fprintf(out, "(must be the last fuse line written)\n");
805 e = image_find_option(IMAGE_CFG_SEC_BOOT_DEV);
807 fprintf(stderr, "ERROR: secured mode boot device not given\n");
812 if (e->sec_boot_dev > 0xff) {
813 fprintf(stderr, "ERROR: secured mode boot device invalid\n");
818 val |= (e->sec_boot_dev << 8);
820 fprintf(out, "fuse prog -y 24 0 %08x 0103e0a9 1\n", val);
822 fprintf(out, "# lock (unused) fuse lines (0-23)s\n");
823 for (fuse_line = 0; fuse_line < 24; ++fuse_line)
824 fprintf(out, "fuse prog -y %u 2 1\n", fuse_line);
826 fprintf(out, "# OK, that's all :-)\n");
832 static int kwb_dump_fuse_cmds(struct secure_hdr_v1 *sec_hdr)
835 struct image_cfg_element *e;
837 e = image_find_option(IMAGE_CFG_SEC_FUSE_DUMP);
841 if (!strcmp(e->name, "a38x")) {
842 FILE *out = fopen("kwb_fuses_a38x.txt", "w+");
845 fprintf(stderr, "Couldn't open eFuse settings: '%s': %s\n",
846 "kwb_fuses_a38x.txt", strerror(errno));
850 kwb_dump_fuse_cmds_38x(out, sec_hdr);
861 static void *image_create_v0(size_t *imagesz, struct image_tool_params *params,
864 struct image_cfg_element *e;
866 struct main_hdr_v0 *main_hdr;
871 * Calculate the size of the header and the size of the
874 headersz = sizeof(struct main_hdr_v0);
876 if (image_count_options(IMAGE_CFG_DATA) > 0) {
878 headersz += sizeof(struct ext_hdr_v0);
881 image = malloc(headersz);
883 fprintf(stderr, "Cannot allocate memory for image\n");
887 memset(image, 0, headersz);
889 main_hdr = (struct main_hdr_v0 *)image;
891 /* Fill in the main header */
892 main_hdr->blocksize =
893 cpu_to_le32(payloadsz - headersz);
894 main_hdr->srcaddr = cpu_to_le32(headersz);
895 main_hdr->ext = has_ext;
896 main_hdr->version = 0;
897 main_hdr->destaddr = cpu_to_le32(params->addr);
898 main_hdr->execaddr = cpu_to_le32(params->ep);
899 main_hdr->blockid = image_get_bootfrom();
901 e = image_find_option(IMAGE_CFG_NAND_ECC_MODE);
903 main_hdr->nandeccmode = e->nandeccmode;
904 e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
906 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
907 main_hdr->checksum = image_checksum8(image,
908 sizeof(struct main_hdr_v0));
910 /* Generate the ext header */
912 struct ext_hdr_v0 *ext_hdr;
915 ext_hdr = (struct ext_hdr_v0 *)
916 (image + sizeof(struct main_hdr_v0));
917 ext_hdr->offset = cpu_to_le32(0x40);
919 for (cfgi = 0, datai = 0; cfgi < cfgn; cfgi++) {
920 e = &image_cfg[cfgi];
921 if (e->type != IMAGE_CFG_DATA)
924 ext_hdr->rcfg[datai].raddr =
925 cpu_to_le32(e->regdata.raddr);
926 ext_hdr->rcfg[datai].rdata =
927 cpu_to_le32(e->regdata.rdata);
931 ext_hdr->checksum = image_checksum8(ext_hdr,
932 sizeof(struct ext_hdr_v0));
939 static size_t image_headersz_v1(int *hasext)
941 struct image_cfg_element *binarye;
947 * Calculate the size of the header and the size of the
950 headersz = sizeof(struct main_hdr_v1);
952 if (image_get_csk_index() >= 0) {
953 headersz += sizeof(struct secure_hdr_v1);
958 count = image_count_options(IMAGE_CFG_DATA);
960 headersz += sizeof(struct register_set_hdr_v1) + 8 * count + 4;
962 for (cfgi = 0; cfgi < cfgn; cfgi++) {
966 binarye = &image_cfg[cfgi];
967 if (binarye->type != IMAGE_CFG_BINARY)
970 ret = stat(binarye->binary.file, &s);
975 memset(cwd, 0, sizeof(cwd));
976 if (!getcwd(cwd, sizeof(cwd))) {
977 dir = "current working directory";
978 perror("getcwd() failed");
982 "Didn't find the file '%s' in '%s' which is mandatory to generate the image\n"
983 "This file generally contains the DDR3 training code, and should be extracted from an existing bootable\n"
984 "image for your board. Use 'dumpimage -T kwbimage -p 0' to extract it from an existing image.\n",
985 binarye->binary.file, dir);
989 headersz += sizeof(struct opt_hdr_v1) + sizeof(uint32_t) +
990 (binarye->binary.nargs) * sizeof(uint32_t);
991 headersz = ALIGN(headersz, 16);
992 headersz += ALIGN(s.st_size, 4) + sizeof(uint32_t);
998 * The payload should be aligned on some reasonable
1001 return ALIGN(headersz, 4096);
1004 int add_binary_header_v1(uint8_t **cur, uint8_t **next_ext,
1005 struct image_cfg_element *binarye,
1006 struct main_hdr_v1 *main_hdr)
1008 struct opt_hdr_v1 *hdr = (struct opt_hdr_v1 *)*cur;
1018 hdr->headertype = OPT_HDR_V1_BINARY_TYPE;
1020 bin = fopen(binarye->binary.file, "r");
1022 fprintf(stderr, "Cannot open binary file %s\n",
1023 binarye->binary.file);
1027 if (fstat(fileno(bin), &s)) {
1028 fprintf(stderr, "Cannot stat binary file %s\n",
1029 binarye->binary.file);
1033 *cur += sizeof(struct opt_hdr_v1);
1035 args = (uint32_t *)*cur;
1036 *args = cpu_to_le32(binarye->binary.nargs);
1038 for (argi = 0; argi < binarye->binary.nargs; argi++)
1039 args[argi] = cpu_to_le32(binarye->binary.args[argi]);
1041 *cur += (binarye->binary.nargs + 1) * sizeof(uint32_t);
1044 * ARM executable code inside the BIN header on some mvebu platforms
1045 * (e.g. A370, AXP) must always be aligned with the 128-bit boundary.
1046 * This requirement can be met by inserting dummy arguments into
1047 * BIN header, if needed.
1049 offset = *cur - (uint8_t *)main_hdr;
1050 add_args = ((16 - offset % 16) % 16) / sizeof(uint32_t);
1052 *(args - 1) = cpu_to_le32(binarye->binary.nargs + add_args);
1053 *cur += add_args * sizeof(uint32_t);
1056 ret = fread(*cur, s.st_size, 1, bin);
1059 "Could not read binary image %s\n",
1060 binarye->binary.file);
1066 *cur += ALIGN(s.st_size, 4);
1068 *((uint32_t *)*cur) = 0x00000000;
1072 *cur += sizeof(uint32_t);
1074 binhdrsz = sizeof(struct opt_hdr_v1) +
1075 (binarye->binary.nargs + add_args + 2) * sizeof(uint32_t) +
1076 ALIGN(s.st_size, 4);
1077 hdr->headersz_lsb = cpu_to_le16(binhdrsz & 0xFFFF);
1078 hdr->headersz_msb = (binhdrsz & 0xFFFF0000) >> 16;
1088 int export_pub_kak_hash(RSA *kak, struct secure_hdr_v1 *secure_hdr)
1093 hashf = fopen("pub_kak_hash.txt", "w");
1095 fprintf(stderr, "Couldn't open hash file: '%s': %s\n",
1096 "pub_kak_hash.txt", strerror(errno));
1100 res = kwb_export_pubkey(kak, &secure_hdr->kak, hashf, "KAK");
1104 return res < 0 ? 1 : 0;
1107 int kwb_sign_csk_with_kak(struct image_tool_params *params,
1108 struct secure_hdr_v1 *secure_hdr, RSA *csk)
1111 RSA *kak_pub = NULL;
1112 int csk_idx = image_get_csk_index();
1113 struct sig_v1 tmp_sig;
1115 if (csk_idx < 0 || csk_idx > 15) {
1116 fprintf(stderr, "Invalid CSK index %d\n", csk_idx);
1120 if (kwb_load_kak(params, &kak) < 0)
1123 if (export_pub_kak_hash(kak, secure_hdr))
1126 if (kwb_import_pubkey(&kak_pub, &secure_hdr->kak, "KAK") < 0)
1129 if (kwb_export_pubkey(csk, &secure_hdr->csk[csk_idx], NULL, "CSK") < 0)
1132 if (kwb_sign_and_verify(kak, &secure_hdr->csk,
1133 sizeof(secure_hdr->csk) +
1134 sizeof(secure_hdr->csksig),
1135 &tmp_sig, "CSK") < 0)
1138 if (kwb_verify(kak_pub, &secure_hdr->csk,
1139 sizeof(secure_hdr->csk) +
1140 sizeof(secure_hdr->csksig),
1141 &tmp_sig, "CSK (2)") < 0)
1144 secure_hdr->csksig = tmp_sig;
1149 int add_secure_header_v1(struct image_tool_params *params, uint8_t *ptr,
1150 int payloadsz, size_t headersz, uint8_t *image,
1151 struct secure_hdr_v1 *secure_hdr)
1153 struct image_cfg_element *e_jtagdelay;
1154 struct image_cfg_element *e_boxid;
1155 struct image_cfg_element *e_flashid;
1157 unsigned char *image_ptr;
1159 struct sig_v1 tmp_sig;
1160 bool specialized_img = image_get_spezialized_img();
1162 kwb_msg("Create secure header content\n");
1164 e_jtagdelay = image_find_option(IMAGE_CFG_JTAG_DELAY);
1165 e_boxid = image_find_option(IMAGE_CFG_BOX_ID);
1166 e_flashid = image_find_option(IMAGE_CFG_FLASH_ID);
1168 if (kwb_load_csk(params, &csk) < 0)
1171 secure_hdr->headertype = OPT_HDR_V1_SECURE_TYPE;
1172 secure_hdr->headersz_msb = 0;
1173 secure_hdr->headersz_lsb = cpu_to_le16(sizeof(struct secure_hdr_v1));
1175 secure_hdr->jtag_delay = e_jtagdelay->jtag_delay;
1176 if (e_boxid && specialized_img)
1177 secure_hdr->boxid = cpu_to_le32(e_boxid->boxid);
1178 if (e_flashid && specialized_img)
1179 secure_hdr->flashid = cpu_to_le32(e_flashid->flashid);
1181 if (kwb_sign_csk_with_kak(params, secure_hdr, csk))
1184 image_ptr = ptr + headersz;
1185 image_size = payloadsz - headersz;
1187 if (kwb_sign_and_verify(csk, image_ptr, image_size,
1188 &secure_hdr->imgsig, "image") < 0)
1191 if (kwb_sign_and_verify(csk, image, headersz, &tmp_sig, "header") < 0)
1194 secure_hdr->hdrsig = tmp_sig;
1196 kwb_dump_fuse_cmds(secure_hdr);
1201 static void *image_create_v1(size_t *imagesz, struct image_tool_params *params,
1202 uint8_t *ptr, int payloadsz)
1204 struct image_cfg_element *e;
1205 struct main_hdr_v1 *main_hdr;
1206 struct register_set_hdr_v1 *register_set_hdr;
1207 struct secure_hdr_v1 *secure_hdr = NULL;
1209 uint8_t *image, *cur;
1211 uint8_t *next_ext = NULL;
1212 int cfgi, datai, size;
1215 * Calculate the size of the header and the size of the
1218 headersz = image_headersz_v1(&hasext);
1222 image = malloc(headersz);
1224 fprintf(stderr, "Cannot allocate memory for image\n");
1228 memset(image, 0, headersz);
1230 main_hdr = (struct main_hdr_v1 *)image;
1232 cur += sizeof(struct main_hdr_v1);
1233 next_ext = &main_hdr->ext;
1235 /* Fill the main header */
1236 main_hdr->blocksize =
1237 cpu_to_le32(payloadsz - headersz);
1238 main_hdr->headersz_lsb = cpu_to_le16(headersz & 0xFFFF);
1239 main_hdr->headersz_msb = (headersz & 0xFFFF0000) >> 16;
1240 main_hdr->destaddr = cpu_to_le32(params->addr);
1241 main_hdr->execaddr = cpu_to_le32(params->ep);
1242 main_hdr->srcaddr = cpu_to_le32(headersz);
1243 main_hdr->ext = hasext;
1244 main_hdr->version = 1;
1245 main_hdr->blockid = image_get_bootfrom();
1247 e = image_find_option(IMAGE_CFG_NAND_BLKSZ);
1249 main_hdr->nandblocksize = e->nandblksz / (64 * 1024);
1250 e = image_find_option(IMAGE_CFG_NAND_PAGESZ);
1252 main_hdr->nandpagesize = cpu_to_le16(e->nandpagesz);
1253 e = image_find_option(IMAGE_CFG_NAND_BADBLK_LOCATION);
1255 main_hdr->nandbadblklocation = e->nandbadblklocation;
1256 e = image_find_option(IMAGE_CFG_BAUDRATE);
1258 main_hdr->options |= baudrate_to_option(e->baudrate);
1259 e = image_find_option(IMAGE_CFG_UART_PORT);
1261 main_hdr->options |= (e->uart_port & 3) << 3;
1262 e = image_find_option(IMAGE_CFG_UART_MPP);
1264 main_hdr->options |= (e->uart_mpp & 7) << 5;
1265 e = image_find_option(IMAGE_CFG_DEBUG);
1267 main_hdr->flags = e->debug ? 0x1 : 0;
1270 * For SATA srcaddr is specified in number of sectors starting from
1271 * sector 0. The main header is stored at sector number 1.
1272 * This expects the sector size to be 512 bytes.
1273 * Header size is already aligned.
1275 if (main_hdr->blockid == IBR_HDR_SATA_ID)
1276 main_hdr->srcaddr = cpu_to_le32(headersz / 512 + 1);
1279 * For SDIO srcaddr is specified in number of sectors starting from
1280 * sector 0. The main header is stored at sector number 0.
1281 * This expects sector size to be 512 bytes.
1282 * Header size is already aligned.
1284 if (main_hdr->blockid == IBR_HDR_SDIO_ID)
1285 main_hdr->srcaddr = cpu_to_le32(headersz / 512);
1287 /* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */
1288 if (main_hdr->blockid == IBR_HDR_PEX_ID)
1289 main_hdr->srcaddr = cpu_to_le32(0xFFFFFFFF);
1291 if (image_get_csk_index() >= 0) {
1293 * only reserve the space here; we fill the header later since
1294 * we need the header to be complete to compute the signatures
1296 secure_hdr = (struct secure_hdr_v1 *)cur;
1297 cur += sizeof(struct secure_hdr_v1);
1299 next_ext = &secure_hdr->next;
1303 register_set_hdr = (struct register_set_hdr_v1 *)cur;
1304 for (cfgi = 0; cfgi < cfgn; cfgi++) {
1305 e = &image_cfg[cfgi];
1306 if (e->type != IMAGE_CFG_DATA &&
1307 e->type != IMAGE_CFG_DATA_DELAY)
1309 if (e->type == IMAGE_CFG_DATA_DELAY) {
1310 size = sizeof(struct register_set_hdr_v1) + 8 * datai + 4;
1311 register_set_hdr->headertype = OPT_HDR_V1_REGISTER_TYPE;
1312 register_set_hdr->headersz_lsb = cpu_to_le16(size & 0xFFFF);
1313 register_set_hdr->headersz_msb = size >> 16;
1314 register_set_hdr->data[datai].last_entry.delay = e->regdata_delay;
1317 next_ext = ®ister_set_hdr->data[datai].last_entry.next;
1321 register_set_hdr->data[datai].entry.address =
1322 cpu_to_le32(e->regdata.raddr);
1323 register_set_hdr->data[datai].entry.value =
1324 cpu_to_le32(e->regdata.rdata);
1328 size = sizeof(struct register_set_hdr_v1) + 8 * datai + 4;
1329 register_set_hdr->headertype = OPT_HDR_V1_REGISTER_TYPE;
1330 register_set_hdr->headersz_lsb = cpu_to_le16(size & 0xFFFF);
1331 register_set_hdr->headersz_msb = size >> 16;
1332 /* Set delay to the smallest possible value 1ms. */
1333 register_set_hdr->data[datai].last_entry.delay = 1;
1336 next_ext = ®ister_set_hdr->data[datai].last_entry.next;
1339 for (cfgi = 0; cfgi < cfgn; cfgi++) {
1340 e = &image_cfg[cfgi];
1341 if (e->type != IMAGE_CFG_BINARY)
1344 if (add_binary_header_v1(&cur, &next_ext, e, main_hdr))
1348 if (secure_hdr && add_secure_header_v1(params, ptr, payloadsz,
1349 headersz, image, secure_hdr))
1352 /* Calculate and set the header checksum */
1353 main_hdr->checksum = image_checksum8(main_hdr, headersz);
1355 *imagesz = headersz;
1359 int recognize_keyword(char *keyword)
1363 for (kw_id = 1; kw_id < IMAGE_CFG_COUNT; ++kw_id)
1364 if (!strcmp(keyword, id_strs[kw_id]))
1370 static int image_create_config_parse_oneline(char *line,
1371 struct image_cfg_element *el)
1373 char *keyword, *saveptr, *value1, *value2;
1374 char delimiters[] = " \t";
1375 int keyword_id, ret, argi;
1376 char *unknown_msg = "Ignoring unknown line '%s'\n";
1378 keyword = strtok_r(line, delimiters, &saveptr);
1379 keyword_id = recognize_keyword(keyword);
1382 fprintf(stderr, unknown_msg, line);
1386 el->type = keyword_id;
1388 value1 = strtok_r(NULL, delimiters, &saveptr);
1391 fprintf(stderr, "Parameter missing in line '%s'\n", line);
1395 switch (keyword_id) {
1396 case IMAGE_CFG_VERSION:
1397 el->version = atoi(value1);
1399 case IMAGE_CFG_BOOT_FROM:
1400 ret = image_boot_mode_id(value1);
1403 fprintf(stderr, "Invalid boot media '%s'\n", value1);
1408 case IMAGE_CFG_NAND_BLKSZ:
1409 el->nandblksz = strtoul(value1, NULL, 16);
1411 case IMAGE_CFG_NAND_BADBLK_LOCATION:
1412 el->nandbadblklocation = strtoul(value1, NULL, 16);
1414 case IMAGE_CFG_NAND_ECC_MODE:
1415 ret = image_nand_ecc_mode_id(value1);
1418 fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value1);
1421 el->nandeccmode = ret;
1423 case IMAGE_CFG_NAND_PAGESZ:
1424 el->nandpagesz = strtoul(value1, NULL, 16);
1426 case IMAGE_CFG_BINARY:
1429 el->binary.file = strdup(value1);
1431 char *value = strtok_r(NULL, delimiters, &saveptr);
1435 el->binary.args[argi] = strtoul(value, NULL, 16);
1437 if (argi >= BINARY_MAX_ARGS) {
1439 "Too many arguments for BINARY\n");
1443 el->binary.nargs = argi;
1445 case IMAGE_CFG_DATA:
1446 value2 = strtok_r(NULL, delimiters, &saveptr);
1448 if (!value1 || !value2) {
1450 "Invalid number of arguments for DATA\n");
1454 el->regdata.raddr = strtoul(value1, NULL, 16);
1455 el->regdata.rdata = strtoul(value2, NULL, 16);
1457 case IMAGE_CFG_DATA_DELAY:
1458 if (!strcmp(value1, "SDRAM_SETUP"))
1459 el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_SDRAM_SETUP;
1461 el->regdata_delay = REGISTER_SET_HDR_OPT_DELAY_MS(strtoul(value1, NULL, 10));
1463 case IMAGE_CFG_BAUDRATE:
1464 el->baudrate = strtoul(value1, NULL, 10);
1466 case IMAGE_CFG_UART_PORT:
1467 el->uart_port = strtoul(value1, NULL, 16);
1469 case IMAGE_CFG_UART_MPP:
1470 el->uart_mpp = strtoul(value1, NULL, 16);
1472 case IMAGE_CFG_DEBUG:
1473 el->debug = strtoul(value1, NULL, 10);
1476 el->key_name = strdup(value1);
1479 el->key_name = strdup(value1);
1481 case IMAGE_CFG_CSK_INDEX:
1482 el->csk_idx = strtol(value1, NULL, 0);
1484 case IMAGE_CFG_JTAG_DELAY:
1485 el->jtag_delay = strtoul(value1, NULL, 0);
1487 case IMAGE_CFG_BOX_ID:
1488 el->boxid = strtoul(value1, NULL, 0);
1490 case IMAGE_CFG_FLASH_ID:
1491 el->flashid = strtoul(value1, NULL, 0);
1493 case IMAGE_CFG_SEC_SPECIALIZED_IMG:
1494 el->sec_specialized_img = true;
1496 case IMAGE_CFG_SEC_COMMON_IMG:
1497 el->sec_specialized_img = false;
1499 case IMAGE_CFG_SEC_BOOT_DEV:
1500 el->sec_boot_dev = strtoul(value1, NULL, 0);
1502 case IMAGE_CFG_SEC_FUSE_DUMP:
1503 el->name = strdup(value1);
1506 fprintf(stderr, unknown_msg, line);
1513 * Parse the configuration file 'fcfg' into the array of configuration
1514 * elements 'image_cfg', and return the number of configuration
1515 * elements in 'cfgn'.
1517 static int image_create_config_parse(FILE *fcfg)
1522 /* Parse the configuration file */
1523 while (!feof(fcfg)) {
1527 /* Read the current line */
1528 memset(buf, 0, sizeof(buf));
1529 line = fgets(buf, sizeof(buf), fcfg);
1533 /* Ignore useless lines */
1534 if (line[0] == '\n' || line[0] == '#')
1537 /* Strip final newline */
1538 if (line[strlen(line) - 1] == '\n')
1539 line[strlen(line) - 1] = 0;
1541 /* Parse the current line */
1542 ret = image_create_config_parse_oneline(line,
1549 if (cfgi >= IMAGE_CFG_ELEMENT_MAX) {
1551 "Too many configuration elements in .cfg file\n");
1560 static int image_get_version(void)
1562 struct image_cfg_element *e;
1564 e = image_find_option(IMAGE_CFG_VERSION);
1571 static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd,
1572 struct image_tool_params *params)
1577 size_t headersz = 0;
1581 fcfg = fopen(params->imagename, "r");
1583 fprintf(stderr, "Could not open input file %s\n",
1588 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1589 sizeof(struct image_cfg_element));
1591 fprintf(stderr, "Cannot allocate memory\n");
1596 memset(image_cfg, 0,
1597 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1600 ret = image_create_config_parse(fcfg);
1607 version = image_get_version();
1610 * Fallback to version 0 if no version is provided in the
1615 image = image_create_v0(&headersz, params, sbuf->st_size);
1619 image = image_create_v1(&headersz, params, ptr, sbuf->st_size);
1623 fprintf(stderr, "Unsupported version %d\n", version);
1629 fprintf(stderr, "Could not create image\n");
1636 /* Build and add image checksum header */
1637 checksum = cpu_to_le32(image_checksum32((uint8_t *)ptr + headersz,
1638 sbuf->st_size - headersz - sizeof(uint32_t)));
1639 memcpy((uint8_t *)ptr + sbuf->st_size - sizeof(uint32_t), &checksum,
1642 /* Finally copy the header into the image area */
1643 memcpy(ptr, image, headersz);
1648 static void kwbimage_print_header(const void *ptr)
1650 struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1651 struct opt_hdr_v1 *ohdr;
1653 printf("Image Type: MVEBU Boot from %s Image\n",
1654 image_boot_mode_name(mhdr->blockid));
1655 printf("Image version:%d\n", kwbimage_version(ptr));
1657 for_each_opt_hdr_v1 (ohdr, mhdr) {
1658 if (ohdr->headertype == OPT_HDR_V1_BINARY_TYPE) {
1659 printf("BIN Hdr Size: ");
1660 genimg_print_size(opt_hdr_v1_size(ohdr) - 12 -
1665 printf("Data Size: ");
1666 genimg_print_size(mhdr->blocksize - sizeof(uint32_t));
1667 printf("Load Address: %08x\n", mhdr->destaddr);
1668 printf("Entry Point: %08x\n", mhdr->execaddr);
1671 static int kwbimage_check_image_types(uint8_t type)
1673 if (type == IH_TYPE_KWBIMAGE)
1674 return EXIT_SUCCESS;
1676 return EXIT_FAILURE;
1679 static int kwbimage_verify_header(unsigned char *ptr, int image_size,
1680 struct image_tool_params *params)
1682 size_t header_size = kwbheader_size(ptr);
1685 if (header_size > image_size)
1686 return -FDT_ERR_BADSTRUCTURE;
1688 if (!main_hdr_checksum_ok(ptr))
1689 return -FDT_ERR_BADSTRUCTURE;
1691 /* Only version 0 extended header has checksum */
1692 if (kwbimage_version(ptr) == 0) {
1693 struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr;
1695 if (mhdr->ext & 0x1) {
1696 struct ext_hdr_v0 *ext_hdr = (void *)(mhdr + 1);
1698 csum = image_checksum8(ext_hdr, sizeof(*ext_hdr) - 1);
1699 if (csum != ext_hdr->checksum)
1700 return -FDT_ERR_BADSTRUCTURE;
1702 } else if (kwbimage_version(ptr) == 1) {
1703 struct main_hdr_v1 *mhdr = (struct main_hdr_v1 *)ptr;
1704 const uint8_t *mhdr_end;
1705 struct opt_hdr_v1 *ohdr;
1709 mhdr_end = (uint8_t *)mhdr + header_size;
1710 for_each_opt_hdr_v1 (ohdr, ptr)
1711 if (!opt_hdr_v1_valid_size(ohdr, mhdr_end))
1712 return -FDT_ERR_BADSTRUCTURE;
1714 offset = le32_to_cpu(mhdr->srcaddr);
1717 * For SATA srcaddr is specified in number of sectors.
1718 * The main header is must be stored at sector number 1.
1719 * This expects that sector size is 512 bytes and recalculates
1720 * data offset to bytes relative to the main header.
1722 if (mhdr->blockid == IBR_HDR_SATA_ID) {
1724 return -FDT_ERR_BADSTRUCTURE;
1730 * For SDIO srcaddr is specified in number of sectors.
1731 * This expects that sector size is 512 bytes and recalculates
1732 * data offset to bytes.
1734 if (mhdr->blockid == IBR_HDR_SDIO_ID)
1738 * For PCIe srcaddr is always set to 0xFFFFFFFF.
1739 * This expects that data starts after all headers.
1741 if (mhdr->blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
1742 offset = header_size;
1744 if (offset > image_size || offset % 4 != 0)
1745 return -FDT_ERR_BADSTRUCTURE;
1747 size = le32_to_cpu(mhdr->blocksize);
1748 if (size < 4 || offset + size > image_size || size % 4 != 0)
1749 return -FDT_ERR_BADSTRUCTURE;
1751 if (image_checksum32(ptr + offset, size - 4) !=
1752 *(uint32_t *)(ptr + offset + size - 4))
1753 return -FDT_ERR_BADSTRUCTURE;
1755 return -FDT_ERR_BADSTRUCTURE;
1761 static int kwbimage_generate(struct image_tool_params *params,
1762 struct image_type_params *tparams)
1772 fcfg = fopen(params->imagename, "r");
1774 fprintf(stderr, "Could not open input file %s\n",
1779 if (stat(params->datafile, &s)) {
1780 fprintf(stderr, "Could not stat data file %s: %s\n",
1781 params->datafile, strerror(errno));
1785 image_cfg = malloc(IMAGE_CFG_ELEMENT_MAX *
1786 sizeof(struct image_cfg_element));
1788 fprintf(stderr, "Cannot allocate memory\n");
1793 memset(image_cfg, 0,
1794 IMAGE_CFG_ELEMENT_MAX * sizeof(struct image_cfg_element));
1797 ret = image_create_config_parse(fcfg);
1804 bootfrom = image_get_bootfrom();
1805 version = image_get_version();
1808 * Fallback to version 0 if no version is provided in the
1813 alloc_len = sizeof(struct main_hdr_v0) +
1814 sizeof(struct ext_hdr_v0);
1818 alloc_len = image_headersz_v1(NULL);
1822 fprintf(stderr, "Unsupported version %d\n", version);
1829 hdr = malloc(alloc_len);
1831 fprintf(stderr, "%s: malloc return failure: %s\n",
1832 params->cmdname, strerror(errno));
1836 memset(hdr, 0, alloc_len);
1837 tparams->header_size = alloc_len;
1841 * The resulting image needs to be 4-byte aligned. At least
1842 * the Marvell hdrparser tool complains if its unaligned.
1843 * After the image data is stored 4-byte checksum.
1844 * Final SPI and NAND images must be aligned to 256 bytes.
1845 * Final SATA and SDIO images must be aligned to 512 bytes.
1847 if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID)
1848 return 4 + (256 - (alloc_len + s.st_size + 4) % 256) % 256;
1849 else if (bootfrom == IBR_HDR_SATA_ID || bootfrom == IBR_HDR_SDIO_ID)
1850 return 4 + (512 - (alloc_len + s.st_size + 4) % 512) % 512;
1852 return 4 + (4 - s.st_size % 4) % 4;
1855 static int kwbimage_extract_subimage(void *ptr, struct image_tool_params *params)
1857 struct main_hdr_v1 *mhdr = (struct main_hdr_v1 *)ptr;
1858 size_t header_size = kwbheader_size(ptr);
1859 struct opt_hdr_v1 *ohdr;
1860 int idx = params->pflag;
1866 for_each_opt_hdr_v1 (ohdr, ptr) {
1867 if (ohdr->headertype != OPT_HDR_V1_BINARY_TYPE)
1870 if (idx == cur_idx) {
1871 image = (ulong)&ohdr->data[4 + 4 * ohdr->data[0]];
1872 size = opt_hdr_v1_size(ohdr) - 12 - 4 * ohdr->data[0];
1879 if (idx != cur_idx) {
1880 printf("Image %d is not present\n", idx);
1884 offset = le32_to_cpu(mhdr->srcaddr);
1886 if (mhdr->blockid == IBR_HDR_SATA_ID) {
1891 if (mhdr->blockid == IBR_HDR_SDIO_ID)
1894 if (mhdr->blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF)
1895 offset = header_size;
1897 image = (ulong)((uint8_t *)ptr + offset);
1898 size = le32_to_cpu(mhdr->blocksize) - 4;
1901 return imagetool_save_subimage(params->outfile, image, size);
1905 * Report Error if xflag is set in addition to default
1907 static int kwbimage_check_params(struct image_tool_params *params)
1909 if (!params->iflag && (!params->imagename || !strlen(params->imagename))) {
1910 char *msg = "Configuration file for kwbimage creation omitted";
1912 fprintf(stderr, "Error:%s - %s\n", params->cmdname, msg);
1916 return (params->dflag && (params->fflag || params->lflag)) ||
1917 (params->fflag && (params->dflag || params->lflag)) ||
1918 (params->lflag && (params->dflag || params->fflag)) ||
1923 * kwbimage type parameters definition
1927 "Marvell MVEBU Boot Image support",
1930 kwbimage_check_params,
1931 kwbimage_verify_header,
1932 kwbimage_print_header,
1933 kwbimage_set_header,
1934 kwbimage_extract_subimage,
1935 kwbimage_check_image_types,