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