linux/tools/testing/selftests/powerpc/dscr/dscr_explicit_test.c
<<
>>
Prefs
   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
  20int 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
  65int main(int argc, char *argv[])
  66{
  67        return test_harness(dscr_explicit, "dscr_explicit_test");
  68}
  69