int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ ulong addr, data, len; uint unc_len = CFG_BOOTM_LEN; int i; image_header_t *hdr = &header; #ifdef CONFIG_TPLINK_IMAGE_HEADER tplink_image_header_t *fileTag; #endif if(argc < 2){ addr = load_addr; } else { addr = simple_strtoul(argv[1], NULL, 16); } printf("Booting image at: 0x%08lX\n", addr); #ifndef CONFIG_TPLINK_IMAGE_HEADER memmove(&header, (char *)addr, sizeof(image_header_t)); print_image_hdr(hdr); data = addr + sizeof(image_header_t); #else fileTag = (tplink_image_header_t *)addr; print_image_hdr(fileTag); fake_image_header(hdr, fileTag); data = addr + TAG_LEN; #endif /* !CONFIG_TPLINK_IMAGE_HEADER */ len = ntohl(hdr->ih_size); /* * We have reached the point of no return: we are going to * overwrite all exception vector code, so we cannot easily * recover from any failures any more... */ #ifdef CONFIG_NETCONSOLE /* * Stop the ethernet stack if NetConsole could have * left it up */ eth_halt(); #endif /* TODO: should we flush caches for kernel? */ /* * Flush everything, restore caches for linux */ //mips_cache_flush(); //mips_icache_flush_ix(); /* XXX - this causes problems when booting from flash */ /* dcache_disable(); */ /* case IH_COMP_LZMA:*/ puts("Uncompressing kernel image... "); i = lzma_inflate((unsigned char *)data, len, (unsigned char*)ntohl(hdr->ih_load), (int *)&unc_len); if(i != LZMA_RESULT_OK){ printf("## Error: LZMA error num: %d\n", i); return(-1); } puts("OK!\n"); #ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux(); #endif do_bootm_linux(cmdtp, flag, argc, argv); #ifdef DEBUG puts("\n## Error: control returned to monitor - resetting...\n"); do_reset(cmdtp, flag, argc, argv); #endif return(1); }
int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { //ulong iflag; ulong addr; ulong data, len; ulong *len_ptr; uint unc_len = CFG_BOOTM_LEN; int i, verify = 0; image_header_t *hdr = &header; LINUX_FILE_TAG *fileTag; // by lqm, 17Sep07 if (argc < 2) { addr = load_addr; } else { addr = simple_strtoul(argv[1], NULL, 16); } //SHOW_BOOT_PROGRESS (1); printf("Booting image at: 0x%08lX...\n", addr); fileTag = (LINUX_FILE_TAG *) addr; /* printf("---- fileTag = %08x\n", fileTag); printf("\t text base = %08x\n", fileTag->kernelTextAddr); printf("\t entry point = %08x\n", fileTag->kernelEntryPoint); */ fake_image_header(hdr, fileTag->kernelTextAddr, fileTag->kernelEntryPoint, fileTag->kernelLen); data = addr + TAG_LEN; len = ntohl(hdr->ih_size); /* TODO: */ //SHOW_BOOT_PROGRESS (2); //SHOW_BOOT_PROGRESS (6); /* * We have reached the point of no return: we are going to * overwrite all exception vector code, so we cannot easily * recover from any failures any more... */ //iflag = disable_interrupts(); // TODO: disable_interrupts() only returns 0... //disable_interrupts(); #ifdef CONFIG_AR7100 /* * Flush everything, restore caches for linux */ mips_cache_flush(); /* XXX - this causes problems when booting from flash */ /* dcache_disable(); */ #endif /* case IH_COMP_LZMA:*/ puts("Uncompressing kernel image...\n"); i = lzma_inflate((unsigned char *) data, len, (unsigned char*) ntohl(hdr->ih_load), (int *) &unc_len); if (i != LZMA_RESULT_OK) { //printf("## Error: LZMA error number %d\n", i); //SHOW_BOOT_PROGRESS(-6); //udelay(100000); return -1; //do_reset(cmdtp, flag, argc, argv); } puts("OK\n"); //SHOW_BOOT_PROGRESS(7); /* case IH_OS_LINUX: */ #ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux(); #endif do_bootm_linux(cmdtp, flag, argc, argv, addr, len_ptr, verify); //SHOW_BOOT_PROGRESS(-9); #ifdef DEBUG puts ("\n## Error: control returned to monitor - resetting...\n"); do_reset (cmdtp, flag, argc, argv); #endif return 1; }