void help() { print_version(); print_author(); printf("Usage: ladybug [OPTIONS] SRC_FILE\n"); printf("\nOPTIONS\n"); printf("\t --lunroll-classic\t enable classic loop unrolling (copy the body multiple times)\n"); printf("\t --lunroll-symbolic\t enable software pipelining aka symbolic loop unroll\n"); printf("\t --lsimplify\t\t move independent statements out of loop UNSAFE (disabled for your safety)\n"); printf("\t --help\t\t\t print this help message and exit\n"); printf("\n"); print_extra(); }
int main(void){ int fd; char *data; char *chunk; unsigned int total_size = 0; unsigned int total_chunks = 0; enum yaffs_ecc_result tags_ecc_result = 0; enum yaffs_ecc_result data_ecc_result = 0; struct yaffs_packed_tags2 *pt = NULL; struct yaffs_ext_tags t; //extra flags. распаковывается ф-ей yaffs_unpack_tags2_tags_only из pt ! unsigned int offset = 0; unsigned int addr; int a; int size; int chunkInNAND; char *x; printf("pt size = %lu\n", sizeof(*pt)); //!!! конвертация в big endian !!! ЭТО ОЧЕНЬВАЖНЫЙ ФЛАГ !!! без него будет полный бред для big endian образов! to_big_endian = 1; data = malloc(32 * 1024 * 1024); if(!data){ printf("Can't malloc memory!\n"); exit(-1); } //fd = open("/home/prog/openwrt/work/rb941-2nd-mtd-dump/mtdblock2.bin", O_RDONLY); // fd = open("./kernel_nand.bin", O_RDONLY); fd = open("./qqq-nand2.bin", O_RDONLY); if(fd < 0){ printf("Can't open file!\n"); exit(-1); } chunk = data; while((size = read(fd, chunk, total_bytes_per_chunk)) > 0){ total_size += size; chunk += size; } close(fd); //рассчет будет меньше если чанки не полностью заполняют все блоки! то есть если последний блок обрезан! total_chunks = total_size / sectorsize * chunks_per_block; if(total_chunks == 0 & total_size > 0) total_chunks = 1; //total_chunks = total_size / NAND_PAGE_SIZE(total_bytes_per_chunk); printf("I read %d bytes from data file! total_chunks = %d\n", total_size, total_chunks); //данные загрузили. работаем. // total_chunks = 7874; // total_chunks = 189; for(chunkInNAND = 0; chunkInNAND < total_chunks; chunkInNAND++){ // for(chunkInNAND = 0; chunkInNAND < 2; chunkInNAND++){ //chunkInNAND = 202; addr = chunkToAddr(chunkInNAND); chunk = data + addr; pt = (void*)(chunk + total_bytes_per_chunk + noob.oobfree[0].offset); x = (void*)(&pt->t); //x = chunk; //printf("%lu -->\n", x - data); //преобразуем в наш endian но только блок tagsecc! без блока tags! pt_endianes_fix(pt, 2); memset(&t, 0x0, sizeof(t)); yaffs_unpack_tags2(&t, pt, 1); //узнаем ecc result до преобразования tags в наш endians! так как он считается побайтово! tags_ecc_result = t.ecc_result; //теперь преобразуем tags в наш endian pt_endianes_fix(pt, 1); //распакуем. распаковка нужна так как могут быть дополнительные(extra) tags! запакованные в месте с нашими 4-мя полями(seq_number, ...)! memset(&t, 0x0, sizeof(t)); yaffs_unpack_tags2(&t, pt, 1); //считаем ecc для данных. для tags его уже посчитала ф-я yaffs_unpack_tags2. data_ecc_result = check_ecc_data(chunk, total_bytes_per_chunk); #ifdef ECC_ALGO_DEBUG dump_ecc_data(pt); #endif printf("%u, %u: seq_num = %u, obj_id = %u, chunk_id = %u, n_bytes = %u, extra_avail = %u, tecc_res = %s, decc_res = %s\n", chunkInNAND, addr, t.seq_number, t.obj_id, t.chunk_id, t.n_bytes, t.extra_available, ecc_result2str(tags_ecc_result), ecc_result2str(data_ecc_result)); if(t.extra_available){ print_extra(&t); } //printf("0x%x: ", addr); for(a = 0; a < 16; a++){ printf("%3x", x[a] & 0xFF); } printf("\n"); } end: free(data); return 0; }