diff options
author | T Karthik Reddy <t.karthik.reddy@xilinx.com> | 2019-03-16 15:23:01 +0530 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2019-10-24 13:37:02 +0200 |
commit | 10088fb0373a0dc6f907f81279db004f5c35c4ea (patch) | |
tree | 46d5533b2bcebfd90635840bf94577a4ba800ea0 | |
parent | 62e3fb027bcf6c4d574bb28a5e8cf6b0873e6a4a (diff) | |
download | u-boot-10088fb0373a0dc6f907f81279db004f5c35c4ea.tar.gz u-boot-10088fb0373a0dc6f907f81279db004f5c35c4ea.tar.bz2 u-boot-10088fb0373a0dc6f907f81279db004f5c35c4ea.zip |
common: hash: Manually relocate struct hash_algo
This patch adds manual relocation for struct hash_algo if
CONFIG_NEEDS_MANUAL_RELOC is enabled.
Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
Signed-off-by: Siva Durga Prasad Paladugu <siva.durga.paladugu@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
-rw-r--r-- | common/hash.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/common/hash.c b/common/hash.c index d33e329897..d0d825e389 100644 --- a/common/hash.c +++ b/common/hash.c @@ -30,6 +30,12 @@ #include <u-boot/sha256.h> #include <u-boot/md5.h> +#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 +221,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 +262,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) { |