bootvx: x86: Explicitly clear the bootloader image size
authorBin Meng <bmeng.cn@gmail.com>
Thu, 12 Apr 2018 05:02:08 +0000 (22:02 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 16 Apr 2018 08:54:51 +0000 (16:54 +0800)
VxWorks bootloader stores its size at a pre-defined offset @ 0x5004.
Later when VxWorks kernel boots up and system memory information is
retrieved from the E820 table, the bootloader size will be subtracted
from the total system memory size to calculate the size of available
memory for the OS.

Explicitly clear the bootloader image size otherwise if memory
at this offset happens to contain some garbage data, the final
available memory size for the kernel is insane.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/elf.c
include/vxworks.h

index ea09506c6464a7bc8b7f2bc6e77fda22210fdda7..22d1918144d4861448c188da6e277007f76890b4 100644 (file)
--- a/cmd/elf.c
+++ b/cmd/elf.c
@@ -348,6 +348,13 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        info->entries = install_e820_map(E820MAX, data);
        info->addr = (info->entries - 1) * sizeof(struct e820entry) +
                     E820_DATA_OFFSET;
+
+       /*
+        * Explicitly clear the bootloader image size otherwise if memory
+        * at this offset happens to contain some garbage data, the final
+        * available memory size for the kernel is insane.
+        */
+       *(u32 *)(base + BOOT_IMAGE_SIZE_OFFSET) = 0;
 #endif
 
        /*
index f600dfa337bd19da05ad91286f9c163530189e5e..d91207632286b71c2a252fbc5f47aa54af22fa71 100644 (file)
@@ -43,6 +43,15 @@ struct e820info {
        u32 error;      /* must be zero */
 };
 
+/*
+ * VxWorks bootloader stores its size at a pre-defined offset @ 0x5004.
+ * Later when VxWorks kernel boots up and system memory information is
+ * retrieved from the E820 table, the bootloader size will be subtracted
+ * from the total system memory size to calculate the size of available
+ * memory for the OS.
+ */
+#define BOOT_IMAGE_SIZE_OFFSET 0x5004
+
 int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 void boot_prep_vxworks(bootm_headers_t *images);
 void boot_jump_vxworks(bootm_headers_t *images);