1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * POWER Data Stream Control Register (DSCR) SPR test 4 * 5 * This test modifies the DSCR value through both the SPR number 6 * based mtspr instruction and then makes sure that the same is 7 * reflected through mfspr instruction using either of the SPR 8 * numbers. 9 * 10 * When using the privilege state SPR, the instructions such as 11 * mfspr or mtspr are priviledged and the kernel emulates them 12 * for us. Instructions using problem state SPR can be exuecuted 13 * directly without any emulation if the HW supports them. Else 14 * they also get emulated by the kernel. 15 * 16 * Copyright 2013, Anton Blanchard, IBM Corporation. 17 * Copyright 2015, Anshuman Khandual, IBM Corporation. 18 */ 19 #include "dscr.h" 20 21 static int check_dscr(char *str) 22 { 23 unsigned long cur_dscr, cur_dscr_usr; 24 25 cur_dscr = get_dscr(); 26 cur_dscr_usr = get_dscr_usr(); 27 if (cur_dscr != cur_dscr_usr) { 28 printf("%s set, kernel get %lx != user get %lx\n", 29 str, cur_dscr, cur_dscr_usr); 30 return 1; 31 } 32 return 0; 33 } 34 35 int dscr_user(void) 36 { 37 int i; 38 39 check_dscr(""); 40 41 for (i = 0; i < COUNT; i++) { 42 set_dscr(i); 43 if (check_dscr("kernel")) 44 return 1; 45 } 46 47 for (i = 0; i < COUNT; i++) { 48 set_dscr_usr(i); 49 if (check_dscr("user")) 50 return 1; 51 } 52 return 0; 53 } 54 55 int main(int argc, char *argv[]) 56 { 57 return test_harness(dscr_user, "dscr_user_test"); 58 } 59