bootvx: x86: Prepare e820 related stuff from the given kernel memory base address
authorBin Meng <bmeng.cn@gmail.com>
Thu, 12 Apr 2018 05:02:07 +0000 (22:02 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 16 Apr 2018 08:54:51 +0000 (16:54 +0800)
At present two environment variables 'e820data'/'e820info' are required
to boot a VxWorks x86 kernel, but this is superfluous. The offset of
these two tables are actually at a fixed offset from the kernel memory
base address and we can provide the kernel memory base address to U-Boot
via only one variable 'vx_phys_mem_base'.

Note as it name indicates, the physical address should be provided.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
cmd/elf.c
doc/README.vxworks
include/vxworks.h

index 19479bb706e06c9ccd97f6c855e39d54778c7c5e..ea09506c6464a7bc8b7f2bc6e77fda22210fdda7 100644 (file)
--- a/cmd/elf.c
+++ b/cmd/elf.c
@@ -209,6 +209,7 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        char build_buf[128]; /* Buffer for building the bootline */
        int ptr = 0;
 #ifdef CONFIG_X86
+       ulong base;
        struct e820info *info;
        struct e820entry *data;
 #endif
@@ -335,25 +336,18 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #ifdef CONFIG_X86
        /*
-        * Since E820 information is critical to the kernel, if we don't
-        * specify these in the environments, use a default one.
+        * Get VxWorks's physical memory base address from environment,
+        * if we don't specify it in the environment, use a default one.
         */
-       tmp = env_get("e820data");
-       if (tmp)
-               data = (struct e820entry *)simple_strtoul(tmp, NULL, 16);
-       else
-               data = (struct e820entry *)VXWORKS_E820_DATA_ADDR;
-       tmp = env_get("e820info");
-       if (tmp)
-               info = (struct e820info *)simple_strtoul(tmp, NULL, 16);
-       else
-               info = (struct e820info *)VXWORKS_E820_INFO_ADDR;
+       base = env_get_hex("vx_phys_mem_base", VXWORKS_PHYS_MEM_BASE);
+       data = (struct e820entry *)(base + E820_DATA_OFFSET);
+       info = (struct e820info *)(base + E820_INFO_OFFSET);
 
        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;
+                    E820_DATA_OFFSET;
 #endif
 
        /*
index 6700e1d163c7aaadceb162c80a8a0a1ca1f13f19..3f9b8c182e3d782da78b2687da787d970325e85b 100644 (file)
@@ -67,17 +67,13 @@ look like VxWorks hangs somewhere as nothing outputs on the serial console.
 
 x86-specific information
 ------------------------
-Before loading an x86 kernel, two additional environment variables need to be
-provided. They are "e820data" and "e820info", which represent the address of
-E820 table and E820 information (defined by VxWorks) in system memory.
-
-Check VxWorks kernel configuration to look for BIOS_E820_DATA_START and
-BIOS_E820_INFO_START, and assign their values to "e820data" and "e820info"
-accordingly. If neither of these two are supplied, U-Boot assumes a default
-location at 0x4000 for "e820data" and 0x4a00 for "e820info". Typical values
-for "e820data" and "e820info" are 0x104000 and 0x104a00. But there is one
-exception on Intel Galileo, where "e820data" and "e820info" should be left
-unset, which assume the default location for VxWorks.
+Before loading an x86 kernel, one additional environment variable need to be
+provided. This is "vx_phys_mem_base", which represent the physical memory
+base address of VxWorks.
+
+Check VxWorks kernel configuration to look for LOCAL_MEM_LOCAL_ADRS. For
+VxWorks 7, this is normally a virtual address and you need find out its
+corresponding physical address and assign its value to "vx_phys_mem_base".
 
 For boards on which ACPI is not supported by U-Boot yet, VxWorks kernel must
 be configured to use MP table and virtual wire interrupt mode. This requires
index f69b0084ff9feba21f310e22fb2945c564c1d41b..f600dfa337bd19da05ad91286f9c163530189e5e 100644 (file)
@@ -8,10 +8,16 @@
 #ifndef _VXWORKS_H_
 #define _VXWORKS_H_
 
+/*
+ * Physical address of memory base for VxWorks x86
+ * This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
+ */
+#define VXWORKS_PHYS_MEM_BASE  0x100000
+
 /*
  * VxWorks x86 E820 related stuff
  *
- * VxWorks on x86 gets E820 information from pre-defined address @
+ * VxWorks on x86 gets E820 information from pre-defined offset @
  * 0x4a00 and 0x4000. At 0x4a00 it's an information table defined
  * by VxWorks and the actual E820 table entries starts from 0x4000.
  * As defined by the BIOS E820 spec, the maximum number of E820 table
@@ -20,8 +26,8 @@
  * information that is retrieved from the BIOS E820 call and saved
  * later for sanity test during the kernel boot-up.
  */
-#define VXWORKS_E820_DATA_ADDR 0x4000
-#define VXWORKS_E820_INFO_ADDR 0x4a00
+#define E820_DATA_OFFSET       0x4000
+#define E820_INFO_OFFSET       0x4a00
 
 /* E820 info signatiure "SMAP" - System MAP */
 #define E820_SIGNATURE 0x534d4150