cmd: mem: Add a command to fill the memory with random data
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Tue, 2 Jul 2019 12:23:26 +0000 (14:23 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 18 Jul 2019 15:31:27 +0000 (11:31 -0400)
This command fills the memory with data produced by rand().

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
cmd/Kconfig
cmd/mem.c

index ec746fe8255d4d9636fff7a6911d9d6e847a1ddd..175c6ad9e3338d0b83062eae932c3e0cd8afc812 100644 (file)
@@ -571,6 +571,13 @@ config CMD_MEMORY
            base - print or set address offset
            loop - initialize loop on address range
 
+config CMD_RANDOM
+       bool "random"
+       default y
+       depends on CMD_MEMORY && (LIB_RAND || LIB_HW_RAND)
+       help
+         random - fill memory with random data
+
 config CMD_MEMTEST
        bool "memtest"
        help
index 392ed1756b636ea89bfc40302134ccc05993cf41..c6b8038fc9dd61e7de81eb4a02c76d6805ec6d34 100644 (file)
--- a/cmd/mem.c
+++ b/cmd/mem.c
@@ -1082,6 +1082,49 @@ static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #endif
 
+#ifdef CONFIG_CMD_RANDOM
+static int do_random(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       unsigned long addr, len;
+       unsigned long seed; // NOT INITIALIZED ON PURPOSE
+       unsigned int *buf, *start;
+       unsigned char *buf8;
+       unsigned int i;
+
+       if (argc < 3 || argc > 4) {
+               printf("usage: %s <addr> <len> [<seed>]\n", argv[0]);
+               return 0;
+       }
+
+       len = simple_strtoul(argv[2], NULL, 16);
+       addr = simple_strtoul(argv[1], NULL, 16);
+
+       if (argc == 4) {
+               seed = simple_strtoul(argv[3], NULL, 16);
+               if (seed == 0) {
+                       printf("The seed cannot be 0. Using 0xDEADBEEF.\n");
+                       seed = 0xDEADBEEF;
+               }
+       } else {
+               seed = get_timer(0) ^ rand();
+       }
+
+       srand(seed);
+       start = map_sysmem(addr, len);
+       buf = start;
+       for (i = 0; i < (len / 4); i++)
+               *buf++ = rand();
+
+       buf8 = (unsigned char *)buf;
+       for (i = 0; i < (len % 4); i++)
+               *buf8++ = rand() & 0xFF;
+
+       unmap_sysmem(start);
+       printf("%lu bytes filled with random data\n", len);
+       return 1;
+}
+#endif
+
 /**************************************************/
 U_BOOT_CMD(
        md,     3,      1,      do_mem_md,
@@ -1250,3 +1293,12 @@ U_BOOT_CMD(
        ""
 );
 #endif
+
+#ifdef CONFIG_CMD_RANDOM
+U_BOOT_CMD(
+       random, 4,      0,      do_random,
+       "fill memory with random pattern",
+       "<addr> <len> [<seed>]\n"
+       "   - Fill 'len' bytes of memory starting at 'addr' with random data\n"
+);
+#endif