summaryrefslogtreecommitdiff
path: root/tools/env/fw_env.c
diff options
context:
space:
mode:
authorAndreas Fenkart <andreas.fenkart@digitalstrom.com>2016-04-19 22:43:42 +0200
committerTom Rini <trini@konsulko.com>2016-05-27 09:56:19 -0400
commitf71cee4bfc9a8f9be40a49ec2da84f4344e398fc (patch)
tree83d8bf2aab09eca02304e5897f0ffb196c2396a2 /tools/env/fw_env.c
parentcedb341e7f44f4686c8c0afb149a9f7940be110a (diff)
downloadu-boot-imx-f71cee4bfc9a8f9be40a49ec2da84f4344e398fc.zip
u-boot-imx-f71cee4bfc9a8f9be40a49ec2da84f4344e398fc.tar.gz
u-boot-imx-f71cee4bfc9a8f9be40a49ec2da84f4344e398fc.tar.bz2
tools/env: compute size of usable area only once
for double buffering to work, redundant buffers must have equal size Signed-off-by: Andreas Fenkart <andreas.fenkart@digitalstrom.com>
Diffstat (limited to 'tools/env/fw_env.c')
-rw-r--r--tools/env/fw_env.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index aa39485..1654ac0 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -75,7 +75,8 @@ static int dev_current;
#define CUR_ENVSIZE ENVSIZE(dev_current)
-#define ENV_SIZE getenvsize()
+static unsigned long usable_envsize;
+#define ENV_SIZE usable_envsize
struct env_image_single {
uint32_t crc; /* CRC32 over data bytes */
@@ -124,18 +125,6 @@ static int parse_config (void);
#if defined(CONFIG_FILE)
static int get_config (char *);
#endif
-static inline ulong getenvsize (void)
-{
- ulong rc = CUR_ENVSIZE - sizeof(uint32_t);
-
- if (HaveRedundEnv)
- rc -= sizeof (char);
-
- if (common_args.aes_flag)
- rc &= ~(AES_KEY_LENGTH - 1);
-
- return rc;
-}
static char *skip_chars(char *s)
{
@@ -953,7 +942,7 @@ static int flash_flag_obsolete (int dev, int fd, off_t offset)
static int env_aes_cbc_crypt(char *payload, const int enc, uint8_t *key)
{
uint8_t *data = (uint8_t *)payload;
- const int len = getenvsize();
+ const int len = usable_envsize;
uint8_t key_exp[AES_EXPAND_KEY_LENGTH];
uint32_t aes_blocks;
@@ -1382,6 +1371,21 @@ static int parse_config ()
DEVNAME (1), strerror (errno));
return -1;
}
+
+ if (HaveRedundEnv && ENVSIZE(0) != ENVSIZE(1)) {
+ ENVSIZE(0) = ENVSIZE(1) = min(ENVSIZE(0), ENVSIZE(1));
+ fprintf(stderr,
+ "Redundant environments have inequal size, set to 0x%08lx\n",
+ ENVSIZE(1));
+ }
+
+ usable_envsize = CUR_ENVSIZE - sizeof(uint32_t);
+ if (HaveRedundEnv)
+ usable_envsize -= sizeof(char);
+
+ if (common_args.aes_flag)
+ usable_envsize &= ~(AES_KEY_LENGTH - 1);
+
return 0;
}