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