#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
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.
(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");
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));
(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
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");