|
|
|
@ -33,22 +33,23 @@ DECLARE_GLOBAL_DATA_PTR; |
|
|
|
|
#define LINUX_MAX_ENVS 256 |
|
|
|
|
#define LINUX_MAX_ARGS 256 |
|
|
|
|
|
|
|
|
|
static int linux_argc; |
|
|
|
|
static char ** linux_argv; |
|
|
|
|
static int linux_argc; |
|
|
|
|
static char **linux_argv; |
|
|
|
|
|
|
|
|
|
static char ** linux_env; |
|
|
|
|
static char * linux_env_p; |
|
|
|
|
static int linux_env_idx; |
|
|
|
|
static char **linux_env; |
|
|
|
|
static char *linux_env_p; |
|
|
|
|
static int linux_env_idx; |
|
|
|
|
|
|
|
|
|
static void linux_params_init (ulong start, char * commandline); |
|
|
|
|
static void linux_env_set (char * env_name, char * env_val); |
|
|
|
|
static void linux_params_init(ulong start, char *commandline); |
|
|
|
|
static void linux_env_set(char *env_name, char *env_val); |
|
|
|
|
|
|
|
|
|
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images) |
|
|
|
|
int do_bootm_linux(int flag, int argc, char * const argv[], |
|
|
|
|
bootm_headers_t *images) |
|
|
|
|
{ |
|
|
|
|
void (*theKernel) (int, char **, char **, int *); |
|
|
|
|
char *commandline = getenv ("bootargs"); |
|
|
|
|
char env_buf[12]; |
|
|
|
|
char *cp; |
|
|
|
|
void (*theKernel) (int, char **, char **, int *); |
|
|
|
|
char *commandline = getenv("bootargs"); |
|
|
|
|
char env_buf[12]; |
|
|
|
|
char *cp; |
|
|
|
|
|
|
|
|
|
if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) |
|
|
|
|
return 1; |
|
|
|
@ -59,53 +60,53 @@ int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *ima |
|
|
|
|
bootstage_mark(BOOTSTAGE_ID_RUN_OS); |
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
|
printf ("## Transferring control to Linux (at address %08lx) ...\n", |
|
|
|
|
printf("## Transferring control to Linux (at address %08lx) ...\n", |
|
|
|
|
(ulong) theKernel); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
linux_params_init (UNCACHED_SDRAM (gd->bd->bi_boot_params), commandline); |
|
|
|
|
linux_params_init(UNCACHED_SDRAM(gd->bd->bi_boot_params), commandline); |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_MEMSIZE_IN_BYTES |
|
|
|
|
sprintf (env_buf, "%lu", (ulong)gd->ram_size); |
|
|
|
|
debug ("## Giving linux memsize in bytes, %lu\n", (ulong)gd->ram_size); |
|
|
|
|
sprintf(env_buf, "%lu", (ulong)gd->ram_size); |
|
|
|
|
debug("## Giving linux memsize in bytes, %lu\n", (ulong)gd->ram_size); |
|
|
|
|
#else |
|
|
|
|
sprintf (env_buf, "%lu", (ulong)(gd->ram_size >> 20)); |
|
|
|
|
debug ("## Giving linux memsize in MB, %lu\n", (ulong)(gd->ram_size >> 20)); |
|
|
|
|
sprintf(env_buf, "%lu", (ulong)(gd->ram_size >> 20)); |
|
|
|
|
debug("## Giving linux memsize in MB, %lu\n", |
|
|
|
|
(ulong)(gd->ram_size >> 20)); |
|
|
|
|
#endif /* CONFIG_MEMSIZE_IN_BYTES */ |
|
|
|
|
|
|
|
|
|
linux_env_set ("memsize", env_buf); |
|
|
|
|
linux_env_set("memsize", env_buf); |
|
|
|
|
|
|
|
|
|
sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (images->rd_start)); |
|
|
|
|
linux_env_set ("initrd_start", env_buf); |
|
|
|
|
sprintf(env_buf, "0x%08X", (uint) UNCACHED_SDRAM(images->rd_start)); |
|
|
|
|
linux_env_set("initrd_start", env_buf); |
|
|
|
|
|
|
|
|
|
sprintf (env_buf, "0x%X", (uint) (images->rd_end - images->rd_start)); |
|
|
|
|
linux_env_set ("initrd_size", env_buf); |
|
|
|
|
sprintf(env_buf, "0x%X", (uint) (images->rd_end - images->rd_start)); |
|
|
|
|
linux_env_set("initrd_size", env_buf); |
|
|
|
|
|
|
|
|
|
sprintf (env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart)); |
|
|
|
|
linux_env_set ("flash_start", env_buf); |
|
|
|
|
sprintf(env_buf, "0x%08X", (uint) (gd->bd->bi_flashstart)); |
|
|
|
|
linux_env_set("flash_start", env_buf); |
|
|
|
|
|
|
|
|
|
sprintf (env_buf, "0x%X", (uint) (gd->bd->bi_flashsize)); |
|
|
|
|
linux_env_set ("flash_size", env_buf); |
|
|
|
|
sprintf(env_buf, "0x%X", (uint) (gd->bd->bi_flashsize)); |
|
|
|
|
linux_env_set("flash_size", env_buf); |
|
|
|
|
|
|
|
|
|
cp = getenv("ethaddr"); |
|
|
|
|
if (cp != NULL) { |
|
|
|
|
if (cp) |
|
|
|
|
linux_env_set("ethaddr", cp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cp = getenv("eth1addr"); |
|
|
|
|
if (cp != NULL) { |
|
|
|
|
if (cp) |
|
|
|
|
linux_env_set("eth1addr", cp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* we assume that the kernel is in place */ |
|
|
|
|
printf ("\nStarting kernel ...\n\n"); |
|
|
|
|
printf("\nStarting kernel ...\n\n"); |
|
|
|
|
|
|
|
|
|
theKernel(linux_argc, linux_argv, linux_env, 0); |
|
|
|
|
|
|
|
|
|
theKernel (linux_argc, linux_argv, linux_env, 0); |
|
|
|
|
/* does not return */ |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void linux_params_init (ulong start, char *line) |
|
|
|
|
static void linux_params_init(ulong start, char *line) |
|
|
|
|
{ |
|
|
|
|
char *next, *quote, *argp; |
|
|
|
|
|
|
|
|
@ -117,26 +118,25 @@ static void linux_params_init (ulong start, char *line) |
|
|
|
|
next = line; |
|
|
|
|
|
|
|
|
|
while (line && *line && linux_argc < LINUX_MAX_ARGS) { |
|
|
|
|
quote = strchr (line, '"'); |
|
|
|
|
next = strchr (line, ' '); |
|
|
|
|
quote = strchr(line, '"'); |
|
|
|
|
next = strchr(line, ' '); |
|
|
|
|
|
|
|
|
|
while (next != NULL && quote != NULL && quote < next) { |
|
|
|
|
while (next && quote && quote < next) { |
|
|
|
|
/* we found a left quote before the next blank
|
|
|
|
|
* now we have to find the matching right quote |
|
|
|
|
*/ |
|
|
|
|
next = strchr (quote + 1, '"'); |
|
|
|
|
if (next != NULL) { |
|
|
|
|
quote = strchr (next + 1, '"'); |
|
|
|
|
next = strchr (next + 1, ' '); |
|
|
|
|
next = strchr(quote + 1, '"'); |
|
|
|
|
if (next) { |
|
|
|
|
quote = strchr(next + 1, '"'); |
|
|
|
|
next = strchr(next + 1, ' '); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (next == NULL) { |
|
|
|
|
next = line + strlen (line); |
|
|
|
|
} |
|
|
|
|
if (!next) |
|
|
|
|
next = line + strlen(line); |
|
|
|
|
|
|
|
|
|
linux_argv[linux_argc] = argp; |
|
|
|
|
memcpy (argp, line, next - line); |
|
|
|
|
memcpy(argp, line, next - line); |
|
|
|
|
argp[next - line] = 0; |
|
|
|
|
|
|
|
|
|
argp += next - line + 1; |
|
|
|
@ -154,19 +154,19 @@ static void linux_params_init (ulong start, char *line) |
|
|
|
|
linux_env_idx = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void linux_env_set (char *env_name, char *env_val) |
|
|
|
|
static void linux_env_set(char *env_name, char *env_val) |
|
|
|
|
{ |
|
|
|
|
if (linux_env_idx < LINUX_MAX_ENVS - 1) { |
|
|
|
|
linux_env[linux_env_idx] = linux_env_p; |
|
|
|
|
|
|
|
|
|
strcpy (linux_env_p, env_name); |
|
|
|
|
linux_env_p += strlen (env_name); |
|
|
|
|
strcpy(linux_env_p, env_name); |
|
|
|
|
linux_env_p += strlen(env_name); |
|
|
|
|
|
|
|
|
|
strcpy (linux_env_p, "="); |
|
|
|
|
strcpy(linux_env_p, "="); |
|
|
|
|
linux_env_p += 1; |
|
|
|
|
|
|
|
|
|
strcpy (linux_env_p, env_val); |
|
|
|
|
linux_env_p += strlen (env_val); |
|
|
|
|
strcpy(linux_env_p, env_val); |
|
|
|
|
linux_env_p += strlen(env_val); |
|
|
|
|
|
|
|
|
|
linux_env_p++; |
|
|
|
|
linux_env[++linux_env_idx] = 0; |
|
|
|
|