1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Simple memory verification test, used to exercise dirty memory migration. 4 */ 5 #include <libcflat.h> 6 #include <migrate.h> 7 #include <alloc.h> 8 #include <asm/page.h> 9 #include <asm/time.h> 10 11 #define NR_PAGES 32 12 #define SIZE (NR_PAGES * PAGE_SIZE) 13 14 static unsigned time_sec = 5; 15 16 static void do_getopts(int argc, char **argv) 17 { 18 int i; 19 20 for (i = 0; i < argc; ++i) { 21 if (strcmp(argv[i], "-t") == 0) { 22 i++; 23 if (i == argc) 24 break; 25 time_sec = atol(argv[i]); 26 } 27 } 28 29 printf("running for %d secs\n", time_sec); 30 } 31 32 int main(int argc, char **argv) 33 { 34 void *mem = memalign(PAGE_SIZE, SIZE); 35 bool success = true; 36 uint64_t ms; 37 long i; 38 39 do_getopts(argc, argv); 40 41 report_prefix_push("memory"); 42 43 memset(mem, 0, SIZE); 44 45 migrate_begin_continuous(); 46 ms = get_clock_ms(); 47 i = 0; 48 do { 49 int j; 50 51 for (j = 0; j < SIZE; j += PAGE_SIZE) { 52 if (*(volatile long *)(mem + j) != i) { 53 success = false; 54 goto out; 55 } 56 *(volatile long *)(mem + j) = i + 1; 57 } 58 i++; 59 } while (get_clock_ms() - ms < time_sec * 1000); 60 out: 61 migrate_end_continuous(); 62 63 report(success, "memory verification stress test"); 64 65 report_prefix_pop(); 66 67 return report_summary(); 68 } 69