- int len, rc;
- ulong end_addr;
- ulong flash_sect_addr;
-#if defined(CFG_ENV_SECT_SIZE) && (CFG_ENV_SECT_SIZE > CFG_ENV_SIZE)
- ulong flash_offset;
- uchar env_buffer[CFG_ENV_SECT_SIZE];
-#else
- uchar *env_buffer = (uchar *)env_ptr;
-#endif /* CFG_ENV_SECT_SIZE */
- int rcode = 0;
-
-#if defined(CFG_ENV_SECT_SIZE) && (CFG_ENV_SECT_SIZE > CFG_ENV_SIZE)
-
- flash_offset = ((ulong)flash_addr) & (CFG_ENV_SECT_SIZE-1);
- flash_sect_addr = ((ulong)flash_addr) & ~(CFG_ENV_SECT_SIZE-1);
-
- debug ( "copy old content: "
- "sect_addr: %08lX env_addr: %08lX offset: %08lX\n",
- flash_sect_addr, (ulong)flash_addr, flash_offset);
-
- /* copy old contents to temporary buffer */
- memcpy (env_buffer, (void *)flash_sect_addr, CFG_ENV_SECT_SIZE);
-
- /* copy current environment to temporary buffer */
- memcpy ((uchar *)((unsigned long)env_buffer + flash_offset),
- env_ptr,
- CFG_ENV_SIZE);
-
- len = CFG_ENV_SECT_SIZE;
-#else
- flash_sect_addr = (ulong)flash_addr;
- len = CFG_ENV_SIZE;
-#endif /* CFG_ENV_SECT_SIZE */
-
-#ifndef CONFIG_INFERNO
- end_addr = flash_sect_addr + len - 1;
-#else
- /* this is the last sector, and the size is hardcoded here */
- /* otherwise we will get stack problems on loading 128 KB environment */
- end_addr = flash_sect_addr + 0x20000 - 1;
-#endif
+ env_t env_new;
+ int rc = 1;
+ char *saved_data = NULL;
+#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE
+ ulong up_data = 0;
+
+ up_data = end_addr + 1 - ((long)flash_addr + CONFIG_ENV_SIZE);
+ debug("Data to save 0x%lx\n", up_data);
+ if (up_data) {
+ saved_data = malloc(up_data);
+ if (saved_data == NULL) {
+ printf("Unable to save the rest of sector (%ld)\n",
+ up_data);
+ goto done;
+ }
+ memcpy(saved_data,
+ (void *)((long)flash_addr + CONFIG_ENV_SIZE), up_data);
+ debug("Data (start 0x%lx, len 0x%lx) saved at 0x%lx\n",
+ (ulong)flash_addr + CONFIG_ENV_SIZE,
+ up_data,
+ (ulong)saved_data);
+ }
+#endif /* CONFIG_ENV_SECT_SIZE */