+ struct flash_partition_entry *firmware_partition = NULL;
+ struct flash_partition_entry *os_image_partition = NULL;
+ struct flash_partition_entry *file_system_partition = NULL;
+ size_t firmware_partition_index = 0;
+
+ for (i = 0; info->partitions[i].name; i++) {
+ if (!strcmp(info->partitions[i].name, "firmware"))
+ {
+ firmware_partition = &info->partitions[i];
+ firmware_partition_index = i;
+ }
+ }
+
+ if (firmware_partition)
+ {
+ os_image_partition = &info->partitions[firmware_partition_index];
+ file_system_partition = &info->partitions[firmware_partition_index + 1];
+
+ struct stat kernel;
+ if (stat(kernel_image, &kernel) < 0)
+ error(1, errno, "unable to stat file `%s'", kernel_image);
+
+ if (kernel.st_size > firmware_partition->size)
+ error(1, 0, "kernel overflowed firmware partition\n");
+
+ for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
+ info->partitions[i+1] = info->partitions[i];
+
+ file_system_partition->name = "file-system";
+ file_system_partition->base = firmware_partition->base + kernel.st_size;
+
+ /* Align partition start to erase blocks for factory images only */
+ if (!sysupgrade)
+ file_system_partition->base = ALIGN(firmware_partition->base + kernel.st_size, 0x10000);
+
+ file_system_partition->size = firmware_partition->size - file_system_partition->base;
+
+ os_image_partition->name = "os-image";
+ os_image_partition->size = kernel.st_size;
+ }
+