diff options
-rw-r--r-- | src/local.c | 100 |
1 files changed, 64 insertions, 36 deletions
diff --git a/src/local.c b/src/local.c index f9da146..b272aa0 100644 --- a/src/local.c +++ b/src/local.c @@ -244,36 +244,36 @@ static int local_nanddump(const char * file, int mtd, int offset, int length) { } struct nanddump_args { - int valid; int mtd; int offset; int length; + int header; }; static struct nanddump_args nanddump_rx51[] = { - [IMAGE_XLOADER] = { 1, 0, 0x00000000, 0x00004000 }, - [IMAGE_SECONDARY] = { 1, 0, 0x00004000, 0x0001C000 }, - [IMAGE_KERNEL] = { 1, 3, 0x00000800, 0x001FF800 }, - [IMAGE_INITFS] = { 1, 4, 0x00000000, 0x00200000 }, - [IMAGE_ROOTFS] = { 1, 5, 0x00000000, 0x0fb40000 }, + [IMAGE_XLOADER] = { 0, 0x00000000, 0x00004000, 0x00000000 }, + [IMAGE_SECONDARY] = { 0, 0x00004000, 0x0001C000, 0x00000000 }, + [IMAGE_KERNEL] = { 3, 0x00000000, 0x00200000, 0x00000800 }, + [IMAGE_INITFS] = { 4, 0x00000000, 0x00200000, 0x00000000 }, + [IMAGE_ROOTFS] = { 5, 0x00000000, 0x0fb40000, 0x00000000 }, }; /* FIXME: Is this table correct? */ static struct nanddump_args nanddump_rx4x[] = { - [IMAGE_XLOADER] = { 1, 0, 0x00000200, 0x00003E00 }, - [IMAGE_SECONDARY] = { 1, 0, 0x00004000, 0x0001C000 }, - [IMAGE_KERNEL] = { 1, 2, 0x00000800, 0x0021F800 }, - [IMAGE_INITFS] = { 1, 3, 0x00000000, 0x00400000 }, - [IMAGE_ROOTFS] = { 1, 4, 0x00000000, 0x0f960000 }, + [IMAGE_XLOADER] = { 0, 0x00000200, 0x00003E00, 0x00000000 }, + [IMAGE_SECONDARY] = { 0, 0x00004000, 0x0001C000, 0x00000000 }, + [IMAGE_KERNEL] = { 2, 0x00000000, 0x00220000, 0x00000800 }, + [IMAGE_INITFS] = { 3, 0x00000000, 0x00400000, 0x00000000 }, + [IMAGE_ROOTFS] = { 4, 0x00000000, 0x0f960000, 0x00000000 }, }; /* FIXME: Is this table correct? */ static struct nanddump_args nanddump_old[] = { - [IMAGE_XLOADER] = { 1, 0, 0x00000200, 0x00003E00 }, - [IMAGE_SECONDARY] = { 1, 0, 0x00004000, 0x0001C000 }, - [IMAGE_KERNEL] = { 1, 2, 0x00000800, 0x001FF800 }, - [IMAGE_INITFS] = { 1, 3, 0x00000000, 0x00200000 }, - [IMAGE_ROOTFS] = { 1, 4, 0x00000000, 0x0fb80000 }, + [IMAGE_XLOADER] = { 0, 0x00000200, 0x00003E00, 0x00000000 }, + [IMAGE_SECONDARY] = { 0, 0x00004000, 0x0001C000, 0x00000000 }, + [IMAGE_KERNEL] = { 2, 0x00000000, 0x00200000, 0x00000800 }, + [IMAGE_INITFS] = { 3, 0x00000000, 0x00200000, 0x00000000 }, + [IMAGE_ROOTFS] = { 4, 0x00000000, 0x0fb80000, 0x00000000 }, }; struct nanddump_device { @@ -380,10 +380,13 @@ static void local_find_internal_mydocs(int * maj, int * min) { int local_dump_image(enum image_type image, const char * file) { + unsigned char buf[20]; int ret = -1; int fd = -1; + int header = 0; unsigned char * addr = NULL; - off_t nlen, len; + off_t nlen = (off_t)-1; + off_t len; int align; int maj, min; @@ -425,7 +428,28 @@ int local_dump_image(enum image_type image, const char * file) { goto clean; } - ret = local_nanddump(file, nanddump[device].args[image].mtd, nanddump[device].args[image].offset, nanddump[device].args[image].length); + header = nanddump[device].args[image].header; + + if ( header > 0 ) { + + ret = local_nanddump(file, nanddump[device].args[image].mtd, nanddump[device].args[image].offset, header); + if ( ret != 0 ) { + unlink(file); + ret = -1; + goto clean; + } + + fd = open(file, O_RDONLY); + if ( fd >= 0 ) { + if ( read(fd, buf, 20) == 20 && memcmp(buf, "NOLO!img\x02\x00\x00\x00\x00\x00\x00\x00", 16) == 0 ) + nlen = (buf[16] << 0) | (buf[17] << 8) | (buf[18] << 16) | (buf[19] << 24); + close(fd); + } + + unlink(file); + } + + ret = local_nanddump(file, nanddump[device].args[image].mtd, nanddump[device].args[image].offset + header, nanddump[device].args[image].length - header); } @@ -442,31 +466,35 @@ int local_dump_image(enum image_type image, const char * file) { if ( len == (off_t)-1 || len == 0 ) goto clean; - addr = (unsigned char *)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); + if ( header <= 0 || nlen == (off_t)-1 ) { - if ( addr == MAP_FAILED ) - addr = NULL; + addr = (unsigned char *)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); - if ( ! addr ) - goto clean; + if ( addr == MAP_FAILED ) + addr = NULL; - for ( nlen = len; nlen > 0; --nlen ) - if ( addr[nlen-1] != 0xFF ) - break; + if ( ! addr ) + goto clean; - for ( ; nlen > 0; --nlen ) - if ( addr[nlen-1] != 0x00 ) - break; + for ( nlen = len; nlen > 0; --nlen ) + if ( addr[nlen-1] != 0xFF ) + break; - if ( image == IMAGE_MMC ) - align = 8; - else - align = 7; + for ( ; nlen > 0; --nlen ) + if ( addr[nlen-1] != 0x00 ) + break; + + if ( image == IMAGE_MMC ) + align = 8; + else + align = 7; - if ( ( nlen & ( ( 1ULL << align ) - 1 ) ) != 0 ) - nlen = ((nlen >> align) + 1) << align; + if ( ( nlen & ( ( 1ULL << align ) - 1 ) ) != 0 ) + nlen = ((nlen >> align) + 1) << align; + + } - if ( nlen == 0 ) { + if ( header <= 0 && nlen == 0 ) { printf("File %s is empty, removing it...\n", file); unlink(file); } else if ( nlen != len ) { |