Ticket #4909: 4909+4943+imagetag_improvement+deadcode_fix.diff

File 4909+4943+imagetag_improvement+deadcode_fix.diff, 14.0 KB (added by cshore@…, 9 years ago)

fix so that deadcode is fully used, not just one or two bytes of it

  • target/linux/brcm63xx/files/include/asm-mips/mach-bcm63xx/bcm_tag.h

    diff --git a/target/linux/brcm63xx/files/include/asm-mips/mach-bcm63xx/bcm_tag.h b/target/linux/brcm63xx/files/include/asm-mips/mach-bcm63xx/bcm_tag.h
    index efc4f02..7c170c0 100644
    a b struct bcm_tag { 
    1414        unsigned char totalLength[IMAGE_LEN];           //Total length of image 
    1515        unsigned char cfeAddress[ADDRESS_LEN];  // Address in memory of CFE 
    1616        unsigned char cfeLength[IMAGE_LEN];             // Size of CFE 
    17         unsigned char rootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
    18         unsigned char rootLength[IMAGE_LEN];            // Size of rootfs 
     17        unsigned char cfeRootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
     18        unsigned char cfeRootLength[IMAGE_LEN];            // Size of rootfs 
    1919        unsigned char kernelAddress[ADDRESS_LEN];       // Address in memory of kernel 
    2020        unsigned char kernelLength[IMAGE_LEN];  // Size of kernel 
    2121        unsigned char dualImage[2];                             // Unused at present 
    2222        unsigned char inactiveFlag[2];                  // Unused at present 
    2323        unsigned char reserved1[74];                            // Reserved area not in use 
    2424        unsigned char imageCRC[4];                              // CRC32 of images 
    25         unsigned char reserved2[16];                            // Unused at present 
    26         unsigned char headerCRC[4];                             // CRC32 of header excluding tagVersion 
    27         unsigned char reserved3[16];                            // Unused at present 
     25//      unsigned char reserved2[16];                    // Unused at present 
     26        unsigned char reserved2[4];                     //Unused 
     27        unsigned char rootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
     28        unsigned char headerCRC[4];                     // CRC32 of header excluding tagVersion 
     29//      unsigned char reserved3[16];                    // Unused at present 
     30        unsigned char reserved3[6];                     // Unused at present 
     31        unsigned char rootLength[IMAGE_LEN];            // Size of rootfs 
    2832}; 
    2933 
    3034#endif /* __BCM63XX_TAG_H */ 
  • target/linux/brcm63xx/image/Makefile

    diff --git a/target/linux/brcm63xx/image/Makefile b/target/linux/brcm63xx/image/Makefile
    index 8714096..7c4ed46 100644
    a b define Image/Build/CFE 
    3434                -b $(2) -c $(3) -e $(LOADADDR) -l $(LOADADDR) 
    3535#               -b $(2) -c $(3) -e $(KERNEL_ENTRY) -l $(LOADADDR) 
    3636 
    37         $(call prepare_generic_squashfs,$(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin) 
    3837endef 
    3938 
    4039define Image/Build/CFEAGPF 
    define Image/Build/CFEAGPF 
    4241        $(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \ 
    4342                -o $(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin \ 
    4443                -b $(2) -c $(3) -e $(LOADADDR) -l $(LOADADDR) \ 
    45                 -v 8 -m IMAGE -k 0x20000 -n $(4) 
    46         $(call prepare_generic_squashfs,$(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin) 
     44                -v 8 -m IMAGE -k 0x20000 -n $(4) -p alice 
    4745endef 
    4846 
    4947define Image/Build/RedBoot 
  • tools/firmware-utils/src/imagetag.c

    diff --git a/tools/firmware-utils/src/imagetag.c b/tools/firmware-utils/src/imagetag.c
    index 00dad29..bae47fa 100644
    a b  
    44 * for more details. 
    55 * 
    66 * Copyright (C) 2008 Axel Gembe <ago@bastart.eu.org> 
     7 * Copyright (C) 2009 Anselmo LuginbÃŒhl <anselmo@darviniano.eu> 
    78 */ 
    89 
    910#include <stdio.h> 
     
    2324#define DEFAULT_FW_OFFSET               0x10000 
    2425#define DEFAULT_FLASH_START             0xBFC00000 
    2526#define DEFAULT_FLASH_BS                (64 * 1024) 
     27#define DEADCODE                        0xDEADC0DE 
    2628 
    2729/* Kernel header */ 
    2830struct kernelhdr { 
    struct imagetag { 
    4749        uint8_t                 bigendian[2];   /*  60 -  61: "1" for big endian, "0" for little endian */ 
    4850        uint8_t                 imagelen[10];   /*  62 -  71: The length of all data that follows */ 
    4951        struct imagecomp        cfe;            /*  72 -  93: The offset and length of CFE */ 
    50         struct imagecomp        rootfs;         /*  94 - 115: The offset and length of the root file system */ 
     52        struct imagecomp        rootfs; /*  94 - 115: The offset and length of the root file system */ 
    5153        struct imagecomp        kernel;         /* 116 - 137: The offset and length of the kernel */ 
    5254        uint8_t                 dualimage[2];   /* 138 - 139: use "0" here */ 
    5355        uint8_t                 inactive[2];    /* 140 - 141: use "0" here */ 
    5456        uint8_t                 reserved1[74];  /* 142 - 215: reserved */ 
    5557        uint32_t                imagecrc;       /* 216 - 219: crc of the images (net byte order) */ 
    56         uint8_t                 reserved2[16];  /* 220 - 235: reserved */ 
     58//      uint8_t                 reserved2[16];  /* 220 - 235: reserved */ 
     59        uint8_t                 reserved2[4];   /* 220 - 223: reserved */ 
     60        uint8_t                 wrtrootfsaddr[12];      /* 224 - 235: wrt rootfs address */ 
    5761        uint32_t                headercrc;      /* 236 - 239: crc starting from sig1 until headercrc (net byte order) */ 
    58         uint8_t                 reserved3[16];  /* 240 - 255: reserved */ 
     62//      uint8_t                 reserved3[16];  /* 240 - 255: reserved */ 
     63        uint8_t                 reserved3[6];   /* 240 - 245: reserved */ 
     64        uint8_t                 wrtrootfslen[10];       /* 246 - 255: wrt rootfs lenght */ 
    5965}; 
    6066 
    6167static uint32_t crc32tab[256] = { 
    uint32_t crc32(uint32_t crc, uint8_t *data, size_t len) 
    101107        return crc; 
    102108} 
    103109 
     110uint32_t compute_crc32(uint32_t crc, FILE *binfile, size_t compute_start, size_t compute_len) 
     111{ 
     112        uint8_t readbuf[1024]; 
     113        size_t read; 
     114 
     115        fseek(binfile, compute_start, SEEK_SET); 
     116         
     117        /* read block of 1024 bytes */ 
     118        while (binfile && !feof(binfile) && !ferror(binfile) && (compute_len >= sizeof(readbuf))) { 
     119                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), binfile); 
     120                crc = crc32(crc, readbuf, read); 
     121                compute_len = compute_len - read; 
     122        } 
     123 
     124        /* Less than 1024 bytes remains, read compute_len bytes */ 
     125        if (binfile && !feof(binfile) && !ferror(binfile) && (compute_len > 0)) { 
     126                read = fread(readbuf, sizeof(uint8_t), compute_len, binfile); 
     127                crc = crc32(crc, readbuf, read); 
     128        } 
     129 
     130        return crc; 
     131} 
     132 
    104133size_t getlen(FILE *fp) 
    105134{ 
    106135        size_t retval, curpos; 
    size_t getlen(FILE *fp) 
    119148int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    120149            const char *boardid, const char *chipid, const uint32_t fwaddr, 
    121150            const uint32_t loadaddr, const uint32_t entry, 
    122             const char *ver, const char *magic2, const uint32_t flash_bs) 
     151            const char *ver, const char *magic2, const uint32_t flash_bs, 
     152            const char *profile) 
    123153{ 
    124154        struct imagetag tag; 
    125155        struct kernelhdr khdr; 
    126156        FILE *kernelfile = NULL, *rootfsfile = NULL, *binfile; 
    127         size_t kerneloff, kernellen, rootfsoff, rootfslen, read; 
     157        size_t kerneloff, kernellen, rootfsoff, rootfslen, read, imagelen; 
    128158        uint8_t readbuf[1024]; 
    129         uint32_t crc; 
     159        uint32_t crc = IMAGETAG_CRC_START; 
     160        const uint32_t deadcode = htonl(DEADCODE); 
    130161 
    131162        memset(&tag, 0, sizeof(struct imagetag)); 
    132163 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    150181                return 1; 
    151182        } 
    152183 
    153         if (!bin || !(binfile = fopen(bin, "wb"))) { 
     184        if (!bin || !(binfile = fopen(bin, "wb+"))) { 
    154185                fprintf(stderr, "Unable to open output file \"%s\"\n", bin); 
    155186                return 1; 
    156187        } 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    172203        rootfsoff = (rootfsoff % flash_bs) > 0 ? (((rootfsoff / flash_bs) + 1) * flash_bs) : rootfsoff; 
    173204        rootfslen = getlen(rootfsfile); 
    174205        rootfslen = (rootfslen % flash_bs) > 0 ? (((rootfslen / flash_bs) + 1) * flash_bs) : rootfslen; 
     206        imagelen = rootfsoff + rootfslen - kerneloff + sizeof(deadcode); 
    175207 
    176208        /* Seek to the start of the kernel */ 
    177209        fseek(binfile, kerneloff - fwaddr, SEEK_SET); 
    178210 
    179211        /* Write the kernel header */ 
    180         crc = crc32(IMAGETAG_CRC_START, (uint8_t*)&khdr, sizeof(khdr)); 
    181212        fwrite(&khdr, sizeof(khdr), 1, binfile); 
    182213 
    183214        /* Write the kernel */ 
    184215        while (kernelfile && !feof(kernelfile) && !ferror(kernelfile)) { 
    185216                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), kernelfile); 
    186                 crc = crc32(crc, readbuf, read); 
    187217                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    188218        } 
    189219 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    191221        fseek(binfile, rootfsoff - fwaddr, SEEK_SET); 
    192222        while (rootfsfile && !feof(rootfsfile) && !ferror(rootfsfile)) { 
    193223                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), rootfsfile); 
    194                 //crc = crc32(crc, readbuf, read); 
    195224                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    196225        } 
    197226 
     227        /* Align image to specified erase block size and append deadc0de */ 
     228        printf("Data alignment to %dk with 'deadc0de' appended\n", flash_bs/1024); 
     229        fseek(binfile, rootfsoff + rootfslen - fwaddr, SEEK_SET); 
     230        fwrite(&deadcode, sizeof(uint32_t), 1, binfile); 
     231         
     232 
     233        /* Choose and compute the CRC32 that should be inserted in the tag */ 
     234        /* and fill reserved tag following profile specification           */ 
     235        if ( profile && (strcmp(profile, "alice") == 0)) { 
     236                crc = compute_crc32(crc, binfile, kerneloff - fwaddr, kernellen); 
     237                /* Should fill alice_data and put them on reserved1 */ 
     238        } 
     239        else { 
     240                /* Compute the crc32 of the entire image (deadC0de included) */ 
     241                crc = compute_crc32(crc, binfile, kerneloff - fwaddr, imagelen); 
     242        } 
     243 
     244         
    198245        /* Close the files */ 
    199246        fclose(kernelfile); 
    200247        fclose(rootfsfile); 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    206253        strcpy(tag.chipid, chipid); 
    207254        strcpy(tag.boardid, boardid); 
    208255        strcpy(tag.bigendian, "1"); 
    209         sprintf(tag.imagelen, "%lu", kernellen + rootfslen); 
     256        sprintf(tag.imagelen, "%lu", imagelen); 
    210257 
    211258        /* We don't include CFE */ 
    212259        strcpy(tag.cfe.address, "0"); 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    218265        } 
    219266 
    220267        if (rootfsfile) { 
    221                 sprintf(tag.rootfs.address, "%lu", rootfsoff); 
    222                 sprintf(tag.rootfs.len, "%lu", rootfslen); 
     268                sprintf(tag.rootfs.address, "%lu", kerneloff); 
     269                sprintf(tag.rootfs.len, "%lu", rootfslen + sizeof(deadcode)); 
     270                sprintf(tag.wrtrootfsaddr, "%lu", rootfsoff); 
     271                sprintf(tag.wrtrootfslen, "%lu", rootfslen); 
    223272        } 
    224273 
    225274        tag.imagecrc = htonl(crc); 
    int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    236285int main(int argc, char **argv) 
    237286{ 
    238287        int c; 
    239         char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver; 
     288        char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver, *profile; 
    240289        uint32_t flashstart, fwoffset, loadaddr, entry; 
    241290        uint32_t fwaddr, flash_bs; 
    242291         
    243         kernel = rootfs = bin = boardid = chipid = magic2 = ver = NULL; 
     292        kernel = rootfs = bin = boardid = chipid = magic2 = ver = profile = NULL; 
    244293        entry = 0; 
    245294 
    246295        flashstart = DEFAULT_FLASH_START; 
    int main(int argc, char **argv) 
    248297        loadaddr = IMAGETAG_DEFAULT_LOADADDR; 
    249298        flash_bs = DEFAULT_FLASH_BS; 
    250299 
    251         printf("Broadcom image tagger - v0.1.1\n"); 
     300        printf("Broadcom image tagger - v0.1.2\n"); 
    252301        printf("Copyright (C) 2008 Axel Gembe\n"); 
    253302 
    254         while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h")) != -1) { 
     303        while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h:p:")) != -1) { 
    255304                switch (c) { 
    256305                        case 'i': 
    257306                                kernel = optarg; 
    int main(int argc, char **argv) 
    289338                        case 'e': 
    290339                                entry = strtoul(optarg, NULL, 16); 
    291340                                break; 
     341                        case 'p': 
     342                                profile = optarg; 
     343                                break; 
    292344                        case 'h': 
    293345                        default: 
    294                                 fprintf(stderr, "Usage: imagetag <parameters>\n"); 
    295                                 fprintf(stderr, "-i <kernel>   - The LZMA compressed kernel file to include in the image\n"); 
    296                                 fprintf(stderr, "-f <rootfs>   - The RootFS file to include in the image\n"); 
    297                                 fprintf(stderr, "-o <bin>      - The output file\n"); 
    298                                 fprintf(stderr, "-b <boardid>  - The board id to set in the image (i.e. \"96345GW2\")\n"); 
    299                                 fprintf(stderr, "-c <chipid>   - The chip id to set in the image (i.e. \"6345\")\n"); 
    300                                 fprintf(stderr, "-s <flashstart>   - Flash start address (i.e. \"0xBFC00000\"\n"); 
    301                                 fprintf(stderr, "-n <fwoffset>   - \n"); 
    302                                 fprintf(stderr, "-v <version>   - \n"); 
    303                                 fprintf(stderr, "-m <magic2>    - \n"); 
    304                                 fprintf(stderr, "-k <flash_bs>  - \n"); 
    305                                 fprintf(stderr, "-l <loadaddr> - Address where the kernel expects to be loaded (defaults to 0x80010000)\n"); 
    306                                 fprintf(stderr, "-e <entry>    - Address where the kernel entry point will end up\n"); 
    307                                 fprintf(stderr, "-h            - Displays this text\n"); 
     346                                fprintf(stderr, "Usage: imagetag <parameters>\n\n"); 
     347                                fprintf(stderr, "       -i <kernel>             - The LZMA compressed kernel file to include in the image\n"); 
     348                                fprintf(stderr, "       -f <rootfs>             - The RootFS file to include in the image\n"); 
     349                                fprintf(stderr, "       -o <bin>                - The output file\n"); 
     350                                fprintf(stderr, "       -b <boardid>            - The board id to set in the image (i.e. \"96345GW2\")\n"); 
     351                                fprintf(stderr, "       -c <chipid>             - The chip id to set in the image (i.e. \"6345\")\n"); 
     352                                fprintf(stderr, "       -s <flashstart>         - Flash start address (i.e. \"0xBFC00000\"\n"); 
     353                                fprintf(stderr, "       -n <fwoffset>           - \n"); 
     354                                fprintf(stderr, "       -v <version>            - \n"); 
     355                                fprintf(stderr, "       -m <magic2>             - \n"); 
     356                                fprintf(stderr, "       -k <flash_bs>           - flash erase block size\n"); 
     357                                fprintf(stderr, "       -l <loadaddr>           - Address where the kernel expects to be loaded (defaults to 0x80010000)\n"); 
     358                                fprintf(stderr, "       -e <entry>              - Address where the kernel entry point will end up\n"); 
     359                                fprintf(stderr, "       -p <profile>            - Specify profile for particular devices, use 'list' to see available devices\n"); 
     360                                fprintf(stderr, "       -h                      - Displays this text\n\n"); 
    308361                                return 1; 
    309362                } 
    310363        } 
    int main(int argc, char **argv) 
    318371                fprintf(stderr, "You need to specify the kernel entry (-e)\n"); 
    319372                return 1; 
    320373        } 
     374         
     375        if (profile && (strcmp(profile, "list") == 0)) { 
     376                fprintf(stderr, "\n----------------------------------------\n"); 
     377                fprintf(stderr, "\tAvailable Profiles:"); 
     378                fprintf(stderr, "\n\n"); 
     379                fprintf(stderr, "\t'alice'\tALICE GATE VoIP 2 Plus Wi-Fi Business"); 
     380                fprintf(stderr, "\n----------------------------------------\n"); 
     381                return 0; 
     382        } 
     383 
     384        /* If the profile increase should found another way of testing the validity */ 
     385        if (profile && !(strcmp(profile, "alice") == 0)) { 
     386                fprintf(stderr, "You specified an inexistent profile %s, see the list of availables options\n", profile); 
     387                return 1; 
     388        } 
    321389 
    322390        /* Fallback to defaults */ 
    323391 
    int main(int argc, char **argv) 
    340408                } 
    341409                strcpy(ver, IMAGETAG_VER); 
    342410        } 
     411                 
    343412 
    344         return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs); 
     413        return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs, profile); 
    345414}