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