Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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;
}