Openwrt/target/linux/brcm63xx/patches-2.6.37/041-bcm963xx_real_rootfs_length.patch
Daniel Dickinson f83c5938d2 bcm63xx: Move the OpenWrt rootfs length field
Dual image capable CFEs store an image sequence at the same place as
currently OpenWrt stores the actual rootfs length, so it will get
overwritten when flashing through such a CFE.

To prevent this from happening, move the rootfs length field to the next
four bytes, thus completely using the reserved1 field.

Since the reserved1 field is now completely in use, it does not make sense
to allow it to be set from the imagetag utility, so remove the option.

Signed-off-by: Jonas Gorski <jonas.gorski+openwrt@gmail.com>

SVN-Revision: 26680
2011-04-15 12:18:25 +00:00

46 lines
1.6 KiB
Diff

--- a/arch/mips/include/asm/mach-bcm63xx/bcm963xx_tag.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm963xx_tag.h
@@ -86,8 +86,10 @@ struct bcm_tag {
char rootfs_crc[CRC_LEN];
/* 224-227: CRC32 of kernel partition */
char kernel_crc[CRC_LEN];
- /* 228-235: Unused at present */
- char reserved1[8];
+ /* 228-231: Image sequence number */
+ char image_sequence[4];
+ /* 222-235: Openwrt: real rootfs length */
+ char real_rootfs_length[4];
/* 236-239: CRC32 of header excluding tagVersion */
char header_crc[CRC_LEN];
/* 240-255: Unused at present */
--- a/drivers/mtd/maps/bcm963xx-flash.c
+++ b/drivers/mtd/maps/bcm963xx-flash.c
@@ -64,7 +64,7 @@ static int parse_cfe_partitions(struct m
int ret;
size_t retlen;
unsigned int rootfsaddr, kerneladdr, spareaddr;
- unsigned int rootfslen, kernellen, sparelen, totallen;
+ unsigned int rootfslen, kernellen, sparelen;
int namelen = 0;
int i;
char *boardid;
@@ -85,7 +85,7 @@ static int parse_cfe_partitions(struct m
sscanf(buf->kernel_address, "%u", &kerneladdr);
sscanf(buf->kernel_length, "%u", &kernellen);
- sscanf(buf->total_length, "%u", &totallen);
+ rootfslen = *(uint32_t *)(&(buf->real_rootfs_length));
tagversion = &(buf->tag_version[0]);
boardid = &(buf->board_id[0]);
@@ -94,7 +94,8 @@ static int parse_cfe_partitions(struct m
kerneladdr = kerneladdr - BCM63XX_EXTENDED_SIZE;
rootfsaddr = kerneladdr + kernellen;
- spareaddr = roundup(totallen, master->erasesize) + master->erasesize;
+ rootfslen = roundup(rootfslen, master->erasesize);
+ spareaddr = rootfsaddr + rootfslen;
sparelen = master->size - spareaddr - master->erasesize;
rootfslen = spareaddr - rootfsaddr;