|
@@ -18,6 +18,7 @@
|
|
|
#include <linux/ctype.h>
|
|
|
#include <net.h>
|
|
|
#include <elf.h>
|
|
|
+#include <vxworks.h>
|
|
|
|
|
|
#if defined(CONFIG_WALNUT) || defined(CONFIG_SYS_VXWORKS_MAC_PTR)
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
@@ -98,13 +99,10 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
unsigned long bootaddr; /* Address to put the bootline */
|
|
|
char *bootline; /* Text of the bootline */
|
|
|
char *tmp; /* Temporary char pointer */
|
|
|
+ char build_buf[128]; /* Buffer for building the bootline */
|
|
|
|
|
|
-#if defined(CONFIG_4xx) || defined(CONFIG_IOP480)
|
|
|
- char build_buf[80]; /* Buffer for building the bootline */
|
|
|
-#endif
|
|
|
- /* -------------------------------------------------- */
|
|
|
-
|
|
|
- /*
|
|
|
+ /* ---------------------------------------------------
|
|
|
+ *
|
|
|
* Check the loadaddr variable.
|
|
|
* If we don't know where the image is then we're done.
|
|
|
*/
|
|
@@ -120,7 +118,8 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
if ((argc == 2) && (strcmp (argv[1], "tftp") == 0)) {
|
|
|
if (NetLoop (TFTP) <= 0)
|
|
|
return 1;
|
|
|
- printf ("Automatic boot of VxWorks image at address 0x%08lx ... \n", addr);
|
|
|
+ printf ("Automatic boot of VxWorks image at address 0x%08lx ... \n",
|
|
|
+ addr);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -148,7 +147,7 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
*/
|
|
|
|
|
|
if ((tmp = getenv ("bootaddr")) == NULL)
|
|
|
- bootaddr = 0x4200;
|
|
|
+ bootaddr = CONFIG_SYS_VXWORKS_BOOT_ADDR;
|
|
|
else
|
|
|
bootaddr = simple_strtoul (tmp, NULL, 16);
|
|
|
|
|
@@ -159,54 +158,40 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
|
|
*/
|
|
|
|
|
|
if ((bootline = getenv ("bootargs")) != NULL) {
|
|
|
- memcpy ((void *) bootaddr, bootline, MAX(strlen(bootline), 255));
|
|
|
- flush_cache (bootaddr, MAX(strlen(bootline), 255));
|
|
|
+ memcpy ((void *) bootaddr, bootline,
|
|
|
+ max (strlen (bootline), 255));
|
|
|
+ flush_cache (bootaddr, max (strlen (bootline), 255));
|
|
|
} else {
|
|
|
-#if defined(CONFIG_4xx)
|
|
|
- sprintf (build_buf, "ibmEmac(0,0)");
|
|
|
|
|
|
- if ((tmp = getenv ("hostname")) != NULL) {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- "host:%s ", tmp);
|
|
|
+
|
|
|
+ sprintf (build_buf, CONFIG_SYS_VXWORKS_BOOT_DEVICE);
|
|
|
+ if ((tmp = getenv ("bootfile")) != NULL) {
|
|
|
+ sprintf (&build_buf[strlen (build_buf)],
|
|
|
+ "%s:%s ", CONFIG_SYS_VXWORKS_SERVERNAME, tmp);
|
|
|
} else {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- ": ");
|
|
|
+ sprintf (&build_buf[strlen (build_buf)],
|
|
|
+ "%s:file ", CONFIG_SYS_VXWORKS_SERVERNAME);
|
|
|
}
|
|
|
|
|
|
if ((tmp = getenv ("ipaddr")) != NULL) {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- "e=%s ", tmp);
|
|
|
+ sprintf (&build_buf[strlen (build_buf)], "e=%s ", tmp);
|
|
|
}
|
|
|
- memcpy ((void *)bootaddr, build_buf, MAX(strlen(build_buf), 255));
|
|
|
- flush_cache (bootaddr, MAX(strlen(build_buf), 255));
|
|
|
-#elif defined(CONFIG_IOP480)
|
|
|
- sprintf (build_buf, "dc(0,0)");
|
|
|
|
|
|
- if ((tmp = getenv ("hostname")) != NULL) {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- "host:%s ", tmp);
|
|
|
- } else {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- ": ");
|
|
|
+ if ((tmp = getenv ("serverip")) != NULL) {
|
|
|
+ sprintf (&build_buf[strlen (build_buf)], "h=%s ", tmp);
|
|
|
}
|
|
|
|
|
|
- if ((tmp = getenv ("ipaddr")) != NULL) {
|
|
|
- sprintf (&build_buf[strlen (build_buf - 1)],
|
|
|
- "e=%s ", tmp);
|
|
|
+ if ((tmp = getenv ("hostname")) != NULL) {
|
|
|
+ sprintf (&build_buf[strlen (build_buf)], "tn=%s ", tmp);
|
|
|
}
|
|
|
- memcpy ((void *) bootaddr, build_buf, MAX(strlen(build_buf), 255));
|
|
|
- flush_cache (bootaddr, MAX(strlen(build_buf), 255));
|
|
|
-#else
|
|
|
-
|
|
|
- /*
|
|
|
- * I'm not sure what the device should be for other
|
|
|
- * PPC flavors, the hostname and ipaddr should be ok
|
|
|
- * to just copy
|
|
|
- */
|
|
|
-
|
|
|
- puts ("No bootargs defined\n");
|
|
|
- return 1;
|
|
|
+#ifdef CONFIG_SYS_VXWORKS_ADD_PARAMS
|
|
|
+ sprintf (&build_buf[strlen (build_buf)],
|
|
|
+ CONFIG_SYS_VXWORKS_ADD_PARAMS);
|
|
|
#endif
|
|
|
+
|
|
|
+ memcpy ((void *) bootaddr, build_buf,
|
|
|
+ max (strlen (build_buf), 255));
|
|
|
+ flush_cache (bootaddr, max (strlen (build_buf), 255));
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -251,8 +236,7 @@ int valid_elf_image (unsigned long addr)
|
|
|
}
|
|
|
|
|
|
if (ehdr->e_type != ET_EXEC) {
|
|
|
- printf ("## Not a 32-bit elf image at address 0x%08lx\n",
|
|
|
- addr);
|
|
|
+ printf ("## Not a 32-bit elf image at address 0x%08lx\n", addr);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -267,7 +251,6 @@ int valid_elf_image (unsigned long addr)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/* ======================================================================
|
|
|
* A very simple elf loader, assumes the image is valid, returns the
|
|
|
* entry point address.
|