1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * POWER Data Stream Control Register (DSCR) explicit test
4  *
5  * This test modifies the DSCR value using mtspr instruction and
6  * verifies the change with mfspr instruction. It uses both the
7  * privilege state SPR and the problem state SPR for this purpose.
8  *
9  * When using the privilege state SPR, the instructions such as
10  * mfspr or mtspr are priviledged and the kernel emulates them
11  * for us. Instructions using problem state SPR can be exuecuted
12  * directly without any emulation if the HW supports them. Else
13  * they also get emulated by the kernel.
14  *
15  * Copyright 2012, Anton Blanchard, IBM Corporation.
16  * Copyright 2015, Anshuman Khandual, IBM Corporation.
17  */
18 #include "dscr.h"
19 
20 int dscr_explicit(void)
21 {
22 	unsigned long i, dscr = 0;
23 
24 	srand(getpid());
25 	set_dscr(dscr);
26 
27 	for (i = 0; i < COUNT; i++) {
28 		unsigned long cur_dscr, cur_dscr_usr;
29 		double ret = uniform_deviate(rand());
30 
31 		if (ret < 0.001) {
32 			dscr++;
33 			if (dscr > DSCR_MAX)
34 				dscr = 0;
35 
36 			set_dscr(dscr);
37 		}
38 
39 		cur_dscr = get_dscr();
40 		if (cur_dscr != dscr) {
41 			fprintf(stderr, "Kernel DSCR should be %ld but "
42 					"is %ld\n", dscr, cur_dscr);
43 			return 1;
44 		}
45 
46 		ret = uniform_deviate(rand());
47 		if (ret < 0.001) {
48 			dscr++;
49 			if (dscr > DSCR_MAX)
50 				dscr = 0;
51 
52 			set_dscr_usr(dscr);
53 		}
54 
55 		cur_dscr_usr = get_dscr_usr();
56 		if (cur_dscr_usr != dscr) {
57 			fprintf(stderr, "User DSCR should be %ld but "
58 					"is %ld\n", dscr, cur_dscr_usr);
59 			return 1;
60 		}
61 	}
62 	return 0;
63 }
64 
65 int main(int argc, char *argv[])
66 {
67 	return test_harness(dscr_explicit, "dscr_explicit_test");
68 }
69