X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=common%2Fhash.c;h=ff4986a6190269ed4659685fd9cb77d8c423fae2;hb=515f613253cf0a892c3a321770ab927fa3d925cf;hp=d33e329897e1ea96c51463270cb1f3a8f25063a1;hpb=5939afc9611e8ba4a86b96e67670b765ee27668e;p=oweals%2Fu-boot.git diff --git a/common/hash.c b/common/hash.c index d33e329897..ff4986a619 100644 --- a/common/hash.c +++ b/common/hash.c @@ -18,6 +18,7 @@ #include #include #include +#include #else #include "mkimage.h" #include @@ -30,6 +31,12 @@ #include #include +#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) +DECLARE_GLOBAL_DATA_PTR; +#endif + +static void reloc_update(void); + #if defined(CONFIG_SHA1) && !defined(CONFIG_SHA_PROG_HW_ACCEL) static int hash_init_sha1(struct hash_algo *algo, void **ctxp) { @@ -215,10 +222,31 @@ static struct hash_algo hash_algo[] = { #define multi_hash() 0 #endif +static void reloc_update(void) +{ +#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) + int i; + static bool done; + + if (!done) { + done = true; + for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { + hash_algo[i].name += gd->reloc_off; + hash_algo[i].hash_func_ws += gd->reloc_off; + hash_algo[i].hash_init += gd->reloc_off; + hash_algo[i].hash_update += gd->reloc_off; + hash_algo[i].hash_finish += gd->reloc_off; + } + } +#endif +} + int hash_lookup_algo(const char *algo_name, struct hash_algo **algop) { int i; + reloc_update(); + for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { if (!strcmp(algo_name, hash_algo[i].name)) { *algop = &hash_algo[i]; @@ -235,6 +263,8 @@ int hash_progressive_lookup_algo(const char *algo_name, { int i; + reloc_update(); + for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { if (!strcmp(algo_name, hash_algo[i].name)) { if (hash_algo[i].hash_init) {