image: Add support for placing crypto_algo in linker lists
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Wed, 14 Jul 2021 22:05:39 +0000 (17:05 -0500)
committerTom Rini <trini@konsulko.com>
Fri, 16 Jul 2021 16:58:56 +0000 (12:58 -0400)
The purpose of this change is to enable crypto algorithms to be placed
in linker lists, rather than be declared as a static array. The goal
is to remove the crypto_algos array in a subsequent patch.

Create a new linker list named "cryptos", and search it when
image_get_crypto_algo() is invoked.

NOTE that adding support for manual relocation of crypto_algos within
linker lists is beyond the scope of this patch.

Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/image-sig.c
include/image.h

index 5e2d171..81a3b73 100644 (file)
@@ -107,6 +107,7 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name)
 
 struct crypto_algo *image_get_crypto_algo(const char *full_name)
 {
+       struct crypto_algo *crypto, *end;
        int i;
        const char *name;
 
@@ -133,6 +134,14 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name)
                        return &crypto_algos[i];
        }
 
+       crypto = ll_entry_start(struct crypto_algo, cryptos);
+       end = ll_entry_end(struct crypto_algo, cryptos);
+       for (; crypto < end; crypto++) {
+               if (!strcmp(crypto->name, name))
+                       return crypto;
+       }
+
+       /* Not found */
        return NULL;
 }
 
index 8b420f2..d4c4534 100644 (file)
@@ -47,6 +47,7 @@ struct fdt_region;
 #include <lmb.h>
 #include <asm/u-boot.h>
 #include <command.h>
+#include <linker_lists.h>
 
 /* Take notice of the 'ignore' property for hashes */
 #define IMAGE_ENABLE_IGNORE    1
@@ -1328,6 +1329,10 @@ struct crypto_algo {
                      uint8_t *sig, uint sig_len);
 };
 
+/* Declare a new U-Boot crypto algorithm handler */
+#define U_BOOT_CRYPTO_ALGO(__name)                                             \
+ll_entry_declare(struct crypto_algo, __name, cryptos)
+
 struct padding_algo {
        const char *name;
        int (*verify)(struct image_sign_info *info,