image: Add support for relocating crypto_algos in linker lists
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Wed, 14 Jul 2021 22:05:46 +0000 (17:05 -0500)
committerTom Rini <trini@konsulko.com>
Fri, 16 Jul 2021 19:39:29 +0000 (15:39 -0400)
Function pointers from crypto_algos array are relocated, when
NEEDS_MANUAL_RELOC is set. This relocation doesn't happen if the algo
is placed in a linker list. Implement this relocation.

Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Acked-by: Michal Simek <michal.simek@xilinx.com>
common/image-sig.c

index d680bf7..fb00355 100644 (file)
@@ -97,6 +97,19 @@ struct crypto_algo *image_get_crypto_algo(const char *full_name)
        struct crypto_algo *crypto, *end;
        const char *name;
 
+#if defined(CONFIG_NEEDS_MANUAL_RELOC)
+       static bool done;
+
+       if (!done) {
+               crypto = ll_entry_start(struct crypto_algo, cryptos);
+               end = ll_entry_end(struct crypto_algo, cryptos);
+               for (; crypto < end; crypto++) {
+                       crypto->name += gd->reloc_off;
+                       crypto->verify += gd->reloc_off;
+               }
+       }
+#endif
+
        /* Move name to after the comma */
        name = strchr(full_name, ',');
        if (!name)