Changeset 24837


Ignore:
Timestamp:
2010-12-26T05:18:08+01:00 (7 years ago)
Author:
cshore
Message:

mtd: Added trx_fixup for brcm63xx imagetag, and made references to fix_trx use the weak reference rather than the brcm47xx ifdef. This fixes a bug in which sysupgrade failed due to changing bad CRC on reboot.

Signed-off-by: Daniel Dickinson <daniel@…>

Location:
trunk/package/mtd/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mtd/src/imagetag.c

    r24835 r24837  
    7979 
    8080int 
     81trx_fixup(int fd, const char *name) 
     82{ 
     83        struct mtd_info_user mtdInfo; 
     84        unsigned long len; 
     85        void *ptr, *scan; 
     86        int bfd; 
     87        struct bcm_tag *tag; 
     88        ssize_t res; 
     89        uint32_t cfelen, imagelen, imagestart, rootfslen; 
     90        uint32_t imagecrc, rootfscrc, headercrc; 
     91        uint32_t offset = 0; 
     92        cfelen = imagelen = imagestart = imagecrc = rootfscrc = headercrc = rootfslen = 0; 
     93 
     94 
     95        if (ioctl(fd, MEMGETINFO, &mtdInfo) < 0) { 
     96                fprintf(stderr, "Failed to get mtd info\n"); 
     97                goto err; 
     98        } 
     99 
     100        len = mtdInfo.size; 
     101        if (mtdInfo.size <= 0) { 
     102                fprintf(stderr, "Invalid MTD device size\n"); 
     103                goto err; 
     104        } 
     105 
     106        bfd = mtd_open(name, true); 
     107        ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, bfd, 0); 
     108        if (!ptr || (ptr == (void *) -1)) { 
     109                perror("mmap"); 
     110                goto err1; 
     111        } 
     112 
     113        tag = (struct bcm_tag *) (ptr); 
     114 
     115        cfelen = strntoul(&tag->cfeLength[0], NULL, 10, IMAGE_LEN); 
     116        if (cfelen) { 
     117          fprintf(stderr, "Non-zero CFE length.  This is currently unsupported.\n"); 
     118          exit(1); 
     119        } 
     120 
     121        headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, headerCRC), fd); 
     122        if (headercrc != *(uint32_t *)(&tag->headerCRC[0])) { 
     123                fprintf(stderr, "Tag verify failed.  This may not be a valid image.\n"); 
     124                exit(1); 
     125        } 
     126 
     127        sprintf(&tag->rootLength[0], "%lu", 0); 
     128        strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN); 
     129 
     130        imagestart = sizeof(tag); 
     131        memcpy(&tag->imageCRC[0], &tag->kernelCRC[0], CRC_LEN); 
     132        memcpy(&tag->fskernelCRC[0], &tag->kernelCRC[0], CRC_LEN); 
     133        rootfscrc = CRC_START; 
     134        memcpy(&tag->rootfsCRC[0], &rootfscrc, sizeof(uint32_t)); 
     135        headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, headerCRC)); 
     136        memcpy(&tag->headerCRC[0], &headercrc, sizeof(uint32_t)); 
     137 
     138        msync(ptr, sizeof(struct bcm_tag), MS_SYNC|MS_INVALIDATE); 
     139        munmap(ptr, len); 
     140        close(bfd); 
     141        return 0; 
     142 
     143err1: 
     144        close(bfd); 
     145err: 
     146        fprintf(stderr, "Error fixing up imagetag header\n"); 
     147        return -1; 
     148} 
     149 
     150 
     151int 
    81152trx_check(int imagefd, const char *mtd, char *buf, int *len) 
    82153{ 
  • trunk/package/mtd/src/jffs2.c

    r22881 r24837  
    245245        free(buf); 
    246246 
    247 #ifdef target_brcm 
    248         trx_fixup(outfd, mtd); 
    249 #endif 
     247        if (trx_fixup) { 
     248          trx_fixup(outfd, mtd); 
     249        } 
    250250        return (mtdofs - ofs); 
    251251} 
     
    348348        err = 0; 
    349349 
    350 #ifdef target_brcm 
    351         trx_fixup(outfd, mtd); 
    352 #endif 
     350        if (trx_fixup) { 
     351          trx_fixup(outfd, mtd); 
     352        } 
    353353 
    354354done: 
Note: See TracChangeset for help on using the changeset viewer.