]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_elf.c
Fix GCC format-security errors and convert sprintfs.
[u-boot] / common / cmd_elf.c
index da70ef3e816a95295bec3987ff960092dc365e3b..5190cc6c0fe0a11fba99985681f08526bf449606 100644 (file)
 #include <elf.h>
 #include <net.h>
 #include <vxworks.h>
+#ifdef CONFIG_X86
+#include <asm/e820.h>
+#include <linux/linkage.h>
+#endif
 
 /*
  * A very simple elf loader, assumes the image is valid, returns the
@@ -214,6 +218,10 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        char *tmp; /* Temporary char pointer */
        char build_buf[128]; /* Buffer for building the bootline */
        int ptr = 0;
+#ifdef CONFIG_X86
+       struct e820info *info;
+       struct e820entry *data;
+#endif
 
        /*
         * Check the loadaddr variable.
@@ -280,9 +288,10 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                                  (size_t)255));
                } else {
                        tmp = getenv("bootdev");
-                       if (tmp)
-                               ptr = sprintf(build_buf, tmp);
-                       else
+                       if (tmp) {
+                               strcpy(build_buf, tmp);
+                               ptr = strlen(tmp);
+                       } else
                                printf("## VxWorks boot device not specified\n");
 
                        tmp = getenv("bootfile");
@@ -323,8 +332,10 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                ptr += sprintf(build_buf + ptr, "tn=%s ", tmp);
 
                        tmp = getenv("othbootargs");
-                       if (tmp)
-                               ptr += sprintf(build_buf + ptr, tmp);
+                       if (tmp) {
+                               strcpy(build_buf + ptr, tmp);
+                               ptr += strlen(tmp);
+                       }
 
                        memcpy((void *)bootaddr, build_buf,
                               max(strlen(build_buf), (size_t)255));
@@ -336,6 +347,29 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                       (char *)bootaddr);
        }
 
+#ifdef CONFIG_X86
+       /*
+        * Since E820 information is critical to the kernel, if we don't
+        * specify these in the environments, use a default one.
+        */
+       tmp = getenv("e820data");
+       if (tmp)
+               data = (struct e820entry *)simple_strtoul(tmp, NULL, 16);
+       else
+               data = (struct e820entry *)VXWORKS_E820_DATA_ADDR;
+       tmp = getenv("e820info");
+       if (tmp)
+               info = (struct e820info *)simple_strtoul(tmp, NULL, 16);
+       else
+               info = (struct e820info *)VXWORKS_E820_INFO_ADDR;
+
+       memset(info, 0, sizeof(struct e820info));
+       info->sign = E820_SIGNATURE;
+       info->entries = install_e820_map(E820MAX, data);
+       info->addr = (info->entries - 1) * sizeof(struct e820entry) +
+                    VXWORKS_E820_DATA_ADDR;
+#endif
+
        /*
         * If the data at the load address is an elf image, then
         * treat it like an elf image. Otherwise, assume that it is a
@@ -349,7 +383,12 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        printf("## Starting vxWorks at 0x%08lx ...\n", addr);
 
        dcache_disable();
+#ifdef CONFIG_X86
+       /* VxWorks on x86 uses stack to pass parameters */
+       ((asmlinkage void (*)(int))addr)(0);
+#else
        ((void (*)(int))addr)(0);
+#endif
 
        puts("## vxWorks terminated\n");