示例#1
0
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;
}