tools/env: compute size of usable area only once
authorAndreas Fenkart <andreas.fenkart@digitalstrom.com>
Tue, 19 Apr 2016 20:43:42 +0000 (22:43 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 27 May 2016 13:56:19 +0000 (09:56 -0400)
for double buffering to work, redundant buffers must have equal size

Signed-off-by: Andreas Fenkart <andreas.fenkart@digitalstrom.com>
tools/env/fw_env.c

index aa394858a08520d203001404442781d158e277ef..1654ac0e46bc54a31990fcb80d2f380c4fa999b5 100644 (file)
@@ -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;
 }