summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2022-01-24 10:39:28 -0500
committerTom Rini <[email protected]>2022-01-24 10:39:28 -0500
commit21a1439d986a889cefbc2ed785c3f592fc9266de (patch)
tree3ff70c21854c4a1bdbf60414d6fead53c0982049
parentae35c59389b9b67e1e553bc9ed3e6fd93cfdb86f (diff)
parent480245cf273dfd14536dc2b30aff0a733b71a1ed (diff)
Merge branch '2022-01-24-assorted-fixes-and-updates'
- Assorted dumpimage/mkimage fixes, allow setting the signature algorithm on the command line with mkimage - Bugfix to the misc uclass, CONFIG_MP / CMD_MP Kconfig logic improved, updated Xen platform MAINTAINERS entry and fixed vexpress_aemv8a_semi booting.
-rw-r--r--Kconfig6
-rw-r--r--MAINTAINERS2
-rw-r--r--boot/image-fit-sig.c2
-rw-r--r--boot/image-fit.c8
-rw-r--r--cmd/Kconfig11
-rw-r--r--cmd/Makefile2
-rw-r--r--configs/vexpress_aemv8a_semi_defconfig1
-rw-r--r--doc/mkimage.15
-rw-r--r--drivers/misc/misc-uclass.c2
-rw-r--r--include/image.h5
-rw-r--r--include/misc.h2
-rw-r--r--tools/fit_common.c12
-rw-r--r--tools/fit_image.c8
-rw-r--r--tools/image-host.c50
-rw-r--r--tools/imagetool.h1
-rw-r--r--tools/mkimage.c13
16 files changed, 80 insertions, 50 deletions
diff --git a/Kconfig b/Kconfig
index c46f4fce862..b0e45cd236f 100644
--- a/Kconfig
+++ b/Kconfig
@@ -454,6 +454,12 @@ config SYS_SRAM_SIZE
default 0x10000 if TARGET_TRICORDER
default 0x0
+config MP
+ bool "Support for multiprocessor"
+ help
+ This provides an option to bringup different processors
+ in multiprocessor cases.
+
config EXAMPLES
bool "Compile API examples"
depends on !SANDBOX
diff --git a/MAINTAINERS b/MAINTAINERS
index 64648c29219..9c2d6fe0630 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1307,7 +1307,7 @@ F: arch/x86/
F: cmd/x86/
XEN
-M: Anastasiia Lukianenko <[email protected]>
+M: Anastasiia Lukianenko <[email protected]>
M: Oleksandr Andrushchenko <[email protected]>
S: Maintained
F: arch/arm/cpu/armv8/xen/
diff --git a/boot/image-fit-sig.c b/boot/image-fit-sig.c
index 9b1d38b20a0..495d7768f68 100644
--- a/boot/image-fit-sig.c
+++ b/boot/image-fit-sig.c
@@ -67,7 +67,7 @@ static int fit_image_setup_verify(struct image_sign_info *info,
const void *fit, int noffset,
int required_keynode, char **err_msgp)
{
- char *algo_name;
+ const char *algo_name;
const char *padding_name;
if (fdt_totalsize(fit) > CONFIG_VAL(FIT_SIGNATURE_MAX_SIZE)) {
diff --git a/boot/image-fit.c b/boot/image-fit.c
index f6594e065c3..85a6f223c85 100644
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -191,7 +191,7 @@ static void fit_image_print_data(const void *fit, int noffset, const char *p,
const char *keyname;
uint8_t *value;
int value_len;
- char *algo;
+ const char *algo;
const char *padding;
bool required;
int ret, i;
@@ -1063,11 +1063,11 @@ int fit_image_get_data_and_size(const void *fit, int noffset,
* 0, on success
* -1, on failure
*/
-int fit_image_hash_get_algo(const void *fit, int noffset, char **algo)
+int fit_image_hash_get_algo(const void *fit, int noffset, const char **algo)
{
int len;
- *algo = (char *)fdt_getprop(fit, noffset, FIT_ALGO_PROP, &len);
+ *algo = (const char *)fdt_getprop(fit, noffset, FIT_ALGO_PROP, &len);
if (*algo == NULL) {
fit_get_debug(fit, noffset, FIT_ALGO_PROP, len);
return -1;
@@ -1265,7 +1265,7 @@ static int fit_image_check_hash(const void *fit, int noffset, const void *data,
{
uint8_t value[FIT_MAX_HASH_LEN];
int value_len;
- char *algo;
+ const char *algo;
uint8_t *fit_value;
int fit_value_len;
int ignore;
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 84ede90eee9..5e25e45fd28 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1827,12 +1827,13 @@ config CMD_SLEEP
help
Delay execution for some time
-config MP
- bool "support for multiprocessor"
+config CMD_MP
+ bool "support for multiprocessor commands"
+ depends on MP
+ default y
help
- This provides an option to brinup
- different processors in multiprocessor
- cases.
+ This enables commands to bringup different processors
+ in multiprocessor cases.
config CMD_TIMER
bool "timer"
diff --git a/cmd/Makefile b/cmd/Makefile
index fb133e37037..166c652d982 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -100,7 +100,7 @@ obj-$(CONFIG_CMD_MDIO) += mdio.o
obj-$(CONFIG_CMD_SLEEP) += sleep.o
obj-$(CONFIG_CMD_MMC) += mmc.o
obj-$(CONFIG_CMD_OPTEE_RPMB) += optee_rpmb.o
-obj-$(CONFIG_MP) += mp.o
+obj-$(CONFIG_CMD_MP) += mp.o
obj-$(CONFIG_CMD_MTD) += mtd.o
obj-$(CONFIG_CMD_MTDPARTS) += mtdparts.o
obj-$(CONFIG_CMD_CLONE) += clone.o
diff --git a/configs/vexpress_aemv8a_semi_defconfig b/configs/vexpress_aemv8a_semi_defconfig
index f9abf29b260..8e6a87c99f0 100644
--- a/configs/vexpress_aemv8a_semi_defconfig
+++ b/configs/vexpress_aemv8a_semi_defconfig
@@ -11,6 +11,7 @@ CONFIG_ENV_SECT_SIZE=0x40000
CONFIG_IDENT_STRING=" vexpress_aemv8a"
CONFIG_DISTRO_DEFAULTS=y
CONFIG_SYS_LOAD_ADDR=0x90000000
+# CONFIG_ARM64_CRC32 is not set
CONFIG_ANDROID_BOOT_IMAGE=y
CONFIG_BOOTDELAY=1
CONFIG_USE_BOOTARGS=y
diff --git a/doc/mkimage.1 b/doc/mkimage.1
index fea52887846..0734bd36a11 100644
--- a/doc/mkimage.1
+++ b/doc/mkimage.1
@@ -156,6 +156,11 @@ verification. Typically the file here is the device tree binary used by
CONFIG_OF_CONTROL in U-Boot.
.TP
+.BI "\-o [" "signing algorithm" "]"
+Specifies the algorithm to be used for signing a FIT image. The default is
+taken from the target signature nodes 'algo' properties.
+
+.TP
.BI "\-p [" "external position" "]"
Place external data at a static external position. See \-E. Instead of writing
a 'data-offset' property defining the offset from the end of the FIT, \-p will
diff --git a/drivers/misc/misc-uclass.c b/drivers/misc/misc-uclass.c
index cbfacc3801a..cfe9d562fa0 100644
--- a/drivers/misc/misc-uclass.c
+++ b/drivers/misc/misc-uclass.c
@@ -26,7 +26,7 @@ int misc_read(struct udevice *dev, int offset, void *buf, int size)
return ops->read(dev, offset, buf, size);
}
-int misc_write(struct udevice *dev, int offset, void *buf, int size)
+int misc_write(struct udevice *dev, int offset, const void *buf, int size)
{
const struct misc_ops *ops = device_get_ops(dev);
diff --git a/include/image.h b/include/image.h
index 1cdc70faee3..fe1356265c8 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1011,7 +1011,7 @@ int fit_image_get_data_size_unciphered(const void *fit, int noffset,
int fit_image_get_data_and_size(const void *fit, int noffset,
const void **data, size_t *size);
-int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
+int fit_image_hash_get_algo(const void *fit, int noffset, const char **algo);
int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
int *value_len);
@@ -1031,6 +1031,7 @@ int fit_cipher_data(const char *keydir, void *keydest, void *fit,
* @require_keys: Mark all keys as 'required'
* @engine_id: Engine to use for signing
* @cmdname: Command name used when reporting errors
+ * @algo_name: Algorithm name, or NULL if to be read from FIT
*
* Adds hash values for all component images in the FIT blob.
* Hashes are calculated for all component images which have hash subnodes
@@ -1045,7 +1046,7 @@ int fit_cipher_data(const char *keydir, void *keydest, void *fit,
int fit_add_verification_data(const char *keydir, const char *keyfile,
void *keydest, void *fit, const char *comment,
int require_keys, const char *engine_id,
- const char *cmdname);
+ const char *cmdname, const char *algo_name);
int fit_image_verify_with_data(const void *fit, int image_noffset,
const void *data, size_t size);
diff --git a/include/misc.h b/include/misc.h
index 82ec2ce7936..6f042625c9f 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -28,7 +28,7 @@ int misc_read(struct udevice *dev, int offset, void *buf, int size);
*
* Return: number of bytes written if OK (may be < @size), -ve on error
*/
-int misc_write(struct udevice *dev, int offset, void *buf, int size);
+int misc_write(struct udevice *dev, int offset, const void *buf, int size);
/**
* misc_ioctl() - Assert command to the device, optional.
diff --git a/tools/fit_common.c b/tools/fit_common.c
index 52b63296f89..5c8920de547 100644
--- a/tools/fit_common.c
+++ b/tools/fit_common.c
@@ -26,10 +26,18 @@
int fit_verify_header(unsigned char *ptr, int image_size,
struct image_tool_params *params)
{
- if (fdt_check_header(ptr) != EXIT_SUCCESS ||
- fit_check_format(ptr, IMAGE_SIZE_INVAL))
+ int ret;
+
+ if (fdt_check_header(ptr) != EXIT_SUCCESS)
return EXIT_FAILURE;
+ ret = fit_check_format(ptr, IMAGE_SIZE_INVAL);
+ if (ret) {
+ if (ret != -EADDRNOTAVAIL)
+ return EXIT_FAILURE;
+ fprintf(stderr, "Image contains unit addresses @, this will break signing\n");
+ }
+
return EXIT_SUCCESS;
}
diff --git a/tools/fit_image.c b/tools/fit_image.c
index f4f372ba62f..8df95c40d20 100644
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
@@ -73,7 +73,8 @@ static int fit_add_file_data(struct image_tool_params *params, size_t size_inc,
params->comment,
params->require_keys,
params->engine_id,
- params->cmdname);
+ params->cmdname,
+ params->algo_name);
}
if (dest_blob) {
@@ -884,11 +885,6 @@ static int fit_extract_contents(void *ptr, struct image_tool_params *params)
/* Indent string is defined in header image.h */
p = IMAGE_INDENT_STRING;
- if (fit_check_format(fit, IMAGE_SIZE_INVAL)) {
- printf("Bad FIT image format\n");
- return -1;
- }
-
/* Find images parent node offset */
images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
if (images_noffset < 0) {
diff --git a/tools/image-host.c b/tools/image-host.c
index 945571f584d..f86e1fbb1b9 100644
--- a/tools/image-host.c
+++ b/tools/image-host.c
@@ -63,7 +63,7 @@ static int fit_image_process_hash(void *fit, const char *image_name,
uint8_t value[FIT_MAX_HASH_LEN];
const char *node_name;
int value_len;
- char *algo;
+ const char *algo;
int ret;
node_name = fit_get_name(fit, noffset, NULL);
@@ -107,7 +107,7 @@ static int fit_image_process_hash(void *fit, const char *image_name,
*/
static int fit_image_write_sig(void *fit, int noffset, uint8_t *value,
int value_len, const char *comment, const char *region_prop,
- int region_proplen, const char *cmdname)
+ int region_proplen, const char *cmdname, const char *algo_name)
{
int string_size;
int ret;
@@ -150,6 +150,8 @@ static int fit_image_write_sig(void *fit, int noffset, uint8_t *value,
strdata, sizeof(strdata));
}
}
+ if (algo_name && !ret)
+ ret = fdt_setprop_string(fit, noffset, "algo", algo_name);
return ret;
}
@@ -157,17 +159,18 @@ static int fit_image_write_sig(void *fit, int noffset, uint8_t *value,
static int fit_image_setup_sig(struct image_sign_info *info,
const char *keydir, const char *keyfile, void *fit,
const char *image_name, int noffset, const char *require_keys,
- const char *engine_id)
+ const char *engine_id, const char *algo_name)
{
const char *node_name;
- char *algo_name;
const char *padding_name;
node_name = fit_get_name(fit, noffset, NULL);
- if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
- printf("Can't get algo property for '%s' signature node in '%s' image node\n",
- node_name, image_name);
- return -1;
+ if (!algo_name) {
+ if (fit_image_hash_get_algo(fit, noffset, &algo_name)) {
+ printf("Can't get algo property for '%s' signature node in '%s' image node\n",
+ node_name, image_name);
+ return -1;
+ }
}
padding_name = fdt_getprop(fit, noffset, "padding", NULL);
@@ -215,7 +218,7 @@ static int fit_image_process_sig(const char *keydir, const char *keyfile,
void *keydest, void *fit, const char *image_name,
int noffset, const void *data, size_t size,
const char *comment, int require_keys, const char *engine_id,
- const char *cmdname)
+ const char *cmdname, const char *algo_name)
{
struct image_sign_info info;
struct image_region region;
@@ -226,7 +229,7 @@ static int fit_image_process_sig(const char *keydir, const char *keyfile,
if (fit_image_setup_sig(&info, keydir, keyfile, fit, image_name,
noffset, require_keys ? "image" : NULL,
- engine_id))
+ engine_id, algo_name))
return -1;
node_name = fit_get_name(fit, noffset, NULL);
@@ -244,7 +247,7 @@ static int fit_image_process_sig(const char *keydir, const char *keyfile,
}
ret = fit_image_write_sig(fit, noffset, value, value_len, comment,
- NULL, 0, cmdname);
+ NULL, 0, cmdname, algo_name);
if (ret) {
if (ret == -FDT_ERR_NOSPACE)
return -ENOSPC;
@@ -606,7 +609,7 @@ int fit_image_cipher_data(const char *keydir, void *keydest,
int fit_image_add_verification_data(const char *keydir, const char *keyfile,
void *keydest, void *fit, int image_noffset,
const char *comment, int require_keys, const char *engine_id,
- const char *cmdname)
+ const char *cmdname, const char* algo_name)
{
const char *image_name;
const void *data;
@@ -643,7 +646,8 @@ int fit_image_add_verification_data(const char *keydir, const char *keyfile,
strlen(FIT_SIG_NODENAME))) {
ret = fit_image_process_sig(keydir, keyfile, keydest,
fit, image_name, noffset, data, size,
- comment, require_keys, engine_id, cmdname);
+ comment, require_keys, engine_id, cmdname,
+ algo_name);
}
if (ret)
return ret;
@@ -927,7 +931,8 @@ static int fit_config_get_data(void *fit, int conf_noffset, int noffset,
static int fit_config_process_sig(const char *keydir, const char *keyfile,
void *keydest, void *fit, const char *conf_name,
int conf_noffset, int noffset, const char *comment,
- int require_keys, const char *engine_id, const char *cmdname)
+ int require_keys, const char *engine_id, const char *cmdname,
+ const char *algo_name)
{
struct image_sign_info info;
const char *node_name;
@@ -945,7 +950,8 @@ static int fit_config_process_sig(const char *keydir, const char *keyfile,
return -1;
if (fit_image_setup_sig(&info, keydir, keyfile, fit, conf_name, noffset,
- require_keys ? "conf" : NULL, engine_id))
+ require_keys ? "conf" : NULL, engine_id,
+ algo_name))
return -1;
ret = info.crypto->sign(&info, region, region_count, &value,
@@ -962,7 +968,8 @@ static int fit_config_process_sig(const char *keydir, const char *keyfile,
}
ret = fit_image_write_sig(fit, noffset, value, value_len, comment,
- region_prop, region_proplen, cmdname);
+ region_prop, region_proplen, cmdname,
+ algo_name);
if (ret) {
if (ret == -FDT_ERR_NOSPACE)
return -ENOSPC;
@@ -992,7 +999,7 @@ static int fit_config_process_sig(const char *keydir, const char *keyfile,
static int fit_config_add_verification_data(const char *keydir,
const char *keyfile, void *keydest, void *fit, int conf_noffset,
const char *comment, int require_keys, const char *engine_id,
- const char *cmdname)
+ const char *cmdname, const char *algo_name)
{
const char *conf_name;
int noffset;
@@ -1011,7 +1018,7 @@ static int fit_config_add_verification_data(const char *keydir,
strlen(FIT_SIG_NODENAME))) {
ret = fit_config_process_sig(keydir, keyfile, keydest,
fit, conf_name, conf_noffset, noffset, comment,
- require_keys, engine_id, cmdname);
+ require_keys, engine_id, cmdname, algo_name);
}
if (ret)
return ret;
@@ -1058,7 +1065,7 @@ int fit_cipher_data(const char *keydir, void *keydest, void *fit,
int fit_add_verification_data(const char *keydir, const char *keyfile,
void *keydest, void *fit, const char *comment,
int require_keys, const char *engine_id,
- const char *cmdname)
+ const char *cmdname, const char *algo_name)
{
int images_noffset, confs_noffset;
int noffset;
@@ -1082,7 +1089,7 @@ int fit_add_verification_data(const char *keydir, const char *keyfile,
*/
ret = fit_image_add_verification_data(keydir, keyfile, keydest,
fit, noffset, comment, require_keys, engine_id,
- cmdname);
+ cmdname, algo_name);
if (ret)
return ret;
}
@@ -1106,7 +1113,8 @@ int fit_add_verification_data(const char *keydir, const char *keyfile,
ret = fit_config_add_verification_data(keydir, keyfile, keydest,
fit, noffset, comment,
require_keys,
- engine_id, cmdname);
+ engine_id, cmdname,
+ algo_name);
if (ret)
return ret;
}
diff --git a/tools/imagetool.h b/tools/imagetool.h
index 3546f7a6711..b7ac3a23d0f 100644
--- a/tools/imagetool.h
+++ b/tools/imagetool.h
@@ -69,6 +69,7 @@ struct image_tool_params {
const char *keydest; /* Destination .dtb for public key */
const char *keyfile; /* Filename of private or public key */
const char *comment; /* Comment to add to signature node */
+ const char *algo_name; /* Algorithm name to use hashing/signing */
int require_keys; /* 1 to mark signing keys as 'required' */
int file_size; /* Total size of output file */
int orig_file_size; /* Original size for file before padding */
diff --git a/tools/mkimage.c b/tools/mkimage.c
index fbe883ce362..0ec28da33cb 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -146,7 +146,6 @@ static int add_content(int type, const char *fname)
return 0;
}
-#define OPT_STRING "a:A:b:B:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qstT:vVx"
static void process_args(int argc, char **argv)
{
char *ptr;
@@ -155,7 +154,7 @@ static void process_args(int argc, char **argv)
int opt;
while ((opt = getopt(argc, argv,
- "a:A:b:B:c:C:d:D:e:Ef:FG:k:i:K:ln:N:p:O:rR:qstT:vVx")) != -1) {
+ "a:A:b:B:c:C:d:D:e:Ef:FG:k:i:K:ln:N:p:o:O:rR:qstT:vVx")) != -1) {
switch (opt) {
case 'a':
params.addr = strtoull(optarg, &ptr, 16);
@@ -251,6 +250,9 @@ static void process_args(int argc, char **argv)
case 'N':
params.engine_id = optarg;
break;
+ case 'o':
+ params.algo_name = optarg;
+ break;
case 'O':
params.os = genimg_get_os_id(optarg);
if (params.os < 0) {
@@ -433,11 +435,12 @@ int main(int argc, char **argv)
params.cmdname, params.imagefile);
exit (EXIT_FAILURE);
#endif
- } else if ((unsigned)sbuf.st_size < tparams->header_size) {
+ } else if (sbuf.st_size < (off_t)tparams->header_size) {
fprintf (stderr,
- "%s: Bad size: \"%s\" is not valid image: size %ld < %u\n",
+ "%s: Bad size: \"%s\" is not valid image: size %llu < %u\n",
params.cmdname, params.imagefile,
- sbuf.st_size, tparams->header_size);
+ (unsigned long long) sbuf.st_size,
+ tparams->header_size);
exit (EXIT_FAILURE);
} else {
size = sbuf.st_size;