
common/cmd_autoscript.c common/cmd_bootm.c common/lynxkdi.c
- sort and cleanup headers, declarations, etc. - group related routines - cleanup indentation, white spaces
Signed-off-by: Marian Balakowicz m8@semihalf.com ---
common/cmd_autoscript.c | 32 +- common/cmd_bootm.c | 755 ++++++++++++++++++++++++----------------------- common/lynxkdi.c | 36 +- 3 files changed, 415 insertions(+), 408 deletions(-)
diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c index c1ff32a..5948cd5 100644 --- a/common/cmd_autoscript.c +++ b/common/cmd_autoscript.c @@ -49,8 +49,7 @@
#if defined(CONFIG_AUTOSCRIPT) || defined(CONFIG_CMD_AUTOSCRIPT)
-int -autoscript (ulong addr) +int autoscript(ulong addr) { ulong len; image_header_t *hdr = (image_header_t *)addr; @@ -93,18 +92,17 @@ autoscript (ulong addr)
debug ("** Script length: %ld\n", len);
- if ((cmd = malloc (len + 1)) == NULL) { + if ((cmd = malloc(len + 1)) == NULL) return 1; - }
while (*len_ptr++);
/* make sure cmd is null terminated */ - memmove (cmd, (char *)len_ptr, len); + memmove(cmd, (char *)len_ptr, len); *(cmd + len) = 0;
#ifdef CFG_HUSH_PARSER /*?? */ - rcode = parse_string_outer (cmd, FLAG_PARSE_SEMICOLON); + rcode = parse_string_outer(cmd, FLAG_PARSE_SEMICOLON); #else { char *line = cmd; @@ -120,9 +118,9 @@ autoscript (ulong addr) *next = '\0'; /* run only non-empty commands */ if ((next - line) > 1) { - debug ("** exec: "%s"\n", - line); - if (run_command (line, 0) < 0) { + debug("** exec: "%s"\n", + line); + if (run_command(line, 0) < 0) { rcode = 1; break; } @@ -133,7 +131,7 @@ autoscript (ulong addr) } } #endif - free (cmd); + free(cmd); return rcode; }
@@ -141,20 +139,18 @@ autoscript (ulong addr)
/**************************************************/ #if defined(CONFIG_CMD_AUTOSCRIPT) -int -do_autoscript (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_autoscript(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong addr; int rcode;
- if (argc < 2) { + if (argc < 2) addr = CFG_LOAD_ADDR; - } else { - addr = simple_strtoul (argv[1],0,16); - } + else + addr = simple_strtoul(argv[1], 0, 16);
- printf ("## Executing script at %08lx\n",addr); - rcode = autoscript (addr); + printf("## Executing script at %08lx\n",addr); + rcode = autoscript(addr); return rcode; }
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 7c3bb2f..51c67bb 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -44,11 +44,6 @@ #include <ft_build.h> #endif
-DECLARE_GLOBAL_DATA_PTR; - -/*cmd_boot.c*/ -extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); - #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) #include <rtc.h> #endif @@ -61,23 +56,33 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); #include <dataflash.h> #endif
-int gunzip (void *, int, unsigned char *, unsigned long *); +DECLARE_GLOBAL_DATA_PTR; + +extern int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp); +#ifndef CFG_BOOTM_LEN +#define CFG_BOOTM_LEN 0x800000 /* use 8MByte as default max gunzip size */ +#endif
#ifdef CONFIG_BZIP2 extern void bz_internal_error(int); #endif
#if defined(CONFIG_CMD_IMI) -static int image_info (unsigned long addr); +static int image_info(unsigned long addr); #endif
#if defined(CONFIG_CMD_IMLS) #include <flash.h> extern flash_info_t flash_info[]; /* info for FLASH chips */ -static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); +static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); +#endif + +#ifdef CONFIG_SILENT_CONSOLE +static void fixup_silent_linux(void); #endif
-static void print_type (image_header_t *hdr); +static void print_type(image_header_t *hdr); +extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
/* * Continue booting an OS image; caller already has: @@ -87,42 +92,39 @@ static void print_type (image_header_t *hdr); * - loaded (first part of) image to header load address, * - disabled interrupts. */ -typedef void boot_os_Fcn (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - ulong addr, /* of image to boot */ - ulong *len_ptr, /* multi-file image length table */ - int verify); /* getenv("verify")[0] != 'n' */ - -extern boot_os_Fcn do_bootm_linux; - -#ifdef CONFIG_SILENT_CONSOLE -static void fixup_silent_linux (void); +typedef void boot_os_fn(cmd_tbl_t *cmdtp, int flag, + int argc, char *argv[], + ulong addr, /* of image to boot */ + ulong *len_ptr, /* multi-file image length table */ + int verify); /* getenv("verify")[0] != 'n' */ + +extern boot_os_fn do_bootm_linux; +static boot_os_fn do_bootm_netbsd; +#ifdef CONFIG_LYNXKDI +static boot_os_fn do_bootm_lynxkdi; +extern void lynxkdi_boot(image_header_t *); #endif -static boot_os_Fcn do_bootm_netbsd; -static boot_os_Fcn do_bootm_rtems; +static boot_os_fn do_bootm_rtems; #if defined(CONFIG_CMD_ELF) -static boot_os_Fcn do_bootm_vxworks; -static boot_os_Fcn do_bootm_qnxelf; -int do_bootvx ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] ); -int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] ); +static boot_os_fn do_bootm_vxworks; +static boot_os_fn do_bootm_qnxelf; +int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); +int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); #endif #if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) -static boot_os_Fcn do_bootm_artos; -#endif -#ifdef CONFIG_LYNXKDI -static boot_os_Fcn do_bootm_lynxkdi; -extern void lynxkdi_boot( image_header_t * ); -#endif - -#ifndef CFG_BOOTM_LEN -#define CFG_BOOTM_LEN 0x800000 /* use 8MByte as default max gunzip size */ +extern uchar (*env_get_char)(int); /* Returns a character from the environment */ +static boot_os_fn do_bootm_artos; #endif
image_header_t header;
-ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */ +ulong load_addr = CFG_LOAD_ADDR; /* Default Load Address */
-int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) + +/*******************************************************************/ +/* bootm - boot application image from image in memory */ +/*******************************************************************/ +int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong iflag; ulong addr; @@ -142,8 +144,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) addr = simple_strtoul(argv[1], NULL, 16); }
- show_boot_progress (1); - printf ("## Booting image at %08lx ...\n", addr); + show_boot_progress(1); + printf("## Booting image at %08lx ...\n", addr);
/* Copy header so we can blank CRC field for re-calculation */ #ifdef CONFIG_HAS_DATAFLASH @@ -154,18 +156,18 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) memmove (&header, (char *)addr, image_get_header_size());
if (!image_check_magic(hdr)) { - puts ("Bad Magic Number\n"); - show_boot_progress (-1); + puts("Bad Magic Number\n"); + show_boot_progress(-1); return 1; } - show_boot_progress (2); + show_boot_progress(2);
if (!image_check_hcrc(hdr)) { - puts ("Bad Header Checksum\n"); - show_boot_progress (-2); + puts("Bad Header Checksum\n"); + show_boot_progress(-2); return 1; } - show_boot_progress (3); + show_boot_progress(3);
#ifdef CONFIG_HAS_DATAFLASH if (addr_dataflash(addr)){ @@ -175,7 +177,6 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } #endif
- /* for multi-file images we need the data part, too */ print_image_hdr((image_header_t *)addr);
@@ -184,30 +185,29 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) len_ptr = (ulong *)data;
if (verify) { - puts (" Verifying Checksum ... "); + puts(" Verifying Checksum ... "); if (!image_check_dcrc((image_header_t *)addr)) { - printf ("Bad Data CRC\n"); - show_boot_progress (-3); + printf("Bad Data CRC\n"); + show_boot_progress(-3); return 1; } - puts ("OK\n"); + puts("OK\n"); } - show_boot_progress (4); + show_boot_progress(4);
if (!image_check_target_arch(hdr)) { - printf ("Unsupported Architecture 0x%x\n", image_get_arch(hdr)); - show_boot_progress (-4); + printf("Unsupported Architecture 0x%x\n", image_get_arch(hdr)); + show_boot_progress(-4); return 1; } - show_boot_progress (5); + show_boot_progress(5);
switch (image_get_type(hdr)) { case IH_TYPE_STANDALONE: name = "Standalone Application"; /* A second argument overwrites the load address */ - if (argc > 2) { + if (argc > 2) image_set_load(hdr, simple_strtoul(argv[2], NULL, 16)); - } break; case IH_TYPE_KERNEL: name = "Kernel Image"; @@ -220,18 +220,18 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) for (i=1; len_ptr[i]; ++i) data += 4; break; - default: printf ("Wrong Image Type for %s command\n", cmdtp->name); - show_boot_progress (-5); + default: + printf("Wrong Image Type for %s command\n", cmdtp->name); + show_boot_progress(-5); return 1; } - show_boot_progress (6); + 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();
#ifdef CONFIG_AMIGAONEG3SE @@ -248,9 +248,9 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) switch (image_get_comp(hdr)) { case IH_COMP_NONE: if (image_get_load(hdr) == addr) { - printf (" XIP %s ... ", name); + printf(" XIP %s ... ", name); } else { - printf (" Loading %s ... ", name); + printf(" Loading %s ... ", name);
memmove_wd((void *)image_get_load(hdr), (void *)data, len, CHUNKSZ); @@ -259,41 +259,41 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } break; case IH_COMP_GZIP: - printf (" Uncompressing %s ... ", name); - if (gunzip ((void *)image_get_load(hdr), unc_len, + printf(" Uncompressing %s ... ", name); + if (gunzip((void *)image_get_load(hdr), unc_len, (uchar *)data, &len) != 0) { - puts ("GUNZIP ERROR - must RESET board to recover\n"); - show_boot_progress (-6); - do_reset (cmdtp, flag, argc, argv); + puts("GUNZIP ERROR - must RESET board to recover\n"); + show_boot_progress(-6); + do_reset(cmdtp, flag, argc, argv); } break; #ifdef CONFIG_BZIP2 case IH_COMP_BZIP2: - printf (" Uncompressing %s ... ", name); + printf(" Uncompressing %s ... ", name); /* * If we've got less than 4 MB of malloc() space, * use slower decompression algorithm which requires * at most 2300 KB of memory. */ - i = BZ2_bzBuffToBuffDecompress ((char*)image_get_load(hdr), + i = BZ2_bzBuffToBuffDecompress((char*)image_get_load(hdr), &unc_len, (char *)data, len, CFG_MALLOC_LEN < (4096 * 1024), 0); if (i != BZ_OK) { - printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i); - show_boot_progress (-6); - do_reset (cmdtp, flag, argc, argv); + printf("BUNZIP2 ERROR %d - must RESET board to recover\n", i); + show_boot_progress(-6); + do_reset(cmdtp, flag, argc, argv); } break; #endif /* CONFIG_BZIP2 */ default: if (iflag) enable_interrupts(); - printf ("Unimplemented compression type %d\n", image_get_comp(hdr)); - show_boot_progress (-7); + printf("Unimplemented compression type %d\n", image_get_comp(hdr)); + show_boot_progress(-7); return 1; } - puts ("OK\n"); - show_boot_progress (7); + puts("OK\n"); + show_boot_progress(7);
switch (image_get_type(hdr)) { case IH_TYPE_STANDALONE: @@ -319,11 +319,11 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) default: if (iflag) enable_interrupts(); - printf ("Can't boot image type %d\n", image_get_type(hdr)); - show_boot_progress (-8); + printf("Can't boot image type %d\n", image_get_type(hdr)); + show_boot_progress(-8); return 1; } - show_boot_progress (8); + show_boot_progress(8);
switch (image_get_os(hdr)) { default: /* handled by (original) Linux case */ @@ -331,58 +331,60 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) #ifdef CONFIG_SILENT_CONSOLE fixup_silent_linux(); #endif - do_bootm_linux (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_linux(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break; + case IH_OS_NETBSD: - do_bootm_netbsd (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_netbsd(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break;
#ifdef CONFIG_LYNXKDI case IH_OS_LYNXOS: - do_bootm_lynxkdi (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_lynxkdi(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break; #endif
case IH_OS_RTEMS: - do_bootm_rtems (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_rtems(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break;
#if defined(CONFIG_CMD_ELF) case IH_OS_VXWORKS: - do_bootm_vxworks (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_vxworks(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break; case IH_OS_QNX: - do_bootm_qnxelf (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_qnxelf(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break; #endif + #ifdef CONFIG_ARTOS case IH_OS_ARTOS: - do_bootm_artos (cmdtp, flag, argc, argv, - addr, len_ptr, verify); + do_bootm_artos(cmdtp, flag, argc, argv, + addr, len_ptr, verify); break; #endif }
- show_boot_progress (-9); + show_boot_progress(-9); #ifdef DEBUG - puts ("\n## Control returned to monitor - resetting...\n"); - do_reset (cmdtp, flag, argc, argv); + puts("\n## Control returned to monitor - resetting...\n"); + do_reset(cmdtp, flag, argc, argv); #endif return 1; }
U_BOOT_CMD( - bootm, CFG_MAXARGS, 1, do_bootm, - "bootm - boot application image from memory\n", - "[addr [arg ...]]\n - boot application image stored in memory\n" - "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n" - "\t'arg' can be the address of an initrd image\n" + bootm, CFG_MAXARGS, 1, do_bootm, + "bootm - boot application image from memory\n", + "[addr [arg ...]]\n - boot application image stored in memory\n" + "\tpassing arguments 'arg ...'; when booting a Linux kernel,\n" + "\t'arg' can be the address of an initrd image\n" #if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT) "\tWhen booting a Linux kernel which requires a flat device-tree\n" "\ta third argument is required which is the address of the\n" @@ -392,279 +394,88 @@ U_BOOT_CMD( #endif );
-#ifdef CONFIG_SILENT_CONSOLE -static void -fixup_silent_linux () -{ - char buf[256], *start, *end; - char *cmdline = getenv ("bootargs"); - - /* Only fix cmdline when requested */ - if (!(gd->flags & GD_FLG_SILENT)) - return; - - debug ("before silent fix-up: %s\n", cmdline); - if (cmdline) { - if ((start = strstr (cmdline, "console=")) != NULL) { - end = strchr (start, ' '); - strncpy (buf, cmdline, (start - cmdline + 8)); - if (end) - strcpy (buf + (start - cmdline + 8), end); - else - buf[start - cmdline + 8] = '\0'; - } else { - strcpy (buf, cmdline); - strcat (buf, " console="); - } - } else { - strcpy (buf, "console="); - } - - setenv ("bootargs", buf); - debug ("after silent fix-up: %s\n", buf); -} -#endif /* CONFIG_SILENT_CONSOLE */ - -static void -do_bootm_netbsd (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - ulong addr, - ulong *len_ptr, - int verify) -{ - image_header_t *hdr = &header; - - void (*loader)(bd_t *, image_header_t *, char *, char *); - image_header_t *img_addr; - char *consdev; - char *cmdline; - - - /* - * Booting a (NetBSD) kernel image - * - * This process is pretty similar to a standalone application: - * The (first part of an multi-) image must be a stage-2 loader, - * which in turn is responsible for loading & invoking the actual - * kernel. The only differences are the parameters being passed: - * besides the board info strucure, the loader expects a command - * line, the name of the console device, and (optionally) the - * address of the original image header. - */ - - img_addr = 0; - if ((image_check_type(hdr, IH_TYPE_MULTI)) && (len_ptr[1])) - img_addr = (image_header_t *) addr; - - - consdev = ""; -#if defined (CONFIG_8xx_CONS_SMC1) - consdev = "smc1"; -#elif defined (CONFIG_8xx_CONS_SMC2) - consdev = "smc2"; -#elif defined (CONFIG_8xx_CONS_SCC2) - consdev = "scc2"; -#elif defined (CONFIG_8xx_CONS_SCC3) - consdev = "scc3"; -#endif - - if (argc > 2) { - ulong len; - int i; - - for (i=2, len=0 ; i<argc ; i+=1) - len += strlen (argv[i]) + 1; - cmdline = malloc (len); - - for (i=2, len=0 ; i<argc ; i+=1) { - if (i > 2) - cmdline[len++] = ' '; - strcpy (&cmdline[len], argv[i]); - len += strlen (argv[i]); - } - } else if ((cmdline = getenv("bootargs")) == NULL) { - cmdline = ""; - } - - loader = (void (*)(bd_t *, image_header_t *, char *, char *))image_get_ep(hdr); - - printf ("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n", - (ulong)loader); - - show_boot_progress (15); - - /* - * NetBSD Stage-2 Loader Parameters: - * r3: ptr to board info data - * r4: image address - * r5: console device - * r6: boot args string - */ - (*loader) (gd->bd, img_addr, consdev, cmdline); -} - -#if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) - -/* Function that returns a character from the environment */ -extern uchar (*env_get_char)(int); - -static void -do_bootm_artos (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - ulong addr, - ulong *len_ptr, - int verify) -{ - ulong top; - char *s, *cmdline; - char **fwenv, **ss; - int i, j, nxt, len, envno, envsz; - bd_t *kbd; - void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top); - image_header_t *hdr = &header; - - /* - * Booting an ARTOS kernel image + application - */ - - /* this used to be the top of memory, but was wrong... */ -#ifdef CONFIG_PPC - /* get stack pointer */ - asm volatile ("mr %0,1" : "=r"(top) ); -#endif - debug ("## Current stack ends at 0x%08lX ", top); - - top -= 2048; /* just to be sure */ - if (top > CFG_BOOTMAPSZ) - top = CFG_BOOTMAPSZ; - top &= ~0xF; - - debug ("=> set upper limit to 0x%08lX\n", top); - - /* first check the artos specific boot args, then the linux args*/ - if ((s = getenv("abootargs")) == NULL && (s = getenv("bootargs")) == NULL) - s = ""; - - /* get length of cmdline, and place it */ - 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))image_get_ep(hdr); - (*entry)(kbd, cmdline, fwenv, top); -} -#endif -
+/*******************************************************************/ +/* bootd - boot default image */ +/*******************************************************************/ #if defined(CONFIG_CMD_BOOTD) -int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +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; + 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; + 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", + 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", + bootd, 1, 1, do_bootd, + "bootd - boot default, i.e., run 'bootcmd'\n", NULL );
#endif
+ +/*******************************************************************/ +/* iminfo - print header info for a requested image */ +/*******************************************************************/ #if defined(CONFIG_CMD_IMI) -int do_iminfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_iminfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - int arg; - ulong addr; - int rcode=0; + int arg; + ulong addr; + int rcode = 0;
if (argc < 2) { return image_info (load_addr); }
- for (arg=1; arg <argc; ++arg) { + for (arg = 1; arg < argc; ++arg) { addr = simple_strtoul(argv[arg], NULL, 16); - if (image_info (addr) != 0) rcode = 1; + if (image_info (addr) != 0) + rcode = 1; } return rcode; }
-static int image_info (ulong addr) +static int image_info(ulong addr) { image_header_t *hdr = (image_header_t *)addr;
- printf ("\n## Checking Image at %08lx ...\n", addr); + printf("\n## Checking Image at %08lx ...\n", addr);
if (!image_check_magic(hdr)) { - puts (" Bad Magic Number\n"); + puts(" Bad Magic Number\n"); return 1; }
if (!image_check_hcrc(hdr)) { - puts (" Bad Header Checksum\n"); + puts(" Bad Header Checksum\n"); return 1; }
print_image_hdr(hdr);
- puts (" Verifying Checksum ... "); + puts(" Verifying Checksum ... "); if (!image_check_dcrc(hdr)) { - puts (" Bad Data CRC\n"); + puts(" Bad Data CRC\n"); return 1; } - puts ("OK\n"); + puts("OK\n"); return 0; }
@@ -676,23 +487,25 @@ U_BOOT_CMD( " address 'addr' in memory; this includes verification of the\n" " image contents (magic number, header and payload checksums)\n" ); - #endif
+ +/*******************************************************************/ +/* imls - list all images found in flash */ +/*******************************************************************/ #if defined(CONFIG_CMD_IMLS) -/*----------------------------------------------------------------------- - * List all images found in flash. - */ -int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { flash_info_t *info; int i, j; image_header_t *hdr;
- for (i=0, info=&flash_info[0]; i<CFG_MAX_FLASH_BANKS; ++i, ++info) { + 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<info->sector_count; ++j) { + for (j = 0; j < info->sector_count; ++j) {
hdr = (image_header_t *)info->start[j];
@@ -702,14 +515,14 @@ int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) if (!image_check_hcrc(hdr)) goto next_sector;
- printf ("Image at %08lX:\n", (ulong)hdr); + printf("Image at %08lX:\n", (ulong)hdr); print_image_hdr( hdr );
- puts (" Verifying Checksum ... "); + puts(" Verifying Checksum ... "); if (!image_check_dcrc(hdr)) - puts ("Bad Data CRC\n"); + puts("Bad Data CRC\n"); else - puts ("OK\n"); + puts("OK\n"); next_sector: ; } next_bank: ; @@ -727,26 +540,31 @@ U_BOOT_CMD( ); #endif
-void -print_image_hdr (image_header_t *hdr) +/*******************************************************************/ +/* */ +/*******************************************************************/ +void print_image_hdr(image_header_t *hdr) { #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) time_t timestamp = (time_t)image_get_time(hdr); struct rtc_time tm; #endif
- printf (" Image Name: %.*s\n", IH_NMLEN, image_get_name(hdr)); + printf(" Image Name: %.*s\n", IH_NMLEN, image_get_name(hdr)); + #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) to_tm (timestamp, &tm); - printf (" Created: %4d-%02d-%02d %2d:%02d:%02d UTC\n", + 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 - puts (" Image Type: "); print_type(hdr); - printf ("\n Data Size: %d Bytes = ", image_get_data_size(hdr)); + puts(" Image Type: "); + print_type(hdr); + + printf("\n Data Size: %d Bytes = ", image_get_data_size(hdr)); print_size (image_get_data_size(hdr), "\n"); - printf (" Load Address: %08x\n" - " Entry Point: %08x\n", + + printf(" Load Address: %08x\n Entry Point: %08x\n", image_get_load(hdr), image_get_ep(hdr));
if (image_check_type(hdr, IH_TYPE_MULTI)) { @@ -754,17 +572,15 @@ print_image_hdr (image_header_t *hdr) ulong len; ulong *len_ptr = (ulong *)((ulong)hdr + image_get_header_size());
- puts (" Contents:\n"); - for (i=0; (len = image_to_cpu(*len_ptr)); ++i, ++len_ptr) { - printf (" Image %d: %8ld Bytes = ", i, len); + puts(" Contents:\n"); + for (i = 0; (len = image_to_cpu(*len_ptr)); ++i, ++len_ptr) { + printf(" Image %d: %8ld Bytes = ", i, len); print_size (len, "\n"); } } }
- -static void -print_type (image_header_t *hdr) +static void print_type(image_header_t *hdr) { char *os, *arch, *type, *comp;
@@ -826,35 +642,157 @@ print_type (image_header_t *hdr) default: comp = "unknown compression"; break; }
- printf ("%s %s %s (%s)", arch, os, type, comp); + printf("%s %s %s (%s)", arch, os, type, comp); +} + +#ifdef CONFIG_SILENT_CONSOLE +static void fixup_silent_linux() +{ + char buf[256], *start, *end; + char *cmdline = getenv ("bootargs"); + + /* Only fix cmdline when requested */ + if (!(gd->flags & GD_FLG_SILENT)) + return; + + debug("before silent fix-up: %s\n", cmdline); + if (cmdline) { + if ((start = strstr (cmdline, "console=")) != NULL) { + end = strchr (start, ' '); + strncpy (buf, cmdline, (start - cmdline + 8)); + if (end) + strcpy (buf + (start - cmdline + 8), end); + else + buf[start - cmdline + 8] = '\0'; + } else { + strcpy (buf, cmdline); + strcat (buf, " console="); + } + } else { + strcpy (buf, "console="); + } + + setenv ("bootargs", buf); + debug("after silent fix-up: %s\n", buf); +} +#endif /* CONFIG_SILENT_CONSOLE */ + + +/*******************************************************************/ +/* OS booting routines */ +/*******************************************************************/ + +static void do_bootm_netbsd(cmd_tbl_t *cmdtp, int flag, + int argc, char *argv[], + ulong addr, ulong *len_ptr, + int verify) +{ + image_header_t *hdr = &header; + + void (*loader)(bd_t *, image_header_t *, char *, char *); + image_header_t *img_addr; + char *consdev; + char *cmdline; + + /* + * Booting a (NetBSD) kernel image + * + * This process is pretty similar to a standalone application: + * The (first part of an multi-) image must be a stage-2 loader, + * which in turn is responsible for loading & invoking the actual + * kernel. The only differences are the parameters being passed: + * besides the board info strucure, the loader expects a command + * line, the name of the console device, and (optionally) the + * address of the original image header. + */ + + img_addr = 0; + if ((image_check_type(hdr, IH_TYPE_MULTI)) && (len_ptr[1])) + img_addr = (image_header_t *)addr; + + consdev = ""; +#if defined (CONFIG_8xx_CONS_SMC1) + consdev = "smc1"; +#elif defined (CONFIG_8xx_CONS_SMC2) + consdev = "smc2"; +#elif defined (CONFIG_8xx_CONS_SCC2) + consdev = "scc2"; +#elif defined (CONFIG_8xx_CONS_SCC3) + consdev = "scc3"; +#endif + + if (argc > 2) { + ulong len; + int i; + + for (i = 2, len = 0; i < argc; i += 1) + len += strlen(argv[i]) + 1; + cmdline = malloc(len); + + for (i = 2, len = 0; i < argc; i += 1) { + if (i > 2) + cmdline[len++] = ' '; + strcpy(&cmdline[len], argv[i]); + len += strlen(argv[i]); + } + } else if ((cmdline = getenv("bootargs")) == NULL) { + cmdline = ""; + } + + loader = (void (*)(bd_t *, image_header_t *, char *, char *))image_get_ep(hdr); + + printf("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n", + (ulong)loader); + + show_boot_progress(15); + + /* + * NetBSD Stage-2 Loader Parameters: + * r3: ptr to board info data + * r4: image address + * r5: console device + * r6: boot args string + */ + (*loader) (gd->bd, img_addr, consdev, cmdline); +} + +#ifdef CONFIG_LYNXKDI +static void do_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 */
-static void -do_bootm_rtems (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - ulong addr, ulong *len_ptr, int verify) +static void do_bootm_rtems(cmd_tbl_t *cmdtp, int flag, + int argc, char *argv[], + ulong addr, ulong *len_ptr, + int verify) { image_header_t *hdr = &header; - void (*entry_point)(bd_t *); + void (*entry_point)(bd_t *);
entry_point = (void (*)(bd_t *))image_get_ep(hdr);
- printf ("## Transferring control to RTEMS (at address %08lx) ...\n", + printf("## Transferring control to RTEMS (at address %08lx) ...\n", (ulong)entry_point);
- show_boot_progress (15); + show_boot_progress(15);
/* * RTEMS Parameters: * r3: ptr to board info data */ - - (*entry_point ) ( gd->bd ); + (*entry_point)(gd->bd); }
#if defined(CONFIG_CMD_ELF) -static void -do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - ulong addr, ulong *len_ptr, int verify) +static void do_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]; @@ -864,9 +802,10 @@ do_bootm_vxworks (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], do_bootvx(cmdtp, 0, 0, NULL); }
-static void -do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - ulong addr, ulong *len_ptr, int verify) +static void do_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]; @@ -879,15 +818,87 @@ do_bootm_qnxelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } #endif
-#ifdef CONFIG_LYNXKDI -static void -do_bootm_lynxkdi (cmd_tbl_t *cmdtp, int flag, - int argc, char *argv[], - ulong addr, - ulong *len_ptr, - int verify) +#if defined(CONFIG_ARTOS) && defined(CONFIG_PPC) +static void do_bootm_artos(cmd_tbl_t *cmdtp, int flag, + int argc, char *argv[], + ulong addr, ulong *len_ptr, + int verify) { - lynxkdi_boot( &header ); -} + ulong top; + char *s, *cmdline; + char **fwenv, **ss; + int i, j, nxt, len, envno, envsz; + bd_t *kbd; + void (*entry)(bd_t *bd, char *cmdline, char **fwenv, ulong top); + image_header_t *hdr = &header;
-#endif /* CONFIG_LYNXKDI */ + /* + * Booting an ARTOS kernel image + application + */ + + /* this used to be the top of memory, but was wrong... */ +#ifdef CONFIG_PPC + /* get stack pointer */ + asm volatile ("mr %0,1" : "=r"(top) ); +#endif + debug("## Current stack ends at 0x%08lX ", top); + + top -= 2048; /* just to be sure */ + if (top > CFG_BOOTMAPSZ) + top = CFG_BOOTMAPSZ; + top &= ~0xF; + + debug("=> set upper limit to 0x%08lX\n", top); + + /* first check the artos specific boot args, then the linux args*/ + if ((s = getenv("abootargs")) == NULL && (s = getenv("bootargs")) == NULL) + s = ""; + + /* get length of cmdline, and place it */ + 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))image_get_ep(hdr); + (*entry)(kbd, cmdline, fwenv, top); +} +#endif diff --git a/common/lynxkdi.c b/common/lynxkdi.c index 62b2a04..5516f85 100644 --- a/common/lynxkdi.c +++ b/common/lynxkdi.c @@ -23,14 +23,14 @@ DECLARE_GLOBAL_DATA_PTR;
#if defined(CONFIG_MPC8260) || defined(CONFIG_440EP) || defined(CONFIG_440GR) -void lynxkdi_boot ( image_header_t *hdr ) +void lynxkdi_boot(image_header_t *hdr) { void (*lynxkdi)(void) = (void(*)(void))image_get_ep(hdr); lynxos_bootparms_t *parms = (lynxos_bootparms_t *)0x0020; bd_t *kbd; u32 *psz = (u32 *)(image_get_load(hdr) + 0x0204);
- memset( parms, 0, sizeof(*parms)); + memset(parms, 0, sizeof(*parms)); kbd = gd->bd; parms->clock_ref = kbd->bi_busfreq; parms->dramsz = kbd->bi_memsize; @@ -40,25 +40,25 @@ void lynxkdi_boot ( image_header_t *hdr ) /* Do a simple check for Bluecat so we can pass the * kernel command line parameters. */ - if( le32_to_cpu(*psz) == image_get_data_size(hdr) ){ /* FIXME: NOT SURE HERE ! */ - char *args; - char *cmdline = (char *)(image_get_load(hdr) + 0x020c); - int len; + if (le32_to_cpu(*psz) == image_get_data_size(hdr)) { /* FIXME: NOT SURE HERE ! */ + char *args; + char *cmdline = (char *)(image_get_load(hdr) + 0x020c); + int len;
- printf("Booting Bluecat KDI ...\n"); - udelay(200*1000); /* Allow serial port to flush */ - if ((args = getenv("bootargs")) == NULL) - args = ""; - /* Prepend the cmdline */ - len = strlen(args); - if( len && (len + strlen(cmdline) + 2 < (0x0400 - 0x020c))) { - memmove( cmdline + strlen(args) + 1, cmdline, strlen(cmdline) ); - strcpy( cmdline, args ); - cmdline[len] = ' '; - } + printf("Booting Bluecat KDI ...\n"); + udelay(200*1000); /* Allow serial port to flush */ + if ((args = getenv("bootargs")) == NULL) + args = ""; + /* Prepend the cmdline */ + len = strlen(args); + if( len && (len + strlen(cmdline) + 2 < (0x0400 - 0x020c))) { + memmove( cmdline + strlen(args) + 1, cmdline, strlen(cmdline) ); + strcpy( cmdline, args ); + cmdline[len] = ' '; + } } else { - printf("Booting LynxOS KDI ...\n"); + printf("Booting LynxOS KDI ...\n"); }
lynxkdi();