xref: /kvm-unit-tests/arm/selftest.c (revision 5e61cba06248d9f2926804b7fb900fe9d721e86c)
1*5e61cba0SAndrew Jones /*
2*5e61cba0SAndrew Jones  * Test the framework itself. These tests confirm that setup works.
3*5e61cba0SAndrew Jones  *
4*5e61cba0SAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5*5e61cba0SAndrew Jones  *
6*5e61cba0SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
7*5e61cba0SAndrew Jones  */
8*5e61cba0SAndrew Jones #include "libcflat.h"
9*5e61cba0SAndrew Jones #include "asm/setup.h"
10*5e61cba0SAndrew Jones 
11*5e61cba0SAndrew Jones #define TESTGRP "selftest"
12*5e61cba0SAndrew Jones 
13*5e61cba0SAndrew Jones static char testname[64];
14*5e61cba0SAndrew Jones 
15*5e61cba0SAndrew Jones static void testname_set(const char *subtest)
16*5e61cba0SAndrew Jones {
17*5e61cba0SAndrew Jones 	strcpy(testname, TESTGRP);
18*5e61cba0SAndrew Jones 	if (subtest) {
19*5e61cba0SAndrew Jones 		strcat(testname, "::");
20*5e61cba0SAndrew Jones 		strcat(testname, subtest);
21*5e61cba0SAndrew Jones 	}
22*5e61cba0SAndrew Jones }
23*5e61cba0SAndrew Jones 
24*5e61cba0SAndrew Jones static void assert_args(int num_args, int needed_args)
25*5e61cba0SAndrew Jones {
26*5e61cba0SAndrew Jones 	if (num_args < needed_args) {
27*5e61cba0SAndrew Jones 		printf("%s: not enough arguments\n", testname);
28*5e61cba0SAndrew Jones 		abort();
29*5e61cba0SAndrew Jones 	}
30*5e61cba0SAndrew Jones }
31*5e61cba0SAndrew Jones 
32*5e61cba0SAndrew Jones static char *split_var(char *s, long *val)
33*5e61cba0SAndrew Jones {
34*5e61cba0SAndrew Jones 	char *p;
35*5e61cba0SAndrew Jones 
36*5e61cba0SAndrew Jones 	p = strchr(s, '=');
37*5e61cba0SAndrew Jones 	if (!p)
38*5e61cba0SAndrew Jones 		return NULL;
39*5e61cba0SAndrew Jones 
40*5e61cba0SAndrew Jones 	*val = atol(p+1);
41*5e61cba0SAndrew Jones 	*p = '\0';
42*5e61cba0SAndrew Jones 
43*5e61cba0SAndrew Jones 	return s;
44*5e61cba0SAndrew Jones }
45*5e61cba0SAndrew Jones 
46*5e61cba0SAndrew Jones static void check_setup(int argc, char **argv)
47*5e61cba0SAndrew Jones {
48*5e61cba0SAndrew Jones 	int nr_tests = 0, i;
49*5e61cba0SAndrew Jones 	char *var;
50*5e61cba0SAndrew Jones 	long val;
51*5e61cba0SAndrew Jones 
52*5e61cba0SAndrew Jones 	for (i = 0; i < argc; ++i) {
53*5e61cba0SAndrew Jones 
54*5e61cba0SAndrew Jones 		var = split_var(argv[i], &val);
55*5e61cba0SAndrew Jones 		if (!var)
56*5e61cba0SAndrew Jones 			continue;
57*5e61cba0SAndrew Jones 
58*5e61cba0SAndrew Jones 		if (strcmp(var, "mem") == 0) {
59*5e61cba0SAndrew Jones 
60*5e61cba0SAndrew Jones 			phys_addr_t memsize = PHYS_END - PHYS_OFFSET;
61*5e61cba0SAndrew Jones 			phys_addr_t expected = ((phys_addr_t)val)*1024*1024;
62*5e61cba0SAndrew Jones 
63*5e61cba0SAndrew Jones 			report("%s[%s]", memsize == expected, testname, "mem");
64*5e61cba0SAndrew Jones 			++nr_tests;
65*5e61cba0SAndrew Jones 
66*5e61cba0SAndrew Jones 		} else if (strcmp(var, "smp") == 0) {
67*5e61cba0SAndrew Jones 
68*5e61cba0SAndrew Jones 			report("%s[%s]", nr_cpus == (int)val, testname, "smp");
69*5e61cba0SAndrew Jones 			++nr_tests;
70*5e61cba0SAndrew Jones 		}
71*5e61cba0SAndrew Jones 	}
72*5e61cba0SAndrew Jones 
73*5e61cba0SAndrew Jones 	assert_args(nr_tests, 2);
74*5e61cba0SAndrew Jones }
75*5e61cba0SAndrew Jones 
76*5e61cba0SAndrew Jones int main(int argc, char **argv)
77*5e61cba0SAndrew Jones {
78*5e61cba0SAndrew Jones 	testname_set(NULL);
79*5e61cba0SAndrew Jones 	assert_args(argc, 1);
80*5e61cba0SAndrew Jones 	testname_set(argv[0]);
81*5e61cba0SAndrew Jones 
82*5e61cba0SAndrew Jones 	if (strcmp(argv[0], "setup") == 0)
83*5e61cba0SAndrew Jones 		check_setup(argc-1, &argv[1]);
84*5e61cba0SAndrew Jones 
85*5e61cba0SAndrew Jones 	return report_summary();
86*5e61cba0SAndrew Jones }
87