📄 cmd_bootm.c.svn-base
字号:
len = strlen(s); top = (top - (len + 1)) & ~0xF; cmdline = (char *)top; debug ("## cmdline at 0x%08lX ", top); strcpy(cmdline, s); /* copy bdinfo */ top = (top - sizeof(bd_t)) & ~0xF; debug ("## bd at 0x%08lX ", top); kbd = (bd_t *)top; memcpy(kbd, gd->bd, sizeof(bd_t)); /* first find number of env entries, and their size */ envno = 0; envsz = 0; for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ; envno++; envsz += (nxt - i) + 1; /* plus trailing zero */ } envno++; /* plus the terminating zero */ debug ("## %u envvars total size %u ", envno, envsz); top = (top - sizeof(char **)*envno) & ~0xF; fwenv = (char **)top; debug ("## fwenv at 0x%08lX ", top); top = (top - envsz) & ~0xF; s = (char *)top; ss = fwenv; /* now copy them */ for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) { for (nxt = i; env_get_char(nxt) != '\0'; ++nxt) ; *ss++ = s; for (j = i; j < nxt; ++j) *s++ = env_get_char(j); *s++ = '\0'; } *ss++ = NULL; /* terminate */ entry = (void (*)(bd_t *, char *, char **, ulong))ntohl(hdr->ih_ep); (*entry)(kbd, cmdline, fwenv, top);}#endif#if (CONFIG_COMMANDS & CFG_CMD_BOOTD)int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ int rcode = 0;#ifndef CFG_HUSH_PARSER if (run_command (getenv ("bootcmd"), flag) < 0) rcode = 1;#else if (parse_string_outer(getenv("bootcmd"), FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0 ) rcode = 1;#endif return rcode;}U_BOOT_CMD( boot, 1, 1, do_bootd, "boot - boot default, i.e., run 'bootcmd'\n", NULL);/* keep old command name "bootd" for backward compatibility */U_BOOT_CMD( bootd, 1, 1, do_bootd, "bootd - boot default, i.e., run 'bootcmd'\n", NULL);#endif#if (CONFIG_COMMANDS & CFG_CMD_IMI)int do_iminfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ int arg; ulong addr; int rcode=0; if (argc < 2) { return image_info (load_addr); } for (arg=1; arg <argc; ++arg) { addr = simple_strtoul(argv[arg], NULL, 16); if (image_info (addr) != 0) rcode = 1; } return rcode;}static int image_info (ulong addr){ ulong data, len, checksum; image_header_t *hdr = &header; printf ("\n## Checking Image at %08lx ...\n", addr); /* Copy header so we can blank CRC field for re-calculation */ memmove (&header, (char *)addr, sizeof(image_header_t)); if (ntohl(hdr->ih_magic) != IH_MAGIC) { puts (" Bad Magic Number\n"); return 1; } data = (ulong)&header; len = sizeof(image_header_t); checksum = ntohl(hdr->ih_hcrc); hdr->ih_hcrc = 0; if (crc32 (0, (char *)data, len) != checksum) { puts (" Bad Header Checksum\n"); return 1; } /* for multi-file images we need the data part, too */ print_image_hdr ((image_header_t *)addr); data = addr + sizeof(image_header_t); len = ntohl(hdr->ih_size); puts (" Verifying Checksum ... "); if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) { puts (" Bad Data CRC\n"); return 1; } puts ("OK\n"); return 0;}U_BOOT_CMD( iminfo, CFG_MAXARGS, 1, do_iminfo, "iminfo - print header information for application image\n", "addr [addr ...]\n" " - print header information for application image starting at\n" " address 'addr' in memory; this includes verification of the\n" " image contents (magic number, header and payload checksums)\n");#endif /* CFG_CMD_IMI */#if (CONFIG_COMMANDS & CFG_CMD_IMLS)/*----------------------------------------------------------------------- * List all images found in flash. */int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ flash_info_t *info; int i, j; image_header_t *hdr; ulong data, len, checksum; for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) { if (info->flash_id == FLASH_UNKNOWN) goto next_bank; for (j=0; j<CFG_MAX_FLASH_SECT; ++j) { if (!(hdr=(image_header_t *)info->start[j]) || (ntohl(hdr->ih_magic) != IH_MAGIC)) goto next_sector; /* Copy header so we can blank CRC field for re-calculation */ memmove (&header, (char *)hdr, sizeof(image_header_t)); checksum = ntohl(header.ih_hcrc); header.ih_hcrc = 0; if (crc32 (0, (char *)&header, sizeof(image_header_t)) != checksum) goto next_sector; printf ("Image at %08lX:\n", (ulong)hdr); print_image_hdr( hdr ); data = (ulong)hdr + sizeof(image_header_t); len = ntohl(hdr->ih_size); puts (" Verifying Checksum ... "); if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) { puts (" Bad Data CRC\n"); } puts ("OK\n");next_sector: ; }next_bank: ; } return (0);}U_BOOT_CMD( imls, 1, 1, do_imls, "imls - list all images found in flash\n", "\n" " - Prints information about all images found at sector\n" " boundaries in flash.\n");#endif /* CFG_CMD_IMLS */voidprint_image_hdr (image_header_t *hdr){#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP) time_t timestamp = (time_t)ntohl(hdr->ih_time); struct rtc_time tm;#endif printf (" Image Name: %.*s\n", IH_NMLEN, hdr->ih_name);#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP) to_tm (timestamp, &tm); printf (" Created: %4d-%02d-%02d %2d:%02d:%02d UTC\n", tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);#endif /* CFG_CMD_DATE, CONFIG_TIMESTAMP */ puts (" Image Type: "); print_type(hdr); printf ("\n Data Size: %d Bytes = ", ntohl(hdr->ih_size)); print_size (ntohl(hdr->ih_size), "\n"); printf (" Load Address: %08x\n" " Entry Point: %08x\n", ntohl(hdr->ih_load), ntohl(hdr->ih_ep)); if (hdr->ih_type == IH_TYPE_MULTI) { int i; ulong len; ulong *len_ptr = (ulong *)((ulong)hdr + sizeof(image_header_t)); puts (" Contents:\n"); for (i=0; (len = ntohl(*len_ptr)); ++i, ++len_ptr) { printf (" Image %d: %8ld Bytes = ", i, len); print_size (len, "\n"); } }}static voidprint_type (image_header_t *hdr){ char *os, *arch, *type, *comp; switch (hdr->ih_os) { case IH_OS_INVALID: os = "Invalid OS"; break; case IH_OS_NETBSD: os = "NetBSD"; break; case IH_OS_LINUX: os = "Linux"; break; case IH_OS_VXWORKS: os = "VxWorks"; break; case IH_OS_QNX: os = "QNX"; break; case IH_OS_U_BOOT: os = "U-Boot"; break; case IH_OS_RTEMS: os = "RTEMS"; break;#ifdef CONFIG_ARTOS case IH_OS_ARTOS: os = "ARTOS"; break;#endif#ifdef CONFIG_LYNXKDI case IH_OS_LYNXOS: os = "LynxOS"; break;#endif default: os = "Unknown OS"; break; } switch (hdr->ih_arch) { case IH_CPU_INVALID: arch = "Invalid CPU"; break; case IH_CPU_ALPHA: arch = "Alpha"; break; case IH_CPU_ARM: arch = "ARM"; break; case IH_CPU_I386: arch = "Intel x86"; break; case IH_CPU_IA64: arch = "IA64"; break; case IH_CPU_MIPS: arch = "MIPS"; break; case IH_CPU_MIPS64: arch = "MIPS 64 Bit"; break; case IH_CPU_PPC: arch = "PowerPC"; break; case IH_CPU_S390: arch = "IBM S390"; break; case IH_CPU_SH: arch = "SuperH"; break; case IH_CPU_SPARC: arch = "SPARC"; break; case IH_CPU_SPARC64: arch = "SPARC 64 Bit"; break; case IH_CPU_M68K: arch = "M68K"; break; case IH_CPU_MICROBLAZE: arch = "Microblaze"; break; default: arch = "Unknown Architecture"; break; } switch (hdr->ih_type) { case IH_TYPE_INVALID: type = "Invalid Image"; break; case IH_TYPE_STANDALONE:type = "Standalone Program"; break; case IH_TYPE_KERNEL: type = "Kernel Image"; break; case IH_TYPE_RAMDISK: type = "RAMDisk Image"; break; case IH_TYPE_MULTI: type = "Multi-File Image"; break; case IH_TYPE_FIRMWARE: type = "Firmware"; break; case IH_TYPE_SCRIPT: type = "Script"; break; default: type = "Unknown Image"; break; } switch (hdr->ih_comp) { case IH_COMP_NONE: comp = "uncompressed"; break; case IH_COMP_GZIP: comp = "gzip compressed"; break; case IH_COMP_BZIP2: comp = "bzip2 compressed"; break; default: comp = "unknown compression"; break; } printf ("%s %s %s (%s)", arch, os, type, comp);}#define ZALLOC_ALIGNMENT 16static void *zalloc(void *x, unsigned items, unsigned size){ void *p; size *= items; size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1); p = malloc (size); return (p);}static void zfree(void *x, void *addr, unsigned nb){ free (addr);}#define HEAD_CRC 2#define EXTRA_FIELD 4#define ORIG_NAME 8#define COMMENT 0x10#define RESERVED 0xe0#define DEFLATED 8int gunzip(void *dst, int dstlen, unsigned char *src, int *lenp){ z_stream s; int r, i, flags; /* skip header */ i = 10; flags = src[3]; if (src[2] != DEFLATED || (flags & RESERVED) != 0) { puts ("Error: Bad gzipped data\n"); return (-1); } if ((flags & EXTRA_FIELD) != 0) i = 12 + src[10] + (src[11] << 8); if ((flags & ORIG_NAME) != 0) while (src[i++] != 0) ; if ((flags & COMMENT) != 0) while (src[i++] != 0) ; if ((flags & HEAD_CRC) != 0) i += 2; if (i >= *lenp) { puts ("Error: gunzip out of data in header\n"); return (-1); } s.zalloc = zalloc; s.zfree = zfree;#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) s.outcb = (cb_func)WATCHDOG_RESET;#else s.outcb = Z_NULL;#endif /* CONFIG_HW_WATCHDOG */ r = inflateInit2(&s, -MAX_WBITS); if (r != Z_OK) { printf ("Error: inflateInit2() returned %d\n", r); return (-1); } s.next_in = src + i; s.avail_in = *lenp - i; s.next_out = dst; s.avail_out = dstlen; r = inflate(&s, Z_FINISH); if (r != Z_OK && r != Z_STREAM_END) { printf ("Error: inflate() returned %d\n", r); return (-1); } *lenp = s.next_out - (unsigned char *) dst; inflateEnd(&s); return (0);}#ifdef CONFIG_BZIP2void bz_internal_error(int errcode){ printf ("BZIP2 internal error %d\n", errcode);}#endif /* CONFIG_BZIP2 */static voiddo_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify){ DECLARE_GLOBAL_DATA_PTR; image_header_t *hdr = &header; void (*entry_point)(bd_t *); entry_point = (void (*)(bd_t *)) hdr->ih_ep; printf ("## Transferring control to RTEMS (at address %08lx) ...\n", (ulong)entry_point); SHOW_BOOT_PROGRESS (15); /* * RTEMS Parameters: * r3: ptr to board info data */ (*entry_point ) ( gd->bd );}#if (CONFIG_COMMANDS & CFG_CMD_ELF)static voiddo_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify){ image_header_t *hdr = &header; char str[80]; sprintf(str, "%x", hdr->ih_ep); /* write entry-point into string */ setenv("loadaddr", str); do_bootvx(cmdtp, 0, 0, NULL);}static voiddo_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify){ image_header_t *hdr = &header; char *local_args[2]; char str[16]; sprintf(str, "%x", hdr->ih_ep); /* write entry-point into string */ local_args[0] = argv[0]; local_args[1] = str; /* and provide it via the arguments */ do_bootelf(cmdtp, 0, 2, local_args);}#endif /* CFG_CMD_ELF */#ifdef CONFIG_LYNXKDIstatic voiddo_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify){ lynxkdi_boot( &header );}#endif /* CONFIG_LYNXKDI */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -