1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/*
* Copyright (c) 2022 Ahmad Fatoum <a.fatoum@pengutronix.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <confuse.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include "genimage.h"
static int fip_generate(struct image *image)
{
struct partition *part;
char *args = strdup("");
const char *extraargs = cfg_getstr(image->imagesec, "extraargs");
int ret;
list_for_each_entry(part, &image->partitions, list) {
struct image *child = image_get(part->image);
char *oldargs;
oldargs = args;
xasprintf(&args, "%s --%s '%s'", args, part->name, imageoutfile(child));
free(oldargs);
}
ret = systemp(image, "%s create %s %s '%s'", get_opt("fiptool"),
args, extraargs, imageoutfile(image));
free(args);
if (ret == 0) {
struct stat statbuf;
ret = stat(imageoutfile(image), &statbuf);
if (ret)
return ret;
image->size = statbuf.st_size;
}
return ret;
}
static void fip_add_part(struct image *image,
const char *name, const char *path)
{
struct partition *part;
part = xzalloc(sizeof *part);
part->image = path;
part->name = name;
list_add_tail(&part->list, &image->partitions);
}
/* clang-format off */
static cfg_opt_t fip_opts[] = {
CFG_STR("extraargs", "", CFGF_NONE),
CFG_STR_LIST("tos-fw", NULL, CFGF_NONE), /* Secure Payload BL32 (Trusted OS, Extra1, Extra 2) */
/* CFGF_NODEFAULT marks options passed as-is */
CFG_STR("scp-fwu-cfg", NULL, CFGF_NODEFAULT), /* SCP Firmware Updater Configuration FWU SCP_BL2U */
CFG_STR("ap-fwu-cfg", NULL, CFGF_NODEFAULT), /* AP Firmware Updater Configuration BL2U */
CFG_STR("fwu", NULL, CFGF_NODEFAULT), /* Firmware Updater NS_BL2U */
CFG_STR("fwu-cert", NULL, CFGF_NODEFAULT), /* Non-Trusted Firmware Updater certificate */
CFG_STR("tb-fw", NULL, CFGF_NODEFAULT), /* Trusted Boot Firmware BL2 */
CFG_STR("scp-fw", NULL, CFGF_NODEFAULT), /* SCP Firmware SCP_BL2 */
CFG_STR("soc-fw", NULL, CFGF_NODEFAULT), /* EL3 Runtime Firmware BL31 */
CFG_STR("nt-fw", NULL, CFGF_NODEFAULT), /* Non-Trusted Firmware BL33 */
CFG_STR("fw-config", NULL, CFGF_NODEFAULT), /* FW_CONFIG */
CFG_STR("hw-config", NULL, CFGF_NODEFAULT), /* HW_CONFIG */
CFG_STR("tb-fw-config", NULL, CFGF_NODEFAULT), /* TB_FW_CONFIG */
CFG_STR("soc-fw-config", NULL, CFGF_NODEFAULT), /* SOC_FW_CONFIG */
CFG_STR("tos-fw-config", NULL, CFGF_NODEFAULT), /* TOS_FW_CONFIG */
CFG_STR("nt-fw-config", NULL, CFGF_NODEFAULT), /* NT_FW_CONFIG */
CFG_STR("rot-cert", NULL, CFGF_NODEFAULT), /* Root Of Trust key certificate */
CFG_STR("trusted-key-cert", NULL, CFGF_NODEFAULT), /* Trusted key certificate */
CFG_STR("scp-fw-key-cert", NULL, CFGF_NODEFAULT), /* SCP Firmware key certificate */
CFG_STR("soc-fw-key-cert", NULL, CFGF_NODEFAULT), /* SoC Firmware key certificate */
CFG_STR("tos-fw-key-cert", NULL, CFGF_NODEFAULT), /* Trusted OS Firmware key certificate */
CFG_STR("nt-fw-key-cert", NULL, CFGF_NODEFAULT), /* Non-Trusted Firmware key certificate */
CFG_STR("tb-fw-cert", NULL, CFGF_NODEFAULT), /* Trusted Boot Firmware BL2 certificate */
CFG_STR("scp-fw-cert", NULL, CFGF_NODEFAULT), /* SCP Firmware content certificate */
CFG_STR("soc-fw-cert", NULL, CFGF_NODEFAULT), /* SoC Firmware content certificate */
CFG_STR("tos-fw-cert", NULL, CFGF_NODEFAULT), /* Trusted OS Firmware content certificate */
CFG_STR("nt-fw-cert", NULL, CFGF_NODEFAULT), /* Non-Trusted Firmware content certificate */
CFG_STR("sip-sp-cert", NULL, CFGF_NODEFAULT), /* SiP owned Secure Partition content certificate */
CFG_STR("plat-sp-cert", NULL, CFGF_NODEFAULT), /* Platform owned Secure Partition content certificate */
CFG_END()
};
/* clang-format on */
static const char *tos_fw[] = { "tos-fw", "tos-fw-extra1", "tos-fw-extra2" };
static int fip_parse(struct image *image, cfg_t *cfg)
{
unsigned int i, num_tos_fw;
cfg_opt_t *opt;
num_tos_fw = cfg_size(cfg, "tos-fw");
if (num_tos_fw > ARRAY_SIZE(tos_fw)) {
image_error(image, "%u tos-fw binaries given, but maximum is %zu\n",
num_tos_fw, ARRAY_SIZE(tos_fw));
return -EINVAL;
}
for (i = 0; i < num_tos_fw; i++)
fip_add_part(image, tos_fw[i], cfg_getnstr(cfg, "tos-fw", i));
for (opt = fip_opts; opt->type; opt++) {
const char *file;
if (opt->flags != CFGF_NODEFAULT)
continue;
file = cfg_getstr(cfg, opt->name);
if (file)
fip_add_part(image, opt->name, file);
}
return 0;
}
struct image_handler fip_handler = {
.type = "fip",
.no_rootpath = cfg_true,
.generate = fip_generate,
.parse = fip_parse,
.opts = fip_opts,
};
|