]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
image: Avoid #ifdefs for manual relocation
authorSimon Glass <sjg@chromium.org>
Sat, 25 Sep 2021 13:03:19 +0000 (07:03 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 8 Oct 2021 19:53:26 +0000 (15:53 -0400)
Add a macro to handle manually relocating a pointer. Update the iamge code
to use this to avoid needing #ifdefs.

This also fixes a bug where the 'done' flag was not set.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/image-sig.c
include/relocate.h

index fa9407bb300d2262e71ad91a911188a9ea2458c7..1aa0b586450a50d5bbaf87bbdcef826db6c9e04c 100644 (file)
@@ -9,6 +9,7 @@
 #include <asm/global_data.h>
 DECLARE_GLOBAL_DATA_PTR;
 #include <image.h>
+#include <relocate.h>
 #include <u-boot/ecdsa.h>
 #include <u-boot/rsa.h>
 #include <u-boot/hash-checksum.h>
@@ -56,17 +57,19 @@ struct checksum_algo *image_get_checksum_algo(const char *full_name)
        int i;
        const char *name;
 
-#if defined(CONFIG_NEEDS_MANUAL_RELOC)
-       static bool done;
+       if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) {
+               static bool done;
 
-       if (!done) {
-               done = true;
-               for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
-                       checksum_algos[i].name += gd->reloc_off;
-                       checksum_algos[i].calculate += gd->reloc_off;
+               if (!done) {
+                       done = true;
+                       for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
+                               struct checksum_algo *algo = &checksum_algos[i];
+
+                               MANUAL_RELOC(algo->name);
+                               MANUAL_RELOC(algo->calculate);
+                       }
                }
        }
-#endif
 
        for (i = 0; i < ARRAY_SIZE(checksum_algos); i++) {
                name = checksum_algos[i].name;
@@ -84,18 +87,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;
+       if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) {
+               static bool done;
+
+               if (!done) {
+                       done = true;
+                       crypto = ll_entry_start(struct crypto_algo, cryptos);
+                       end = ll_entry_end(struct crypto_algo, cryptos);
+                       for (; crypto < end; crypto++) {
+                               MANUAL_RELOC(crypto->name);
+                               MANUAL_RELOC(crypto->verify);
+                       }
                }
        }
-#endif
 
        /* Move name to after the comma */
        name = strchr(full_name, ',');
index c4fad3361285141f9893cf2261bc5b67c0b160ac..26682da955fd41e646c9cc9ea0ca5394b9aab1e7 100644 (file)
@@ -57,4 +57,10 @@ static inline void *manual_reloc(void *ptr)
                return ptr;
 }
 
+#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC)
+#define MANUAL_RELOC(ptr)      (ptr) = manual_reloc(ptr)
+#else
+#define MANUAL_RELOC(ptr)      (void)(ptr)
+#endif
+
 #endif /* _RELOCATE_H_ */