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.
This commit is contained in:
Tom Rini 2022-01-24 10:39:28 -05:00
commit 21a1439d98
16 changed files with 80 additions and 50 deletions

View file

@ -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

View file

@ -1307,7 +1307,7 @@ F: arch/x86/
F: cmd/x86/
XEN
M: Anastasiia Lukianenko <anastasiia_lukianenko@epam.com>
M: Anastasiia Lukianenko <vicooodin@gmail.com>
M: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
S: Maintained
F: arch/arm/cpu/armv8/xen/

View file

@ -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)) {

View file

@ -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;

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -155,6 +155,11 @@ the corresponding public key is written into this file for for run-time
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

View file

@ -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);

View file

@ -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);

View file

@ -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.

View file

@ -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;
}

View file

@ -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) {

View file

@ -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;
}

View file

@ -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 */

View file

@ -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;