xref: /kvm-unit-tests/common/memory-verify.c (revision fe151b46d2870e67be32b1a388afa84d7424c1a4)
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