mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-24 03:58:35 +02:00
mtd - remove partition table assumption when writing fis table
When mtd alters the fis partition table it assumes that the first partition table entry also is the first logical parition table entry. For instance our table could look like this (irrelevant partitions put aside): * vmlinux.bin.l7 0xA8710000 * rootfs 0xA8030000 Here mtd would assume vmlinux.bin.l7 being the first partition and use its address to calculate the size and offset which ultimately leads to a broken partition table. This patch alters the behavior by checking what partition has the smaller address to do the calculations based on that address. Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@32601 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
6a288531d7
commit
dd97bbee8a
@ -143,6 +143,8 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
|
|||||||
struct fis_image_desc *redboot = NULL;
|
struct fis_image_desc *redboot = NULL;
|
||||||
struct fis_image_desc *first = NULL;
|
struct fis_image_desc *first = NULL;
|
||||||
struct fis_image_desc *last = NULL;
|
struct fis_image_desc *last = NULL;
|
||||||
|
struct fis_image_desc *first_fb = NULL;
|
||||||
|
struct fis_image_desc *last_fb = NULL;
|
||||||
struct fis_image_desc *desc;
|
struct fis_image_desc *desc;
|
||||||
struct fis_part *part;
|
struct fis_part *part;
|
||||||
uint32_t offset = 0, size = 0;
|
uint32_t offset = 0, size = 0;
|
||||||
@ -184,13 +186,21 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
|
|||||||
}
|
}
|
||||||
desc--;
|
desc--;
|
||||||
|
|
||||||
|
first_fb = first;
|
||||||
|
last_fb = last;
|
||||||
|
|
||||||
|
if (first_fb->hdr.flash_base > last_fb->hdr.flash_base) {
|
||||||
|
first_fb = last;
|
||||||
|
last_fb = first;
|
||||||
|
}
|
||||||
|
|
||||||
/* determine size of available space */
|
/* determine size of available space */
|
||||||
desc = (struct fis_image_desc *) start;
|
desc = (struct fis_image_desc *) start;
|
||||||
while ((char *) desc < end) {
|
while ((char *) desc < end) {
|
||||||
if (!desc->hdr.name[0] || (desc->hdr.name[0] == 0xff))
|
if (!desc->hdr.name[0] || (desc->hdr.name[0] == 0xff))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (desc->hdr.flash_base > last->hdr.flash_base &&
|
if (desc->hdr.flash_base > last_fb->hdr.flash_base &&
|
||||||
desc->hdr.flash_base < offset)
|
desc->hdr.flash_base < offset)
|
||||||
offset = desc->hdr.flash_base;
|
offset = desc->hdr.flash_base;
|
||||||
|
|
||||||
@ -198,7 +208,7 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
|
|||||||
}
|
}
|
||||||
desc--;
|
desc--;
|
||||||
|
|
||||||
size = offset - first->hdr.flash_base;
|
size = offset - first_fb->hdr.flash_base;
|
||||||
|
|
||||||
#ifdef notyet
|
#ifdef notyet
|
||||||
desc = first - 1;
|
desc = first - 1;
|
||||||
@ -214,7 +224,7 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
|
|||||||
|
|
||||||
last++;
|
last++;
|
||||||
desc = first + n_new;
|
desc = first + n_new;
|
||||||
offset = first->hdr.flash_base;
|
offset = first_fb->hdr.flash_base;
|
||||||
|
|
||||||
if (desc != last) {
|
if (desc != last) {
|
||||||
if (desc > last)
|
if (desc > last)
|
||||||
|
Loading…
Reference in New Issue
Block a user